设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1515|回复: 3
打印 上一主题 下一主题

[已经过期] 怎么样能使玩家与npc互动?

[复制链接]

Lv2.观梦者

梦石
0
星屑
329
在线时间
890 小时
注册时间
2009-10-12
帖子
1829
跳转到指定楼层
1
发表于 2010-11-20 15:05:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 日月星辰 于 2010-11-20 15:12 编辑

我用的是即时消息的增强版,就是有一个框框可以输入文字的,我要的效果就是:
当玩家输入 你好【或其他字符】 时,调用公共事件xx。
脚本如下:
  1. #------------------制作by bluefool,转载请保留------------------
  2. module Blue
  3.   #这个是控制显示最近的多少条信息的,当超出一屏能显示的值的话可通过先按一下shift
  4.   #然后用上下翻看内容。再按一次shift则解除激活
  5.   Blue_max = 12
  6.   #这个填写进如游戏时生成的系统语言,
  7.   INTRO = "官方网站:http://44rpg.uueasy.com"
  8.   #战斗画面时即时消息窗口的x坐标
  9.   BATAM_X = 0
  10.   #战斗画面时即时消息窗口的y坐标
  11.   BATAM_Y = 90
  12.   #用于清空hash表,可以不管它,但不要让Blue_max大于它,当然,它的值也可以改变
  13.   NAM_MAX = 50
  14.   #主要传递信息参数为函数$am,参见脚本内容
  15. end
  16. #-------------------------------------------
  17. class Scene_Load < Scene_File
  18.   #--------------------------------------------------------------------------
  19.   # ● 确定时的处理
  20.   #--------------------------------------------------------------------------
  21.   def on_decision(filename)
  22.     # 文件不存在的情况下
  23.     unless FileTest.exist?(filename)
  24.       # 演奏冻结 SE
  25.       $game_system.se_play($data_system.buzzer_se)
  26.       return
  27.     end
  28.     # 演奏读档 SE
  29.     $game_system.se_play($data_system.load_se)
  30.     # 写入存档数据
  31.     file = File.open(filename, "rb")
  32.     read_save_data(file)
  33.     file.close
  34.     # 还原 BGM、BGS
  35.     $game_system.bgm_play($game_system.playing_bgm)
  36.     $game_system.bgs_play($game_system.playing_bgs)
  37.     # 刷新地图 (执行并行事件)
  38.     $a = {}
  39.     $game_map.update
  40.     # 切换到地图画面
  41.     $scene = Scene_Map.new
  42.   end
  43. end  
  44. class Game_Player < Game_Character
  45.   def update
  46.     # 本地变量记录移动信息
  47.     last_moving = moving?
  48.     # 移动中、事件执行中、强制移动路线中、
  49.     # 信息窗口一个也不显示的时候
  50.     unless moving? or $game_system.map_interpreter.running? or
  51.            @move_route_forcing or $game_temp.message_window_showing or $ccc == 1
  52.       case Input.dir4
  53.       when 2
  54.         move_down
  55.       when 4
  56.         move_left
  57.       when 6
  58.         move_right
  59.       when 8
  60.         move_up
  61.       end
  62.     end
  63.     # 本地变量记忆坐标
  64.     last_real_x = @real_x
  65.     last_real_y = @real_y
  66.     super
  67.     # 角色向下移动、画面上的位置在中央下方的情况下
  68.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  69.       # 画面向下卷动
  70.       $game_map.scroll_down(@real_y - last_real_y)
  71.     end
  72.     # 角色向左移动、画面上的位置在中央左方的情况下
  73.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  74.       # 画面向左卷动
  75.       $game_map.scroll_left(last_real_x - @real_x)
  76.     end
  77.     # 角色向右移动、画面上的位置在中央右方的情况下
  78.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  79.       # 画面向右卷动
  80.       $game_map.scroll_right(@real_x - last_real_x)
  81.     end
  82.     # 角色向上移动、画面上的位置在中央上方的情况下
  83.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  84.       # 画面向上卷动
  85.       $game_map.scroll_up(last_real_y - @real_y)
  86.     end
  87.     # 不在移动中的情况下
  88.     unless moving?
  89.       # 上次主角移动中的情况
  90.       if last_moving
  91.         # 与同位置的事件接触就判定为事件启动
  92.         result = check_event_trigger_here([1,2])
  93.         # 没有可以启动的事件的情况下
  94.         if result == false
  95.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  96.           unless $DEBUG and Input.press?(Input::CTRL)
  97.             # 遇敌计数下降
  98.             if @encounter_count > 0
  99.               @encounter_count -= 1
  100.             end
  101.           end
  102.         end
  103.       end
  104.       # 按下 C 键的情况下
  105.       if Input.trigger?(Input::C)
  106.         # 判定为同位置以及正面的事件启动
  107.         check_event_trigger_here([0])
  108.         check_event_trigger_there([0,1,2])
  109.       end
  110.     end
  111.   end
  112. end  
  113. #==============================================================================
  114. # ■ Scene_Title
  115. #------------------------------------------------------------------------------
  116. #  处理标题画面的类。
  117. #==============================================================================

  118. class Scene_Title
  119.   #--------------------------------------------------------------------------
  120.   # ● 命令 : 新游戏
  121.   #--------------------------------------------------------------------------
  122.   def command_new_game
  123.     # 演奏确定 SE
  124.     $game_system.se_play($data_system.decision_se)
  125.     # 停止 BGM
  126.     Audio.bgm_stop
  127.     # 重置测量游戏时间用的画面计数器
  128.     Graphics.frame_count = 0
  129.     # 生成各种游戏对像
  130.     $game_temp          = Game_Temp.new
  131.     $game_system        = Game_System.new
  132.     $game_switches      = Game_Switches.new
  133.     $game_variables     = Game_Variables.new
  134.     $game_self_switches = Game_SelfSwitches.new
  135.     $game_screen        = Game_Screen.new
  136.     $game_actors        = Game_Actors.new
  137.     $game_party         = Game_Party.new
  138.     $game_troop         = Game_Troop.new
  139.     $game_map           = Game_Map.new
  140.     $game_player        = Game_Player.new
  141.     # 设置初期同伴位置
  142.     $game_party.setup_starting_members
  143.     # 设置初期位置的地图
  144.     $game_map.setup($data_system.start_map_id)
  145.     # 主角向初期位置移动
  146.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  147.     # 刷新主角
  148.     $game_player.refresh
  149.     # 执行地图设置的 BGM 与 BGS 的自动切换
  150.     $game_map.autoplay
  151.     # 刷新地图 (执行并行事件)
  152.     $game_map.update
  153.     $a = {}
  154.     $am = Blue::INTRO
  155.     $ccc = 0
  156.     # 切换地图画面
  157.     $scene = Scene_Map.new
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 命令 : 继续
  161.   #--------------------------------------------------------------------------
  162.   def command_continue
  163.     # 继续无效的情况下
  164.     unless @continue_enabled
  165.       # 演奏无效 SE
  166.       $game_system.se_play($data_system.buzzer_se)
  167.       return
  168.     end
  169.     # 演奏确定 SE
  170.     $game_system.se_play($data_system.decision_se)
  171.     # 切换到读档画面
  172.     $scene = Scene_Load.new
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   # ● 命令 : 退出
  176.   #--------------------------------------------------------------------------
  177.   def command_shutdown
  178.     # 演奏确定 SE
  179.     $game_system.se_play($data_system.decision_se)
  180.     # BGM、BGS、ME 的淡入淡出
  181.     Audio.bgm_fade(800)
  182.     Audio.bgs_fade(800)
  183.     Audio.me_fade(800)
  184.     # 退出
  185.     $scene = nil
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● 战斗测试
  189.   #--------------------------------------------------------------------------
  190.   def battle_test
  191.     # 载入数据库 (战斗测试用)
  192.     $data_actors        = load_data("Data/BT_Actors.rxdata")
  193.     $data_classes       = load_data("Data/BT_Classes.rxdata")
  194.     $data_skills        = load_data("Data/BT_Skills.rxdata")
  195.     $data_items         = load_data("Data/BT_Items.rxdata")
  196.     $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  197.     $data_armors        = load_data("Data/BT_Armors.rxdata")
  198.     $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  199.     $data_troops        = load_data("Data/BT_Troops.rxdata")
  200.     $data_states        = load_data("Data/BT_States.rxdata")
  201.     $data_animations    = load_data("Data/BT_Animations.rxdata")
  202.     $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  203.     $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  204.     $data_system        = load_data("Data/BT_System.rxdata")
  205.     # 重置测量游戏时间用的画面计数器
  206.     Graphics.frame_count = 0
  207.     # 生成各种游戏对像
  208.     $game_temp          = Game_Temp.new
  209.     $game_system        = Game_System.new
  210.     $game_switches      = Game_Switches.new
  211.     $game_variables     = Game_Variables.new
  212.     $game_self_switches = Game_SelfSwitches.new
  213.     $game_screen        = Game_Screen.new
  214.     $game_actors        = Game_Actors.new
  215.     $game_party         = Game_Party.new
  216.     $game_troop         = Game_Troop.new
  217.     $game_map           = Game_Map.new
  218.     $game_player        = Game_Player.new
  219.     $a = {0=>"进入战斗测试."}
  220.     # 设置战斗测试用同伴
  221.     $game_party.setup_battle_test_members
  222.     # 设置队伍 ID、可以逃走标志、战斗背景
  223.     $game_temp.battle_troop_id = $data_system.test_troop_id
  224.     $game_temp.battle_can_escape = true
  225.     $game_map.battleback_name = $data_system.battleback_name
  226.     # 演奏战斗开始 BGM
  227.     $game_system.se_play($data_system.battle_start_se)
  228.     # 演奏战斗 BGM
  229.     $game_system.bgm_play($game_system.battle_bgm)
  230.     # 切换到战斗画面
  231.     $scene = Scene_Battle.new
  232.   end
  233. end
  234. #-------------------------------------------------------
  235. class Scene_Map
  236.   #--------------------------------------------------------------------------
  237.   # ● 主处理
  238.   #--------------------------------------------------------------------------
  239.   def main
  240.     @spriteset = Spriteset_Map.new
  241.     @message_window = Window_Message.new
  242.     @down_window = Window_Down.new
  243.     ####################################
  244.     @v = Viewport.new(0,460,320,20)
  245.     @v.color.set(0,0,0,120)
  246.     @tf = Type_Field.new(@v,"",16)
  247.     ########################################懒虫
  248.     Graphics.transition
  249.     # 主循环
  250.     loop do
  251.       Graphics.update
  252.       Input.update
  253.       update
  254.       if $scene != self
  255.         break
  256.       end
  257.     end
  258.     Graphics.freeze
  259.     @spriteset.dispose
  260.     @message_window.dispose
  261.     @down_window.dispose
  262.     ############
  263.     @v.dispose
  264.     @tf.dispose
  265.     ###############
  266.     if $scene.is_a?(Scene_Title)
  267.       Graphics.transition
  268.       Graphics.freeze
  269.     end
  270.     @am_size = $a.size
  271.   end
  272.   #---------------------
  273.   def bluefool_sort
  274.     if $am != nil
  275.        if $a.size > Blue::NAM_MAX
  276.           a_temp = {}
  277.           j = 0
  278.           for i in ($a.size - Blue::Blue_max)...$a.size
  279.             a_temp[j] = $a[i]
  280.             j += 1
  281.           end  
  282.          $a = a_temp
  283.        end  
  284.        if $am.length < 54
  285.           $a[$a.size] = $am
  286.         else
  287.           while $am.length > 53
  288.             i = 53
  289.             while (/\W/ =~ $am[i-3,3]) != nil
  290.               i -= 1
  291.             end
  292.             $a[$a.size] = $am[0,i]
  293.             $am = $am[i ,$am.length - i]
  294.           end
  295.           $a[$a.size] = $am
  296.        end
  297.        $am = nil
  298.     end
  299.   end  
  300.   #--------------------------------------------------------------------------
  301.   # ● 刷新画面
  302.   #--------------------------------------------------------------------------
  303.   def update
  304.     # 循环
  305.     loop do
  306.       # 按照地图、实例、主角的顺序刷新
  307.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
  308.       #  的机会的重要因素)
  309.       $game_map.update
  310.       $game_system.map_interpreter.update
  311.       $game_player.update
  312.       # 系统 (计时器)、画面刷新
  313.       $game_system.update
  314.       $game_screen.update
  315.       # 如果主角在场所移动中就中断循环
  316.       unless $game_temp.player_transferring
  317.         break
  318.       end
  319.       # 执行场所移动
  320.       transfer_player
  321.       # 处理过渡中的情况下、中断循环
  322.       if $game_temp.transition_processing
  323.         break
  324.       end
  325.     end
  326.     # 刷新活动块
  327.     @spriteset.update
  328.     # 刷新信息窗口
  329.     ###########################懒虫到此一游###########################
  330.     # 输入法测试
  331.     @tf.update
  332.     if RInput.trigger?(RInput::ENTER) and Input.press?(Input::CTRL)
  333.         if (text = @tf.get_text) != ""
  334.       $am = @tf.get_text
  335.       $scene = Scene_Map.new
  336.         end
  337.       end
  338.       ##################################官方http://rpg.6te.net##########
  339.     @message_window.update
  340.     # 游戏结束的情况下
  341.     if $game_temp.gameover
  342.       # 切换的游戏结束画面
  343.       $scene = Scene_Gameover.new
  344.       return
  345.     end
  346.     # 返回标题画面的情况下
  347.     if $game_temp.to_title
  348.       # 切换到标题画面
  349.       $scene = Scene_Title.new
  350.       return
  351.     end
  352.     # 处理过渡中的情况下
  353.     if $game_temp.transition_processing
  354.       # 清除过渡处理中标志
  355.       $game_temp.transition_processing = false
  356.       # 执行过渡
  357.       if $game_temp.transition_name == ""
  358.         Graphics.transition(20)
  359.       else
  360.         Graphics.transition(40, "Graphics/Transitions/" +
  361.           $game_temp.transition_name)
  362.       end
  363.     end
  364.     # 显示信息窗口中的情况下
  365.     if $game_temp.message_window_showing
  366.       return
  367.     end
  368.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  369.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  370.       # 不是在事件执行中或者禁止遇敌中
  371.       unless $game_system.map_interpreter.running? or
  372.              $game_system.encounter_disabled
  373.         # 确定队伍
  374.         n = rand($game_map.encounter_list.size)
  375.         troop_id = $game_map.encounter_list[n]
  376.         # 队伍有效的话
  377.         if $data_troops[troop_id] != nil
  378.           # 设置调用战斗标志
  379.           $game_temp.battle_calling = true
  380.           $game_temp.battle_troop_id = troop_id
  381.           $game_temp.battle_can_escape = true
  382.           $game_temp.battle_can_lose = false
  383.           $game_temp.battle_proc = nil
  384.         end
  385.       end
  386.     end
  387.     #---------------------------------------------
  388.     bluefool_sort
  389.     if @am_size != $a.size
  390.        @down_window.refresh
  391.        if $a != nil and $a.size < Blue::Blue_max + 1
  392.         @down_window.index = $a.size/2 - 1
  393.         elsif $a != nil and $a.size > Blue::Blue_max
  394.         @down_window.index = Blue::Blue_max/2 - 1
  395.        end  
  396.        @am_size = $a.size
  397.     end  
  398.     if Input.trigger?(Input::A)
  399.       if @down_window.active == false
  400.         @down_window.active = true
  401.         $ccc = 1
  402.       else
  403.         @down_window.active = false
  404.         $ccc = 0
  405.       end  
  406.     end
  407.     if Input.trigger?(Input::DOWN)#输入DOWN键的情况
  408.       if @down_window.active == true and @down_window.index < (@down_window.item_max-1)/2
  409.         @down_window.index += 1
  410.       end  
  411.     end  
  412.     if Input.trigger?(Input::UP)#输入UP键的情况
  413.       if @down_window.active == true and @down_window.index > 0
  414.         @down_window.index -= 1
  415.       end  
  416.     end  
  417.     #----------------------------------------------
  418.     # 按下 B 键的情况下
  419.     if Input.trigger?(Input::B)
  420.       # 不是在事件执行中或菜单禁止中
  421.       unless $game_system.map_interpreter.running? or
  422.              $game_system.menu_disabled
  423.         # 设置菜单调用标志以及 SE 演奏
  424.         $game_temp.menu_calling = true
  425.         $game_temp.menu_beep = true
  426.       end
  427.     end
  428.     # 调试模式为 ON 并且按下 F9 键的情况下
  429.     if $DEBUG and Input.press?(Input::F9)
  430.       # 设置调用调试标志
  431.       $game_temp.debug_calling = true
  432.     end
  433.     # 不在主角移动中的情况下
  434.     unless $game_player.moving?
  435.       # 执行各种画面的调用
  436.       if $game_temp.battle_calling
  437.         call_battle
  438.       elsif $game_temp.shop_calling
  439.         call_shop
  440.       elsif $game_temp.name_calling
  441.         call_name
  442.       elsif $game_temp.menu_calling
  443.         call_menu
  444.       elsif $game_temp.save_calling
  445.         call_save
  446.       elsif $game_temp.debug_calling
  447.         call_debug
  448.       end
  449.     end
  450.   end
  451. end
  452. class Game_Battler
  453.   def bluefool_sort
  454.       if $am != nil
  455.         if $am.length < 54
  456.            $a[$a.size] = $am
  457.         else
  458.            while $am.length > 53
  459.              i = 53
  460.              while (/\W/ =~ $am[i-3,3]) != nil
  461.               i -= 1
  462.              end
  463.              $a[$a.size] = $am[0,i]
  464.              $am = $am[i ,$am.length - i]
  465.            end
  466.            $a[$a.size] = $am
  467.         end
  468.        $am = nil
  469.       end
  470.   end
  471.   #--------------------------------------------------------------------------
  472.   # ● 应用连续伤害效果
  473.   #--------------------------------------------------------------------------
  474.   def slip_damage_effect
  475.     # 设置伤害
  476.     self.damage = self.maxhp / 10
  477.     # 分散
  478.     if self.damage.abs > 0
  479.       amp = [self.damage.abs * 15 / 100, 1].max
  480.       self.damage += rand(amp+1) + rand(amp+1) - amp
  481.     end
  482.     # HP 的伤害减法运算
  483.     self.hp -= self.damage
  484.     if self.damage > 0
  485.       $am = "异常状态使#{self.name}受到了#{self.damage}点伤害."
  486.     elsif self.damage < 0
  487.       $am = "异常状态使#{self.name}恢复了#{self.damage.abs}点#{$data_system.words.hp}"
  488.     end
  489.     bluefool_sort
  490.     # 过程结束
  491.     return true
  492.   end
  493.   #--------------------------------------------------------------------------
  494.   # ● 应用通常攻击效果
  495.   #     attacker : 攻击者 (battler)
  496.   #--------------------------------------------------------------------------
  497.   def attack_effect(attacker)
  498.     # 清除会心一击标志
  499.     self.critical = false
  500.     # 第一命中判定
  501.     hit_result = (rand(100) < attacker.hit)
  502.     # 命中的情况下
  503.     if hit_result == true
  504.       # 计算基本伤害
  505.       atk = [attacker.atk - self.pdef / 2, 0].max
  506.       self.damage = atk * (20 + attacker.str) / 20
  507.       # 属性修正
  508.       self.damage *= elements_correct(attacker.element_set)
  509.       self.damage /= 100
  510.       # 伤害符号正确的情况下
  511.       if self.damage > 0
  512.         # 会心一击修正
  513.         if rand(100) < 4 * attacker.dex / self.agi
  514.           self.damage *= 2
  515.           self.critical = true
  516.         end
  517.         # 防御修正
  518.         if self.guarding?
  519.           self.damage /= 2
  520.         end
  521.       end
  522.       # 分散
  523.       if self.damage.abs > 0
  524.         amp = [self.damage.abs * 15 / 100, 1].max
  525.         self.damage += rand(amp+1) + rand(amp+1) - amp
  526.       end
  527.       # 第二命中判定
  528.       eva = 8 * self.agi / attacker.dex + self.eva
  529.       hit = self.damage < 0 ? 100 : 100 - eva
  530.       hit = self.cant_evade? ? 100 : hit
  531.       hit_result = (rand(100) < hit)
  532.     end
  533.     # 命中的情况下
  534.     if hit_result == true
  535.       # 状态冲击解除
  536.       remove_states_shock
  537.       # HP 的伤害计算
  538.       self.hp -= self.damage
  539.       $am = "#{attacker.name}对#{self.name}造成了#{self.damage}伤害."
  540.       bluefool_sort
  541.       # 状态变化
  542.       @state_changed = false
  543.       states_plus(attacker.plus_state_set)
  544.       states_minus(attacker.minus_state_set)
  545.     # Miss 的情况下
  546.     else
  547.       # 伤害设置为 "Miss"
  548.       self.damage = "Miss"
  549.       $am = "#{attacker.name}击空了."
  550.       bluefool_sort
  551.       # 清除会心一击标志
  552.       self.critical = false
  553.     end
  554.     # 过程结束
  555.     return true
  556.   end
  557.   #--------------------------------------------------------------------------
  558.   # ● 应用特技效果
  559.   #     user  : 特技的使用者 (battler)
  560.   #     skill : 特技
  561.   #--------------------------------------------------------------------------
  562.   def skill_effect(user, skill)
  563.     # 清除会心一击标志
  564.     self.critical = false
  565.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  566.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  567.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  568.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  569.       # 过程结束
  570.       return false
  571.     end
  572.     # 清除有效标志
  573.     effective = false
  574.     # 公共事件 ID 是有效的情况下,设置为有效标志
  575.     effective |= skill.common_event_id > 0
  576.     # 第一命中判定
  577.     hit = skill.hit
  578.     if skill.atk_f > 0
  579.       hit *= user.hit / 100
  580.     end
  581.     hit_result = (rand(100) < hit)
  582.     # 不确定的特技的情况下设置为有效标志
  583.     effective |= hit < 100
  584.     # 命中的情况下
  585.     if hit_result == true
  586.       # 计算威力
  587.       power = skill.power + user.atk * skill.atk_f / 100
  588.       if power > 0
  589.         power -= self.pdef * skill.pdef_f / 200
  590.         power -= self.mdef * skill.mdef_f / 200
  591.         power = [power, 0].max
  592.       end
  593.       # 计算倍率
  594.       rate = 20
  595.       rate += (user.str * skill.str_f / 100)
  596.       rate += (user.dex * skill.dex_f / 100)
  597.       rate += (user.agi * skill.agi_f / 100)
  598.       rate += (user.int * skill.int_f / 100)
  599.       # 计算基本伤害
  600.       self.damage = power * rate / 20
  601.       # 属性修正
  602.       self.damage *= elements_correct(skill.element_set)
  603.       self.damage /= 100
  604.       # 伤害符号正确的情况下
  605.       if self.damage > 0
  606.         # 防御修正
  607.         if self.guarding?
  608.           self.damage /= 2
  609.         end
  610.       end
  611.       # 分散
  612.       if skill.variance > 0 and self.damage.abs > 0
  613.         amp = [self.damage.abs * skill.variance / 100, 1].max
  614.         self.damage += rand(amp+1) + rand(amp+1) - amp
  615.       end
  616.       # 第二命中判定
  617.       eva = 8 * self.agi / user.dex + self.eva
  618.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  619.       hit = self.cant_evade? ? 100 : hit
  620.       hit_result = (rand(100) < hit)
  621.       # 不确定的特技的情况下设置为有效标志
  622.       effective |= hit < 100
  623.     end
  624.     # 命中的情况下
  625.     if hit_result == true
  626.       # 威力 0 以外的物理攻击的情况下
  627.       if skill.power != 0 and skill.atk_f > 0
  628.         # 状态冲击解除
  629.         remove_states_shock
  630.         # 设置有效标志
  631.         effective = true
  632.       end
  633.       # HP 的伤害减法运算
  634.       last_hp = self.hp
  635.       self.hp -= self.damage
  636.         if self.damage > 0
  637.          $am = "#{user.name}对#{self.name}造成了#{self.damage}伤害."
  638.          elsif self.damage < 0
  639.           if user == self
  640.            $am = "#{user.name}恢复了自己#{self.damage.abs}点#{$data_system.words.hp}."
  641.            else
  642.            $am = "#{user.name}恢复了#{self.name}#{self.damage.abs}点#{$data_system.words.hp}."
  643.           end
  644.         end
  645.       bluefool_sort
  646.       effective |= self.hp != last_hp
  647.       # 状态变化
  648.       @state_changed = false
  649.       effective |= states_plus(skill.plus_state_set)
  650.       effective |= states_minus(skill.minus_state_set)
  651.       # 威力为 0 的场合
  652.       if skill.power == 0
  653.         # 伤害设置为空的字串
  654.         self.damage = ""
  655.         # 状态没有变化的情况下
  656.         unless @state_changed
  657.           # 伤害设置为 "Miss"
  658.           self.damage = "Miss"
  659.           $am = "#{user.name}没有击中."
  660.           bluefool_sort
  661.         end
  662.       end
  663.     # Miss 的情况下
  664.     else
  665.       # 伤害设置为 "Miss"
  666.       self.damage = "Miss"
  667.       $am = "#{user.name}没有击中."
  668.       bluefool_sort
  669.     end
  670.     # 不在战斗中的情况下
  671.     unless $game_temp.in_battle
  672.       # 伤害设置为 nil
  673.       self.damage = nil
  674.     end
  675.     # 过程结束
  676.     return effective
  677.   end
  678. end
  679. class Scene_Battle
  680.   #--------------------------------------------------------------------------
  681.   # ● 刷新画面 (主回合步骤 1 : 准备行动)
  682.   #--------------------------------------------------------------------------
  683.   def update_phase4_step1
  684.     # 隐藏帮助窗口
  685.     @help_window.visible = false
  686.     # 判定胜败
  687.     if judge
  688.       # 胜利或者失败的情况下 : 过程结束
  689.       return
  690.     end
  691.     # 强制行动的战斗者不存在的情况下
  692.     if $game_temp.forcing_battler == nil
  693.       # 设置战斗事件
  694.       setup_battle_event
  695.       # 执行战斗事件中的情况下
  696.       if $game_system.battle_interpreter.running?
  697.         return
  698.       end
  699.     end
  700.     # 强制行动的战斗者存在的情况下
  701.     if $game_temp.forcing_battler != nil
  702.       # 在头部添加后移动
  703.       @action_battlers.delete($game_temp.forcing_battler)
  704.       @action_battlers.unshift($game_temp.forcing_battler)
  705.     end
  706.     # 未行动的战斗者不存在的情况下 (全员已经行动)
  707.     if @action_battlers.size == 0
  708.       # 开始同伴命令回合
  709.       start_phase2
  710.       return
  711.     end
  712.     # 初始化动画 ID 和公共事件 ID
  713.     @animation1_id = 0
  714.     @animation2_id = 0
  715.     @common_event_id = 0
  716.     # 未行动的战斗者移动到序列的头部
  717.     @active_battler = @action_battlers.shift
  718.     # 如果已经在战斗之外的情况下
  719.     if @active_battler.index == nil
  720.       return
  721.     end
  722.     # 连续伤害
  723.     if @active_battler.hp > 0 and @active_battler.slip_damage?
  724.       @active_battler.slip_damage_effect
  725.       @active_battler.damage_pop = true
  726.       @down_window.refresh
  727.     end
  728.     # 自然解除状态
  729.     @active_battler.remove_states_auto
  730.     # 刷新状态窗口
  731.     @status_window.refresh
  732.     # 移至步骤 2
  733.     @phase4_step = 2
  734.   end
  735.   #--------------------------------------------------------------------------
  736.   # ● 开始结束战斗回合
  737.   #--------------------------------------------------------------------------
  738.   def start_phase5
  739.     # 转移到回合 5
  740.     @phase = 5
  741.     # 演奏战斗结束 ME
  742.     $game_system.me_play($game_system.battle_end_me)
  743.     # 还原为战斗开始前的 BGM
  744.     $game_system.bgm_play($game_temp.map_bgm)
  745.     # 初始化 EXP、金钱、宝物
  746.     exp = 0
  747.     gold = 0
  748.     treasures = []
  749.     # 循环
  750.     for enemy in $game_troop.enemies
  751.       # 敌人不是隐藏状态的情况下
  752.       unless enemy.hidden
  753.         # 获得 EXP、增加金钱
  754.         exp += enemy.exp
  755.         gold += enemy.gold
  756.         # 出现宝物判定
  757.         if rand(100) < enemy.treasure_prob
  758.           if enemy.item_id > 0
  759.             treasures.push($data_items[enemy.item_id])
  760.           end
  761.           if enemy.weapon_id > 0
  762.             treasures.push($data_weapons[enemy.weapon_id])
  763.           end
  764.           if enemy.armor_id > 0
  765.             treasures.push($data_armors[enemy.armor_id])
  766.           end
  767.         end
  768.       end
  769.     end
  770.     # 限制宝物数为 6 个
  771.     treasures = treasures[0..5]
  772.     # 获得 EXP
  773.     for i in 0...$game_party.actors.size
  774.       actor = $game_party.actors[i]
  775.       if actor.cant_get_exp? == false
  776.         last_level = actor.level
  777.         actor.exp += exp
  778.         if actor.level > last_level
  779.           @status_window.level_up(i)
  780.         end
  781.       end
  782.     end
  783.     # 获得金钱
  784.     $game_party.gain_gold(gold)
  785.     $am = "获得#{exp}经验,#{gold}#{$data_system.words.gold}"
  786.     bluefool_sort
  787.     @down_window.refresh
  788.     # 获得宝物
  789.     for item in treasures
  790.       case item
  791.       when RPG::Item
  792.         $game_party.gain_item(item.id, 1)
  793.         $am = "获得#{$data_items[item.id].name}"
  794.         bluefool_sort
  795.       when RPG::Weapon
  796.         $game_party.gain_weapon(item.id, 1)
  797.         $am = "获得#{$data_weapons[item.id].name}"
  798.         bluefool_sort
  799.       when RPG::Armor
  800.         $game_party.gain_armor(item.id, 1)
  801.         $am = "获得#{$data_armors[item.id].name}"
  802.         bluefool_sort
  803.       end
  804.       @down_window.refresh
  805.     end
  806.     # 生成战斗结果窗口
  807.     @result_window = Window_BattleResult.new(exp, gold, treasures)
  808.     # 设置等待计数
  809.     @phase5_wait_count = 100
  810.   end
  811.   #--------------------------------------------------------------------------
  812.   # ● 生成基本行动结果
  813.   #--------------------------------------------------------------------------
  814.   def make_basic_action_result
  815.     # 攻击的情况下
  816.     if @active_battler.current_action.basic == 0
  817.       # 设置攻击 ID
  818.       @animation1_id = @active_battler.animation1_id
  819.       @animation2_id = @active_battler.animation2_id
  820.       # 行动方的战斗者是敌人的情况下
  821.       if @active_battler.is_a?(Game_Enemy)
  822.         if @active_battler.restriction == 3
  823.           target = $game_troop.random_target_enemy
  824.         elsif @active_battler.restriction == 2
  825.           target = $game_party.random_target_actor
  826.         else
  827.           index = @active_battler.current_action.target_index
  828.           target = $game_party.smooth_target_actor(index)
  829.         end
  830.       end
  831.       # 行动方的战斗者是角色的情况下
  832.       if @active_battler.is_a?(Game_Actor)
  833.         if @active_battler.restriction == 3
  834.           target = $game_party.random_target_actor
  835.         elsif @active_battler.restriction == 2
  836.           target = $game_troop.random_target_enemy
  837.         else
  838.           index = @active_battler.current_action.target_index
  839.           target = $game_troop.smooth_target_enemy(index)
  840.         end
  841.       end
  842.       # 设置对像方的战斗者序列
  843.       @target_battlers = [target]
  844.       for target in @target_battlers
  845.         $am = "#{@active_battler.name}对#{target.name}发起了进攻!"
  846.         bluefool_sort
  847.         target.attack_effect(@active_battler)
  848.       end
  849.       return
  850.     end
  851.     # 防御的情况下
  852.     if @active_battler.current_action.basic == 1
  853.       @help_window.set_text($data_system.words.guard, 1)
  854.       $am = "#{@active_battler.name}选择了防御."
  855.       bluefool_sort
  856.       return
  857.     end
  858.     # 逃跑的情况下
  859.     if @active_battler.is_a?(Game_Enemy) and
  860.        @active_battler.current_action.basic == 2
  861.       #  帮助窗口显示"逃跑"
  862.       @help_window.set_text("逃跑", 1)
  863.       # 逃跑
  864.       @active_battler.escape
  865.       return
  866.     end
  867.     # 什么也不做的情况下
  868.     if @active_battler.current_action.basic == 3
  869.       # 清除强制行动对像的战斗者
  870.       $game_temp.forcing_battler = nil
  871.       # 移至步骤 1
  872.       @phase4_step = 1
  873.       return
  874.     end
  875.   end
  876.   #--------------------------------------------------------------------------
  877.   # ● 生成特技行动结果
  878.   #--------------------------------------------------------------------------
  879.   def make_skill_action_result
  880.     # 获取特技
  881.     @skill = $data_skills[@active_battler.current_action.skill_id]
  882.     # 如果不是强制行动
  883.     unless @active_battler.current_action.forcing
  884.       # 因为 SP 耗尽而无法使用的情况下
  885.       unless @active_battler.skill_can_use?(@skill.id)
  886.         # 清除强制行动对像的战斗者
  887.         $game_temp.forcing_battler = nil
  888.         # 移至步骤 1
  889.         @phase4_step = 1
  890.         return
  891.       end
  892.     end
  893.     # 消耗 SP
  894.     @active_battler.sp -= @skill.sp_cost
  895.     # 刷新状态窗口
  896.     @status_window.refresh
  897.     # 在帮助窗口显示特技名
  898.     @help_window.set_text(@skill.name, 1)
  899.     # 设置动画 ID
  900.     @animation1_id = @skill.animation1_id
  901.     @animation2_id = @skill.animation2_id
  902.     # 设置公共事件 ID
  903.     @common_event_id = @skill.common_event_id
  904.     # 设置对像侧战斗者
  905.     set_target_battlers(@skill.scope)
  906.     # 应用特技效果
  907.     for target in @target_battlers
  908.       case @skill.scope
  909.       when 1  
  910.        $am = "#{@active_battler.name}使用#{@skill.name}攻击#{target.name}!"
  911.       when 2  
  912.        $am = "#{@active_battler.name}使用#{@skill.name}攻击#{target.name}!"
  913.       when 7  
  914.         $am = "#{@active_battler.name}对自己使用#{@skill.name}."
  915.       else
  916.         if target == @active_battler
  917.           $am = "#{@active_battler.name}对自己使用#{@skill.name}."
  918.           else
  919.           $am = "#{@active_battler.name}对#{target.name}使用#{@skill.name}."
  920.         end  
  921.       end
  922.       bluefool_sort
  923.       target.skill_effect(@active_battler, @skill)
  924.     end
  925.   end
  926.   #--------------------------------------------------------------------------
  927.   # ● 生成物品行动结果
  928.   #--------------------------------------------------------------------------
  929.   def make_item_action_result
  930.     # 获取物品
  931.     @item = $data_items[@active_battler.current_action.item_id]
  932.     # 因为物品耗尽而无法使用的情况下
  933.     unless $game_party.item_can_use?(@item.id)
  934.       # 移至步骤 1
  935.       @phase4_step = 1
  936.       return
  937.     end
  938.     # 消耗品的情况下
  939.     if @item.consumable
  940.       # 使用的物品减 1
  941.       $game_party.lose_item(@item.id, 1)
  942.     end
  943.     # 在帮助窗口显示物品名
  944.     @help_window.set_text(@item.name, 1)
  945.     # 设置动画 ID
  946.     @animation1_id = @item.animation1_id
  947.     @animation2_id = @item.animation2_id
  948.     # 设置公共事件 ID
  949.     @common_event_id = @item.common_event_id
  950.     # 确定对像
  951.     index = @active_battler.current_action.target_index
  952.     target = $game_party.smooth_target_actor(index)
  953.     # 设置对像侧战斗者
  954.     set_target_battlers(@item.scope)
  955.     # 应用物品效果
  956.     for target in @target_battlers
  957.       target.item_effect(@item)
  958.       if target == @active_battler
  959.         $am = "#{@active_battler.name}对自己使用了#{@item.name}"
  960.        else
  961.         $am = "#{@active_battler.name}对#{target.name}使用了#{@item.name}"
  962.       end
  963.       bluefool_sort
  964.     end
  965.   end
  966.   #--------------------------------------------------------------------------
  967.   # ● 刷新画面 (主回合步骤 4 : 对像方动画)
  968.   #--------------------------------------------------------------------------
  969.   def update_phase4_step4
  970.     # 对像方动画
  971.     for target in @target_battlers
  972.       target.animation_id = @animation2_id
  973.       target.animation_hit = (target.damage != "Miss")
  974.     end
  975.     @down_window.refresh
  976.     @wait_count = 8
  977.     # 移至步骤 5
  978.     @phase4_step = 5
  979.   end
  980.   def bluefool_sort
  981.       if $am != nil
  982.        if $a.size > Blue::NAM_MAX
  983.           a_temp = {}
  984.           j = 0
  985.           for i in ($a.size - Blue::Blue_max)...$a.size
  986.             a_temp[j] = $a[i]
  987.             j += 1
  988.           end  
  989.          $a = a_temp
  990.        end  
  991.         if $am.length < 54
  992.            $a[$a.size] = $am
  993.         else
  994.            while $am.length > 53
  995.              i = 53
  996.              while (/\W/ =~ $am[i-3,3]) != nil
  997.               i -= 1
  998.              end
  999.              $a[$a.size] = $am[0,i]
  1000.              $am = $am[i ,$am.length - i]
  1001.            end
  1002.            $a[$a.size] = $am
  1003.         end
  1004.        $am = nil
  1005.       end
  1006.   end
  1007.   def main
  1008.     $am = "队伍进入战斗!"
  1009.     bluefool_sort
  1010.     $game_temp.in_battle = true
  1011.     $game_temp.battle_turn = 0
  1012.     $game_temp.battle_event_flags.clear
  1013.     $game_temp.battle_abort = false
  1014.     $game_temp.battle_main_phase = false
  1015.     $game_temp.battleback_name = $game_map.battleback_name
  1016.     $game_temp.forcing_battler = nil
  1017.     $game_system.battle_interpreter.setup(nil, 0)
  1018.     @troop_id = $game_temp.battle_troop_id
  1019.     $game_troop.setup(@troop_id)
  1020.     #生成角色命令窗口
  1021.     s1 = $data_system.words.attack
  1022.     s2 = $data_system.words.skill
  1023.     s3 = $data_system.words.guard
  1024.     s4 = $data_system.words.item
  1025.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
  1026.     @actor_command_window.y = 160
  1027.     @actor_command_window.back_opacity = 160
  1028.     @actor_command_window.active = false
  1029.     @actor_command_window.visible = false
  1030.     # 生成其它窗口
  1031.     @party_command_window = Window_PartyCommand.new
  1032.     @help_window = Window_Help.new
  1033.     @help_window.back_opacity = 160
  1034.     @help_window.visible = false
  1035.     @status_window = Window_BattleStatus.new
  1036.     @message_window = Window_Message.new
  1037.     @down_window = Window_Down.new
  1038.     @down_window.y = Blue::BATAM_Y
  1039.     @down_window.z = @actor_command_window.z - 10
  1040.     # 生成活动块
  1041.     @spriteset = Spriteset_Battle.new
  1042.     # 初始化等待计数
  1043.     @wait_count = 0
  1044.     # 执行过渡
  1045.     if $data_system.battle_transition == ""
  1046.       Graphics.transition(20)
  1047.     else
  1048.       Graphics.transition(40, "Graphics/Transitions/" +
  1049.         $data_system.battle_transition)
  1050.     end
  1051.     # 开始自由战斗回合
  1052.     start_phase1
  1053.     # 主循环
  1054.     loop do
  1055.       Graphics.update
  1056.       Input.update
  1057.       update
  1058.       if $scene != self
  1059.         break
  1060.       end
  1061.     end
  1062.     # 刷新地图
  1063.     $game_map.refresh
  1064.     # 准备过渡
  1065.     Graphics.freeze
  1066.     # 释放窗口
  1067.     @actor_command_window.dispose
  1068.     @party_command_window.dispose
  1069.     @help_window.dispose
  1070.     @status_window.dispose
  1071.     @message_window.dispose
  1072.     @down_window.dispose
  1073.     $am = "战斗结束"
  1074.     bluefool_sort
  1075.     if @skill_window != nil
  1076.       @skill_window.dispose
  1077.     end
  1078.     if @item_window != nil
  1079.       @item_window.dispose
  1080.     end
  1081.     if @result_window != nil
  1082.       @result_window.dispose
  1083.     end
  1084.     # 释放活动块
  1085.     @spriteset.dispose
  1086.     # 标题画面切换中的情况
  1087.     if $scene.is_a?(Scene_Title)
  1088.       # 淡入淡出画面
  1089.       Graphics.transition
  1090.       Graphics.freeze
  1091.     end
  1092.     # 战斗测试或者游戏结束以外的画面切换中的情况
  1093.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  1094.       $scene = nil
  1095.     end
  1096.   end
  1097. end
  1098. #---------------------------------------------------------
  1099. class Interpreter
  1100.   def bluefool_sort
  1101.       if $am != nil
  1102.        if $a.size > Blue::NAM_MAX
  1103.           a_temp = {}
  1104.           j = 0
  1105.           for i in ($a.size - Blue::Blue_max)...$a.size
  1106.             a_temp[j] = $a[i]
  1107.             j += 1
  1108.           end  
  1109.          $a = a_temp
  1110.        end  
  1111.         if $am.length < 54
  1112.            $a[$a.size] = $am
  1113.         else
  1114.            while $am.length > 53
  1115.              i = 53
  1116.              while (/\W/ =~ $am[i-3,3]) != nil
  1117.               i -= 1
  1118.              end
  1119.              $a[$a.size] = $am[0,i]
  1120.              $am = $am[i ,$am.length - i]
  1121.            end
  1122.            $a[$a.size] = $am
  1123.         end
  1124.        $am = nil
  1125.       end
  1126.   end
  1127.   def command_101
  1128.     if $game_temp.message_text != nil
  1129.       return false
  1130.     end
  1131.     # 设置信息结束后待机和返回调用标志
  1132.     @message_waiting = true
  1133.     $game_temp.message_proc = Proc.new { @message_waiting = false }
  1134.     # message_text 设置为 1 行
  1135.     $game_temp.message_text = @list[@index].parameters[0] + "\n"
  1136.     if (@list[@index].parameters[0]).split(/\\/)[1] != nil
  1137.      $am = @list[@index].parameters[0].split(/\\/)[0]
  1138.      else
  1139.      $am = @list[@index].parameters[0]
  1140.     end  
  1141.     bluefool_sort
  1142.     line_count = 1
  1143.     # 循环
  1144.     loop do
  1145.       # 下一个事件指令为文章两行以上的情况
  1146.       if @list[@index+1].code == 401
  1147.         # message_text 添加到第 2 行以下
  1148.         $game_temp.message_text += @list[@index+1].parameters[0] + "\n"
  1149.         $am = @list[@index+1].parameters[0]
  1150.         bluefool_sort
  1151.         line_count += 1
  1152.       # 事件指令不在文章两行以下的情况
  1153.       else
  1154.         # 下一个事件指令为显示选择项的情况下
  1155.         if @list[@index+1].code == 102
  1156.           # 如果选择项能收纳在画面里
  1157.           if @list[@index+1].parameters[0].size <= 4 - line_count
  1158.             # 推进索引
  1159.             @index += 1
  1160.             # 设置选择项
  1161.             $game_temp.choice_start = line_count
  1162.             setup_choices(@list[@index].parameters)
  1163.           end
  1164.         # 下一个事件指令为处理输入数值的情况下
  1165.         elsif @list[@index+1].code == 103
  1166.           # 如果数值输入窗口能收纳在画面里
  1167.           if line_count < 4
  1168.             # 推进索引
  1169.             @index += 1
  1170.             # 设置输入数值
  1171.             $game_temp.num_input_start = line_count
  1172.             $game_temp.num_input_variable_id = @list[@index].parameters[0]
  1173.             $game_temp.num_input_digits_max = @list[@index].parameters[1]
  1174.           end
  1175.         end
  1176.         # 继续
  1177.         return true
  1178.       end
  1179.       # 推进索引
  1180.       @index += 1
  1181.     end
  1182.   end
  1183.   def command_125
  1184.     value = operate_value(@parameters[0], @parameters[1], @parameters[2])
  1185.     $game_party.gain_gold(value)
  1186.     if value >= 0
  1187.       $am = "#{$game_party.actors[0].name}得到了#{value}#{$data_system.words.gold}"
  1188.     else
  1189.       $am = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}#{$data_system.words.gold}"
  1190.     end  
  1191.     bluefool_sort
  1192.     Audio.se_play("Audio/SE/"+"006-System06",100,100)
  1193.     return true
  1194.   end
  1195.   def command_126
  1196.     value = operate_value(@parameters[1], @parameters[2], @parameters[3])
  1197.     # 增减物品
  1198.     $game_party.gain_item(@parameters[0], value)
  1199.     if value >= 0
  1200.       $am = "#{$game_party.actors[0].name}得到了#{value.abs.to_s}个#{$data_items[@parameters[0]].name}"
  1201.     else
  1202.       $am = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}个#{$data_items[@parameters[0]].name}"
  1203.     end
  1204.     bluefool_sort
  1205.     Audio.se_play("Audio/SE/"+"006-System06",100,100)
  1206.     return true
  1207.   end
  1208.   def command_127
  1209.     value = operate_value(@parameters[1], @parameters[2], @parameters[3])
  1210.     # 增减武器
  1211.     $game_party.gain_weapon(@parameters[0], value)
  1212.     if value >= 0
  1213.       $am = "#{$game_party.actors[0].name}得到了#{value.abs.to_s}个#{$data_weapons[@parameters[0]].name}"
  1214.     else
  1215.       $am = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}个#{$data_weapons[@parameters[0]].name}"
  1216.     end
  1217.     bluefool_sort
  1218.     Audio.se_play("Audio/SE/"+"006-System06",100,100)
  1219.     return true
  1220.   end
  1221.   def command_128
  1222.     value = operate_value(@parameters[1], @parameters[2], @parameters[3])
  1223.     # 增减防具
  1224.     $game_party.gain_armor(@parameters[0], value)
  1225.     if value >= 0
  1226.       $am = "#{$game_party.actors[0].name}得到了#{value.abs.to_s}个#{$data_armors[@parameters[0]].name}"
  1227.     else
  1228.       $am = "#{$game_party.actors[0].name}失去了#{value.abs.to_s}个#{$data_armors[@parameters[0]].name}"
  1229.     end
  1230.     bluefool_sort
  1231.     Audio.se_play("Audio/SE/"+"006-System06",100,100)
  1232.     return true
  1233.   end
  1234.   def command_129
  1235.     # 获取角色
  1236.     actor = $game_actors[@parameters[0]]
  1237.     # 角色有效的情况下
  1238.     if actor != nil
  1239.       # 操作分支
  1240.       if @parameters[1] == 0
  1241.         if @parameters[2] == 1
  1242.           $game_actors[@parameters[0]].setup(@parameters[0])
  1243.         end
  1244.         $game_party.add_actor(@parameters[0])
  1245.         Audio.me_play("Audio/ME/"+"002-Victory02",100,100)
  1246.         $am = "#{$game_actors[@parameters[0]].name}加入队伍!"
  1247.         bluefool_sort
  1248.       else
  1249.         $game_party.remove_actor(@parameters[0])
  1250.         Audio.me_play("Audio/ME/"+"015-Mystery01",100,100)
  1251.         $am = "#{$game_actors[@parameters[0]].name}离开队伍!"
  1252.         bluefool_sort
  1253.       end
  1254.     end
  1255.     # 继续
  1256.     return true
  1257.   end
  1258.   #-------------------------
  1259. end
  1260. #==============================================================================
  1261. # ■ Window_Down
  1262. #------------------------------------------------------------------------------
  1263. #   信息窗口。
  1264. #==============================================================================

  1265. class Window_Down < Window_Selectable
  1266.   #--------------------------------------------------------------------------
  1267.   # ● 初始化对像
  1268.   #--------------------------------------------------------------------------
  1269.   def initialize
  1270.     super(0, 240, 330, 240)
  1271.     @column_max = 1
  1272.     self.opacity = 0
  1273.     if $a != nil and $a.size < 21
  1274.       self.index = $a.size/2
  1275.       elsif $a != nil and $a.size > 20
  1276.       self.index = 9
  1277.     end  
  1278.     refresh
  1279.     self.active = false
  1280.   end
  1281.   #--------------------------------------------------------------------------
  1282.   # ● 刷新
  1283.   #--------------------------------------------------------------------------
  1284.   def refresh
  1285.     if self.contents != nil
  1286.       self.contents.dispose
  1287.       self.contents = nil
  1288.     end
  1289.     if $a != nil and $a.size < Blue::Blue_max + 1
  1290.       @item_max = $a.size
  1291.       elsif $a != nil and $a.size > Blue::Blue_max
  1292.       @item_max = Blue::Blue_max
  1293.     end  
  1294.     if @item_max > 0
  1295.       self.contents = Bitmap.new(width - 32, row_max * 16)
  1296.       for i in 0...@item_max
  1297.          draw_item(i)
  1298.       end
  1299.     end
  1300.   end
  1301.   def item_max
  1302.     return @item_max
  1303.   end  
  1304.   #--------------------------------------------------------------------------
  1305.   # ● 描绘项目
  1306.   #     index : 项目编号
  1307.   #--------------------------------------------------------------------------
  1308.   def draw_item(index)
  1309.     if $a.size < Blue::Blue_max + 1
  1310.      item = $a[index]
  1311.      else
  1312.      item = $a[index + $a.size - Blue::Blue_max]
  1313.     end
  1314.     x = 0
  1315.     y = index * 16
  1316.     self.contents.font.size = 14
  1317.     self.contents.font.color = Color.new(-170,-170,-170,255)
  1318.     self.contents.draw_text(x + 6, y + 1, self.contents.text_size(item).width, 16, item, 0)
  1319.     self.contents.font.color = normal_color
  1320.     self.contents.draw_text(x + 5, y, self.contents.text_size(item).width, 16, item, 0)
  1321.   end
  1322.   #--------------------------------------
  1323.   #  ● 刷新光标
  1324.   #--------------------------------------
  1325.   def update_cursor_rect
  1326.     # 光标位置不满 0 的情况下
  1327.     if @index < 0
  1328.       self.cursor_rect.empty
  1329.       return
  1330.     end
  1331.     # 获取当前的行
  1332.     row = @index / @column_max
  1333.     # 当前行被显示开头行前面的情况下
  1334.     if row < self.top_row
  1335.       # 从当前行向开头行滚动
  1336.       self.top_row = row
  1337.     end
  1338.     # 当前行被显示末尾行之后的情况下
  1339.     if row > self.top_row + (self.page_row_max - 1)
  1340.       # 从当前行向末尾滚动
  1341.       self.top_row = row - (self.page_row_max - 1)
  1342.     end
  1343.     # 计算光标的宽
  1344.     cursor_width = self.width / @column_max - 32
  1345.     cursor_width = 0
  1346.     # 计算光标坐标
  1347.     x = @index % @column_max * (cursor_width + 32)
  1348.     y = @index / @column_max * 32 - self.oy
  1349.     # 更新国标矩形
  1350.     self.cursor_rect.set(x, y, cursor_width, 16)
  1351.   end
  1352. end
复制代码
当然,还需要用到全键盘
范例贴如下:
http://rpg.blue/forum.php?mod=vi ... F%E7%BD%91%E6%B8%B8


【虽然被hx】

点评

虽然那个贴骂声一片【- -2个】但是真的有用,那贴的2l纯瞎眼 明明很好用……还和即时消息不一样……  发表于 2010-11-20 15:14
要不……来点奖赏???……囧~先看看回答吧  发表于 2010-11-20 15:09

Lv1.梦旅人

小小的百鬼夜行<

梦石
0
星屑
54
在线时间
579 小时
注册时间
2010-7-29
帖子
2682

贵宾

2
发表于 2010-11-20 20:50:26 | 只看该作者
嘛。。。我能弱弱地提供一下思路吗。
首先给每个事件增添一个触发属性
触发时,即时消息显示框显示什么NPC就显示啥文章吧- =
某只PHP/HTML小白鼠→退屈の间


Cause I knew you were trouble when you walked in
So shame is on me now
I flow me to place i ve never been
till you put me down oh
Now Im lying on the cold hard ground
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
93 小时
注册时间
2010-10-21
帖子
101
3
发表于 2010-11-21 08:20:09 | 只看该作者
弱弱的说下,最好在设定一个公共事件,是在玩家不按套路出牌时,输入的语句,就全部调用这个。。。。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
255
在线时间
227 小时
注册时间
2009-7-26
帖子
216
4
发表于 2010-11-21 08:26:15 | 只看该作者
这个……想法很强大……听起来是类似那种聊天机器人的机制……
个人觉得应该是做个能够接受玩家输入的框框……然后做个数据库记录什么主谓宾的……
把输入的文字和数据库中的做比较,然后给予相对应的答案……
(话说完全不知道怎么做那个“框框”,有没有人做过我也不知道,没研究过……)
不要吐槽我⋯⋯
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 05:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表