Project1

标题: 反击脚本疑问 [打印本页]

作者: 89444640    时间: 2017-3-26 09:53
标题: 反击脚本疑问
这个反击脚本
我把所有使用的脚本,都复制到一个新的工程上就没问题该魔反魔反,该物反物反击,
但是我回去原工程测试,所有的crm都无效 crp只反击普通攻击 物理特技不反击
最初设置的时候crm确实魔法反击,
开新进度测试依然不行
请问到底是什么原因呢?

RUBY 代码复制
  1. #==========================================================================
  2. # 本脚本来自[url]www.66RPG.com[/url],由ikki转载。使用请保留此信息
  3. #=========================================================================
  4.  
  5. # ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
  6. # by シムナフ, ピニョン
  7.  
  8. #========================================================================
  9. # □ 自定义设定
  10. #========================================================================
  11. class Game_Battler
  12.   # 反击的状态名
  13.   STATE_COUNTER_NAME = '反击'
  14. end
  15.  
  16. #========================================================================
  17. # ◇ 说明文档
  18. #=======================================================================
  19. #****Warning! 重新定义了 Game_Actor#skill_can_use? ****
  20. #!!!!-crm 魔法反击有各种异常不能修正,不使用
  21. #使用方法
  22. #对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
  23. #反击的模式可以在下面设定
  24.  
  25. #-cr (counter react)下面设定可以反击的挨打设定,
  26. # 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
  27. #-crp  (physical)=>遭到通常攻击,物理攻击的时候反击
  28. #-crm  (masic)=>遭到魔法攻击的时候反击
  29. #-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。
  30.  
  31. #-ca (counter act)下面设定反击行为
  32. #比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
  33. #-cas1 (skill)=>使用编号为1的技能
  34. #-cai1 (item)=>使用编号为1的物品。
  35. #-caa  (attack)=>使用物理攻击反击。
  36. #-cae  (escape)=>逃跑,敌人使用
  37.  
  38. #-cac  (copy)=>受けたスキルをそのまま反击。未テスト(笑
  39. #何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)
  40.  
  41. #注意和即时战斗的共同使用问题……
  42.  
  43. #举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”
  44.  
  45. #========================================================================
  46. # ■ Game_Battler (分割定義 1)
  47. #========================================================================
  48.  
  49. class Game_Battler
  50.   #-----------------------------------------------------------------------
  51.   # ● オブジェクト初期化
  52.   #-----------------------------------------------------------------------
  53.   def states=(states)
  54.     @states = states
  55.   end
  56.  
  57.   #-----------------------------------------------------------------------
  58.   # ● オブジェクト初期化
  59.   #-----------------------------------------------------------------------
  60.   alias original_initialize_before_counter_action initialize
  61.   def initialize
  62.     original_initialize_before_counter_action()
  63.     @counter_action = Game_BattleAction.new
  64.   end
  65.  
  66.   #-----------------------------------------------------------------------
  67.   # ●
  68.   #-----------------------------------------------------------------------
  69.   alias original_current_action_before_counter_action current_action
  70.   def current_action
  71.       if @counter_action.cleared?
  72.         return original_current_action_before_counter_action()
  73.       else
  74.         return @counter_action
  75.       end
  76.   end
  77.  
  78.   #-----------------------------------------------------------------------
  79.   # ●
  80.   #-----------------------------------------------------------------------
  81.   def counter_action
  82.     return @counter_action
  83.   end
  84.   #-----------------------------------------------------------------------
  85.   # ●
  86.   #-----------------------------------------------------------------------
  87.   def counter_acting?
  88.     if !@counter_action.cleared?
  89.       return true
  90.     else
  91.       return false
  92.     end
  93.   end
  94.   #-----------------------------------------------------------------------
  95.   # ● 戦闘不能判定
  96.   #-----------------------------------------------------------------------
  97.   #alias original_dead_before_counter_action dead?
  98.   #def dead?
  99.   #  if self.counter_acting?
  100.   #    return false
  101.   #  else
  102.   #    return original_dead_before_counter_action()
  103.   #  end
  104.   #end
  105.  
  106.   #----------------------------------------------------------------------
  107.   # ●
  108.   #----------------------------------------------------------------------
  109.   def counter_action_for(attacker, skill = nil)
  110.     #カウンターからのカウンターは発生しない
  111.     if attacker.counter_acting?
  112.       return
  113.     end
  114.     #動けない場合存在しない場合は発生しない
  115.     #if !self.movable? || !self.exist?
  116.     #  return
  117.     #end
  118.     if attacker.is_a?(Game_Actor)
  119.       if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
  120.         return
  121.       end
  122.       ind = $game_party.get_index_by(attacker)
  123.       s_ind = $game_troop.get_index_by(self)
  124.     elsif attacker.is_a?(Game_Enemy)
  125.       if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
  126.         return
  127.       end
  128.       ind = $game_troop.get_index_by(attacker)
  129.       s_ind = $game_party.get_index_by(self)
  130.     end
  131.     if ind.nil? || s_ind.nil?
  132.       return
  133.     end
  134.  
  135.     act_kind = 'a'
  136.     act_id = 0
  137.  
  138.     for id in @states
  139.       if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
  140.         react_cond = false
  141.         react_succ = false
  142.         for opt in $data_states[id].options
  143.           if opt =~ /^cr([pmedns])([0-9]*)/
  144.             kind = $1
  145.             id = $2.to_i
  146.             react_cond = true
  147.             case kind
  148.             when 'p'
  149.               if skill.nil? || skill.atk_f >= 100
  150.                 react_succ = true
  151.               end
  152.             when 'm'
  153.               if !skill.nil? && skill.int_f >= 100
  154.                 react_succ = true
  155.               end
  156.             when 'e'
  157.               if id.nil? || id.zero?
  158.                 next
  159.               elsif skill.nil? #武器の攻撃属性
  160.                 if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
  161.                   if $data_weapons[@weapon_id].element_set.include?(id)
  162.                     react_succ = true
  163.                   end
  164.                 end
  165.               elsif skill.element_set.include?(id)#スキルの攻撃属性
  166.                 react_succ = true
  167.               end
  168.  
  169.             when 'n'#相手攻撃無効カウンター
  170.               no_attack = true
  171.             when 's'#回避時カウンター
  172.               miss_attack = true
  173.             when 'd'#死亡カウンター
  174.               if self.dead? && self.movable?
  175.                 react_succ = true
  176.               end
  177.             end
  178.  
  179.           elsif opt =~ /^ca([asime])([0-9]*)/
  180.             act_kind = $1
  181.             act_id = $2.to_i
  182.             act_cond = true
  183.           end
  184.         end
  185.  
  186.         if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
  187.           counter = true#カウンター成功
  188.           break
  189.         else
  190.           next
  191.         end
  192.  
  193.       end
  194.     end
  195.  
  196.     if !counter#カウンター成功していなかった場合
  197.       return
  198.     end
  199.  
  200.  
  201.     # 相手攻撃無効カウンターありならダメージ戻し
  202.     if no_attack == true
  203.       if self.damage != "未击中!"
  204.         self.hp += self.damage
  205.         self.damage = "反击!!"
  206.         self.critical = false
  207.         @state_changed = false
  208.         self.states = @old_states
  209.       end
  210.     end
  211.  
  212.     # 回避時カウンターありでミスじゃないときはさよなら
  213.     if miss_attack == true and self.damage != "未击中!"
  214.       return
  215.     end
  216.  
  217.  
  218.     if act_kind == 'c'
  219.       if skill.nil?
  220.         act_kind = 'a'
  221.       else
  222.         act_kind = 's'
  223.         act_id = skill.id
  224.       end
  225.     end
  226.  
  227.     case act_kind
  228.     when 's'#skill kind:1 basic0
  229.       s = $data_skills[act_id]
  230.       if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
  231.         return
  232.       end
  233.       self.counter_action.skill_id = act_id
  234.       self.counter_action.kind = 1
  235.       if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
  236.         self.counter_action.target_index = ind
  237.       else
  238.         self.counter_action.target_index = s_ind
  239.       end
  240.     when 'i'#item kind:2 basic:0
  241.       i = $data_items[act_id]
  242.       if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
  243.         return
  244.       end
  245.       self.counter_action.item_id = act_id
  246.       self.counter_action.kind = 2
  247.       if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
  248.         self.counter_action.target_index = ind
  249.       else
  250.         self.counter_action.target_index = s_ind
  251.       end
  252.     when 'a'#通常攻撃 kind:0 basic:0
  253.       self.counter_action.kind = 0
  254.       self.counter_action.target_index = ind
  255.       self.counter_action.basic = 0
  256.     when 'e'#escape kind:0 basic:2
  257.       if !self.is_a?(Game_Enemy)
  258.         return
  259.       end
  260.       self.counter_action.kind = 0
  261.       self.counter_action.target_index = ind
  262.       self.counter_action.basic = 2      
  263.     end
  264.     return
  265.  
  266.   end
  267.  
  268.   #----------------------------------------------------------------------
  269.   # ● 通常攻撃の効果適用
  270.   #     attacker : 攻撃者 (バトラー)
  271.   #----------------------------------------------------------------------
  272.   alias original_attack_effect_before_counter_action attack_effect
  273.   def attack_effect(attacker)
  274.     @old_states = self.states.clone
  275.     val = original_attack_effect_before_counter_action(attacker)
  276.     self.counter_action_for(attacker)
  277.     return val
  278.   end  
  279.  
  280.   #----------------------------------------------------------------------
  281.   # ● スキルの効果適用
  282.   #     user  : スキルの使用者 (バトラー)
  283.   #     skill : スキル
  284.   #----------------------------------------------------------------------
  285.   alias original_skill_effect_before_counter_action skill_effect
  286.   def skill_effect(attacker, skill)
  287.     @old_states = self.states.clone
  288.     val = original_skill_effect_before_counter_action(attacker, skill)
  289.     self.counter_action_for(attacker, skill)
  290.     return val
  291.   end
  292.  
  293. end
  294.  
  295. #=======================================================================
  296. # ■ Game_Actor
  297. #--------------------------------------------------------------------------
  298. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  299. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  300. #=======================================================================
  301.  
  302. class Game_Actor < Game_Battler
  303.   #----------------------------------------------------------------------
  304.   # ● スキルの使用可能判定
  305.   #     skill_id : スキル ID
  306.   #----------------------------------------------------------------------
  307.   def skill_can_use?(skill_id)
  308.     #if not skill_learn?(skill_id)
  309.     #  return false
  310.     #end
  311.     return super
  312.   end
  313. end
  314.  
  315. #========================================================================
  316. # ■ Game_BattleAction
  317. #-------------------------------------------------------------------------
  318. #  アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
  319. # スの内部で使用されます。
  320. #========================================================================
  321.  
  322. class Game_BattleAction
  323.  
  324.   alias :xp_original_initialize :initialize
  325.   def initialize
  326.     xp_original_initialize()
  327.     @turn_move_times = 0
  328.   end
  329.   #-----------------------------------------------------------------------
  330.   # ● クリア判定
  331.   #-----------------------------------------------------------------------
  332.   def cleared?
  333.     if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
  334.       return true
  335.     else
  336.       return false
  337.     end
  338.   end
  339.  
  340. end
  341.  
  342.  
  343. #=========================================================================
  344. # ■ Game_Party
  345. #--------------------------------------------------------------------------
  346. #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
  347. # ラスのインスタンスは $game_party で参照されます。
  348. #=========================================================================
  349.  
  350. class Game_Party
  351.   #----------------------------------------------------------------------
  352.   # ●
  353.   #----------------------------------------------------------------------
  354.   def get_index_by(actor)
  355.     for i in [email]0...@actors.size[/email]()
  356.       if @actors[i].equal?(actor)
  357.         return i
  358.       end
  359.     end
  360.     return nil
  361.   end
  362. end
  363.  
  364.  
  365. #==========================================================================
  366. # ■ Game_Troop
  367. #--------------------------------------------------------------------------
  368. #  トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
  369. # れます。
  370. #==========================================================================
  371.  
  372. class Game_Troop
  373.   #----------------------------------------------------------------------
  374.   # ●
  375.   #----------------------------------------------------------------------
  376.   def get_index_by(enemy)
  377.     for i in [email]0...@enemies.size[/email]()
  378.       if @enemies[i].equal?(enemy)
  379.         return i
  380.       end
  381.     end
  382.     return nil
  383.   end
  384. end
  385.  
  386. #==========================================================================
  387. # ■ Scene_Battle (分割定義 4)
  388. #--------------------------------------------------------------------------
  389. #  バトル画面の処理を行うクラスです。
  390. #==========================================================================
  391.  
  392. class Scene_Battle
  393.  
  394.   #----------------------------------------------------------------------
  395.   # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  396.   #----------------------------------------------------------------------
  397.   alias original_update_phase4_step6_before_counter_action update_phase4_step6
  398.   def update_phase4_step6
  399.     original_update_phase4_step6_before_counter_action()
  400.     clear_counter_action(@active_battler)
  401.     activate_counter_action(@action_battlers)
  402.   end
  403.   #----------------------------------------------------------------------
  404.   #
  405.   #----------------------------------------------------------------------
  406.   def clear_counter_action(active_battler)
  407.     #既にカウンターを行ったバトラーのカウンターアクションをクリア
  408.     if active_battler.nil?
  409.       return
  410.     end
  411.     if !active_battler.counter_acting?
  412.       return
  413.     end
  414.     active_battler.counter_action.clear
  415.     return
  416.   end
  417.   #----------------------------------------------------------------------
  418.   #
  419.   #----------------------------------------------------------------------
  420.   def activate_counter_action(action_battlers)   
  421.     #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
  422.     if !action_battlers[0].nil?
  423.       if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
  424.         return
  425.       end
  426.     end
  427.     counter_battlers = []
  428.     $game_party.actors.each{|a|
  429.       if a.counter_acting?
  430.         counter_battlers.push(a)
  431.       end
  432.     }
  433.     $game_troop.enemies.each{|e|
  434.       if e.counter_acting?
  435.         counter_battlers.push(e)
  436.       end
  437.     }
  438.     counter_battlers = counter_battlers.sort_by{|b| b.agi}
  439.     counter_battlers.each{ |b|
  440.       action_battlers.unshift(b)
  441.     }
  442.     #p action_battlers.collect{|b| b.name}
  443.     return
  444.   end
  445. end
  446.  
  447.  
  448. #=============================
  449. #CPバトル対応。
  450. #ターンバトルの人は必要なし。
  451. #=============================
  452. class Game_Battler
  453.   if method_defined?(:cp)
  454.     alias original_cp_before_counter_action cp
  455.     def cp
  456.       if self.counter_acting?
  457.         return 65535
  458.       else
  459.         return original_cp_before_counter_action()
  460.       end
  461.     end
  462.   end
  463.   if method_defined?(:cp=)
  464.     alias original_cp_before_counter_action= cp=
  465.     def cp=(n)
  466.       if self.counter_acting?
  467.         return
  468.       else
  469.         self.original_cp_before_counter_action = n
  470.       end
  471.     end
  472.   end
  473. end
  474. #=============================
  475. #ここまで。
  476. #=============================
  477.  
  478.  
  479.   #---------------------------------------------------------------------
  480.   #
  481.   #---------------------------------------------------------------------
  482.  
  483. module RPG
  484.   class State
  485.     def name
  486.       if @new_name.nil?
  487.         name_setting()
  488.       end
  489.       return @new_name
  490.     end
  491.  
  492.     def options
  493.       if @options.nil?
  494.         name_setting()
  495.       end
  496.       return @options
  497.     end
  498.  
  499.     def name_setting
  500.       names = @name.split(/ +-/)
  501.       @new_name = names.shift
  502.       if @new_name.nil?
  503.         @new_name = ''
  504.       end
  505.       @options = names
  506.       if @options.nil?
  507.         @options = []
  508.       end
  509.     end
  510.  
  511.   end
  512. end




作者: soulsaga    时间: 2017-3-26 12:00
如果是和你用的其他脚本冲突的话..大概要上传脚本文件比较好让大神找出冲突的原因吧..
作者: 89444640    时间: 2017-3-26 20:03
soulsaga 发表于 2017-3-26 12:00
如果是和你用的其他脚本冲突的话..大概要上传脚本文件比较好让大神找出冲突的原因吧.. ...

说明写的是
-crp  (physical)=>遭到通常攻击,物理攻击的时候反击、
-cas (skill)=>使用编号为X的技能
数据库截图

写的是
反击 -crp -cas1022
中间必须有空格否则不能生效
测试用敌人技能
这个肯定算物理技能吧

魔法技能就更别提了,任何一个默认的火球魔法都可以测试,就是死活不给我反击!


本来还做了一个魔反的技能,用魔法反击的时候取消物理特技反击,用物理反击的时候取消魔法反击,用的那个光镜的动作,第一次设置好了,测试时候好好的,然后不知哪根筋不对突然就不能用了,开新进度也不行
我说忍了取消魔法反击了吧,结果
现在这脚本居然只能反击普通攻击。实用性大打折扣!太可恶了!
作者: soulsaga    时间: 2017-3-26 20:26
本帖最后由 soulsaga 于 2017-3-26 20:41 编辑
89444640 发表于 2017-3-26 20:03
说明写的是
-crp  (physical)=>遭到通常攻击,物理攻击的时候反击、
-cas (skill)=>使用编号为X的技能


对了..问题关键似乎是这里
when 'p'
              if skill.nil? || skill.atk_f >= 100

攻击力F低过100不被视为物理攻击

解決方法是加个名为物理攻击的属性用作判断..
然后在
if skill.nil? || skill.atk_f >= 100 后面的skill.atk_f >= 100改为判断该属性ID就行..这个你懂的..

至於魔反是不是也是这个原因就不知道了..
作者: 89444640    时间: 2017-3-26 20:30
本帖最后由 89444640 于 2017-3-26 20:32 编辑
soulsaga 发表于 2017-3-26 20:26
对了..问题关键似乎是这里
when 'p'
              if skill.nil? || skill.atk_f >= 100


- -b靠!
我改了个100的试了下果然行了。
但是这样敌人伤害又破表了……
看我给改成1- -b
我再测试一下魔法击,倒霉催的帕秋莉魔法反击让我删了,还得重新设置。

有没有方法设定成同时反击魔法和物理的?
作者: soulsaga    时间: 2017-3-26 20:34
本帖最后由 soulsaga 于 2017-3-27 08:20 编辑
89444640 发表于 2017-3-26 20:30
- -b靠!
我改了个100的试了下果然行了。
但是这样敌人伤害又破表了……


RUBY 代码复制
  1. if opt =~ /^cr([pmedns])([0-9]*)/
  2.             kind = $1
  3.             id = $2.to_i
  4.             react_cond = true
  5.             case kind
  6.             when 'p'
  7.               if skill.nil? || skill.atk_f >= 100
  8.                 react_succ = true
  9.               end
  10.             when 'm'
  11.               if !skill.nil? && skill.int_f >= 100
  12.                 react_succ = true
  13.               end
  14.               when 'q'
  15.               if skill.nil? || skill.int_f >= 1 || skill.atk_f >= 1
  16.                 react_succ = true
  17.               end


改成这样..或且做个属性判断也行..
这样普攻,物魔技能都应该会反了..

s不行呢..已经有了..你自己随便填个吧..

反击必定命中Game_Battler 3脚本125行改成下面这样

RUBY 代码复制
  1. $counter_act = "" if !$counter_act
  2.     if hit_result == true or $counter_act == "反击"
  3. $counter_act = ""

然后反击脚本
搜self.counter_action.skill_id = act_id
上面插入$counter_act = "反击"

未测试..不知是否有效..
作者: 89444640    时间: 2017-3-26 23:12
本帖最后由 89444640 于 2017-3-26 23:15 编辑
soulsaga 发表于 2017-3-26 20:34
if opt =~ /^cr()([0-9]*)/
            kind = $1
            id = $2.to_i


出现了新的问题,这个脚,只能让队伍中一个角色拥有某一对应的反击状态,比如你反击魔法了,其他人再上反击魔法的反击状态,就肯定显示失误……但是其他人上比如物理反击,则不会出现失误,
如果物理魔法均反击,则其他角色无论如何也加不上反击状态。
不对错了……不能抵抗忘了点上- -b 我还是睡觉去吧
作者: soulsaga    时间: 2017-3-27 08:28
89444640 发表于 2017-3-26 23:12
出现了新的问题,这个脚,只能让队伍中一个角色拥有某一对应的反击状态,比如你反击魔法了,其他人再上反 ...

另外反击脚本开注译没有提到的..脚本有写到
crn #相手攻撃無効カウンター 这个看不懂
crs # 回避時カウンター回避了对方的攻击才会触发反击
crd 死亡カウンター 角色死亡时才会触发反击..

不过你或许已经知道了?
作者: 89444640    时间: 2017-3-27 13:59
本帖最后由 89444640 于 2017-3-27 15:45 编辑
soulsaga 发表于 2017-3-27 08:28
另外反击脚本开注译没有提到的..脚本有写到
crn #相手攻撃無効カウンター 这个看不懂
crs # 回避時カウン ...


像素的我没画,应该商业的里面有,一时想不起来哪个游戏有像素版本的。
看看这个pi3做的能不能凑合,这个是整合好的动画,音效自己找合适的替换。
[attach]325693[/attach]




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