=begin ◆概要 スリップダメージを付加させたバトラーが吸収できます。 ◆機能 ・メモ欄に<寄生>と入力すると、そのステートを付加させたバトラーが ステートのスリップダメージの分だけ吸収できます。 ・メモ欄に<完全寄生>と入力すると、そのステートを付加させたバトラーが (他のステートも含め)バトラーのスリップダメージの分だけ吸収できます。 ・メモ欄に<魔法吸収>と入力すると、ステートにかかったバトラーが魔法を使用する 時に不発となり、そのステートを付加させたバトラーがスキルの消費MPの分だけ 吸収できます。 ◆仕様 ・TPダメージは未対応。 ・寄生は実ダメージ分を上限とします。 ・完全寄生は0を下限とします。 ◆使用上の注意 ・○……新規定義 ★……エイリアス ◆作者:faida @faida3983 =end # 設定項目:「魔法」とみなすスキルタイプ MAGIC_STYPE = [2] # 設定項目:魔法吸収時、アニメーションを表示しない MAGIC_ABSORB_NO_ANI = true class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # ○ 処理簡略化のための追加能力値読み込み #-------------------------------------------------------------------------- def xparam(id) features.select{|f|f.code==22 && f.data_id==id}.inject(0){|r, f|r + f.value} end def hrg; xparam(7); end def mrg; xparam(8); end #-------------------------------------------------------------------------- # ○ メモ読み込み #-------------------------------------------------------------------------- def parasite return @parasite if !@parasite.nil? @parasite = (note =~ /<寄生>/ ? true : false); @parasite end def parasite_ex return @parasite_ex if !@parasite_ex.nil? @parasite_ex = (note =~ /<完全寄生>/ ? true : false); @parasite_ex end def magic_absorb return @magic_absorb if !@magic_absorb.nil? @magic_absorb = (note =~ /<魔法吸収>/ ? true : false); @magic_absorb end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :magic_absorb #-------------------------------------------------------------------------- # ★ オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_paras initialize def initialize initialize_paras @parasite = [] if !@parasite; @parasite_ex = [] if !@parasite_ex @magic_absorb = [] if !@magic_absorb end #-------------------------------------------------------------------------- # ★ スキル/アイテムの命中率計算 #-------------------------------------------------------------------------- alias item_hit_paras item_hit def item_hit(user, item) if !user.magic_absorb.empty? && item.is_a?(RPG::Skill) && MAGIC_STYPE.include?(item.stype_id) user.magic_absorb.each{|arr| arr[0].result.mp_damage = -skill_mp_cost(item) arr[0].mp += skill_mp_cost(item) }; return 0 end item_hit_paras(user, item) end #-------------------------------------------------------------------------- # ★ 使用効果[ステート付加]:通常 #-------------------------------------------------------------------------- alias item_effect_add_state_normal_paras item_effect_add_state_normal def item_effect_add_state_normal(user, item, effect) item_effect_add_state_normal_paras(user, item, effect) return if !@result.added_states.include?(effect.data_id) @parasite = [] if !@parasite; @parasite_ex = [] if !@parasite_ex @magic_absorb = [] if !@magic_absorb @parasite << [user, effect.data_id] if $data_states[effect.data_id].parasite if $data_states[effect.data_id].parasite_ex @parasite_ex << [user, effect.data_id] end if $data_states[effect.data_id].magic_absorb @magic_absorb << [user, effect.data_id] end @parasite.uniq!; @parasite_ex.uniq!; @magic_absorb.uniq! end #-------------------------------------------------------------------------- # ★ ステートの解除 #-------------------------------------------------------------------------- alias remove_state_paras remove_state def remove_state(state_id) if $data_states[state_id] && $data_states[state_id].parasite @parasite.delete_if{|arr|arr[1] == state_id} end if $data_states[state_id] && $data_states[state_id].parasite_ex @parasite_ex.delete_if{|arr|arr[1] == state_id} end if $data_states[state_id] && $data_states[state_id].magic_absorb @magic_absorb.delete_if{|arr|arr[1] == state_id} end remove_state_paras(state_id) end #-------------------------------------------------------------------------- # ★ 全ての再生 #-------------------------------------------------------------------------- alias regenerate_all_paras regenerate_all def regenerate_all if alive? check_parasite_dead? regenerate_all_paras @parasite.each{|a| hp_d = [-(mhp * $data_states[a[1]].hrg).to_i, @result.hp_damage].min mp_d = [-(mmp * $data_states[a[1]].mrg).to_i, @result.mp_damage].min a[0].hp += [hp_d, 0].max; a[0].mp += [mp_d, 0].max } @parasite_ex.collect{|a|a[0]}.each{|a| a.hp += [@result.hp_damage, 0].max a.mp += [@result.mp_damage, 0].max } end end #-------------------------------------------------------------------------- # ○ 寄生者死亡チェック #-------------------------------------------------------------------------- def check_parasite_dead? @parasite.each{|arr| (@parasite.delete(arr); remove_state(arr[1])) if arr[0].dead? } @parasite_ex.each{|arr| (@parasite_ex.delete(arr); remove_state(arr[1])) if arr[0].dead? } @magic_absorb.each{|arr| (@magic_absorb.delete(arr); remove_state(arr[1])) if arr[0].dead? } end end if MAGIC_ABSORB_NO_ANI #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ★ アニメーションの表示 #-------------------------------------------------------------------------- alias show_animation_paras show_animation def show_animation(targets, animation_id) item = @subject.current_action.item return if !@subject.magic_absorb.empty? && item.is_a?(RPG::Skill) && MAGIC_STYPE.include?(item.stype_id) show_animation_paras(targets, animation_id) end end end # <= if MAGIC_ABSORB_NO_ANI