コード: 全て選択
#==============================================================================
# ■ Game_Action
#==============================================================================
class Game_Action
#--------------------------------------------------------------------------
# ● スキル/アイテムの評価
#--------------------------------------------------------------------------
def evaluate_item
return if item.for_all? && item_target_candidates.size == 1
return if item.is_a?(RPG::Item) && !$game_party.has_item?(item)
(0...item.target_num).to_a.inject(0){|r, i|
item_target_candidates.each do |target|
value = evaluate_item_with_target(target)
if item.for_all?
@value += value
elsif value > @value
@value = value
@target_index = target.index
end
end
@targets_index << @target_index
i == item.target_num - 1 ? @value += r : r + @value
}
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの評価(ターゲット指定)
#--------------------------------------------------------------------------
def evaluate_item_with_target(target)
target.result.clear
target.make_damage_value_test(subject, item)
if item.for_opponent?
n = target.result.hp_damage.to_f / [target.hp, 1].max
item.effects.inject(n){|r, effect|
case effect.code
when 11
r + evaluate_recover_hp(target, item, effect) / [target.hp, 1].max
when 12
r + evaluate_recover_mp(target, item, effect) / [target.mp, 1].max
when 13
r + evaluate_gain_tp(target, item, effect)
when 21
r + evaluate_add_state(target, item, effect)
when 22
r + evaluate_remove_state(target, item, effect)
when 31
r + evaluate_add_buff(target, item, effect)
when 32
r + evaluate_add_debuff(target, item, effect)
when 33
r + evaluate_remove_buff(target, item, effect)
when 34
r + evaluate_remove_debuff(target, item, effect)
else
r
end
}
else
recovery = [-target.result.hp_damage, target.mhp - target.hp].min
n = recovery == 0.0 ? 0.0 :
[0.5 + (recovery.to_f / target.mhp) - target.hp_rate, 0].max
item.effects.inject(n){|r, effect|
case effect.code
when 11
r + evaluate_recover_hp(target, item, effect)
when 12
r + evaluate_recover_mp(target, item, effect)
when 13
r + evaluate_gain_tp(target, item, effect)
when 21
r + evaluate_add_state(target, item, effect)
when 22
r + evaluate_remove_state(target, item, effect)
when 31
r + evaluate_add_buff(target, item, effect)
when 32
r + evaluate_add_debuff(target, item, effect)
when 33
r + evaluate_remove_buff(target, item, effect)
when 34
r + evaluate_remove_debuff(target, item, effect)
else
r
end
}
end
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[HP 回復]
#--------------------------------------------------------------------------
def evaluate_recover_hp(target, item, effect)
return -0.25 if target.hp_rate > 0.9
value = (target.mhp * effect.value1 + effect.value2) * target.rec
value *= (item.is_a?(RPG::Item) ? @subject.pha : 1.0)
value = [value, target.mhp - target.hp].min
0.5 + value / target.mhp - target.hp_rate
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[MP 回復]
#--------------------------------------------------------------------------
def evaluate_recover_mp(target, item, effect)
value = (target.mmp * effect.value1 + effect.value2) * target.rec
value *= (item.is_a?(RPG::Item) ? @subject.pha : 1.0)
value = [value, target.mmp - target.mp].min
[0.25 + value / target.mmp - target.mp_rate, 0.001].max
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[TP 増加]
#--------------------------------------------------------------------------
def evaluate_gain_tp(target, item, effect)
effect.value1 / 100.0
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[ステート付加]
#--------------------------------------------------------------------------
def evaluate_add_state(target, item, effect)
if effect.data_id == 0
evaluate_add_state_attack(target, item, effect)
else
evaluate_add_state_normal(target, item, effect)
end
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[ステート付加]:通常攻撃
#--------------------------------------------------------------------------
def evaluate_add_state_attack(target, item, effect)
@subject.atk_states.inject(0.0) do |r, state_id|
chance = effect.value1
chance *= target.state_rate(state_id)
chance *= @subject.atk_states_rate(state_id)
chance *= target.luk_effect_rate(@subject)
r + chance
end
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[ステート付加]:通常
#--------------------------------------------------------------------------
def evaluate_add_state_normal(target, item, effect)
return 0.001 if effect.data_id == 9
chance = effect.value1
chance *= target.state_rate(effect.data_id) if target.opposite?(@subject)
chance *= target.luk_effect_rate(@subject) if target.opposite?(@subject)
chance
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[ステート解除]
#--------------------------------------------------------------------------
def evaluate_remove_state(target, item, effect)
target.state?(effect.data_id) ? effect.value1 : 0.0
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[能力強化]
#--------------------------------------------------------------------------
def evaluate_add_buff(target, item, effect)
target.buff_max?(effect.data_id) ? 0.0 : 0.25
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[能力弱体]
#--------------------------------------------------------------------------
def evaluate_add_debuff(target, item, effect)
return 0.0 if target.debuff_max?(effect.data_id)
target.debuff_rate(effect.data_id) * target.luk_effect_rate(@subject) *
0.001 * target.param_base(effect.data_id)
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[能力強化の解除]
#--------------------------------------------------------------------------
def evaluate_remove_buff(target, item, effect)
@buffs[effect.data_id] > 0 ? 0.5 : 0
end
#--------------------------------------------------------------------------
# ● 使用効果の評価[能力弱体の解除]
#--------------------------------------------------------------------------
def evaluate_remove_debuff(target, item, effect)
@buffs[effect.data_id] < 0 ? 0.5 : 0
end
end