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

Project1

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

[已经解决] 求教!如何制作一个反击状态

 关闭 [复制链接]

Lv2.观梦者

路人

梦石
0
星屑
590
在线时间
943 小时
注册时间
2011-8-20
帖子
1011
跳转到指定楼层
1
发表于 2011-10-6 15:34:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aaalbx 于 2011-10-6 15:35 编辑

就是让角色处在反击状态中能给攻击自己的敌人反击(不难理解吧- -!)求教啊求教
为填坑而修炼中……

Lv4.逐梦者

梦石
3
星屑
6420
在线时间
1131 小时
注册时间
2007-12-26
帖子
2402
2
发表于 2011-10-6 15:37:23 | 只看该作者
这个是自动反击脚本
  1. #==========================================================================
  2. # 本脚本来自www.66RPG.com,由ikki转载。使用请保留此信息
  3. #=========================================================================

  4. # ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
  5. # by シムナフ, ピニョン

  6. #========================================================================
  7. # □ 自定义设定
  8. #========================================================================
  9. class Game_Battler
  10.   # 反击的状态名
  11.   STATE_COUNTER_NAME = '反击'
  12. end

  13. #========================================================================
  14. # ◇ 说明文档
  15. #=======================================================================
  16. #****Warning! 重新定义了 Game_Actor#skill_can_use? ****

  17. #使用方法
  18. #对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
  19. #反击的模式可以在下面设定

  20. #-cr (counter react)下面设定可以反击的挨打设定,
  21. # 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
  22. #-crp  (physical)=>遭到通常攻击,物理攻击的时候反击
  23. #-crm  (masic)=>遭到魔法攻击的时候反击
  24. #-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。

  25. #-ca (counter act)下面设定反击行为
  26. #比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
  27. #-cas1 (skill)=>使用编号为1的技能
  28. #-cai1 (item)=>使用编号为1的物品。
  29. #-caa  (attack)=>使用物理攻击反击。
  30. #-cae  (escape)=>逃跑,敌人使用

  31. #-cac  (copy)=>受けたスキルをそのまま反击。未テスト(笑
  32. #何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)

  33. #注意和即时战斗的共同使用问题……

  34. #举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”

  35. #========================================================================
  36. # ■ Game_Battler (分割定義 1)
  37. #========================================================================

  38. class Game_Battler
  39.   #-----------------------------------------------------------------------
  40.   # ● オブジェクト初期化
  41.   #-----------------------------------------------------------------------
  42.   def states=(states)
  43.     @states = states
  44.   end

  45.   #-----------------------------------------------------------------------
  46.   # ● オブジェクト初期化
  47.   #-----------------------------------------------------------------------
  48.   alias original_initialize_before_counter_action initialize
  49.   def initialize
  50.     original_initialize_before_counter_action()
  51.     @counter_action = Game_BattleAction.new
  52.   end

  53.   #-----------------------------------------------------------------------
  54.   # ●
  55.   #-----------------------------------------------------------------------
  56.   alias original_current_action_before_counter_action current_action
  57.   def current_action
  58.       if @counter_action.cleared?
  59.         return original_current_action_before_counter_action()
  60.       else
  61.         return @counter_action
  62.       end
  63.   end

  64.   #-----------------------------------------------------------------------
  65.   # ●
  66.   #-----------------------------------------------------------------------
  67.   def counter_action
  68.     return @counter_action
  69.   end
  70.   #-----------------------------------------------------------------------
  71.   # ●
  72.   #-----------------------------------------------------------------------
  73.   def counter_acting?
  74.     if !@counter_action.cleared?
  75.       return true
  76.     else
  77.       return false
  78.     end
  79.   end
  80.   #-----------------------------------------------------------------------
  81.   # ● 戦闘不能判定
  82.   #-----------------------------------------------------------------------
  83.   #alias original_dead_before_counter_action dead?
  84.   #def dead?
  85.   #  if self.counter_acting?
  86.   #    return false
  87.   #  else
  88.   #    return original_dead_before_counter_action()
  89.   #  end
  90.   #end

  91.   #----------------------------------------------------------------------
  92.   # ●
  93.   #----------------------------------------------------------------------
  94.   def counter_action_for(attacker, skill = nil)
  95.     #カウンターからのカウンターは発生しない
  96.     if attacker.counter_acting?
  97.       return
  98.     end
  99.     #動けない場合存在しない場合は発生しない
  100.     #if !self.movable? || !self.exist?
  101.     #  return
  102.     #end
  103.     if attacker.is_a?(Game_Actor)
  104.       if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
  105.         return
  106.       end
  107.       ind = $game_party.get_index_by(attacker)
  108.       s_ind = $game_troop.get_index_by(self)
  109.     elsif attacker.is_a?(Game_Enemy)
  110.       if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
  111.         return
  112.       end
  113.       ind = $game_troop.get_index_by(attacker)
  114.       s_ind = $game_party.get_index_by(self)
  115.     end
  116.     if ind.nil? || s_ind.nil?
  117.       return
  118.     end
  119.    
  120.     act_kind = 'a'
  121.     act_id = 0
  122.    
  123.     for id in @states
  124.       if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
  125.         react_cond = false
  126.         react_succ = false
  127.         for opt in $data_states[id].options
  128.           if opt =~ /^cr([pmedns])([0-9]*)/
  129.             kind = $1
  130.             id = $2.to_i
  131.             react_cond = true
  132.             case kind
  133.             when 'p'
  134.               if skill.nil? || skill.atk_f >= 100
  135.                 react_succ = true
  136.               end
  137.             when 'm'
  138.               if !skill.nil? && skill.int_f >= 100
  139.                 react_succ = true
  140.               end
  141.             when 'e'
  142.               if id.nil? || id.zero?
  143.                 next
  144.               elsif skill.nil? #武器の攻撃属性
  145.                 if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
  146.                   if $data_weapons[@weapon_id].element_set.include?(id)
  147.                     react_succ = true
  148.                   end
  149.                 end
  150.               elsif skill.element_set.include?(id)#スキルの攻撃属性
  151.                 react_succ = true
  152.               end

  153.             when 'n'#相手攻撃無効カウンター
  154.               no_attack = true
  155.             when 's'#回避時カウンター
  156.               miss_attack = true
  157.             when 'd'#死亡カウンター
  158.               if self.dead? && self.movable?
  159.                 react_succ = true
  160.               end
  161.             end
  162.            
  163.           elsif opt =~ /^ca([asime])([0-9]*)/
  164.             act_kind = $1
  165.             act_id = $2.to_i
  166.             act_cond = true
  167.           end
  168.         end
  169.       
  170.         if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
  171.           counter = true#カウンター成功
  172.           break
  173.         else
  174.           next
  175.         end
  176.       
  177.       end
  178.     end
  179.    
  180.     if !counter#カウンター成功していなかった場合
  181.       return
  182.     end


  183.     # 相手攻撃無効カウンターありならダメージ戻し
  184.     if no_attack == true
  185.       if self.damage != "被对手闪开了!"
  186.         self.hp += self.damage
  187.         self.damage = "反击!!"
  188.         self.critical = false
  189.         @state_changed = false
  190.         self.states = @old_states
  191.       end
  192.     end

  193.     # 回避時カウンターありでミスじゃないときはさよなら
  194.     if miss_attack == true and self.damage != "被对手闪开了!"
  195.       return
  196.     end


  197.     if act_kind == 'c'
  198.       if skill.nil?
  199.         act_kind = 'a'
  200.       else
  201.         act_kind = 's'
  202.         act_id = skill.id
  203.       end
  204.     end
  205.    
  206.     case act_kind
  207.     when 's'#skill kind:1 basic0
  208.       s = $data_skills[act_id]
  209.       if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
  210.         return
  211.       end
  212.       self.counter_action.skill_id = act_id
  213.       self.counter_action.kind = 1
  214.       if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
  215.         self.counter_action.target_index = ind
  216.       else
  217.         self.counter_action.target_index = s_ind
  218.       end
  219.     when 'i'#item kind:2 basic:0
  220.       i = $data_items[act_id]
  221.       if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
  222.         return
  223.       end
  224.       self.counter_action.item_id = act_id
  225.       self.counter_action.kind = 2
  226.       if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
  227.         self.counter_action.target_index = ind
  228.       else
  229.         self.counter_action.target_index = s_ind
  230.       end
  231.     when 'a'#通常攻撃 kind:0 basic:0
  232.       self.counter_action.kind = 0
  233.       self.counter_action.target_index = ind
  234.       self.counter_action.basic = 0
  235.     when 'e'#escape kind:0 basic:2
  236.       if !self.is_a?(Game_Enemy)
  237.         return
  238.       end
  239.       self.counter_action.kind = 0
  240.       self.counter_action.target_index = ind
  241.       self.counter_action.basic = 2     
  242.     end
  243.     return
  244.    
  245.   end

  246.   #----------------------------------------------------------------------
  247.   # ● 通常攻撃の効果適用
  248.   #     attacker : 攻撃者 (バトラー)
  249.   #----------------------------------------------------------------------
  250.   alias original_attack_effect_before_counter_action attack_effect
  251.   def attack_effect(attacker)
  252.     @old_states = self.states.clone
  253.     val = original_attack_effect_before_counter_action(attacker)
  254.     self.counter_action_for(attacker)
  255.     return val
  256.   end

  257.   #----------------------------------------------------------------------
  258.   # ● スキルの効果適用
  259.   #     user  : スキルの使用者 (バトラー)
  260.   #     skill : スキル
  261.   #----------------------------------------------------------------------
  262.   alias original_skill_effect_before_counter_action skill_effect
  263.   def skill_effect(attacker, skill)
  264.     @old_states = self.states.clone
  265.     val = original_skill_effect_before_counter_action(attacker, skill)
  266.     self.counter_action_for(attacker, skill)
  267.     return val
  268.   end

  269. end

  270. #=======================================================================
  271. # ■ Game_Actor
  272. #--------------------------------------------------------------------------
  273. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  274. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  275. #=======================================================================

  276. class Game_Actor < Game_Battler
  277.   #----------------------------------------------------------------------
  278.   # ● スキルの使用可能判定
  279.   #     skill_id : スキル ID
  280.   #----------------------------------------------------------------------
  281.   def skill_can_use?(skill_id)
  282.     #if not skill_learn?(skill_id)
  283.     #  return false
  284.     #end
  285.    
  286.     # 全技能禁止
  287.     if self.state?(48)
  288.       return false
  289.     #$data_skills[112] = false
  290.    
  291.     # 攻击技能禁止
  292.     elsif $data_skills[skill_id].atk_f > 0 and self.state?(49)
  293.       return false
  294.     end
  295.    
  296.     return super
  297.   end
  298. end

  299. #========================================================================
  300. # ■ Game_BattleAction
  301. #-------------------------------------------------------------------------
  302. #  アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
  303. # スの内部で使用されます。
  304. #========================================================================

  305. class Game_BattleAction

  306.   alias :xp_original_initialize :initialize
  307.   def initialize
  308.     xp_original_initialize()
  309.     @turn_move_times = 0
  310.   end
  311.   #-----------------------------------------------------------------------
  312.   # ● クリア判定
  313.   #-----------------------------------------------------------------------
  314.   def cleared?
  315.     if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
  316.       return true
  317.     else
  318.       return false
  319.     end
  320.   end

  321. end


  322. #=========================================================================
  323. # ■ Game_Party
  324. #--------------------------------------------------------------------------
  325. #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
  326. # ラスのインスタンスは $game_party で参照されます。
  327. #=========================================================================

  328. class Game_Party
  329.   #----------------------------------------------------------------------
  330.   # ●
  331.   #----------------------------------------------------------------------
  332.   def get_index_by(actor)
  333.     for i in [email protected]()
  334.       if @actors[i].equal?(actor)
  335.         return i
  336.       end
  337.     end
  338.     return nil
  339.   end
  340. end


  341. #==========================================================================
  342. # ■ Game_Troop
  343. #--------------------------------------------------------------------------
  344. #  トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
  345. # れます。
  346. #==========================================================================

  347. class Game_Troop
  348.   #----------------------------------------------------------------------
  349.   # ●
  350.   #----------------------------------------------------------------------
  351.   def get_index_by(enemy)
  352.     for i in [email protected]()
  353.       if @enemies[i].equal?(enemy)
  354.         return i
  355.       end
  356.     end
  357.     return nil
  358.   end
  359. end

  360. #==========================================================================
  361. # ■ Scene_Battle (分割定義 4)
  362. #--------------------------------------------------------------------------
  363. #  バトル画面の処理を行うクラスです。
  364. #==========================================================================

  365. class Scene_Battle

  366.   #----------------------------------------------------------------------
  367.   # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  368.   #----------------------------------------------------------------------
  369.   alias original_update_phase4_step6_before_counter_action update_phase4_step6
  370.   def update_phase4_step6
  371.     original_update_phase4_step6_before_counter_action()
  372.     clear_counter_action(@active_battler)
  373.     activate_counter_action(@action_battlers)
  374.   end
  375.   #----------------------------------------------------------------------
  376.   #
  377.   #----------------------------------------------------------------------
  378.   def clear_counter_action(active_battler)
  379.     #既にカウンターを行ったバトラーのカウンターアクションをクリア
  380.     if active_battler.nil?
  381.       return
  382.     end
  383.     if !active_battler.counter_acting?
  384.       return
  385.     end
  386.     active_battler.counter_action.clear
  387.     return
  388.   end
  389.   #----------------------------------------------------------------------
  390.   #
  391.   #----------------------------------------------------------------------
  392.   def activate_counter_action(action_battlers)   
  393.     #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
  394.     if !action_battlers[0].nil?
  395.       if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
  396.         return
  397.       end
  398.     end
  399.     counter_battlers = []
  400.     $game_party.actors.each{|a|
  401.       if a.counter_acting?
  402.         counter_battlers.push(a)
  403.       end
  404.     }
  405.     $game_troop.enemies.each{|e|
  406.       if e.counter_acting?
  407.         counter_battlers.push(e)
  408.       end
  409.     }
  410.     counter_battlers = counter_battlers.sort_by{|b| b.agi}
  411.     counter_battlers.each{ |b|
  412.       action_battlers.unshift(b)
  413.     }
  414.     #p action_battlers.collect{|b| b.name}
  415.     return
  416.   end
  417. end


  418. #=============================
  419. #CPバトル対応。
  420. #ターンバトルの人は必要なし。
  421. #=============================
  422. class Game_Battler
  423.   if method_defined?(:cp)
  424.     alias original_cp_before_counter_action cp
  425.     def cp
  426.       if self.counter_acting?
  427.         return 65535
  428.       else
  429.         return original_cp_before_counter_action()
  430.       end
  431.     end
  432.   end
  433.   if method_defined?(:cp=)
  434.     alias original_cp_before_counter_action= cp=
  435.     def cp=(n)
  436.       if self.counter_acting?
  437.         return
  438.       else
  439.         self.original_cp_before_counter_action = n
  440.       end
  441.     end
  442.   end
  443. end
  444. #=============================
  445. #ここまで。
  446. #=============================


  447.   #---------------------------------------------------------------------
  448.   #
  449.   #---------------------------------------------------------------------

  450. module RPG
  451.   class State
  452.     def name
  453.       if @new_name.nil?
  454.         name_setting()
  455.       end
  456.       return @new_name
  457.     end
  458.    
  459.     def options
  460.       if @options.nil?
  461.         name_setting()
  462.       end
  463.       return @options
  464.     end
  465.    
  466.     def name_setting
  467.       names = @name.split(/ +\-/)
  468.       @new_name = names.shift
  469.       if @new_name.nil?
  470.         @new_name = ''
  471.       end
  472.       @options = names
  473.       if @options.nil?
  474.         @options = []
  475.       end
  476.     end
  477.    
  478.   end
  479. end
复制代码
囡囚囨囚囨図囨囧
回复

使用道具 举报

Lv2.观梦者

路人

梦石
0
星屑
590
在线时间
943 小时
注册时间
2011-8-20
帖子
1011
3
 楼主| 发表于 2011-10-6 16:07:50 | 只看该作者
真心的谢谢啊
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 20:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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