# ▼▲▼ No19. 特殊効果詰め合わせ DamageEX ver.2 ▼▲▼ # # update 2006/11/19 # # [採用] 付加属性名取得・装備属性取得 #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXS19 # # 「SPダメージ」変換係数[単位:%] # SP_DAMAGE_EFFICIENCY = 50 # # 「SP防御」指定値 (0以外を指定するとその値だけ消費します) # SP_GUARD_COST = 0 # # 特殊効果の名称設定 # SP_DAMAGE = "SPダメージ" # 「 SPダメージ 」属性の名前 CP_DAMAGE = "CPダメージ" # 「 CPダメージ 」属性の名前 HP_DRAIN = "HP吸収" # 「  HP吸収  」属性の名前 SP_DRAIN = "SP吸収" # 「  SP吸収  」属性の名前 CRITICAL_HIT = "必殺" # 「  必殺  」属性の名前 CERTAIN_HIT = "必中" # 「  必中  」属性の名前 FIXDAMAGE = "固定ダメージ" # 「固定ダメージ」属性の名前 FIXDAMAGE_NOWHPP = "%ダメージ" # 「 %ダメージ 」属性の名前 FIXDAMAGE_MAXHPP = "最大%ダメージ" # 「最大%ダメージ」属性の名前 FIXDAMAGE_USERHP = "現在HPダメージ" # 「現在HPダメージ」属性の名前 FIXDAMAGE_DIFFHP = "差分HPダメージ" # 「差分HPダメージ」属性の名前 ADD_VARIANCE = "分散度" # 「  分散度  」属性の名前 end #============================================================================== # 定数 #============================================================================== module XRXS19 # # 定数 # NOWHPP = 2 MAXHPP = 4 USERHP = 5 DIFFHP = 6 end class Game_BattleAction attr_accessor :sp_damage # 「SPダメージ」 (true/false) attr_accessor :cp_damage # 「CPダメージ」% (Numeric) attr_accessor :hp_drain # 「HP吸収」 (Numeric) attr_accessor :sp_drain # 「SP吸収」 (Numeric) attr_accessor :critical_hit # 「必殺」 (Numeric) attr_accessor :certain_hit # 「必中」 (true/false) attr_accessor :special_damage_kind # 特殊ダメージ種別(Numeric) XRXS19::定数 attr_accessor :fix_damage # 固定ダメージ値 (Numeric) attr_accessor :add_variance # 追加分散度  (Numeric) end #------------------------------------------------------------------------------ #============================================================================== # ■ Game_BattleAction #============================================================================== class Game_BattleAction #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- alias xrxs19_clear clear def clear # 呼び戻す xrxs19_clear # 特殊効果を初期化 initialize_xrxs19_special_effect end #-------------------------------------------------------------------------- # ○ 特殊効果を初期化 #-------------------------------------------------------------------------- def initialize_xrxs19_special_effect self.sp_damage = false self.cp_damage = 0 self.hp_drain = 0 self.sp_drain = 0 self.critical_hit = 0 self.certain_hit = false self.special_damage_kind = 0 self.fix_damage = 0 self.add_variance = 0 end #-------------------------------------------------------------------------- # ○ 特殊効果の設定 #-------------------------------------------------------------------------- def set_xrxs19_special_effect(set) # SPダメージ (true/false) self.sp_damage = XRXS.element_include?(set, XRXS19::SP_DAMAGE) # CPダメージ (true/false) self.cp_damage = XRXS.element_percent(set, XRXS19::CP_DAMAGE) # HP/SP吸収 (数値%) self.hp_drain = XRXS.element_percent(set, XRXS19::HP_DRAIN) self.sp_drain = XRXS.element_percent(set, XRXS19::SP_DRAIN) # 必殺 (数値%) returnar = XRXS.element_check(set, XRXS19::CRITICAL_HIT) percent = returnar[0] ? (returnar[2] == 0 ? 100 : returnar[2]) : 0 self.critical_hit = percent # 必中 (true/false) self.certain_hit = XRXS.element_include?(set, XRXS19::CERTAIN_HIT) # 特殊ダメージ種別 self.special_damage_kind = XRXS.element_include?(set, XRXS19::FIXDAMAGE_NOWHPP) ? XRXS19::NOWHPP : XRXS.element_include?(set, XRXS19::FIXDAMAGE_MAXHPP) ? XRXS19::MAXHPP : XRXS.element_include?(set, XRXS19::FIXDAMAGE_USERHP) ? XRXS19::USERHP : XRXS.element_include?(set, XRXS19::FIXDAMAGE_DIFFHP) ? XRXS19::DIFFHP : 0 # 固定ダメージ値 self.fix_damage = XRXS.element_amount(set, XRXS19::FIXDAMAGE) # 追加分散度 self.add_variance = XRXS.element_amount(set, XRXS19::ADD_VARIANCE) end #-------------------------------------------------------------------------- # ○ 特殊効果をクリア #-------------------------------------------------------------------------- def clear_xrxs19_special_effect self.sp_damage = nil self.cp_damage = nil self.hp_drain = nil self.sp_drain = nil self.critical_hit = nil self.certain_hit = nil self.special_damage_kind = nil self.fix_damage = nil self.add_variance = nil end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_writer :hp0_ban # HP/SPの 0 化または最大制限の解除 attr_writer :certain_hit # 必中受け(Trueだと攻撃を避けられない) #-------------------------------------------------------------------------- # ○ 指定の配列の特殊効果を設定 #-------------------------------------------------------------------------- def set_xrxs19_special_effect(set) self.current_action.set_xrxs19_special_effect(set) end #-------------------------------------------------------------------------- # ● ステート [攻撃を回避できない] 判定 #-------------------------------------------------------------------------- alias xrxs19_cant_evade? cant_evade? def cant_evade? return (@certain_hit ? true : xrxs19_cant_evade?) end #-------------------------------------------------------------------------- # ● 通常攻撃の効果適用 #-------------------------------------------------------------------------- alias xrxs19_attack_effect attack_effect # alias したものは effect_it 内で使用 def attack_effect(attacker) return effect_it(attacker) end #-------------------------------------------------------------------------- # ● スキルの効果適用 #-------------------------------------------------------------------------- alias xrxs19_skill_effect skill_effect # alias したものは effect_it 内で使用 def skill_effect(user, skill) return effect_it(user, skill) end #-------------------------------------------------------------------------- # ○ 効果適用 #-------------------------------------------------------------------------- def effect_it(user, skill = nil) # 特殊効果予約:SPダメージ sp_damage_plan = user.current_action.sp_damage # 実行前の数値を保持 last_hp = self.hp last_sp = self.sp last_states = self.states.dup # 特殊効果:必中 if user.current_action.certain_hit self.certain_hit = true end # 特殊効果:現HP威力 if skill != nil and XRXS.element_include?(user.skill_element_set(skill), "現HP威力") skill = skill.dup skill.power = (1.0 * skill.power * user.hp / user.maxhp).floor end # 特殊効果:減HP威力 if skill != nil and XRXS.element_include?(user.skill_element_set(skill), "減HP威力") skill = skill.dup skill.power = (1.0 * skill.power * (user.maxhp - user.hp) / user.maxhp).floor end # 特殊効果:現SP威力 if skill != nil and XRXS.element_include?(user.skill_element_set(skill), "現SP威力") skill = skill.dup skill.power = (1.0 * skill.power * user.sp / user.maxsp).floor end #/--- # 基本実行、skill が nil かどうかで通常攻撃とスキルを分別 save_in_battle = $game_temp.in_battle $game_temp.in_battle = true last_immortal = @immortal @immortal = !(self.dead?) if skill == nil bool = xrxs19_attack_effect(user) else bool = xrxs19_skill_effect(user, skill) end @immortal = last_immortal $game_temp.in_battle = save_in_battle #---/ # HP回復スキルの判定 if skill != nil and skill.power < 0 and !user.current_action.sp_damage # 既に最大HPかつステート不変かどうかで有効フラグをセット bool = false if (last_hp == self.maxhp and last_states == self.states) elsif user.current_action.sp_damage # SPダメージの場合は一旦trueへ (Thx. Tetra-Z) bool = true end # 必中の解除 self.certain_hit = false # 基本実行でfalseの場合ここで終了する ("銭投げ"は確実成功) if !bool or !self.damage.is_a?(Numeric) return bool end # # --- ダメージを測定 ------------------------------------------------- # damage = self.damage damage_sp = 0 defeated = self.dead? # # --- ダメージを変化させる ------------------------------------------- # # 特殊効果:現HP威力 if skill.nil? and XRXS.element_include?(user.equip_element_set, "現HP威力") damage = (1.0 * damage * user.hp / user.maxhp).floor end # 特殊効果:減HP威力 if skill.nil? and XRXS.element_include?(user.equip_element_set, "減HP威力") damage = (1.0 * damage * (user.maxhp - user.hp) / user.maxhp).floor end # 特殊効果:防御能力の判定 if damage > 0 and self.guarding? case battler_element_rank?(self, "防御能力") when 1 # 特殊効果:防御能力 A(無効防御) damage = 0 when 2 # 特殊効果:防御能力 B(強防御) damage /= 2 when 4 # 特殊効果:防御能力 D(50%の確率で0) if rand(2) > 0 damage = 0 else damage *= 2 end when 5 # 特殊効果:防御能力 E(SP防御) if XRXS19::SP_GUARD_COST != 0 sp_cost = XRXS19::SP_GUARD_COST else sp_cost = damage end if self.sp >= sp_cost damage = XRXS19::SP_GUARD_COST if XRXS19::SP_GUARD_COST != 0 sp_damage_plan = true end when 6 # 特殊効果:防御能力 F(二倍ダメージ) damage *= 4 end end # 特殊効果:必殺 if user.current_action.critical_hit > 0 # クリティカルが発生していた場合、それを取りやめる if self.critical self.critical = false # フラグを消して damage /= 2 # ダメージの半分を end # クリティカル判定 if rand(100) < user.current_action.critical_hit self.critical = true damage *= 2 end end # 特殊効果:固定ダメージ ( 固定ダメージ故クリティカルを禁止 ) case user.current_action.special_damage_kind when XRXS19::NOWHPP # 「%ダメージ」 if skill == nil damage = last_hp / 2 + 1 else damage = last_hp * skill.power / 100 end self.critical = false when XRXS19::MAXHPP # 「最大%ダメージ」 if skill == nil damage = self.maxhp / 4 + 1 else damage = self.maxhp * skill.power / 100 end self.critical = false when XRXS19::USERHP # 「現在HPダメージ」 damage = user.hp self.critical = false when XRXS19::DIFFHP # 「差分HPダメージ」 damage = user.maxhp - user.hp self.critical = false end # 特殊効果「分散度」(RGSS標準仕様) if user.current_action.add_variance != 0 variance = user.current_action.add_variance if variance > 0 and damage.abs > 0 amp = [damage.abs * variance / 100, 1].max damage += rand(amp+1) + rand(amp+1) - amp end end # 特殊効果「固定ダメージ」 if user.current_action.fix_damage != 0 damage = user.current_action.fix_damage end # 特殊効果:CPダメージ if user.current_action.cp_damage > 0 if defined? self.cp # 今回のダメージの、最大HPに対する割合を計算 damage_cp = user.current_action.cp_damage * self.max_cp * damage / self.maxhp / 100 self.cp -= damage_cp damage = damage * (100 - user.current_action.cp_damage)/100 self.damage = damage == 0 ? nil : damage end end # 特殊効果:SPダメージ if sp_damage_plan damage_sp = damage * XRXS19::SP_DAMAGE_EFFICIENCY / 100 damage = 0 self.damage = "" # # メモ :(RGSS標準) .damageがnilの場合、ステートの変化が即座に表示される。 # # SP回復スキルの判定 if skill != nil and skill.power < 0 # 既に最大SPかつステート不変かどうかで有効フラグをセット (Thx. Tetra-Z) bool = false if (last_sp == self.maxsp and last_states == self.states) end end # # --- ダメージを適用する --------------------------------------------- # self.hp = last_hp - damage self.damage = damage if self.damage.is_a?(Numeric) self.sp = last_sp - damage_sp if damage_sp != 0 self.damage_sp = damage_sp == 0 ? nil : damage_sp real_damage = (last_hp - self.hp) + (last_sp - self.sp) self.hp = 0 if defeated # # 特殊効果「HP吸収」「SP吸収」 # if user.current_action.hp_drain > 0 user.damage = 0 if user.damage == nil # nil の場合はリセット drain_point = -real_damage * user.current_action.hp_drain / 100 user.damage += drain_point user.hp -= drain_point if user.damage == 0 user.damage = nil end elsif user.current_action.sp_drain > 0 user.damage_sp = 0 if user.damage_sp == nil # nil の場合はリセット drain_point = -real_damage * user.current_action.sp_drain / 100 user.damage_sp += drain_point user.sp -= drain_point if user.damage_sp == 0 user.damage_sp = nil end end # 終了 return bool end #-------------------------------------------------------------------------- # ○ バトラーの指定名の属性のランクを判定 #-------------------------------------------------------------------------- def battler_element_rank?(battler, element_name) for i in 1..$data_system.elements.size if $data_system.elements[i] == element_name if self.is_a?(Game_Actor) return $data_classes[battler.class_id].element_ranks[i] else return $data_enemies[battler.id].element_ranks[i] end end end return 3 end end #============================================================================== # ■ Scene_Skill #============================================================================== class Scene_Skill #-------------------------------------------------------------------------- # ● フレーム更新 (ターゲットウィンドウがアクティブの場合) #-------------------------------------------------------------------------- alias xrxs19_update_target update_target def update_target # C ボタンが押された場合 if Input.trigger?(Input::C) # 特殊効果の取得 @actor.set_xrxs19_special_effect(@actor.skill_element_set(@skill)) end # 呼び戻す xrxs19_update_target # 特殊効果とダメージ値をクリア for actor in $game_party.actors actor.current_action.clear_xrxs19_special_effect actor.damage = nil end end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias xrxs19_main main def main # ダメージをクリア for actor in $game_party.actors actor.damage = nil end # 呼び戻す xrxs19_main # 特殊効果をクリア for actor in $game_party.actors actor.current_action.clear_xrxs19_special_effect end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始) #-------------------------------------------------------------------------- alias xrxs19_update_phase4_step2 update_phase4_step2 def update_phase4_step2 # 使用者のダメージ値を nil でリセット @active_battler.damage = nil # ステップ 2 へ xrxs19_update_phase4_step2 end #-------------------------------------------------------------------------- # ● 基本アクション 結果作成 #-------------------------------------------------------------------------- alias xrxs19_make_basic_action_result make_basic_action_result def make_basic_action_result # 攻撃の場合 if @active_battler.current_action.basic == 0 # 使用する武器の特殊効果の取得 @active_battler.set_xrxs19_special_effect(@active_battler.equip_element_set) end xrxs19_make_basic_action_result end #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- alias xrxs19_make_skill_action_result make_skill_action_result def make_skill_action_result # スキルを取得 @skill = $data_skills[@active_battler.current_action.skill_id] # 使用する武器の特殊効果の取得 @active_battler.set_xrxs19_special_effect(@active_battler.skill_element_set(@skill)) # 呼び戻す xrxs19_make_skill_action_result end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- alias xrxs19_update_phase4_step5 update_phase4_step5 def update_phase4_step5 # 呼び戻す xrxs19_update_phase4_step5 # ダメージ表示 for target in @target_battlers if target.damage_sp != nil target.damage_pop = true end end # 行動者もダメージ表示 if @active_battler.damage != nil or @active_battler.damage_sp != nil @active_battler.damage_pop = true end end end #============================================================================== # □ SPダメージ機能 (表示機能は他に任せる) #------------------------------------------------------------------------------ # SPダメージ機能を搭載し、ダメージ時には"SP (値)"文字列を生成します。 #============================================================================== class Game_Battler attr_accessor :damage_sp # ダメージSP値 end