Project1

标题: 战斗换人脚本,怎样在战斗中临时更改出战的人数? [打印本页]

作者: 幻耶    时间: 2011-9-28 09:28
标题: 战斗换人脚本,怎样在战斗中临时更改出战的人数?
本帖最后由 幻耶 于 2011-9-28 11:18 编辑

战斗中换人脚本,如何在游戏的战斗中更改出战的人数?例如缺省出战人数最多2个,当打开某个开关,出战人数可以达到3个,关闭开关,出战人数恢复2个,在脚本开头改成下面这样会出错

  if $game_switches[1] == true
  MaxBattlerSize = 3
else
  MaxBattlerSize = 2
end


战斗中换人脚本:
  1. module LimBattlePlug
  2. # 队伍最大人数
  3. MaxPartySize = 8
  4. # 出战人数
  5. MaxBattlerSize = 2
  6. # 换人语句
  7. WordChangeBattler = "换人"
  8. # 换人时播放的动画
  9. AnimationChangeBattler = 26
  10. end

  11. class Game_BattleAction
  12.   attr_accessor :change_to_battler
  13.   # 初始化
  14.   alias lbp_initialize initialize
  15.   def initialize
  16.     lbp_initialize
  17.     @change_to_battler = 0
  18.   end
  19.   # 欲更换角色编号
  20.   def set_change_battler
  21.     @kind = 3
  22.   end
  23.   # 判断行动是否为更换角色
  24.   def is_change_battler?
  25.     return (@kind == 3)
  26.   end
  27. end

  28. class Game_Party
  29.   include LimBattlePlug
  30.   attr_reader :actors2
  31.   alias lpb_initialize initialize
  32.   def initialize
  33.     lpb_initialize
  34.     @actors2 = []
  35.   end
  36.   # 角色加入
  37.   def add_actor(actor_id)
  38.     actor = $game_actors[actor_id]
  39.     if @actors.size < MaxPartySize and not @actors.include?(actor)
  40.       @actors.push(actor)
  41.       $game_player.refresh
  42.     end
  43.   end
  44.   # 设置战斗的角色
  45.   def set_actor_to_battle
  46.     @actors2 = []
  47.     @actors.each do |actor|
  48.       @actors2.push(actor)
  49.     end
  50.     @actors = []
  51.     dead_actor = []
  52.     @actors2.each do |actor|
  53.       if !actor.dead?
  54.         @actors.push(actor)
  55.       else
  56.         dead_actor.push(actor)
  57.       end
  58.       break if @actors.size == MaxBattlerSize
  59.     end
  60.     if @actors.size < MaxBattlerSize
  61.       for actor in dead_actor
  62.         @actors.push(actor)
  63.         break if @actors.size == MaxBattlerSize
  64.       end
  65.     end
  66.   end
  67.   # 还原战斗的角色
  68.   def set_actor_to_normal
  69.     @actors = []
  70.     @actors2.each do |actor|
  71.       @actors.push(actor)
  72.     end
  73.   end
  74.   # 获取角色id数组
  75.   def get_actors_id
  76.     id = []
  77.     @actors.each{|actor|id.push(actor.id)}
  78.     return id
  79.   end
  80.   # 获取角色id数组
  81.   def get_actors2_id
  82.     id = []
  83.     @actors2.each{|actor|id.push(actor.id)}
  84.     return id
  85.   end
  86.   # 兑换角色
  87.   def change_actor(index,id)
  88.     @actors[index] = $game_actors[id]
  89.   end
  90.   # 全灭判定
  91.   def all_dead?
  92.     # 同伴人数为 0 的情况下
  93.     if $game_party.actors.size == 0
  94.       return false
  95.     end
  96.     # 同伴中无人 HP 在 0 以上
  97.     for actor in @actors2
  98.       if actor.hp > 0
  99.         return false
  100.       end
  101.     end
  102.     for actor in @actors
  103.       if actor.hp > 0
  104.         return false
  105.       end
  106.     end
  107.     # 全灭
  108.     return true
  109.   end
  110.   # 其他角色
  111.   def other_actors
  112.     actors = []
  113.     @actors2.each{|actor|actors.push(actor) if [email protected]?(actor)}
  114.     return actors
  115.   end
  116.   # 角色位置互换
  117.   def change_actor_pos(id1,id2)
  118.     actor_id = []
  119.     @actors.each do |actor|
  120.       actor_id.push(actor.id)
  121.     end
  122.     return if !actor_id.include?(id1) and !actor_id.include?(id2)
  123.     id1_index = id2_index = -1
  124.     (0...actor_id.size).each do |i|
  125.       if actor_id[i] == id1
  126.         id1_index = i
  127.       elsif actor_id[i] == id2
  128.         id2_index = i
  129.       end
  130.     end
  131.     temp_actor = @actors[id1_index]
  132.     @actors[id1_index] = @actors[id2_index]
  133.     @actors[id2_index] = temp_actor
  134.   end
  135. end

  136. class Window_Actor < Window_Selectable
  137.   # 初始化
  138.   def initialize
  139.     super(0,64,640,256)
  140.     self.back_opacity = 160
  141.     refresh
  142.     self.index = -1
  143.     self.active = false
  144.   end
  145.   # 刷新
  146.   def refresh
  147.     @item_max = $game_party.actors2.size
  148.     @data = []
  149.     $game_party.actors.each do |actor|
  150.       @data.push(actor)
  151.     end
  152.     $game_party.actors2.each do |actor|
  153.       @data.push(actor) if [email protected]?(actor)
  154.     end
  155.     if self.contents != nil
  156.       self.contents.clear
  157.       self.contents = nil
  158.     end
  159.     self.contents = Bitmap.new(608,@data.size*32)
  160.     x = 4
  161.     y = 0
  162.     @data.each do |actor|
  163.       bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
  164.       rect = Rect.new(0,0,bitmap.width/4,31)
  165.       self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)
  166.       draw_actor_name(actor,x+36,y)
  167.       draw_actor_state(actor,156,y)
  168.       draw_actor_hp(actor,x+256,y,96)
  169.       draw_actor_sp(actor,x+376,y,96)
  170.       if $game_party.actors.include?(actor)
  171.         self.contents.font.color = text_color(6)
  172.         cword = "出战"
  173.       else
  174.         self.contents.font.color = text_color(0)
  175.         cword = "待战"
  176.       end
  177.       self.contents.draw_text(x+496,y,60,32,cword)
  178.       y += 32
  179.     end
  180.   end
  181.   # 获取当前角色编号
  182.   def actor_id
  183.     return @data[self.index].id
  184.   end
  185.   # 刷新帮助
  186.   def update_help
  187.     @help_window.set_text(@data[self.index] == nil ?\
  188.                           "" : @data[self.index].name)
  189.   end
  190. end

  191. class Scene_Battle
  192.   include LimBattlePlug
  193.   # 初始化
  194.   def initialize
  195.     $game_party.set_actor_to_battle
  196.   end
  197.   # 主处理
  198.   def main
  199.     # 初始化战斗用的各种暂时数据
  200.     $game_temp.in_battle = true
  201.     $game_temp.battle_turn = 0
  202.     $game_temp.battle_event_flags.clear
  203.     $game_temp.battle_abort = false
  204.     $game_temp.battle_main_phase = false
  205.     $game_temp.battleback_name = $game_map.battleback_name
  206.     $game_temp.forcing_battler = nil
  207.     # 初始化战斗用事件解释器
  208.     $game_system.battle_interpreter.setup(nil, 0)
  209.     # 准备队伍
  210.     @troop_id = $game_temp.battle_troop_id
  211.     $game_troop.setup(@troop_id)
  212.     # 生成角色命令窗口
  213.     s1 = $data_system.words.attack
  214.     s2 = $data_system.words.skill
  215.     s3 = $data_system.words.guard
  216.     s4 = $data_system.words.item
  217.     s5 = WordChangeBattler
  218.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4,s5])
  219.     @actor_command_window.y = 128
  220.     @actor_command_window.back_opacity = 160
  221.     @actor_command_window.active = false
  222.     @actor_command_window.visible = false
  223.     # 生成其它窗口
  224.     @party_command_window = Window_PartyCommand.new
  225.     @help_window = Window_Help.new
  226.     @help_window.back_opacity = 160
  227.     @help_window.visible = false
  228.     @status_window = Window_BattleStatus.new
  229.     @message_window = Window_Message.new
  230.     # 生成活动块
  231.     @spriteset = Spriteset_Battle.new
  232.     # 初始化等待计数
  233.     @wait_count = 0
  234.     # 执行过渡
  235.     if $data_system.battle_transition == ""
  236.       Graphics.transition(20)
  237.     else
  238.       Graphics.transition(40, "Graphics/Transitions/" +
  239.         $data_system.battle_transition)
  240.     end
  241.     # 开始自由战斗回合
  242.     start_phase1
  243.     # 主循环
  244.     loop do
  245.       # 刷新游戏画面
  246.       Graphics.update
  247.       # 刷新输入信息
  248.       Input.update
  249.       # 刷新画面
  250.       update
  251.       # 如果画面切换的话就中断循环
  252.       if $scene != self
  253.         break
  254.       end
  255.     end
  256.     # 刷新地图
  257.     $game_map.refresh
  258.     # 准备过渡
  259.     Graphics.freeze
  260.     # 释放窗口
  261.     @actor_command_window.dispose
  262.     @party_command_window.dispose
  263.     @help_window.dispose
  264.     @status_window.dispose
  265.     @message_window.dispose
  266.     if @skill_window != nil
  267.       @skill_window.dispose
  268.     end
  269.     if @item_window != nil
  270.       @item_window.dispose
  271.     end
  272.     if @actor_window != nil
  273.       @actor_window.dispose
  274.     end
  275.     if @result_window != nil
  276.       @result_window.dispose
  277.     end
  278.     # 释放活动块
  279.     @spriteset.dispose
  280.     # 标题画面切换中的情况
  281.     if $scene.is_a?(Scene_Title)
  282.       # 淡入淡出画面
  283.       Graphics.transition
  284.       Graphics.freeze
  285.     end
  286.     # 战斗测试或者游戏结束以外的画面切换中的情况
  287.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  288.       $scene = nil
  289.     end
  290.   end
  291.   # 战斗结束
  292.   alias lpb_battle_end battle_end
  293.   def battle_end(n)
  294.     lpb_battle_end(n)
  295.     $game_party.set_actor_to_normal
  296.    
  297.     # XXOO 解除战斗用状态(中途换下的队员)
  298.     for actor in $game_party.actors2
  299.       actor.remove_states_battle
  300.     end
  301.    
  302.   end
  303.   # 开始回合3
  304.   alias lbp_start_phase3 start_phase3
  305.   def start_phase3
  306.     @changed_battler_id = []
  307.     lbp_start_phase3
  308.   end
  309.   # 刷新角色命令回合画面
  310.   def update_phase3
  311.     # 敌人光标有效的情况下
  312.     if @enemy_arrow != nil
  313.       update_phase3_enemy_select
  314.     # 角色光标有效的情况下
  315.     elsif @actor_arrow != nil
  316.       update_phase3_actor_select
  317.     # 特技窗口有效的情况下
  318.     elsif @skill_window != nil
  319.       update_phase3_skill_select
  320.     # 物品窗口有效的情况下
  321.     elsif @item_window != nil
  322.       update_phase3_item_select
  323.     elsif @actor_window != nil
  324.       update_phase3_battler_select
  325.     # 角色指令窗口有效的情况下
  326.     elsif @actor_command_window.active
  327.       update_phase3_basic_command
  328.     end
  329.   end
  330.   # 角色基本命令
  331.   def update_phase3_basic_command
  332.     # 按下 B 键的情况下
  333.     if Input.trigger?(Input::B)
  334.       # 演奏取消 SE
  335.       $game_system.se_play($data_system.cancel_se)
  336.       # 转向前一个角色的指令输入
  337.       phase3_prior_actor
  338.       return
  339.     end
  340.     # 按下 C 键的情况下
  341.     if Input.trigger?(Input::C)
  342.       # 角色指令窗口光标位置分之
  343.       case @actor_command_window.index
  344.       when 0  # 攻击
  345.         # 演奏确定 SE
  346.         $game_system.se_play($data_system.decision_se)
  347.         # 设置行动
  348.         @active_battler.current_action.kind = 0
  349.         @active_battler.current_action.basic = 0
  350.         # 开始选择敌人
  351.         start_enemy_select
  352.       when 1  # 特技
  353.         # 演奏确定 SE
  354.         $game_system.se_play($data_system.decision_se)
  355.         # 设置行动
  356.         @active_battler.current_action.kind = 1
  357.         # 开始选择特技
  358.         start_skill_select
  359.       when 2  # 防御
  360.         # 演奏确定 SE
  361.         $game_system.se_play($data_system.decision_se)
  362.         # 设置行动
  363.         @active_battler.current_action.kind = 0
  364.         @active_battler.current_action.basic = 1
  365.         # 转向下一位角色的指令输入
  366.         phase3_next_actor
  367.       when 3  # 物品
  368.         # 演奏确定 SE
  369.         $game_system.se_play($data_system.decision_se)
  370.         # 设置行动
  371.         @active_battler.current_action.kind = 2
  372.         # 开始选择物品
  373.         start_item_select
  374.       when 4 # 换人
  375.         $game_system.se_play($data_system.decision_se)
  376.         @active_battler.current_action.set_change_battler
  377.         start_battler_select
  378.       end
  379.       return
  380.     end
  381.   end
  382.   # 开始角色选择
  383.   def start_battler_select
  384.     @actor_window = Window_Actor.new
  385.     @actor_window.active = true
  386.     @actor_window.index = 0
  387.     @actor_window.help_window = @help_window
  388.     @actor_command_window.active = false
  389.     @actor_command_window.visible = false
  390.   end
  391.   # 结束角色选择
  392.   def end_battler_select
  393.     @actor_window.dispose
  394.     @actor_window = nil
  395.     @help_window.visible = false
  396.     @actor_command_window.active = true
  397.     @actor_command_window.visible = true
  398.   end
  399.   # 刷新角色选择
  400.   def update_phase3_battler_select
  401.     @actor_window.visible = true
  402.     @actor_window.update
  403.     if Input.trigger?(Input::B)
  404.       $game_system.se_play($data_system.cancel_se)
  405.       end_battler_select
  406.       return
  407.     end
  408.     if Input.trigger?(Input::C)
  409.       actor_id = @actor_window.actor_id
  410.       if $game_party.get_actors_id.include?(actor_id) or
  411.          $game_actors[actor_id].dead? or
  412.          @changed_battler_id.include?(actor_id)
  413.         $game_system.se_play($data_system.buzzer_se)
  414.         return
  415.       end
  416.       $game_system.se_play($data_system.decision_se)
  417.       @active_battler.current_action.change_to_battler = actor_id
  418.       @changed_battler_id.push(actor_id)
  419.       end_battler_select
  420.       phase3_next_actor
  421.       return
  422.     end
  423.   end
  424.   # 行动方动画
  425.   def update_phase4_step3
  426.     if @active_battler.current_action.is_change_battler?
  427.       @animation1_id = AnimationChangeBattler
  428.       @target_battlers = []
  429.     end
  430.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)
  431.     if @animation1_id == 0
  432.       @active_battler.white_flash = true
  433.     else
  434.       @active_battler.animation_id = @animation1_id
  435.       @active_battler.animation_hit = true
  436.     end
  437.     # 移至步骤 4
  438.     @phase4_step = 4
  439.   end
  440.   # 对象方动画
  441.   def update_phase4_step4
  442.     if @active_battler.current_action.is_change_battler?
  443.       actor1_id = @active_battler.current_action.change_to_battler
  444.       actor2_id = @active_battler.id
  445.       (0...$game_party.actors.size).each do |i|
  446.         if $game_party.actors[i].id == actor2_id
  447.           $game_party.change_actor(i,actor1_id)
  448.           @active_battler = $game_actors[actor1_id]
  449.           @status_window.refresh
  450.         end
  451.       end
  452.     end
  453.     # 对像方动画
  454.     for target in @target_battlers
  455.       target.animation_id = @animation2_id
  456.       target.animation_hit = (target.damage != "Miss")
  457.     end
  458.     # 限制动画长度、最低 8 帧
  459.     @wait_count = 8
  460.     # 移至步骤 5
  461.     @phase4_step = 5
  462.   end
  463.   # 公共事件
  464.   def update_phase4_step6
  465.     @target_battlers.each do |target|
  466.       if target.is_a?(Game_Actor) and target.dead? and
  467.          !$game_party.other_actors.all?{|actor|actor.dead?}
  468.         @actor_window = Window_Actor.new
  469.         @actor_window.index = 0
  470.         @actor_window.active = true
  471.         @actor_window.help_window = @help_window
  472.         actor_id = -1
  473.         loop do
  474.           Graphics.update
  475.           Input.update
  476.           @actor_window.update
  477.           if Input.trigger?(Input::C)
  478.             actor = $game_actors[@actor_window.actor_id]
  479.             if actor.dead? or
  480.                (@changed_battler_id.include?(actor.id) and
  481.                 target.current_action.change_to_battler != actor.id) or
  482.                $game_party.actors.include?(actor)
  483.               $game_system.se_play($data_system.buzzer_se)
  484.             else
  485.               actor_id = actor.id
  486.             end
  487.           end
  488.           break if actor_id >= 0
  489.         end
  490.         @actor_window.visible = false
  491.         @actor_window.dispose
  492.         @actor_window = nil
  493.         @help_window.visible = false
  494.         (0...$game_party.actors.size).each do |i|
  495.           if $game_party.actors[i].id == target.id
  496.             $game_party.change_actor(i,actor_id)
  497.             @status_window.refresh
  498.           end
  499.         end
  500.       end
  501.     end
  502.     # 清除强制行动对像的战斗者
  503.     $game_temp.forcing_battler = nil
  504.     # 公共事件 ID 有效的情况下
  505.     if @common_event_id > 0
  506.       # 设置事件
  507.       common_event = $data_common_events[@common_event_id]
  508.       $game_system.battle_interpreter.setup(common_event.list, 0)
  509.     end
  510.     # 移至步骤 1
  511.     @phase4_step = 1
  512.   end
  513. end

  514. class Window_MenuStatus
  515.   def refresh
  516.     self.contents.clear
  517.     @item_max = $game_party.actors.size
  518.     for i in 0...$game_party.actors.size
  519.       x = 4
  520.       y = i * 32
  521.       actor = $game_party.actors[i]
  522.       bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
  523.       rect = Rect.new(0,0,bitmap.width/4,31)
  524.       self.contents.blt(x+16-bitmap.width/8,y,bitmap,rect)
  525.       draw_actor_name(actor, x+36, y)
  526.       draw_actor_state(actor, x + 136,y)
  527.       draw_actor_hp(actor, x + 236, y,96)
  528.       draw_actor_sp(actor, x + 336, y,96)
  529.     end
  530.   end
  531.   def update_cursor_rect
  532.     super
  533.   end
  534. end
复制代码
dsu_plus_rewardpost_czw
作者: yu1989com    时间: 2011-9-28 10:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: 幻耶    时间: 2011-9-28 10:32
yu1989com 发表于 2011-9-28 10:25
把你那个脚本删掉,试试这个脚本,简单实用易于修改!

我这两个脚本都用了,一个用于战斗时换人,一个用于人物顺序调整,但我要求的是在游戏中自由更改出战的人数!
作者: 嘀嘀吧吧~Wu    时间: 2011-9-28 19:28
搜索 MaxBattlerSize ,if $game_switches[1] == true的时候,MaxBattlerSize全部改成MaxBattlerSize +1

作者: 各种压力的猫君    时间: 2011-9-28 22:48
本帖最后由 各种压力的猫君 于 2011-9-28 22:48 编辑

对常量进行重新赋值当然会报错……
最起码看完F1帮助里的基础篇关于常量变量的讲解部分啊 = = b
们都当帮助是摆设么 =.=




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1