######## 特定の属性のスキル / 攻撃 / アイテムを反射するステートを作成 ######## # # # 特定の属性を持った攻撃、スキル、アイテムを反射するステートを作成します。 # # # # [["炎反射", "炎", 3], ["マジックシールド", "魔術", 2]] のように、 # # 二次配列で設定してください。 # # # # 例えば["炎反射", "炎", 3]の場合、「炎反射」のステートにかかっている間は # # 炎属性の攻撃を反射します。 # # その時の反射エフェクトにアニメーションID が 3 のものが表示されます。 # # 最後のIDは 0 にするとただフラッシュするだけになります。 # # # # 仲間に向かって使用した攻撃とスキルはランダムで敵へ。 # # 相手に向かって使用した攻撃とスキルは自分自身に反射されます。 # # アイテムに関してのみ、必ず使用対象とは逆の対象にランダムで反射されます # # 敵に使ったアイテムは必ず自分達の誰かに反射する、ということ。 # # # ############################################################################## # ココから設定 module Annex # 反射ステートと、そのステートが反射する属性名、 # そして反射の際に表示されるアニメーションの三つの配列を順に格納する配列 # アニメーションを省略したい場合は「0」にすること REFLECTION_STATES = [ [ "炎反射", "炎", 3], # コレで炎反射ステートは炎を反射する。 ["マジックシールド", "魔術", 12], ] # 反射ダメージの重複 REFLECTION_DAMAGE_REPEAT = false end # ココまで設定 #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :reflect # 反射確認フラグ # [0](REFLECTION_STATESの何番目で反射してるかを格納) # [1](反射対象を格納) #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- alias reflection_initialize initialize def initialize # 呼び戻し reflection_initialize # フラグ初期化 @reflect = [-1, nil] # 被ダメージ済か否か end #-------------------------------------------------------------------------- # ○ 通常攻撃の効果適用 # attacker : 攻撃者 (バトラー) # reflected : 既に一度反射しているか否か #-------------------------------------------------------------------------- alias reflection_attack_effect attack_effect def attack_effect(attacker, reflected = false) temp_damage = 0 # damage が nil でない場合は REFLECTION_DAMAGE_REPEAT に応じて計算変更。 if self.damage != nil # ダメージ重複拒否の場合、処理を終了する if not Annex::REFLECTION_DAMAGE_REPEAT return # ダメージ重複を許可する場合、現在のダメージを保存しておく。 else temp_damage = self.damage end end # まだ反射されていない場合 if (reflected == false) and $game_temp.in_battle # 反射されるか確認 target = reflect_check(attacker, attacker.element_set) # target が 帰ってきている場合(反射された場合) そのターゲットに攻撃実行 if target != nil @reflect[1] = target return target.attack_effect(attacker, true) end end # 呼び戻し effective = reflection_attack_effect(attacker) # ダメージ呼び戻し if temp_damage != 0 self.damage += temp_damage end return effective end #-------------------------------------------------------------------------- # ○ スキルの効果適用 # user : スキルの使用者 (バトラー) # skill : スキル # reflected : 既に一度反射しているか否か #-------------------------------------------------------------------------- alias reflection_skill_effect skill_effect def skill_effect(user, skill, reflected = false) temp_damage = 0 # damage が nil でない場合は REFLECTION_DAMAGE_REPEAT に応じて計算変更。 if self.damage != nil # ダメージ重複拒否の場合、処理を終了する if not Annex::REFLECTION_DAMAGE_REPEAT return # ダメージ重複を許可する場合、現在のダメージを保存しておく。 else temp_damage = self.damage end end # まだ反射されていない場合 if (reflected == false) and $game_temp.in_battle # 反射されるか確認 target = reflect_check(user, skill.element_set) # target が 帰ってきている場合(反射された場合) そのターゲットに攻撃実行 if target != nil @reflect[1] = target return target.skill_effect(user, skill, true) end end # 呼び戻し effective = reflection_skill_effect(user, skill) # ダメージ呼び戻し if temp_damage != 0 self.damage += temp_damage end return effective end #-------------------------------------------------------------------------- # ○ アイテムの効果適用 # item : アイテム # reflected : 既に一度反射しているか否か #-------------------------------------------------------------------------- alias reflection_item_effect item_effect def item_effect(item, reflected = false) temp_damage = 0 # damage が nil でない場合は REFLECTION_DAMAGE_REPEAT に応じて計算変更。 if self.damage != nil # ダメージ重複拒否の場合、処理を終了する if not Annex::REFLECTION_DAMAGE_REPEAT return # ダメージ重複を許可する場合、現在のダメージを保存しておく。 else temp_damage = self.damage end end # まだ反射されていない場合 if (reflected == false) and $game_temp.in_battle # 反射されるか確認 # 道具は特殊なため「nil」とする target = reflect_check(nil, item.element_set) # target が 帰ってきている場合(反射された場合) そのターゲットに攻撃実行 if target != nil @reflect[1] = target return target.item_effect(item, true) end end # 呼び戻し effective = reflection_item_effect(item) # ダメージ呼び戻し if temp_damage != 0 self.damage += temp_damage end return effective end #-------------------------------------------------------------------------- # ◎ 追加:反射できるかどうかの確認 # user : 攻撃 / スキルの使用者 (アイテムの場合はnil) # element_set : そのスキルや攻撃に含まれる属性配列 #-------------------------------------------------------------------------- def reflect_check(user, element_set) # 反射されなかった場合はnilを返す get_reflect_check(element_set) return nil if @reflect[0] == -1 # アイテムだった場合 if user == nil # 自分のHPが正 (対象がHP1以上) の場合 if self.hp >= 1 if self.is_a?(Game_Actor) return $game_troop.random_target_enemy else return $game_party.random_target_actor end # 自分のHPが0 (対象がHP0) の場合 else if self.is_a?(Game_Actor) return $game_troop.random_target_enemy_hp0 else return $game_party.random_target_actor_hp0 end end end # 使用者がアクターの場合 if user.is_a?(Game_Actor) if self.is_a?(Game_Actor) return user.current_action.decide_random_target_for_actor else return user end # 使用者がエネミーの場合 else if self.is_a?(Game_Actor) return user else return user.current_action.decide_random_target_for_enemy end end end #-------------------------------------------------------------------------- # ◎ 追加:反射した場合、それがREFLECTION_STATESの何番目のステートかを返す # element_set : そのスキルや攻撃に含まれる属性配列 #-------------------------------------------------------------------------- def get_reflect_check(element_set) for i in 0...Annex::REFLECTION_STATES.size name = Annex::REFLECTION_STATES[i] # 反射ステート(name[0] => ステート名)にかかっていて、 # そのステートが反射する属性 (name[1] => 属性名) が攻撃属性に含まれるか if state_name?(name[0]) and include_element?(element_set, name[1]) @reflect[0] = i return break end end # 反射されない場合は初期化しておく @reflect = [-1, nil] return end #-------------------------------------------------------------------------- # ◎ 追加:任意の属性配列にその属性が含まれるか否か #-------------------------------------------------------------------------- def include_element?(element_set, name) return element_set.include?($data_system.elements.index(name)) end #-------------------------------------------------------------------------- # ◎ 追加 指定された名前のステートのIDを取得 # state_name : ステート名 #-------------------------------------------------------------------------- def get_state_id(state_name) for i in $data_states next if i == nil if i.name == state_name return (i.id) end end return 0 end #-------------------------------------------------------------------------- # ◎ 追加 指定された名前のステートになっているかの確認 # state_name : ステート名 #-------------------------------------------------------------------------- def state_name?(state_name) id = get_state_id(state_name) return state?(id) end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ○ フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション) #-------------------------------------------------------------------------- alias reflection_update_phase4_step3 update_phase4_step3 def update_phase4_step3 # 反射等を考慮し、@target_battlersを再調整 temp_targets = @target_battlers.dup # 反射アニメーションを適用するターゲットを取得 @reflection = [] for target in @target_battlers # 反射した場合 if target.reflect[0] >= 0 # 反射アニメを適用するターゲットの配列に追加 @reflection.push(target) # temp_targetsからtargetを削除 temp_targets.delete(target) # temp_targetsに新たなターゲットをプッシュ temp_targets.push(target.reflect[1]) end end # 重複を削除 temp_targets.uniq! # 上記の調整で得た対象を得なおす @target_battlers = temp_targets # 呼び戻し reflection_update_phase4_step3 end #-------------------------------------------------------------------------- # ○ フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション) #-------------------------------------------------------------------------- alias reflection_update_phase4_step4 update_phase4_step4 def update_phase4_step4 # 反射アニメーションを適用するキャラがいる場合 if @reflection != [] for target in @reflection # アニメーション適用 target.animation_id = Annex::REFLECTION_STATES[(target.reflect[0])][2] target.animation_hit = true # アニメーションの長さにかかわらず、最低 4 フレーム待つ @wait_count = 4 end # 反射適用キャラを初期化 @reflection = [] # とりあえずreturn return end # 呼び戻し reflection_update_phase4_step4 end #-------------------------------------------------------------------------- # ○ フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ) #-------------------------------------------------------------------------- alias reflection_update_phase4_step6 update_phase4_step6 def update_phase4_step6 # 対象となった人達のダメージを初期化 for target in @target_battlers target.damage = nil end # 呼び戻し reflection_update_phase4_step6 end end