#============================================================================== # 本脚本来自www.66RPG.com,使用和转载请保留此信息 #============================================================================== #============================================================================== #合体技能系统v1.0 BY 绿发的Eclair #嗯...这个脚本可以相对完美地实现多人合力技能的效果。 #使用方法: #首先设定合体技能使用的成员,在数据库最后一页的“属性”中设定如下格式的属性: #合体技,第一个队员ID,第二个队员ID #记得一定要用英文逗号分隔“合体技”三个字和使用队员哦,不然会错。 #如果技能需要三人以上合力,只要在第二个队员ID后面继续添加一个半角逗号和第三个人的ID即可。 #PS:默认战斗超出4人以上的合体技能是一定用不鸟的- -|||具体原因在这脚本之中~~ #最后只要把想设定成合体技能的技能勾上这个属性就完成了,就这么简单。 #最后,和战斗类脚本发生冲突的可能性非常高,使用这个脚本之前最好找个技工帮忙(如果自己就是技工的话54这句8~) #============================================================================== #============================================================================== # ■ Game_chain #------------------------------------------------------------------------------ # - -|||一个伪造的battler模子.... #============================================================================== class Game_chain attr_accessor :atk attr_accessor :str attr_accessor :dex attr_accessor :agi attr_accessor :int attr_accessor :hit def initialize @atk = 0 @str = 0 @dex = 0 @agi = 0 @int = 0 @hit = 0 end end module RPG class Skill def chain_id use = [] for i in @element_set if $data_system.elements[i].split(/,/)[0] == "合体技" for j in 1...$data_system.elements[i].split(/,/).size use.push($data_system.elements[i].split(/,/)[j].to_i) end end end return use end end end #============================================================================== # ■ Scene_Battle (分割定义 4) #------------------------------------------------------------------------------ # 处理战斗画面的类。 #============================================================================== class Scene_Battle attr_accessor :phase #-------------------------------------------------------------------------- # ● 刷新画面画面 (角色命令回合 : 选择敌人) #-------------------------------------------------------------------------- def update_phase3_enemy_select # 刷新敌人箭头 @enemy_arrow.update # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 选择敌人结束 end_enemy_select return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 设置行动 @active_battler.current_action.target_index = @enemy_arrow.index #####################################################eclair if @skill_window != nil if @active_battler.current_action.kind == 1 and $data_skills[@active_battler.current_action.skill_id].chain_id != [] for i in $game_party.actors for j in $data_skills[@active_battler.current_action.skill_id].chain_id if i.id == j i.current_action.target_index = @enemy_arrow.index end end end end end #####################################################eclair # 选择敌人结束 end_enemy_select # 显示特技窗口中的情况下 if @skill_window != nil # 结束特技选择 end_skill_select end # 显示物品窗口的情况下 if @item_window != nil # 结束物品选择 end_item_select end # 转到下一位角色的指令输入 phase3_next_actor end end #-------------------------------------------------------------------------- # ● 设置角色指令窗口 #-------------------------------------------------------------------------- def phase3_setup_command_window ######################################################eclair if @active_battler.chain_id != 0 phase3_next_actor return end ######################################################eclair # 同伴指令窗口无效化 @party_command_window.active = false @party_command_window.visible = false # 角色指令窗口无效化 @actor_command_window.active = true @actor_command_window.visible = true # 设置角色指令窗口的位置 @actor_command_window.x = @actor_index * 160 # 设置索引为 0 @actor_command_window.index = 0 end #-------------------------------------------------------------------------- # ● 转向前一个角色的命令输入 #-------------------------------------------------------------------------- def phase3_prior_actor ######################################################eclair if $game_party.actors[@actor_index - 1].chain_id != 0 a = $game_party.actors[@actor_index - 1].chain_id b = [] for i in $game_party.actors i.blink = false if i.chain_id == a b.push(i.id) end end for j in b $game_actors[j].chain_id = 0 $game_actors[j].chain_over = false end @actor_index = b.min @active_battler = $game_party.actors[@actor_index] end ######################################################eclair # 循环 begin # 角色的明灭效果 OFF if @active_battler != nil @active_battler.blink = false end # 最初的角色的情况下 if @actor_index == 0 # 开始同伴指令回合 start_phase2 return end # 返回角色索引 @actor_index -= 1 @active_battler = $game_party.actors[@actor_index] @active_battler.blink = true # 如果角色是在无法接受指令的状态就再试 end until @active_battler.inputable? # 设置角色的命令窗口 phase3_setup_command_window end #-------------------------------------------------------------------------- # ● 刷新画面 (主回合步骤 1 : 准备行动) #-------------------------------------------------------------------------- def update_phase4_step1 # 隐藏帮助窗口 @help_window.visible = false # 判定胜败 if judge # 胜利或者失败的情况下 : 过程结束 return end # 强制行动的战斗者不存在的情况下 if $game_temp.forcing_battler == nil # 设置战斗事件 setup_battle_event # 执行战斗事件中的情况下 if $game_system.battle_interpreter.running? return end end # 强制行动的战斗者存在的情况下 if $game_temp.forcing_battler != nil # 在头部添加后移动 @action_battlers.delete($game_temp.forcing_battler) @action_battlers.unshift($game_temp.forcing_battler) end # 未行动的战斗者不存在的情况下 (全员已经行动) ##################################################eclair if @action_battlers.size == 0 for i in $game_party.actors i.chain_over = false i.chain_id = 0 end # 开始同伴命令回合 start_phase2 return end ##################################################eclair # 初始化动画 ID 和公共事件 ID @animation1_id = 0 @animation2_id = 0 @common_event_id = 0 # 未行动的战斗者移动到序列的头部 @active_battler = @action_battlers.shift # 如果已经在战斗之外的情况下 if @active_battler.index == nil return end # 连续伤害 if @active_battler.hp > 0 and @active_battler.slip_damage? @active_battler.slip_damage_effect @active_battler.damage_pop = true end # 自然解除状态 @active_battler.remove_states_auto # 刷新状态窗口 @status_window.refresh # 移至步骤 2 @phase4_step = 2 end #-------------------------------------------------------------------------- # ● 刷新画面 (角色命令回合 : 选择特技) #-------------------------------------------------------------------------- def update_phase3_skill_select # 设置特技窗口为可视状态 @skill_window.visible = true # 刷新特技窗口 @skill_window.update # 按下 B 键的情况下 if Input.trigger?(Input::B) # 演奏取消 SE $game_system.se_play($data_system.cancel_se) # 结束特技选择 end_skill_select return end # 按下 C 键的情况下 if Input.trigger?(Input::C) # 获取特技选择窗口现在选择的特技的数据 @skill = @skill_window.skill # 无法使用的情况下 if @skill == nil or not @active_battler.skill_can_use?(@skill.id) # 演奏冻结 SE $game_system.se_play($data_system.buzzer_se) return end # 演奏确定 SE $game_system.se_play($data_system.decision_se) # 设置行动 @active_battler.current_action.skill_id = @skill.id ####################################################eclair #设定合体技能ID if @active_battler.is_a?(Game_Actor) for i in $data_skills[@skill.id].chain_id for j in $game_party.actors if j.id == i j.current_action.kind = 1 j.chain_id = @skill.id end end end end ####################################################eclair # 设置特技窗口为不可见状态 @skill_window.visible = false # 效果范围是敌单体的情况下 if @skill.scope == 1 # 开始选择敌人 start_enemy_select # 效果范围是我方单体的情况下 elsif @skill.scope == 3 or @skill.scope == 5 # 开始选择角色 start_actor_select # 效果范围不是单体的情况下 else # 选择特技结束 end_skill_select # 转到下一位角色的指令输入 phase3_next_actor end return end end #-------------------------------------------------------------------------- # ● 生成特技行动结果 #-------------------------------------------------------------------------- def make_skill_action_result # 获取特技 @skill = $data_skills[@active_battler.current_action.skill_id] #################################################eclair if @active_battler.chain_over == true @help_window.visible = false @phase4_step = 1 return end if @active_battler.chain_id != 0 @skill = $data_skills[@active_battler.chain_id] @a = Game_chain.new for i in $data_skills[@skill.id].chain_id for j in $game_party.actors if j.id == i @a.atk += j.atk / @skill.chain_id.size @a.str += j.str / @skill.chain_id.size @a.dex += j.dex / @skill.chain_id.size @a.agi += j.agi / @skill.chain_id.size @a.int += j.int / @skill.chain_id.size @a.hit += j.hit / @skill.chain_id.size end end end end #################################################eclair # 如果不是强制行动 unless @active_battler.current_action.forcing # 因为 SP 耗尽而无法使用的情况下 unless @active_battler.skill_can_use?(@skill.id) # 清除强制行动对像的战斗者 $game_temp.forcing_battler = nil # 移至步骤 1 @phase4_step = 1 return end end # 消耗 SP ##################################################eclair if @skill.chain_id != [] for i in @skill.chain_id $game_actors[i].sp -= @skill.sp_cost end else @active_battler.sp -= @skill.sp_cost end ##################################################eclair # 刷新状态窗口 @status_window.refresh # 在帮助窗口显示特技名 @help_window.set_text(@skill.name, 1) # 设置动画 ID @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id # 设置公共事件 ID @common_event_id = @skill.common_event_id # 设置对像侧战斗者 set_target_battlers(@skill.scope) # 应用特技效果 #####################################################eclair if @active_battler.chain_id == 0 for target in @target_battlers target.skill_effect(@active_battler, @skill) end else for target in @target_battlers target.skill_effect(@a, @skill) end end ######################################################eclair end #-------------------------------------------------------------------------- # ● 刷新画面 (主回合步骤 3 : 行动方动画) #-------------------------------------------------------------------------- def update_phase4_step3 # 行动方动画 (ID 为 0 的情况下是白色闪烁) ####################################################eclair if @active_battler.chain_id == 0#1 if @animation1_id == 0#2 @active_battler.white_flash = true else @active_battler.animation_id = @animation1_id @active_battler.animation_hit = true end#2 else for i in $data_skills[@skill.id].chain_id#4 for j in $game_party.actors#5 if j.id == i#3 j.animation_id = $data_skills[@skill.id].animation1_id j.animation_hit = true end#3 end#4 end#5 end#1 ########################################################eclair # 移至步骤 4 @phase4_step = 4 end #-------------------------------------------------------------------------- # ● 刷新画面 (主回合步骤 5 : 显示伤害) #-------------------------------------------------------------------------- def update_phase4_step5 # 隐藏帮助窗口 @help_window.visible = false # 刷新状态窗口 @status_window.refresh # 显示伤害 for target in @target_battlers if target.damage != nil target.damage_pop = true end end #####################################################eclair if @active_battler.chain_id != 0 for i in $game_party.actors if i.chain_id == @active_battler.chain_id i.chain_over = true end end end #####################################################eclair # 移至步骤 6 @phase4_step = 6 end end #============================================================================== # ■ Game_Battler (分割定义 1) #------------------------------------------------------------------------------ # 处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的 # 超级类来使用。 #============================================================================== class Game_Battler attr_accessor :chain_id # 使用合体技能的ID attr_accessor :chain_over # 合体技能使用完毕的标志 alias initialize_c initialize def initialize initialize_c @chain_id = 0 @chain_over = false end #-------------------------------------------------------------------------- # ● 可以使用特技的判定 # skill_id : 特技 ID #-------------------------------------------------------------------------- def skill_can_use?(skill_id) # SP 不足的情况下不能使用 if $data_skills[skill_id].sp_cost > self.sp return false end # 战斗不能的情况下不能使用 if dead? return false end # 沉默状态的情况下、物理特技以外的特技不能使用 if $data_skills[skill_id].atk_f == 0 and self.restriction == 1 return false end ###################################################eclair if $data_skills[skill_id].chain_id != [] and self.is_a?(Game_Actor) for i in $data_skills[skill_id].chain_id return false if !$game_party.actors.include?($game_actors[i]) return false if !$game_actors[i].movable? or !$game_actors[i].inputable? or $game_actors[i].dead? return false if $game_actors[i].chain_id != 0 and ($game_actors[i].sp < $data_skills[skill_id].sp_cost) return false if $game_actors[i].chain_id != 0 && skill_id and $scene.phase != 4 end end ##################################################eclair # 获取可以使用的时机 occasion = $data_skills[skill_id].occasion # 战斗中的情况下 if $game_temp.in_battle # [平时] 或者是 [战斗中] 可以使用 return (occasion == 0 or occasion == 1) # 不是战斗中的情况下 else # [平时] 或者是 [菜单中] 可以使用 return (occasion == 0 or occasion == 2) end end end #============================================================================== # 本脚本来自www.66RPG.com,使用和转载请保留此信息 #============================================================================== 范例: http://bbs.66rpg.com/UP_PIC/200801/合体技能.rar
|