$imported = {} if $imported == nil
$imported["ReproduceFunctions"] = true
module KGC::ReproduceFunctions
#--------------------------------------------------------------------------
# ○ 武器属性を整数配列に変換
#--------------------------------------------------------------------------
def self.create_weapon_element_list
result = []
WEAPON_ELEMENTS.each { |e|
if e.is_a?(Range)
result |= e.to_a
elsif e.is_a?(Integer)
result |= [e]
end
}
return result.sort
end
class RPG::Item < RPG::UsableItem
#--------------------------------------------------------------------------
# ○ 再現機能のキャッシュ生成
#--------------------------------------------------------------------------
def create_reproduce_functions_cache
super
@__usable_count = 1
@__skill_id = 0
self.note.split(/[\r\n]+/).each { |line|
case line
when KGC::ReproduceFunctions::Regexp::Item::MULTI_USABLE
# 使用可能回数
@__usable_count = $1.to_i
when KGC::ReproduceFunctions::Regexp::Item::EXEC_SKILL
# 発動スキル ID
@__skill_id = $1.to_i
end
}
end
#--------------------------------------------------------------------------
# ● アニメーション ID
#--------------------------------------------------------------------------
def animation_id
if exec_skill?
return $data_skills[skill_id].animation_id
else
return @animation_id
end
end
#--------------------------------------------------------------------------
# ○ 使用可能回数
#--------------------------------------------------------------------------
def usable_count
create_reproduce_functions_cache if @__usable_count == nil
return @__usable_count
end
#--------------------------------------------------------------------------
# ○ スキル発動判定
#--------------------------------------------------------------------------
def exec_skill?
return (skill_id > 0)
end
#--------------------------------------------------------------------------
# ○ 発動スキル ID
#--------------------------------------------------------------------------
def skill_id
create_reproduce_functions_cache if @__skill_id == nil
return @__skill_id
end
end
self.note.split(/[\r\n]+/).each { |line|
case line
when KGC::ReproduceFunctions::Regexp::Enemy::TRANSLUCENT
# 半透明
@__translucent = true
when KGC::ReproduceFunctions::Regexp::Enemy::CRITICAL
# クリティカル修正
@__cri += $1.to_i
end
}
end
#--------------------------------------------------------------------------
# ○ 半透明
#--------------------------------------------------------------------------
def translucent?
create_reproduce_functions_cache if @__translucent == nil
return @__translucent
end
#--------------------------------------------------------------------------
# ○ クリティカル修正
#--------------------------------------------------------------------------
def cri
create_reproduce_functions_cache if @__cri == nil
return @__cri
end
end
class Game_Battler
#--------------------------------------------------------------------------
# ● 現在のステートをオブジェクトの配列で取得
#--------------------------------------------------------------------------
alias states_KGC_ReproduceFunctions states
def states
result = states_KGC_ReproduceFunctions + auto_states
result.sort! { |a, b| b.priority <=> a.priority }
return result
end
#--------------------------------------------------------------------------
# ● MaxHP の取得
#--------------------------------------------------------------------------
alias maxhp_KGC_ReproduceFunctions maxhp
def maxhp
n = maxhp_KGC_ReproduceFunctions
states.each { |state| n *= state.maxhp_rate / 100.0 }
return [[Integer(n), 1].max, maxhp_limit].min
end
#--------------------------------------------------------------------------
# ● MaxMP の取得
#--------------------------------------------------------------------------
alias maxmp_KGC_ReproduceFunctions maxmp
def maxmp
n = maxmp_KGC_ReproduceFunctions
states.each { |state| n *= state.maxmp_rate / 100.0 }
limit = (defined?(maxmp_limit) ? maxmp_limit : 9999)
return [[Integer(n), 0].max, limit].min
end
#--------------------------------------------------------------------------
# ● HP の取得
#--------------------------------------------------------------------------
alias hp_KGC_ReproduceFunctions_Battler hp
def hp
@hp = maxhp if @hp > maxhp
return hp_KGC_ReproduceFunctions_Battler
end
#--------------------------------------------------------------------------
# ● MP の取得
#--------------------------------------------------------------------------
alias mp_KGC_ReproduceFunctions_Battler mp
def mp
@mp = maxmp if @mp > maxmp
return mp_KGC_ReproduceFunctions_Battler
end
#--------------------------------------------------------------------------
# ○ オートステートの ID を取得
#--------------------------------------------------------------------------
def auto_state_ids
return auto_states(true)
end
#--------------------------------------------------------------------------
# ○ オートステートの配列を取得
# id_only : ID のみを取得
#--------------------------------------------------------------------------
def auto_states(id_only = false)
return []
end
#--------------------------------------------------------------------------
# ● ステートの検査
# state_id : ステート ID
# 該当するステートが付加されていれば true を返す。
#--------------------------------------------------------------------------
alias state_KGC_ReproduceFunctions? state?
def state?(state_id)
return (state_KGC_ReproduceFunctions?(state_id) || auto_state?(state_id))
end
#--------------------------------------------------------------------------
# ● ステートの付加
# state_id : ステート ID
#--------------------------------------------------------------------------
alias add_state_KGC_ReproduceFunctions add_state
def add_state(state_id)
last_states = @states.dup
add_state_KGC_ReproduceFunctions(state_id)
if (@states - last_states).include?(state_id) # ステートが付加された場合
state = $data_states[state_id]
# [付加するステート] を適用
state.plus_state_set.each { |i|
add_state(i)
}
end
end
#--------------------------------------------------------------------------
# ○ オートステートの検査
# state_id : ステート ID
# 該当するステートが付加されていれば true を返す。
#--------------------------------------------------------------------------
def auto_state?(state_id)
return auto_state_ids.include?(state_id)
end
#--------------------------------------------------------------------------
# ● ステートの解除
# state_id : ステート ID
#--------------------------------------------------------------------------
alias remove_state_KGC_ReproduceFunctions remove_state
def remove_state(state_id)
if auto_state?(state_id) # オートステートは解除しない
return
end
remove_state_KGC_ReproduceFunctions(state_id)
end
#--------------------------------------------------------------------------
# ○ 半透明化判定
#--------------------------------------------------------------------------
def translucent?
# エネミーの場合は Game_Enemy で再定義
return false
end
#--------------------------------------------------------------------------
# ○ 装備オプション [全体攻撃] の取得
#--------------------------------------------------------------------------
def whole_attack
return false
end
#--------------------------------------------------------------------------
# ○ 装備オプション [回避無視] の取得
#--------------------------------------------------------------------------
def ignore_eva
return false
end
#--------------------------------------------------------------------------
# ○ MP ダメージ加算
# value : 加算する値
#--------------------------------------------------------------------------
def add_mp_damage(value)
@mp_damage += value
end
#--------------------------------------------------------------------------
# ○ 通常攻撃の消費 MP 計算
#--------------------------------------------------------------------------
def calc_attack_mp_cost
return 0
end
#--------------------------------------------------------------------------
# ● スキルの使用可能判定
# skill : スキル
#--------------------------------------------------------------------------
alias skill_can_use_KGC_ReproduceFunctions? skill_can_use?
def skill_can_use?(skill)
return false unless skill.is_a?(RPG::Skill)
return false if skill_seal?(skill)
return false unless skill_satisfied_weapon_element?(skill)
return skill_can_use_KGC_ReproduceFunctions?(skill)
end
#--------------------------------------------------------------------------
# ○ スキル封印判定
#--------------------------------------------------------------------------
def skill_seal?(skill)
return (seal_atk_f <= skill.atk_f || seal_spi_f <= skill.spi_f)
end
#--------------------------------------------------------------------------
# ○ 封印する打撃関係度を取得
#--------------------------------------------------------------------------
def seal_atk_f
n = 999
states.each { |state| n = [n, state.seal_atk_f].min }
return n
end
#--------------------------------------------------------------------------
# ○ 封印する精神関係度を取得
#--------------------------------------------------------------------------
def seal_spi_f
n = 999
states.each { |state| n = [n, state.seal_spi_f].min }
return n
end
#--------------------------------------------------------------------------
# ○ 必要な武器属性を満たしているか判定
#--------------------------------------------------------------------------
def skill_satisfied_weapon_element?(skill)
return true
end
#--------------------------------------------------------------------------
# ● 最終回避率の計算
# user : 攻撃者、スキルまたはアイテムの使用者
# obj : スキルまたはアイテム (通常攻撃の場合は nil)
#--------------------------------------------------------------------------
alias calc_eva_KGC_ReproduceFunctions calc_eva
def calc_eva(user, obj = nil)
eva = calc_eva_KGC_ReproduceFunctions(user, obj)
if obj == nil && user.ignore_eva # 通常攻撃かつ回避無視の場合
eva = 0
end
return eva
end
#--------------------------------------------------------------------------
# ● アイテムの効果適用
# user : アイテムの使用者
# item : アイテム
#--------------------------------------------------------------------------
alias item_effect_KGC_ReproduceFunctions item_effect
def item_effect(user, item)
# スキル発動判定
if item.exec_skill?
$game_temp.exec_skill_on_item = true
skill_effect(user, $data_skills[item.skill_id])
$game_temp.exec_skill_on_item = false
else
item_effect_KGC_ReproduceFunctions(user, item)
end
end
end
class Game_BattleAction
#--------------------------------------------------------------------------
# ● 通常攻撃のターゲット作成
#--------------------------------------------------------------------------
alias make_attack_targets_KGC_ReproduceFunctions make_attack_targets
def make_attack_targets
unless battler.whole_attack # 全体攻撃でない
return make_attack_targets_KGC_ReproduceFunctions
end
targets = []
if battler.confusion?
targets += friends_unit.existing_members
else
targets += opponents_unit.existing_members
end
if battler.dual_attack # 連続攻撃
targets += targets
end
return targets.compact
end
end
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ○ 半透明化判定
#--------------------------------------------------------------------------
def translucent?
return enemy.translucent?
end
#--------------------------------------------------------------------------
# ● クリティカル率の取得
#--------------------------------------------------------------------------
alias cri_KGC_ReproduceFunctions cri
def cri
n = cri_KGC_ReproduceFunctions
if enemy.has_critical && enemy.cri != 0
n += enemy.cri - 10
end
return n
end
end
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_KGC_ReproduceFunctions initialize
def initialize
initialize_KGC_ReproduceFunctions
@item_use_count = {} # 所持品使用回数ハッシュ (アイテム ID)
end
#--------------------------------------------------------------------------
# ● アイテムの減少
# item : アイテム
# n : 個数
# include_equip : 装備品も含める
#--------------------------------------------------------------------------
alias lose_item_KGC_ReproduceFunctions lose_item
def lose_item(item, n, include_equip = false)
lose_item_KGC_ReproduceFunctions(item, n, include_equip)
# アイテムが無くなったら使用回数をリセット
if item.is_a?(RPG::Item) && item.consumable && item_number(item) == 0
@item_use_count[item.id] = 0
end
end
#--------------------------------------------------------------------------
# ● アイテムの消耗
# item : アイテム
#--------------------------------------------------------------------------
alias consume_item_KGC_ReproduceFunctions consume_item
def consume_item(item)
if item.is_a?(RPG::Item) && item.consumable
update_use_count(item)
# 使用回数が 0 の場合のみ消耗
if @item_use_count[item.id] == 0
consume_item_KGC_ReproduceFunctions(item)
end
else
consume_item_KGC_ReproduceFunctions(item)
end
end
#--------------------------------------------------------------------------
# ○ 使用回数の更新
# item : アイテム
# 指定アイテムの使用回数を 1 増やす。
# 使用後に消耗する場合は、使用回数を 0 にする。
#--------------------------------------------------------------------------
def update_use_count(item)
if @item_use_count == nil
@item_use_count = {}
end
unless @item_use_count.has_key?(item.id)
@item_use_count[item.id] = 0
end
@item_use_count[item.id] += 1
# 使用可能回数に達したら、使用回数を 0 にする
if @item_use_count[item.id] >= item.usable_count
@item_use_count[item.id] = 0
end
end
end