=begin ◆概要 耐久力のあるバリアを作ります。 ◆機能 ・ステートのメモ欄に<耐久力バリア n, m>と入力することにより、耐久力がn、 防御力がmあるバリアを張ります。mを省略でき、その場合は0になります。 ・バリアの防御力はバリアの耐久力減少をその数値だけ減らします。 防御力100あれば155ダメージを55ダメージにできます。 ・ステートかバトラーのメモ欄に<耐久力バリアアニメ n>と入力することにより、 バリアでダメージを防いだ場合にIDがnのアニメを表示します。 ・スキル・アイテムのメモ欄に<バリア貫通>と入力することにより、バリアに よらないダメージを与えることが出来ます。 ・スキル・アイテムのメモ欄に<バリア破壊>と入力することにより、バリアがある相手に 使用した場合、耐久力に関わらず一撃でバリアを破壊することが出来ます。 ・スキル・アイテムのメモ欄に<バリア防御無視>と入力することにより、バリアの 防御力を無視してバリアにダメージを与えられます。 ◆仕様 ・バトラーに設定したアニメを優先。 ・複数バリアを張っている場合、一枚破れるとその超過分ダメージが入ったりする。 ちなみにその次の攻撃ではちゃんとバリアが機能する。 ・バリアステートを解除すればバリア破壊と同じような効果が得られます。 ◆使用上の注意 ・★……エイリアス ○……新規定義 ◆作者:faida @faida3983 ◆更新履歴 ver1.0 : 公開 ver1.1 : 防御力機能追加 =end module Barrier PAITENT_BARRIER = /<耐久力バリア\s*(\d+)(?:\s*\,\s*(\d+))?>/ BARRIER_ANIME = /<耐久力バリアアニメ\s*(\d+)>/ BARRIER_THROUGH = /<バリア貫通>/ BARRIER_BREAK = /<バリア破壊>/ BARRIER_DIGNORE = /<バリア防御無視>/ # アクター&デフォルト敵のアニメーションID。0で普通のダメージ表示。 ANIMATION_BARRIER = 0 # バリアの残り耐久力を表示する # falseでバリアへのダメージを表示します。 DISPLAY_PQP = true # スリップダメージはバリアを貫通する SLIP_DAMAGE_BTHROUGH = true end module Vocab # メッセージの定義。 BarrierDamage = "%sのバリア耐久力 残り %s " BarrierBreak = "%sのバリアが壊れた!" end class RPG::BaseItem #-------------------------------------------------------------------------- # ○ メモ取得 #-------------------------------------------------------------------------- def barrier_anime return @barrier_anime if !@barrier_anime.nil? @barrier_anime = false @barrier_anime = $1.to_i if note =~ Barrier::BARRIER_ANIME @barrier_anime end end class RPG::UsableItem #-------------------------------------------------------------------------- # ○ メモ取得 #-------------------------------------------------------------------------- def barrier_through return @barrier_through if !@barrier_through.nil? @barrier_through = !!(note =~ Barrier::BARRIER_THROUGH) @barrier_through end def barrier_break return @barrier_break if !@barrier_break.nil? @barrier_break = !!(note =~ Barrier::BARRIER_BREAK) @barrier_break end def barrier_dignore return @barrier_dignore if !@barrier_dignore.nil? @barrier_dignore = !!(note =~ Barrier::BARRIER_DIGNORE) @barrier_dignore end end class RPG::State #-------------------------------------------------------------------------- # ○ メモ取得 #-------------------------------------------------------------------------- def memo_pqp @patient_quanty = 0 @patient_quanty_def = 0 if note =~ Barrier::PAITENT_BARRIER @patient_quanty = $1.to_i; @patient_quanty_def = $2 ? $2.to_i : 0 end end def patient_quanty memo_pqp if !@patient_quanty; @patient_quanty end def patient_quanty_def memo_pqp if !@patient_quanty_def; @patient_quanty_def end end #============================================================================== # ■ Game_ActionResult #============================================================================== class Game_ActionResult #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :pqp_damage #-------------------------------------------------------------------------- # ★ ダメージ値のクリア #-------------------------------------------------------------------------- alias pqp_clear_damage_values clear_damage_values def clear_damage_values pqp_clear_damage_values @pqp_damage = 0 end #-------------------------------------------------------------------------- # ★ ダメージの作成 #-------------------------------------------------------------------------- alias pqp_make_damage make_damage def make_damage(value, item) pqp_make_damage(value, item) make_pqp_damage_value(item) if pqp_effective?(item) end #-------------------------------------------------------------------------- # ○ バリアへのダメージが有効か? #-------------------------------------------------------------------------- def pqp_effective?(item) !item.barrier_through && @battler.pqp > 0 && @hp_damage > 0 end #-------------------------------------------------------------------------- # ○ バリアへのダメージ計算 #-------------------------------------------------------------------------- def make_pqp_damage_value(item) pqp_def = item.barrier_dignore ? 0 : @battler.pqp_def @pqp_damage = [@hp_damage - pqp_def, 0].max @pqp_damage = @battler.pqp if item.barrier_break @battler.pqp -= @pqp_damage if @battler.pqp <= 0 id = @battler.states.find{|s|s.patient_quanty == @battler.maxpqp}.id @battler.remove_state(id) @hp_damage = -@battler.pqp; @battler.pqp = @battler.maxpqp else @hp_damage = 0 end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :maxpqp attr_reader :pqp_def attr_accessor :pqp #-------------------------------------------------------------------------- # ★ オブジェクト初期化 #-------------------------------------------------------------------------- alias pqp_initialize initialize def initialize; pqp_initialize; @maxpqp = 0; @pqp_def = 0; @pqp = 0; end #-------------------------------------------------------------------------- # ○ バリア表示時のアニメーション ID #-------------------------------------------------------------------------- def barrier_anime anime = Barrier::ANIMATION_BARRIER states.each{|s|anime = s.barrier_anime if s.barrier_anime} return actor.barrier_anime if actor? && actor.barrier_anime enemy? && enemy.barrier_anime ? enemy.barrier_anime : anime end #-------------------------------------------------------------------------- # ★ ステートの付加 #-------------------------------------------------------------------------- alias pqp_add_state add_state def add_state(state_id) last_pqp = @maxpqp pqp_add_state(state_id) @maxpqp = [$data_states[state_id].patient_quanty, @maxpqp].max if @maxpqp != last_pqp @pqp = @maxpqp @pqp_def = $data_states[state_id].patient_quanty_def end end #-------------------------------------------------------------------------- # ★ ステートの解除 #-------------------------------------------------------------------------- alias pqp_remove_state remove_state def remove_state(state_id) pqp_remove_state(state_id) last_pqp_state = states.max_by{|s|s.patient_quanty} if last_pqp_state @maxpqp = last_pqp_state.patient_quanty @pqp_def = last_pqp_state.patient_quanty_def else @maxpqp = 0; @pqp_def = 0 end @pqp = [@pqp, @maxpqp].min end end #============================================================================== # ■ Window_BattleLog #============================================================================== class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ★ HP ダメージ表示 #-------------------------------------------------------------------------- alias pqp_display_hp_damage display_hp_damage def display_hp_damage(target, item) if target.result.pqp_damage > 0 display_pqp_damage(target) pqp_display_hp_damage(target, item) if target.result.hp_damage > 0 else pqp_display_hp_damage(target, item) end end #-------------------------------------------------------------------------- # ○ PQP ダメージ表示 #-------------------------------------------------------------------------- def display_pqp_damage(target) if target.result.hp_damage > 0 text = sprintf(Vocab::BarrierBreak, target.name) else pqp = Barrier::DISPLAY_PQP ? target.pqp : target.result.pqp_damage text = sprintf(Vocab::BarrierDamage, target.name, pqp) if target.barrier_anime > 0 SceneManager.scene.show_animation([target], target.barrier_anime) else target.perform_damage_effect end end add_text(text) wait end end if !Barrier::SLIP_DAMAGE_BTHROUGH #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● HP の再生 #-------------------------------------------------------------------------- def regenerate_hp damage = -(mhp * hrg).to_i perform_map_damage_effect if $game_party.in_battle && damage > 0 @result.hp_damage = [damage, max_slip_damage].min if @pqp > 0 @pqp -= @result.hp_damage if @pqp <= 0 remove_state(states.find{|s|s.patient_quanty == @maxpqp}.id) @result.hp_damage = -@pqp; @pqp = @maxpqp else @result.hp_damage = 0 end end self.hp -= @result.hp_damage end end end # <= if !Barrier::SLIP_DAMAGE_BTHROUGH