赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 0 |
经验 | 648 |
最后登录 | 2012-1-26 |
在线时间 | 46 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 49
- 在线时间
- 46 小时
- 注册时间
- 2011-10-7
- 帖子
- 95
|
本帖最后由 我不是字母君 于 2011-10-24 12:32 编辑
- #==========================================================================
- # 本脚本来自www.66RPG.com,由ikki转载。使用请保留此信息http://rpg.blue/forum.php?mod=post&action=edit&fid=18&tid=212215&pid=1783006&page=1
- #=========================================================================
- # ▼▲▼ XRXS27. 特殊効果 SuperEX「反击」 ver.1.05 ▼▲▼
- # by シムナフ, ピニョン
- #========================================================================
- # □ 自定义设定
- #========================================================================
- class Game_Battler
- # 反击的状态名
- STATE_COUNTER_NAME = '反击'
- end
- #========================================================================
- # ◇ 说明文档
- #=======================================================================
- #****Warning! 重新定义了 Game_Actor#skill_can_use? ****
- #使用方法
- #对于身中“反击”状态的角色,当收到单独的攻击的时候会自动反击
- #反击的模式可以在下面设定
- #-cr (counter react)下面设定可以反击的挨打设定,
- # 比如设定一个状态名为“反击 -crm”,则受到魔法攻击的时候会自动反击
- #-crp (physical)=>遭到通常攻击,物理攻击的时候反击
- #-crm (masic)=>遭到魔法攻击的时候反击
- #-cre7 (element)=>遭到属性ID编号为7的攻击的时候反击。
- #-ca (counter act)下面设定反击行为
- #比如设置一个状态名叫做“反击 -cas19”,那么受到攻击的时候就会用19号特技反击。
- #-cas1 (skill)=>使用编号为1的技能
- #-cai1 (item)=>使用编号为1的物品。
- #-caa (attack)=>使用物理攻击反击。
- #-cae (escape)=>逃跑,敌人使用
- #-cac (copy)=>受けたスキルをそのまま反击。未テスト(笑
- #何もつけない場合は通常攻撃反击になります。(不懂……?@_@?)
- #注意和即时战斗的共同使用问题……
- #举例:设置一个状态,使得遭遇物理攻击的时候使用物品4,“反击 -crp -cai4”
- #========================================================================
- # ■ Game_Battler (分割定義 1)
- #========================================================================
- class Game_Battler
- #-----------------------------------------------------------------------
- # ● オブジェクト初期化
- #-----------------------------------------------------------------------
- def states=(states)
- @states = states
- end
-
- #-----------------------------------------------------------------------
- # ● オブジェクト初期化
- #-----------------------------------------------------------------------
- alias original_initialize_before_counter_action initialize
- def initialize
- original_initialize_before_counter_action()
- @counter_action = Game_BattleAction.new
- end
-
- #-----------------------------------------------------------------------
- # ●
- #-----------------------------------------------------------------------
- alias original_current_action_before_counter_action current_action
- def current_action
- if @counter_action.cleared?
- return original_current_action_before_counter_action()
- else
- return @counter_action
- end
- end
- #-----------------------------------------------------------------------
- # ●
- #-----------------------------------------------------------------------
- def counter_action
- return @counter_action
- end
- #-----------------------------------------------------------------------
- # ●
- #-----------------------------------------------------------------------
- def counter_acting?
- if !@counter_action.cleared?
- return true
- else
- return false
- end
- end
- #-----------------------------------------------------------------------
- # ● 戦闘不能判定
- #-----------------------------------------------------------------------
- #alias original_dead_before_counter_action dead?
- #def dead?
- # if self.counter_acting?
- # return false
- # else
- # return original_dead_before_counter_action()
- # end
- #end
-
- #----------------------------------------------------------------------
- # ●
- #----------------------------------------------------------------------
- def counter_action_for(attacker, skill = nil)
- #カウンターからのカウンターは発生しない
- if attacker.counter_acting?
- return
- end
- #動けない場合存在しない場合は発生しない
- #if !self.movable? || !self.exist?
- # return
- #end
- if attacker.is_a?(Game_Actor)
- if self.is_a?(Game_Actor)#味方からの攻撃はカウンター不可
- return
- end
- ind = $game_party.get_index_by(attacker)
- s_ind = $game_troop.get_index_by(self)
- elsif attacker.is_a?(Game_Enemy)
- if self.is_a?(Game_Enemy)#味方からの攻撃はカウンター不可
- return
- end
- ind = $game_troop.get_index_by(attacker)
- s_ind = $game_party.get_index_by(self)
- end
- if ind.nil? || s_ind.nil?
- return
- end
-
- act_kind = 'a'
- act_id = 0
-
- for id in @states
- if $data_states[id].name =~ /^#{STATE_COUNTER_NAME}/
- react_cond = false
- react_succ = false
- for opt in $data_states[id].options
- if opt =~ /^cr([pmedns])([0-9]*)/
- kind = $1
- id = $2.to_i
- react_cond = true
- case kind
- when 'p'
- if skill.nil? || skill.atk_f >= 100
- react_succ = true
- end
- when 'm'
- if !skill.nil? && skill.int_f >= 100
- react_succ = true
- end
- when 'e'
- if id.nil? || id.zero?
- next
- elsif skill.nil? #武器の攻撃属性
- if attacker.is_a?(Game_Actor) && !$data_weapons[@weapon_id].nil?
- if $data_weapons[@weapon_id].element_set.include?(id)
- react_succ = true
- end
- end
- elsif skill.element_set.include?(id)#スキルの攻撃属性
- react_succ = true
- end
- when 'n'#相手攻撃無効カウンター
- no_attack = true
- when 's'#回避時カウンター
- miss_attack = true
- when 'd'#死亡カウンター
- if self.dead? && self.movable?
- react_succ = true
- end
- end
-
- elsif opt =~ /^ca([asime])([0-9]*)/
- act_kind = $1
- act_id = $2.to_i
- act_cond = true
- end
- end
-
- if (!react_cond || react_succ)#反击条件が無い・もしくは条件に一致
- counter = true#カウンター成功
- break
- else
- next
- end
-
- end
- end
-
- if !counter#カウンター成功していなかった場合
- return
- end
- # 相手攻撃無効カウンターありならダメージ戻し
- if no_attack == true
- if self.damage != "被对手闪开了!"
- self.hp += self.damage
- self.damage = "抵抗"
- self.critical = false
- @state_changed = false
- self.states = @old_states
- end
- end
- # 回避時カウンターありでミスじゃないときはさよなら
- if miss_attack == true and self.damage != "被对手闪开了!"
- return
- end
- if act_kind == 'c'
- if skill.nil?
- act_kind = 'a'
- else
- act_kind = 's'
- act_id = skill.id
- end
- end
-
- case act_kind
- when 's'#skill kind:1 basic0
- s = $data_skills[act_id]
- if s.nil? || ![0,1].include?(s.occasion) || !self.skill_can_use?(act_id)
- return
- end
- self.counter_action.skill_id = act_id
- self.counter_action.kind = 1
- if [1,2].include?(s.scope)#1,2で敵単体、敵全体。
- self.counter_action.target_index = ind
- else
- self.counter_action.target_index = s_ind
- end
- when 'i'#item kind:2 basic:0
- i = $data_items[act_id]
- if !self.is_a?(Game_Actor) || i.nil? || ![0,1].include?(i.occasion) || !$game_party.item_can_use?(act_id)
- return
- end
- self.counter_action.item_id = act_id
- self.counter_action.kind = 2
- if [1,2].include?(i.scope)#1,2で敵単体、敵全体。
- self.counter_action.target_index = ind
- else
- self.counter_action.target_index = s_ind
- end
- when 'a'#通常攻撃 kind:0 basic:0
- self.counter_action.kind = 0
- self.counter_action.target_index = ind
- self.counter_action.basic = 0
- when 'e'#escape kind:0 basic:2
- if !self.is_a?(Game_Enemy)
- return
- end
- self.counter_action.kind = 0
- self.counter_action.target_index = ind
- self.counter_action.basic = 2
- end
- return
-
- end
-
- #----------------------------------------------------------------------
- # ● 通常攻撃の効果適用
- # attacker : 攻撃者 (バトラー)
- #----------------------------------------------------------------------
- alias original_attack_effect_before_counter_action attack_effect
- def attack_effect(attacker)
- @old_states = self.states.clone
- val = original_attack_effect_before_counter_action(attacker)
- self.counter_action_for(attacker)
- return val
- end
-
- #----------------------------------------------------------------------
- # ● スキルの効果適用
- # user : スキルの使用者 (バトラー)
- # skill : スキル
- #----------------------------------------------------------------------
- alias original_skill_effect_before_counter_action skill_effect
- def skill_effect(attacker, skill)
- @old_states = self.states.clone
- val = original_skill_effect_before_counter_action(attacker, skill)
- self.counter_action_for(attacker, skill)
- return val
- end
-
- end
- #=======================================================================
- # ■ Game_Actor
- #--------------------------------------------------------------------------
- # アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
- # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
- #=======================================================================
- class Game_Actor < Game_Battler
- #----------------------------------------------------------------------
- # ● スキルの使用可能判定
- # skill_id : スキル ID
- #----------------------------------------------------------------------
- def skill_can_use?(skill_id)
- #if not skill_learn?(skill_id)
- # return false
- #end
- return super
- end
- end
- #========================================================================
- # ■ Game_BattleAction
- #-------------------------------------------------------------------------
- # アクション (戦闘中の行動) を扱うクラスです。このクラスは Game_Battler クラ
- # スの内部で使用されます。
- #========================================================================
- class Game_BattleAction
-
- alias :xp_original_initialize :initialize
- def initialize
- xp_original_initialize()
- @turn_move_times = 0
- end
- #-----------------------------------------------------------------------
- # ● クリア判定
- #-----------------------------------------------------------------------
- def cleared?
- if @speed == 0 && @kind == 0 && @basic == 3 && @skill_id == 0 && @item_id == 0 && @target_index == -1 && @forcing == false
- return true
- else
- return false
- end
- end
-
- end
- #=========================================================================
- # ■ Game_Party
- #--------------------------------------------------------------------------
- # パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク
- # ラスのインスタンスは $game_party で参照されます。
- #=========================================================================
- class Game_Party
- #----------------------------------------------------------------------
- # ●
- #----------------------------------------------------------------------
- def get_index_by(actor)
- for i in [email protected]()
- if @actors[i].equal?(actor)
- return i
- end
- end
- return nil
- end
- end
- #==========================================================================
- # ■ Game_Troop
- #--------------------------------------------------------------------------
- # トループを扱うクラスです。このクラスのインスタンスは $game_troop で参照さ
- # れます。
- #==========================================================================
- class Game_Troop
- #----------------------------------------------------------------------
- # ●
- #----------------------------------------------------------------------
- def get_index_by(enemy)
- for i in [email protected]()
- if @enemies[i].equal?(enemy)
- return i
- end
- end
- return nil
- end
- end
- #==========================================================================
- # ■ Scene_Battle (分割定義 4)
- #--------------------------------------------------------------------------
- # バトル画面の処理を行うクラスです。
- #==========================================================================
- class Scene_Battle
-
- #----------------------------------------------------------------------
- # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
- #----------------------------------------------------------------------
- alias original_update_phase4_step6_before_counter_action update_phase4_step6
- def update_phase4_step6
- original_update_phase4_step6_before_counter_action()
- clear_counter_action(@active_battler)
- activate_counter_action(@action_battlers)
- end
- #----------------------------------------------------------------------
- #
- #----------------------------------------------------------------------
- def clear_counter_action(active_battler)
- #既にカウンターを行ったバトラーのカウンターアクションをクリア
- if active_battler.nil?
- return
- end
- if !active_battler.counter_acting?
- return
- end
- active_battler.counter_action.clear
- return
- end
- #----------------------------------------------------------------------
- #
- #----------------------------------------------------------------------
- def activate_counter_action(action_battlers)
- #カウンター状態になったバトラーを一回だけアクションバトラーズにアンシフト
- if !action_battlers[0].nil?
- if action_battlers[0].counter_acting?#既にカウンター行動待機バトラーが居た場合
- return
- end
- end
- counter_battlers = []
- $game_party.actors.each{|a|
- if a.counter_acting?
- counter_battlers.push(a)
- end
- }
- $game_troop.enemies.each{|e|
- if e.counter_acting?
- counter_battlers.push(e)
- end
- }
- counter_battlers = counter_battlers.sort_by{|b| b.agi}
- counter_battlers.each{ |b|
- action_battlers.unshift(b)
- }
- #p action_battlers.collect{|b| b.name}
- return
- end
- end
- #=============================
- #CPバトル対応。
- #ターンバトルの人は必要なし。
- #=============================
- class Game_Battler
- if method_defined?(:cp)
- alias original_cp_before_counter_action cp
- def cp
- if self.counter_acting?
- return 65535
- else
- return original_cp_before_counter_action()
- end
- end
- end
- if method_defined?(:cp=)
- alias original_cp_before_counter_action= cp=
- def cp=(n)
- if self.counter_acting?
- return
- else
- self.original_cp_before_counter_action = n
- end
- end
- end
- end
- #=============================
- #ここまで。
- #=============================
- #---------------------------------------------------------------------
- #
- #---------------------------------------------------------------------
- module RPG
- class State
- def name
- if @new_name.nil?
- name_setting()
- end
- return @new_name
- end
-
- def options
- if @options.nil?
- name_setting()
- end
- return @options
- end
-
- def name_setting
- names = @name.split(/ +-/)
- @new_name = names.shift
- if @new_name.nil?
- @new_name = ''
- end
- @options = names
- if @options.nil?
- @options = []
- end
- end
- def description
- return @description.split(/P/)[0]
- end
- def priority
- return @description.split(/P/)[1]
- end
- end
- end
复制代码 希望能改成概率反击而不是必定反击。
为了防止6R想度娘一样吞分,解答问题者领分请后台 |
|