Project1

标题: 组合技能如何弄 [打印本页]

作者: 唐小航    时间: 2011-8-31 17:27
标题: 组合技能如何弄
如 热血物语rm 地狱双龙dsu_plus_rewardpost_czw
作者: 萨绯罗斯    时间: 2011-8-31 18:08
  1. #==============================================================================
  2. #合体技能系统v1.0 BY 绿发的Eclair
  3. #嗯...这个脚本可以相对完美地实现多人合力技能的效果。
  4. #使用方法:
  5. #首先设定合体技能使用的成员,在数据库最后一页的“属性”中设定如下格式的属性:
  6. #合体技,第一个队员ID,第二个队员ID
  7. #记得一定要用英文逗号分隔“合体技”三个字和使用队员哦,不然会错。
  8. #如果技能需要三人以上合力,只要在第二个队员ID后面继续添加一个半角逗号和第三个人的ID即可。
  9. #PS:默认战斗超出4人以上的合体技能是一定用不鸟的- -|||具体原因在这脚本之中~~
  10. #最后只要把想设定成合体技能的技能勾上这个属性就完成了,就这么简单。
  11. #最后,和战斗类脚本发生冲突的可能性非常高,使用这个脚本之前最好找个技工帮忙(如果自己就是技工的话54这句8~)
  12. #==============================================================================

  13. #==============================================================================
  14. # ■ Game_chain
  15. #------------------------------------------------------------------------------
  16. #  - -|||一个伪造的battler模子....
  17. #==============================================================================
  18. class Game_chain
  19.   attr_accessor :atk
  20.   attr_accessor :str
  21.   attr_accessor :dex
  22.   attr_accessor :agi
  23.   attr_accessor :int
  24.   attr_accessor :hit
  25.   def initialize
  26.     @atk = 0
  27.     @str = 0
  28.     @dex = 0
  29.     @agi = 0
  30.     @int = 0
  31.     @hit = 0
  32.   end
  33. end
  34. module RPG
  35.   class Skill
  36.     def chain_id
  37.       use = []
  38.       for i in @element_set
  39.         if $data_system.elements[i].split(/,/)[0] == "合体技"
  40.           for j in 1...$data_system.elements[i].split(/,/).size
  41.             use.push($data_system.elements[i].split(/,/)[j].to_i)
  42.           end
  43.         end
  44.       end
  45.       return use
  46.     end
  47.   end
  48. end
  49. #==============================================================================
  50. # ■ Scene_Battle (分割定义 4)
  51. #------------------------------------------------------------------------------
  52. #  处理战斗画面的类。
  53. #==============================================================================

  54. class Scene_Battle
  55.   attr_accessor :phase
  56.   #--------------------------------------------------------------------------
  57.   # ● 刷新画面画面 (角色命令回合 : 选择敌人)
  58.   #--------------------------------------------------------------------------
  59.   def update_phase3_enemy_select
  60.     # 刷新敌人箭头
  61.     @enemy_arrow.update
  62.     # 按下 B 键的情况下
  63.     if Input.trigger?(Input::B)
  64.       # 演奏取消 SE
  65.       $game_system.se_play($data_system.cancel_se)
  66.       # 选择敌人结束
  67.       end_enemy_select
  68.       return
  69.     end
  70.     # 按下 C 键的情况下
  71.     if Input.trigger?(Input::C)
  72.       # 演奏确定 SE
  73.       $game_system.se_play($data_system.decision_se)
  74.       # 设置行动
  75.       @active_battler.current_action.target_index = @enemy_arrow.index
  76.       #####################################################eclair
  77.         if @skill_window != nil
  78.         if @active_battler.current_action.kind == 1 and $data_skills[@active_battler.current_action.skill_id].chain_id != []
  79.         for i in $game_party.actors
  80.       
  81.       for j in $data_skills[@active_battler.current_action.skill_id].chain_id
  82.           if i.id == j
  83.           i.current_action.target_index = @enemy_arrow.index
  84.           end
  85.         end
  86.         end
  87.       end
  88.       end
  89.       #####################################################eclair
  90.       
  91.       # 选择敌人结束
  92.       end_enemy_select
  93.       # 显示特技窗口中的情况下
  94.       if @skill_window != nil
  95.         # 结束特技选择
  96.         end_skill_select
  97.       end
  98.       # 显示物品窗口的情况下
  99.       if @item_window != nil
  100.         # 结束物品选择
  101.         end_item_select
  102.       end
  103.       # 转到下一位角色的指令输入
  104.       phase3_next_actor
  105.     end
  106.   end

  107.   #--------------------------------------------------------------------------
  108.   # ● 设置角色指令窗口
  109.   #--------------------------------------------------------------------------
  110.   def phase3_setup_command_window
  111.     ######################################################eclair
  112.     if @active_battler.chain_id != 0
  113.       phase3_next_actor
  114.       return
  115.     end
  116.     ######################################################eclair
  117.     # 同伴指令窗口无效化
  118.     @party_command_window.active = false
  119.     @party_command_window.visible = false
  120.     # 角色指令窗口无效化
  121.     @actor_command_window.active = true
  122.     @actor_command_window.visible = true
  123.     # 设置角色指令窗口的位置
  124.     @actor_command_window.x = @actor_index * 160
  125.     # 设置索引为 0
  126.     @actor_command_window.index = 0
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ● 转向前一个角色的命令输入
  130.   #--------------------------------------------------------------------------
  131.   def phase3_prior_actor
  132.     ######################################################eclair
  133.     if $game_party.actors[@actor_index - 1].chain_id != 0
  134.     a = $game_party.actors[@actor_index - 1].chain_id
  135.     b = []
  136.     for i in $game_party.actors
  137.       i.blink = false
  138.       if i.chain_id == a
  139.       b.push(i.id)
  140.       end
  141.     end
  142.     for j in b
  143.       $game_actors[j].chain_id = 0
  144.       $game_actors[j].chain_over = false
  145.     end
  146.     @actor_index = b.min
  147.     @active_battler = $game_party.actors[@actor_index]
  148.     end  
  149.     ######################################################eclair
  150.     # 循环
  151.     begin
  152.       # 角色的明灭效果 OFF
  153.       if @active_battler != nil
  154.         @active_battler.blink = false
  155.       end
  156.       # 最初的角色的情况下
  157.       if @actor_index == 0
  158.         # 开始同伴指令回合
  159.         start_phase2
  160.         return
  161.       end
  162.       # 返回角色索引
  163.       @actor_index -= 1
  164.       @active_battler = $game_party.actors[@actor_index]
  165.       @active_battler.blink = true
  166.     # 如果角色是在无法接受指令的状态就再试
  167.     end until @active_battler.inputable?
  168.     # 设置角色的命令窗口
  169.     phase3_setup_command_window
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 刷新画面 (主回合步骤 1 : 准备行动)
  173.   #--------------------------------------------------------------------------
  174.   def update_phase4_step1
  175.     # 隐藏帮助窗口
  176.     @help_window.visible = false
  177.     # 判定胜败
  178.     if judge
  179.       # 胜利或者失败的情况下 : 过程结束
  180.       return
  181.     end
  182.     # 强制行动的战斗者不存在的情况下
  183.     if $game_temp.forcing_battler == nil
  184.       # 设置战斗事件
  185.       setup_battle_event
  186.       # 执行战斗事件中的情况下
  187.       if $game_system.battle_interpreter.running?
  188.         return
  189.       end
  190.     end
  191.     # 强制行动的战斗者存在的情况下
  192.     if $game_temp.forcing_battler != nil
  193.       # 在头部添加后移动
  194.       @action_battlers.delete($game_temp.forcing_battler)
  195.       @action_battlers.unshift($game_temp.forcing_battler)
  196.     end
  197.     # 未行动的战斗者不存在的情况下 (全员已经行动)
  198.     ##################################################eclair
  199.     if @action_battlers.size == 0
  200.       for i in $game_party.actors
  201.         i.chain_over = false
  202.         i.chain_id = 0
  203.       end
  204.       # 开始同伴命令回合
  205.       start_phase2
  206.       return
  207.     end
  208.     ##################################################eclair
  209.     # 初始化动画 ID 和公共事件 ID
  210.     @animation1_id = 0
  211.     @animation2_id = 0
  212.     @common_event_id = 0
  213.     # 未行动的战斗者移动到序列的头部
  214.     @active_battler = @action_battlers.shift
  215.     # 如果已经在战斗之外的情况下
  216.     if @active_battler.index == nil
  217.       return
  218.     end
  219.     # 连续伤害
  220.     if @active_battler.hp > 0 and @active_battler.slip_damage?
  221.       @active_battler.slip_damage_effect
  222.       @active_battler.damage_pop = true
  223.     end
  224.     # 自然解除状态
  225.     @active_battler.remove_states_auto
  226.     # 刷新状态窗口
  227.     @status_window.refresh
  228.     # 移至步骤 2
  229.     @phase4_step = 2
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 刷新画面 (角色命令回合 : 选择特技)
  233.   #--------------------------------------------------------------------------
  234.   def update_phase3_skill_select
  235.     # 设置特技窗口为可视状态
  236.     @skill_window.visible = true
  237.     # 刷新特技窗口
  238.     @skill_window.update
  239.     # 按下 B 键的情况下
  240.     if Input.trigger?(Input::B)
  241.       # 演奏取消 SE
  242.       $game_system.se_play($data_system.cancel_se)
  243.       # 结束特技选择
  244.       end_skill_select
  245.       return
  246.     end
  247.     # 按下 C 键的情况下
  248.     if Input.trigger?(Input::C)
  249.       # 获取特技选择窗口现在选择的特技的数据
  250.       @skill = @skill_window.skill
  251.       # 无法使用的情况下
  252.       if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
  253.         # 演奏冻结 SE
  254.         $game_system.se_play($data_system.buzzer_se)
  255.         return
  256.       end
  257.       # 演奏确定 SE
  258.       $game_system.se_play($data_system.decision_se)
  259.       # 设置行动
  260.       @active_battler.current_action.skill_id = @skill.id
  261.       ####################################################eclair
  262.       #设定合体技能ID
  263.       if @active_battler.is_a?(Game_Actor)
  264.         for i in $data_skills[@skill.id].chain_id
  265.         for j in $game_party.actors
  266.           if j.id == i
  267.           j.current_action.kind = 1
  268.           j.chain_id = @skill.id   
  269.           end
  270.           end
  271.         end
  272.       end
  273.       ####################################################eclair
  274.       # 设置特技窗口为不可见状态
  275.       @skill_window.visible = false
  276.       # 效果范围是敌单体的情况下
  277.       if @skill.scope == 1
  278.         # 开始选择敌人
  279.         start_enemy_select
  280.       # 效果范围是我方单体的情况下
  281.       elsif @skill.scope == 3 or @skill.scope == 5
  282.         # 开始选择角色
  283.         start_actor_select
  284.       # 效果范围不是单体的情况下
  285.       else
  286.         # 选择特技结束
  287.         end_skill_select
  288.         # 转到下一位角色的指令输入
  289.         phase3_next_actor
  290.       end
  291.       return
  292.     end
  293.     end
  294.   #--------------------------------------------------------------------------
  295.   # ● 生成特技行动结果
  296.   #--------------------------------------------------------------------------
  297.   def make_skill_action_result
  298.     # 获取特技
  299.     @skill = $data_skills[@active_battler.current_action.skill_id]
  300.     #################################################eclair
  301.     if @active_battler.chain_over == true
  302.     @help_window.visible = false
  303.     @phase4_step = 1
  304.     return
  305.   end
  306.   
  307.     if @active_battler.chain_id != 0
  308.     @skill = $data_skills[@active_battler.chain_id]
  309.     @a = Game_chain.new
  310.     for i in $data_skills[@skill.id].chain_id
  311.       for j in $game_party.actors
  312.       if j.id == i
  313.         @a.atk += j.atk / @skill.chain_id.size
  314.         @a.str += j.str / @skill.chain_id.size
  315.         @a.dex += j.dex / @skill.chain_id.size
  316.         @a.agi += j.agi / @skill.chain_id.size
  317.         @a.int += j.int / @skill.chain_id.size
  318.         @a.hit += j.hit / @skill.chain_id.size
  319.       end
  320.     end
  321.   end
  322. end
  323.     #################################################eclair
  324.     # 如果不是强制行动
  325.     unless @active_battler.current_action.forcing
  326.       # 因为 SP 耗尽而无法使用的情况下
  327.       unless @active_battler.skill_can_use?(@skill.id)
  328.         # 清除强制行动对像的战斗者
  329.         $game_temp.forcing_battler = nil
  330.         # 移至步骤 1
  331.         @phase4_step = 1
  332.         return
  333.       end
  334.     end
  335.     # 消耗 SP
  336.     ##################################################eclair
  337.     if @skill.chain_id != []
  338.       for i in @skill.chain_id
  339.         $game_actors[i].sp -= @skill.sp_cost
  340.       end
  341.     else
  342.       @active_battler.sp -= @skill.sp_cost
  343.     end
  344.     ##################################################eclair
  345.     # 刷新状态窗口
  346.     @status_window.refresh
  347.     # 在帮助窗口显示特技名
  348.     @help_window.set_text(@skill.name, 1)
  349.     # 设置动画 ID
  350.     @animation1_id = @skill.animation1_id
  351.     @animation2_id = @skill.animation2_id
  352.     # 设置公共事件 ID
  353.     @common_event_id = @skill.common_event_id
  354.     # 设置对像侧战斗者
  355.     set_target_battlers(@skill.scope)
  356.     # 应用特技效果
  357.        #####################################################eclair
  358.     if @active_battler.chain_id == 0
  359.     for target in @target_battlers
  360.       target.skill_effect(@active_battler, @skill)
  361.     end
  362.   else
  363.     for target in @target_battlers
  364.       target.skill_effect(@a, @skill)
  365.     end
  366.   end
  367.     ######################################################eclair
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # ● 刷新画面 (主回合步骤 3 : 行动方动画)
  371.   #--------------------------------------------------------------------------
  372.   def update_phase4_step3
  373.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)
  374.     ####################################################eclair
  375.     if @active_battler.chain_id == 0#1
  376.   
  377.     if @animation1_id == 0#2
  378.       @active_battler.white_flash = true
  379.     else
  380.       @active_battler.animation_id = @animation1_id
  381.       @active_battler.animation_hit = true
  382.     end#2
  383.    
  384.   else
  385.    
  386.     for i in $data_skills[@skill.id].chain_id#4
  387.     for j in $game_party.actors#5
  388.     if j.id == i#3
  389.     j.animation_id = $data_skills[@skill.id].animation1_id
  390.     j.animation_hit = true
  391.    
  392.     end#3
  393.   end#4
  394. end#5

  395.   end#1
  396.    ########################################################eclair
  397.     # 移至步骤 4
  398.     @phase4_step = 4
  399.   end
  400.   
  401.   
  402.   #--------------------------------------------------------------------------
  403.   # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  404.   #--------------------------------------------------------------------------
  405.   def update_phase4_step5
  406.     # 隐藏帮助窗口
  407.     @help_window.visible = false
  408.     # 刷新状态窗口
  409.     @status_window.refresh
  410.     # 显示伤害
  411.     for target in @target_battlers
  412.       if target.damage != nil
  413.         target.damage_pop = true
  414.       end
  415.     end
  416.     #####################################################eclair
  417.     if @active_battler.chain_id != 0
  418.       for i in $game_party.actors
  419.         if i.chain_id == @active_battler.chain_id
  420.            i.chain_over = true
  421.         end
  422.       end
  423.     end
  424.     #####################################################eclair
  425.     # 移至步骤 6
  426.     @phase4_step = 6
  427.   end
  428. end
  429. #==============================================================================
  430. # ■ Game_Battler (分割定义 1)
  431. #------------------------------------------------------------------------------
  432. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  433. # 超级类来使用。
  434. #==============================================================================
  435. class Game_Battler
  436.   attr_accessor :chain_id                  # 使用合体技能的ID
  437.   attr_accessor :chain_over                # 合体技能使用完毕的标志
  438.   alias initialize_c initialize
  439.   def initialize
  440.     initialize_c
  441.     @chain_id = 0
  442.     @chain_over = false
  443.   end
  444.   #--------------------------------------------------------------------------
  445.   # ● 可以使用特技的判定
  446.   #     skill_id : 特技 ID
  447.   #--------------------------------------------------------------------------
  448.   def skill_can_use?(skill_id)
  449.     # SP 不足的情况下不能使用
  450.     if $data_skills[skill_id].sp_cost > self.sp
  451.       return false
  452.     end
  453.     # 战斗不能的情况下不能使用
  454.     if dead?
  455.       return false
  456.     end
  457.     # 沉默状态的情况下、物理特技以外的特技不能使用
  458.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  459.       return false
  460.     end
  461.     ###################################################eclair
  462.     if $data_skills[skill_id].chain_id != [] and self.is_a?(Game_Actor)
  463.       for i in $data_skills[skill_id].chain_id
  464.         return false if !$game_party.actors.include?($game_actors[i])
  465.         return false if !$game_actors[i].movable? or !$game_actors[i].inputable? or $game_actors[i].dead?
  466.         return false if $game_actors[i].chain_id != 0 and ($game_actors[i].sp < $data_skills[skill_id].sp_cost)
  467.         return false if $game_actors[i].chain_id != 0 && skill_id and $scene.phase != 4
  468.       end
  469.     end
  470.     ##################################################eclair
  471.     # 获取可以使用的时机
  472.     occasion = $data_skills[skill_id].occasion
  473.     # 战斗中的情况下
  474.     if $game_temp.in_battle
  475.       # [平时] 或者是 [战斗中] 可以使用
  476.       return (occasion == 0 or occasion == 1)
  477.     # 不是战斗中的情况下
  478.     else
  479.       # [平时] 或者是 [菜单中] 可以使用
  480.       return (occasion == 0 or occasion == 2)
  481.     end
  482.   end
  483. end
复制代码
范例




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