
# XMS.「XRXS19.DamageEX」追加パーツ
# by Tetra-Z
#
# 追加分
# ・回復かつステート変化を持つスキルで、対象のHPがフルだと使えないバグの修正
# ・「現HP威力」「減HP威力」の武器への適応
# ・「%ダメージ」「最大%ダメージ」SP版「SP%ダメージ」「最大SP%ダメージ」
# ・「現SP威力」「減SP威力」「現在SPダメージ」「差分SPダメージ」
# ・「防御能力」ランクE「SP身代わり」(オマケ、不要なら「★」を検索してコメントアウトで)
#
# 上書き : class Game_Battler
# def set_xrxs19_special_effect(set)
# def effect_it(user, skill = nil)
#------------------------------------------------------------------------------
# ▽ 特殊効果の設定 ( 名称設定、取得設定 )
#==============================================================================
module XRXS19_Fixed_Valuables
ELEMENT_NAME_FIXDAMAGE_NOWSPP = "SP%ダメージ" # 「 SP%ダメージ 」属性の名前
ELEMENT_NAME_FIXDAMAGE_MAXSPP = "最大SP%ダメージ" # 「最大SP%ダメージ」属性の名前
ELEMENT_NAME_FIXDAMAGE_USERSP = "現在SPダメージ" # 「 現在SPダメージ 」属性の名前
ELEMENT_NAME_FIXDAMAGE_DIFFSP = "差分SPダメージ" # 「 差分SPダメージ 」属性の名前
end
#------------------------------------------------------------------------------
#==============================================================================
# □ 定数
#==============================================================================
module XRXS19
FIXDAMAGE_NOWSPP = 12
FIXDAMAGE_MAXSPP = 14
FIXDAMAGE_USERSP = 15
FIXDAMAGE_DIFFSP = 16
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ○ 指定の配列の特殊効果を設定
#--------------------------------------------------------------------------
def set_xrxs19_special_effect(set)
# SPダメージ (true/false)
self.current_action.sp_damage = element_include?(set, ELEMENT_NAME_SP_DAMAGE)
# CPダメージ (true/false)
self.current_action.cp_damage = element_percent(set, ELEMENT_NAME_CP_DAMAGE)
# HP/SP吸収 (数値%)
self.current_action.hp_drain = element_percent(set, ELEMENT_NAME_HP_DRAIN)
self.current_action.sp_drain = element_percent(set, ELEMENT_NAME_SP_DRAIN)
# 必殺 (数値%)
returnar = element_check(set, ELEMENT_NAME_CRITICAL_HIT)
percent = returnar[0] ? (returnar[2] == 0 ? 100 : returnar[2]) : 0
self.current_action.critical_hit = percent
# 必中 (true/false)
self.current_action.certain_hit = element_include?(set, ELEMENT_NAME_CERTAIN_HIT)
# 特殊ダメージ種別
self.current_action.special_damage_kind =
element_include?(set, ELEMENT_NAME_NO_DAMAGE) ? XRXS19::NO_DAMAGE :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_NOWHPP) ? XRXS19::FIXDAMAGE_NOWHPP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_MAXHPP) ? XRXS19::FIXDAMAGE_MAXHPP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_NOWSPP) ? XRXS19::FIXDAMAGE_NOWSPP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_MAXSPP) ? XRXS19::FIXDAMAGE_MAXSPP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_USERHP) ? XRXS19::FIXDAMAGE_USERHP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_DIFFHP) ? XRXS19::FIXDAMAGE_DIFFHP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_USERSP) ? XRXS19::FIXDAMAGE_USERSP :
element_include?(set, ELEMENT_NAME_FIXDAMAGE_DIFFSP) ? XRXS19::FIXDAMAGE_DIFFSP :
0
# 固定ダメージ値
self.current_action.fix_damage = element_amount(set, ELEMENT_NAME_FIXDAMAGE)
# 追加分散度
self.current_action.add_variance = element_amount(set, ELEMENT_NAME_ADD_VARIANCE)
end
#--------------------------------------------------------------------------
# ○ 効果適用
#--------------------------------------------------------------------------
def effect_it(user, skill = nil)
# 初期化
user.current_action.hp_drain = 0 if user.current_action.hp_drain.nil?
user.current_action.sp_drain = 0 if user.current_action.sp_drain.nil?
user.current_action.critical_hit = 0 if user.current_action.critical_hit.nil?
user.current_action.special_damage_kind = 0 if user.current_action.special_damage_kind.nil?
# 実行前の数値・ステートを保持
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 element_include?(user.skill_element_set(skill), "現HP威力")
skill = skill.dup
skill.power = (1.0 * skill.power * user.hp / user.maxhp).floor
elsif skill == nil and element_include?(user.element_set, "現HP威力")
user = user.dup
user.atk = (1.0 * user.atk * user.hp / user.maxhp).floor
end
# 特殊効果:減HP威力
if skill != nil and element_include?(user.skill_element_set(skill), "減HP威力")
skill = skill.dup
skill.power = (1.0 * skill.power * (user.maxhp - user.hp) / user.maxhp).floor
elsif skill == nil and element_include?(user.skill_element_set(skill), "減HP威力")
user = user.dup
user.atk = (1.0 * user.atk * (user.maxhp - user.hp) / user.maxhp).floor
end
# 特殊効果:現SP威力
if skill != nil and element_include?(user.skill_element_set(skill), "現SP威力")
skill = skill.dup
skill.power = (1.0 * skill.power * user.sp / user.maxsp).floor
elsif skill == nil and element_include?(user.element_set, "現SP威力")
user = user.dup
user.atk = (1.0 * user.atk * user.sp / user.maxsp).floor
end
# 特殊効果:減SP威力
if skill != nil and element_include?(user.skill_element_set(skill), "減SP威力")
skill = skill.dup
skill.power = (1.0 * skill.power * (user.maxsp - user.sp) / user.maxsp).floor
elsif skill == nil and element_include?(user.skill_element_set(skill), "減SP威力")
user = user.dup
user.atk = (1.0 * user.atk * (user.maxsp - user.sp) / user.maxsp).floor
end
#/---
# 基本実行、skill が nil かどうかで通常攻撃とスキルを分別
save_in_battle = $game_temp.in_battle
$game_temp.in_battle = true
if skill == nil
bool = xrxs19_attack_effect(user)
else
bool = xrxs19_skill_effect(user, skill)
end
$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へ
bool = true
end
# 必中の解除
self.certain_hit = false
#
# --- ダメージを測定 -------------------------------------------------
#
damage = self.damage
damage_sp = 0
#
# --- ダメージを変化させる -------------------------------------------
#
# 特殊効果:消費金額に順ずる固定ダメージ
if skill != nil and element_include?(user.skill_element_set(skill), "銭投げ")
# ゴールドの消費
last_gold = $game_party.gold
$game_party.gain_gold(-1 * ($game_party.gold * skill.variance / 100 + skill.power))
self.hp += damage if bool
damage = last_gold - $game_party.gold
bool = true
end
# 基本実行でfalseの場合ここで終了する ("銭投げ"は確実成功)
if !bool or !damage.is_a?(Numeric)
return bool
end
# 特殊効果デメリット
if XRXS19::DEMERIT and damage > 0 and
(user.current_action.hp_drain > 0 or
user.current_action.sp_drain > 0 or
user.current_action.critical_hit > 0)
damage = damage * 2/3
end
# 特殊効果:防御能力の判定
if damage > 0 and self.guarding?
case battler_element_rank?(self, "防御能力")
when 2 # 特殊効果:防御能力 2(強防御)
damage /= 2
when 1 # 特殊効果:防御能力 1(無効防御)
damage = 0
when 4
if rand(2) > 0
damage = 0
else
damage *= 2
end
# 防御能力E:「SP身代わり」追加分1/2ここから★
when 5
damage *= 2
# 防御能力E:「SP身代わり」追加分1/2ここまで★
when 6
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::FIXDAMAGE_NOWHPP # 「%ダメージ」
if skill == nil
damage = last_hp / 2 + 1
else
damage = last_hp * skill.power / 100
end
self.critical = false
when XRXS19::FIXDAMAGE_MAXHPP # 「最大%ダメージ」
if skill == nil
damage = self.maxhp / 4 + 1
else
damage = self.maxhp * skill.power / 100
end
self.critical = false
when XRXS19::FIXDAMAGE_NOWSPP # 「SP%ダメージ」
if skill == nil
damage = last_sp / 2 + 1
else
damage = last_sp * skill.power / 100
end
self.critical = false
when XRXS19::FIXDAMAGE_MAXSPP # 「最大SP%ダメージ」
if skill == nil
damage = self.maxsp / 4 + 1
else
damage = self.maxsp * skill.power / 100
end
self.critical = false
when XRXS19::FIXDAMAGE_USERHP # 「現在HPダメージ」
damage = user.hp
self.critical = false
when XRXS19::FIXDAMAGE_DIFFHP # 「差分HPダメージ」
damage = user.maxhp - user.hp
self.critical = false
when XRXS19::FIXDAMAGE_USERSP # 「現在SPダメージ」
damage = user.sp
self.critical = false
when XRXS19::FIXDAMAGE_DIFFSP # 「差分SPダメージ」
damage = user.maxsp - user.sp
self.critical = false
when XRXS19::NO_DAMAGE # 「ダメージ無し」
damage = 0
self.damage = nil
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 * 65535 * 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ダメージ
# 防御能力E:「SP身代わり」追加分2/2↓ここ(「or」)から★
if (user.current_action.sp_damage or (self.guarding? and
battler_element_rank?(self, "防御能力") == 5 and
damage > 0 and self.sp > 0))
# 防御能力E:「SP身代わり」追加分2/2ここまで★
damage_sp = damage
damage = 0
self.damage = nil
# SP回復スキルの判定
if skill != nil and skill.power < 0
# 既に最大SPかつステート不変かどうかで有効フラグをセット
bool = false if (self.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 -= 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)
#
# 特殊効果「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
end