#============================================================================== # ■ RGSS3 マルチプルアイテム・スキル Ver1.02 by 星潟 #------------------------------------------------------------------------------ # 複数のアイテム、もしくはスキルのダメージ部分の効果を # 一つのアイテム・スキルで扱う事が出来ます。 # これにより、HPダメージを与えつつMPを吸収するような特殊スキルや # 複数属性の異なるダメージを同時に併せ持つスキルを作成できます。 # 対象やコスト、使用効果は元のスキルに依存します。 # # 設定例(デフォルトの場合) # ファイアTのメモ欄に以下のように記述 # <マルチダメージ:49,50,55,59> # ファイアT、ライフドレイン、マナドレイン、アイスT、サンダーTを # それぞれの属性でダメージ計算した後、合計してダメージ処理。 # ライフドレインの分だけHPを吸収し、マナドレインの分だけMPを吸収する。 #============================================================================== # Ver1.01 全体的な軽量化を施しました。 #============================================================================== module MULTI_SKILL #設定用ワードを指定します。 WORD1 = "マルチダメージ" #HPダメージ&HP吸収、もしくはMPダメージ&MP吸収の組み合わせのスキルを #作成する場合において、ダメージと吸収の表示を明確に分けるか否か #(全てのスキルにおいて相手へのダメージと # 自分への吸収が別表示されるようになります) CHANGE = true end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ダメージ計算 #-------------------------------------------------------------------------- alias make_damage_value_multipul_damage make_damage_value def make_damage_value(user, item) #本来の処理を実行。 make_damage_value_multipul_damage(user, item) #HPダメージフラグを判定。 hpdflg = item.damage.to_hp? #HPダメージ・MPダメージ・HP吸収・MP吸収データを取得。 rhda = @result.hp_damage rmda = @result.mp_damage rhdr = @result.hp_drain rmdr = @result.mp_drain #マルチプルアイテム・スキルの配列データを取得。 array = item.multi_is_array #配列が空ではない場合はマルチプルアイテム・スキルの処理を行う。 unless array.empty? #配列のデータ別に処理 array.each {|i| #元のアイテム・スキルがアイテムかスキルかで処理を分岐。 item_data = item.is_a?(RPG::Skill) ? $data_skills[i] : $data_items[i] #マルチプルアイテム・スキルがHPダメージを与える場合はHPダメージフラグを立てる。 hpdflg = true if item_data.damage.to_hp? #本来の処理をマルチプルアイテム・スキルに置き換えて実行。 make_damage_value_multipul_damage(user, item_data) #得られた値を取得していた値に加える。 rhda += @result.hp_damage if item_data.damage.to_hp? rmda += @result.mp_damage if item_data.damage.to_mp? rhdr += @result.hp_damage if item_data.damage.to_hp? && item_data.damage.drain? rmdr += @result.mp_damage if item_data.damage.to_mp? && item_data.damage.drain? } end #HPダメージ・MPダメージの値を最終的に値に変更する。 @result.hp_damage = rhda @result.mp_damage = rmda @result.hp_drain = rhdr @result.mp_drain = rmdr #ダメージを与えられなかった場合は失敗とする。 @result.success = false if rhda == 0 && rmda == 0 && rhdr == 0 && rmdr == 0 #ここまででHPダメージフラグが有効の場合は成功とする。 @result.success = true if hpdflg end end class Game_ActionResult #-------------------------------------------------------------------------- # HP ダメージの文章を取得 #-------------------------------------------------------------------------- def hp_damage_text1 if @hp_damage > 0 fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage sprintf(fmt, @battler.name, @hp_damage) elsif @hp_damage < 0 fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery sprintf(fmt, @battler.name, Vocab::hp, -hp_damage) else fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage sprintf(fmt, @battler.name) end end #-------------------------------------------------------------------------- # HP ダメージの文章を取得 #-------------------------------------------------------------------------- def hp_damage_text2 if @hp_drain > 0 fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain sprintf(fmt, @battler.name, Vocab::hp, @hp_drain) else "" end end #-------------------------------------------------------------------------- # MP ダメージの文章を取得 #-------------------------------------------------------------------------- def mp_damage_text1 if @mp_damage > 0 fmt = @battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss sprintf(fmt, @battler.name, Vocab::mp, @mp_damage) elsif @mp_damage < 0 fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery sprintf(fmt, @battler.name, Vocab::mp, -@mp_damage) else "" end end #-------------------------------------------------------------------------- # MP ダメージの文章を取得 #-------------------------------------------------------------------------- def mp_damage_text2 if @mp_drain > 0 fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain sprintf(fmt, @battler.name, Vocab::mp, @mp_drain) else "" end end end class Window_BattleLog < Window_Selectable if MULTI_SKILL::CHANGE #-------------------------------------------------------------------------- # HP ダメージ表示 #-------------------------------------------------------------------------- def display_hp_damage(target, item) return if target.result.hp_damage == 0 && item && !item.damage.to_hp? target.perform_damage_effect if target.result.hp_damage > 0 Sound.play_recovery if target.result.hp_damage < 0 add_text(target.result.hp_damage_text1) wait return unless target.result.hp_drain > 0 add_text(target.result.hp_damage_text2) wait end #-------------------------------------------------------------------------- # MP ダメージ表示 #-------------------------------------------------------------------------- def display_mp_damage(target, item) return if target.dead? || target.result.mp_damage == 0 Sound.play_recovery if target.result.mp_damage < 0 add_text(target.result.mp_damage_text1) wait return unless target.result.mp_drain > 0 add_text(target.result.mp_damage_text2) wait end end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # マルチプルアイテム・スキル配列 #-------------------------------------------------------------------------- def multi_is_array #キャッシュが存在する場合はキャッシュを返す。 @multi_is_array ||= /<#{MULTI_SKILL::WORD1}[::](\S+)>/ =~ note ? $1.to_s.split(/\s*,\s*/).inject([]) {|r,i| r.push(i.to_i)} : [] end end