=begin DoTダメージ β版  RPGツクールVXAce用スクリプト   制作 : 石っころ  URL : http://tek0tek.blog130.fc2.com/  内容 : ダメージを継続して与えるスキルの実装      対象が行動時に(スキル命中時のダメージを元にした)継続ダメージを与えます  使い方   ・スキルのメモ欄にて、以下の様に記載します。                     xは効果時間 yyは初弾ダメージに対する継続ダメージの割合 zzは分散度     aaaは効果開始のテキスト内容     bbbは効果継続のテキスト内容     cccは効果終了のテキスト内容 =end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase attr_accessor :dot_list # DoTリスト #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_dot initialize def initialize @dot_list = [] #DoTダメージリスト initialize_dot end #-------------------------------------------------------------------------- # ● ダメージ計算 #-------------------------------------------------------------------------- alias make_damage_value_dot make_damage_value def make_damage_value(user, item) make_damage_value_dot(user, item) set_dot_damagelist(user, item) end #-------------------------------------------------------------------------- # ● DoTダメージ設定 #-------------------------------------------------------------------------- def set_dot_damagelist(user, item) for dot_damage in item.note.scan(//i) if dot_damage #効果時間が0以上 if dot_damage[0].to_i > 0 damage_val = (@result.hp_damage * dot_damage[1].to_i) / 100 #ダメージが0以上 if damage_val > 0 && item.damage.to_hp? #DoTのIDを作成する if user.actor? dot_id = "ACTOR_ID" + user.id.to_s else dot_id = "ENEMY_ID" + user.index.to_s end if item.is_a?(RPG::Skill) dot_id += "_SKILL_ID" + item.id.to_s else dot_id += "_ITEM_ID" + item.id.to_s end #同一ユーザーの同一DoTスキルがあれば更新する @dot_list.delete_if{|dot_value|dot_value[:dot_id] == dot_id} dot_value = {:damage => damage_val, :effect_time => dot_damage[0].to_i, :variance => dot_damage[2].to_i, :dot_id => dot_id, :dot_text2 => get_dot_text2(item), :dot_text3 => get_dot_text3(item)} @dot_list.push(dot_value) end end end end end #-------------------------------------------------------------------------- # ● DoT開始時テキスト取得 #-------------------------------------------------------------------------- def get_dot_text1(item) for dot_text in item.note.scan(//i) if dot_text[0] return dot_text[0].to_s end end return "" end #-------------------------------------------------------------------------- # ● DoT継続時テキスト取得 #-------------------------------------------------------------------------- def get_dot_text2(item) for dot_text in item.note.scan(//i) if dot_text[0] return dot_text[0].to_s end end return "" end #-------------------------------------------------------------------------- # ● DoT終了時テキスト取得 #-------------------------------------------------------------------------- def get_dot_text3(item) for dot_text in item.note.scan(//i) if dot_text[0] return dot_text[0].to_s end end return "" end #-------------------------------------------------------------------------- # ● 戦闘終了処理 #-------------------------------------------------------------------------- alias on_battle_end_dot on_battle_end def on_battle_end @dot_list.clear on_battle_end_dot end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 戦闘行動終了時の処理 #-------------------------------------------------------------------------- alias process_action_end_dot process_action_end def process_action_end @subject.dot_list.each_index {|index| damage_val = @subject.apply_variance(@subject.dot_list[index][:damage].to_f, @subject.dot_list[index][:variance].to_f) @log_window.display_dot_damage(@subject, @subject.dot_list[index][:dot_text2], damage_val.to_i) @subject.hp -= damage_val.to_i @subject.dot_list[index][:effect_time] -= 1 @log_window.display_dot_damage_end(@subject, @subject.dot_list[index][:dot_text3]) if(@subject.dot_list[index][:effect_time] <= 0) } #効果時間が過ぎたDoTを削除する @subject.dot_list.delete_if{|dot_value|dot_value[:effect_time] <= 0} @log_window.display_changed_states(@subject) @log_window.display_changed_buffs(@subject) process_action_end_dot end end #============================================================================== # ■ Window_BattleLog #------------------------------------------------------------------------------ #  戦闘の進行を実況表示するウィンドウです。枠は表示しませんが、便宜上ウィンド # ウとして扱います。 #============================================================================== class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ● HP ダメージ表示 #-------------------------------------------------------------------------- alias display_hp_damage_dot display_hp_damage def display_hp_damage(target, item) display_hp_damage_dot(target, item) for dot_damage in item.note.scan(//i) if dot_damage if target.result.hp_damage > 0 add_text(target.name + target.get_dot_text1(item)) wait end end end end #-------------------------------------------------------------------------- # ● DoTダメージ継続時表示 #-------------------------------------------------------------------------- def display_dot_damage(target, dot_text, dot_damage) add_text(target.name + dot_text) target.perform_damage_effect wait fmt = target.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage add_text(sprintf(fmt, target.name, dot_damage)) wait end #-------------------------------------------------------------------------- # ● DoTダメージから回復表示 #-------------------------------------------------------------------------- def display_dot_damage_end(target, dot_text) add_text(target.name + dot_text) wait end end