1051 lines
No EOL
39 KiB
Ruby
1051 lines
No EOL
39 KiB
Ruby
#==============================================================================
|
|
# ■併用化ベーススクリプトD for RGSS3 Ver5.03-β6
|
|
# □作成者 kure
|
|
#==============================================================================
|
|
|
|
$kure_base_script = {} if $kure_base_script == nil
|
|
$kure_base_script[:base_D] = 503
|
|
p "併用化ベーススクリプトD"
|
|
|
|
#==============================================================================
|
|
# ■ Window_BattleLog
|
|
#==============================================================================
|
|
class Window_BattleLog < Window_Selectable
|
|
#--------------------------------------------------------------------------
|
|
# ● 反撃の表示(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def display_counter(target, item)
|
|
Sound.play_evasion
|
|
if item.id == 1
|
|
add_text(sprintf(Vocab::CounterAttack, target.name))
|
|
else
|
|
add_text(sprintf(Vocab::Ext_CounterAttack, target.name, item.name))
|
|
end
|
|
wait
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ステート付加の表示(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def display_added_states(target)
|
|
target.result.added_state_objects.each do |state|
|
|
next if state.id == target.death_state_id && target.result.final_atk
|
|
state_msg = target.actor? ? state.message1 : state.message2
|
|
target.perform_collapse_effect if state.id == target.death_state_id
|
|
next if state_msg.empty?
|
|
replace_text(target.name + state_msg)
|
|
wait
|
|
wait_for_effect
|
|
end
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Battler
|
|
#==============================================================================
|
|
class Game_Battler < Game_BattlerBase
|
|
#--------------------------------------------------------------------------
|
|
# ● 運による有効度変化率の取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def luk_effect_rate(user)
|
|
[1.0 + (user.luk - luk) * KURE::BaseScript::C_LUK_EFFECT, 0.0].max
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 戦闘不能になる(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def die
|
|
@hp = 0
|
|
#全ステートを検索し、残留対象のステート以外を解除する
|
|
self.need_passive_refresh = false if actor?
|
|
states.each do |state|
|
|
next if state.not_delete_state
|
|
erase_state(state.id) if state.battler_add_ability(1)[0] == 0 && state.gain_drop_rate == 100
|
|
end
|
|
self.need_passive_refresh = true if actor?
|
|
clear_buffs
|
|
set_passive_skills if actor?
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ステートの付加(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def add_state(state_id)
|
|
#重複許容
|
|
return unless state_multi_addable?(state_id)
|
|
|
|
last_flag = self.need_passive_refresh if actor?
|
|
self.need_passive_refresh = false if actor?
|
|
|
|
basic_state = $data_states[state_id].basic_state
|
|
basic_state.each{|id| return unless state?(id)}
|
|
|
|
#上書きステートを処理
|
|
overwrite_state = $data_states[state_id].overwrite_state_type
|
|
overwrite_state.each do |type|
|
|
states.each{|state| remove_state(state.id) if state.state_type.include?(type)}
|
|
end
|
|
|
|
#相殺ステートを処理する
|
|
offset_state = $data_states[state_id].offset_state_type
|
|
flag = 0
|
|
offset_state.each do |off_type|
|
|
states.each do |state|
|
|
if state.state_type.include?(off_type)
|
|
remove_state(state.id)
|
|
flag = 1
|
|
end
|
|
end
|
|
end
|
|
|
|
self.need_passive_refresh = last_flag if actor?
|
|
set_passive_skills(2) if actor? && flag == 1
|
|
return if flag == 1
|
|
self.need_passive_refresh = false if actor?
|
|
|
|
#上書き情報により処理を変更
|
|
mode = $data_states[state_id].overwrite_mode
|
|
return if mode == 2 && state?(state_id)
|
|
|
|
#付与できないステートは処理しない
|
|
return unless state_addable?(state_id)
|
|
|
|
#モードによりカウンター更新手順を変更
|
|
cheak = [1,10,32]
|
|
if @actor_add_counter && @actor_add_delay
|
|
cheak.each do |ability|
|
|
@actor_add_counter[ability] ||= 0
|
|
@actor_add_delay[ability] ||= 0
|
|
|
|
case ability
|
|
when 1
|
|
ability_1 = $data_states[state_id].battler_add_ability(1)
|
|
case mode
|
|
when 1,2
|
|
@actor_add_counter[ability] += ability_1[2]
|
|
@actor_add_delay[ability] = [ability_1[3],self.battler_add_ability(1)[3]].max
|
|
when 0
|
|
@actor_add_counter[ability] = [@actor_add_counter[ability],ability_1[2]].max
|
|
@actor_add_delay[ability] = [ability_1[3],self.battler_add_ability(1)[3]].max
|
|
end
|
|
when 10
|
|
case mode
|
|
when 1,2
|
|
@actor_add_counter[ability] += $data_states[state_id].battler_add_ability(10)
|
|
when 0
|
|
@actor_add_counter[ability] = [@actor_add_counter[ability],$data_states[state_id].battler_add_ability(10)].max
|
|
end
|
|
when 32
|
|
if @actor_add_delay[ability] != 0
|
|
@actor_add_delay[ability] += $data_states[state_id].battler_add_ability(32)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
add_new_state(state_id) unless state?(state_id)
|
|
case mode
|
|
when 0,2
|
|
reset_state_counts(state_id)
|
|
when 1
|
|
add_state_counts(state_id)
|
|
end
|
|
@result.added_states.push(state_id).uniq!
|
|
|
|
#アクターであればパッシブスキルを更新する
|
|
self.need_passive_refresh = last_flag if actor?
|
|
set_passive_skills(2) if actor?
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ○ スキル/アイテムの効果適用(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def item_apply(user, item)
|
|
self.need_passive_refresh = false if actor?
|
|
@result.clear
|
|
@result.used = item_test(user, item)
|
|
@result.missed = (@result.used && rand >= item_hit(user, item))
|
|
@result.evaded = (!@result.missed && rand < item_eva(user, item))
|
|
if @result.hit?
|
|
skip_flag = 0
|
|
#防御壁
|
|
if defense_wall_usuable?(user,item)
|
|
skip_flag = 1
|
|
apply_defense_wall
|
|
end
|
|
|
|
#必中、物理、魔法無効判定
|
|
type = item.hit_type
|
|
ability_id = 46 + type
|
|
if invalidate_usuable?(user,item,type) && skip_flag == 0
|
|
if battler_add_ability(ability_id) > rand(100)
|
|
skip_flag = 1
|
|
apply_invalidate_ability(type)
|
|
end
|
|
end
|
|
|
|
if skip_flag == 0
|
|
unless item.damage.none?
|
|
@result.critical = (rand < item_cri(user, item))
|
|
make_damage_value(user, item)
|
|
execute_damage(user)
|
|
end
|
|
item.effects.each {|effect| item_effect_apply(user, item, effect) }
|
|
item_user_effect(user, item)
|
|
end
|
|
end
|
|
|
|
if actor?
|
|
set_b_add_status if KURE::BaseScript::C_BATTLE_ADD_STATUS == 1
|
|
set_b_add_state if KURE::BaseScript::C_BATTLE_ADD_STATE == 1
|
|
self.need_passive_refresh = true
|
|
set_passive_skills
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ○ 使用効果の適用(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def item_effect_apply(user, item, effect)
|
|
method_table = {
|
|
EFFECT_CLEAR_STATE => :item_effect_clear_state,
|
|
EFFECT_RECOVER_HP => :item_effect_recover_hp,
|
|
EFFECT_RECOVER_MP => :item_effect_recover_mp,
|
|
EFFECT_GAIN_TP => :item_effect_gain_tp,
|
|
EFFECT_ADD_STATE => :item_effect_add_state,
|
|
EFFECT_REMOVE_STATE => :item_effect_remove_state,
|
|
EFFECT_ADD_BUFF => :item_effect_add_buff,
|
|
EFFECT_ADD_DEBUFF => :item_effect_add_debuff,
|
|
EFFECT_REMOVE_BUFF => :item_effect_remove_buff,
|
|
EFFECT_REMOVE_DEBUFF => :item_effect_remove_debuff,
|
|
EFFECT_SPECIAL => :item_effect_special,
|
|
EFFECT_GROW => :item_effect_grow,
|
|
EFFECT_LEARN_SKILL => :item_effect_learn_skill,
|
|
EFFECT_COMMON_EVENT => :item_effect_common_event,
|
|
EFFECT_STEAL => :item_effect_steal,
|
|
EFFECT_SKILL_RESET => :item_effect_reset_skillpoint,
|
|
EFFECT_BREAK_EQUIP => :item_effect_break_equip,
|
|
EFFECT_GET_ITEM => :item_effect_get_item,
|
|
}
|
|
method_name = method_table[effect.code]
|
|
send(method_name, user, item, effect) if method_name
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
# ☆ 使用効果[ステート付加]:通常攻撃(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def item_effect_add_state_attack(user, item, effect)
|
|
return if @result.invalidate
|
|
user.atk_states.each do |state_id|
|
|
chance = effect.value1
|
|
chance *= state_rate(state_id)
|
|
chance *= user.atk_states_rate(state_id)
|
|
chance *= luk_effect_rate(user)
|
|
|
|
if KURE::BaseScript::C_STATE_BOOSTER == 1
|
|
chance *= state_per_booster(user, item, state_id)
|
|
chance += state_val_booster(user, item, state_id)
|
|
end
|
|
|
|
if rand < chance
|
|
if reverse_deth && state_id == death_state_id
|
|
self.hp = mhp
|
|
@result.reverse_deth = true
|
|
else
|
|
add_state(state_id)
|
|
end
|
|
@result.success = true
|
|
end
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ 使用効果[ステート付加]:通常(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def item_effect_add_state_normal(user, item, effect)
|
|
chance = effect.value1
|
|
chance *= state_rate(effect.data_id) if opposite?(user)
|
|
chance *= luk_effect_rate(user) if opposite?(user)
|
|
|
|
if KURE::BaseScript::C_STATE_BOOSTER == 1
|
|
chance *= state_per_booster(user, item, effect.data_id)
|
|
chance += state_val_booster(user, item, effect.data_id)
|
|
end
|
|
|
|
if rand < chance
|
|
if reverse_deth && effect.data_id == death_state_id
|
|
self.hp = mhp
|
|
@result.reverse_deth = true
|
|
else
|
|
add_state(effect.data_id)
|
|
if $data_states[effect.data_id].adv_substitute_t
|
|
@substitute_list.push([effect.data_id,user]) if @substitute_list
|
|
end
|
|
end
|
|
@result.success = true
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ スキル/アイテムの属性修正値を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def item_element_rate(user, item)
|
|
element = apply_elements(user, item)
|
|
#属性反映
|
|
case KURE::BaseScript::C_ELEMENT_MODE
|
|
when 0
|
|
result = 1 if element == []
|
|
result = elements_max_rate(user, element) if element != []
|
|
when 1
|
|
result = 1 if element == []
|
|
result = elements_mix_atk_rate(user, element) - elements_mix_drain_rate(user, element) if element != []
|
|
end
|
|
|
|
#アクターであればダメージ増加補正を取得
|
|
result *= gain_damage_rate(user, item) if user.actor?
|
|
|
|
return result
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ 属性の最大修正値の取得(再定義)
|
|
# elements : 属性 ID の配列
|
|
# 与えられた属性の中で最も有効な修正値を返す
|
|
#--------------------------------------------------------------------------
|
|
def elements_max_rate(user, elements)
|
|
elements.inject([0.0]) {|r, i| r.push((element_rate(i) * elements_booster_rate(user, i)) - elements_drain_rate(i)) }.max
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ ダメージ計算(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def make_damage_value(user, item)
|
|
value = item.damage.eval(user, self, $game_variables)
|
|
|
|
value = apply_reverse_heel(value, item)
|
|
|
|
value *= item_element_rate(user, item)
|
|
#value *= fild_element_rate(user, item)
|
|
|
|
value *= pdr if item.physical?
|
|
value *= mdr if item.magical?
|
|
value *= rec if item.damage.recover?
|
|
value = apply_critical(value) if @result.critical
|
|
value = apply_counter_gain(user, value, item) if user.result.counter
|
|
value = apply_variance(value, item.damage.variance)
|
|
value = apply_guard(value)
|
|
|
|
value = apply_adv_guard(value)
|
|
value = apply_invalidate_wall(value, item)
|
|
value = apply_metalbody(value, item)
|
|
value = apply_goldconvert(value, item)
|
|
value = apply_mpconvert(value, item)
|
|
value = apply_stand(value, item)
|
|
apply_add_drain(value, item)
|
|
|
|
@result.make_damage(value.to_i, item)
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Actor(再定義項目集積)
|
|
#==============================================================================
|
|
class Game_Actor < Game_Battler
|
|
#--------------------------------------------------------------------------
|
|
# ■★▲ スキルの初期化(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def init_skills
|
|
@skills = []
|
|
@sub_class_skills = [] #サブクラススキル
|
|
@memory_skills = [] #スキルメモライズシステム
|
|
@extra_skills = [] #スキルメモライズシステム
|
|
@passive_skills = [] #パッシブスキル
|
|
|
|
#スキルポイントシステム利用時には消費ポイントを初期化
|
|
@used_skill_point = [] if $kure_base_script[:SkillPoint]
|
|
@save_class_skills = []
|
|
|
|
#初期Lvで覚えるスキルを処理
|
|
learn_set_skill_lv(@class_id, first_skill_cheak_lv)
|
|
|
|
#職業レベル導入時の処理
|
|
if $kure_base_script[:JobLvSystem]
|
|
#サブクラススキル習得
|
|
learn_set_skill_lv(@sub_class_id, @sub_class_level)
|
|
#固有スキル習得
|
|
learn_actor_actor_peculiar_skill(@actor_id,@level,1)
|
|
end
|
|
|
|
#初期登録スキルが有れば処理する
|
|
if $kure_base_script[:Memorize]
|
|
actor.first_memorize.each do |id|
|
|
skill = $data_skills[id]
|
|
next unless skill
|
|
add_memorize_skill(skill) unless skill_memorize?(skill)
|
|
end
|
|
chain_memorize_set
|
|
end
|
|
|
|
#パッシブスキルを更新する
|
|
set_passive_skills
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ▲☆ 通常能力値の基本値取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def param_base(param_id)
|
|
#基本能力値の取得
|
|
base_class = $data_actors[@actor_id].base_param_index
|
|
if base_class == 0
|
|
class_base = self.class.params[param_id, @level]
|
|
else
|
|
class_base = $data_classes[base_class].params[param_id, @level]
|
|
end
|
|
|
|
sub_class_base = 0
|
|
#サブクラス関連のステータス処理
|
|
if $kure_base_script[:JobLvSystem]
|
|
sub_class_base = self.sub_class.params[param_id, @level] if @sub_class_id != 0
|
|
sub_class_base = sub_class_base * KURE::JobLvSystem::SUB_CLASS_STATUS_RATE
|
|
class_base = class_base * KURE::JobLvSystem::MAIN_CLASS_STATUS_RATE if @sub_class_id != 0
|
|
end
|
|
|
|
passive_base = 0
|
|
#パッシブスキル関連のステータス処理
|
|
passive_skills.each{|data| passive_base += data.params[param_id] if data.kind_of?(RPG::EquipItem)}
|
|
|
|
status_divide_base = 0
|
|
#ステータス振り分けの処理
|
|
status_divide_base = @status_divide[param_id] if @status_divide && @status_divide[param_id]
|
|
|
|
battle_add = 0
|
|
#戦闘中ステータス強化率
|
|
battle_add = @battle_add_status[param_id] if @battle_add_status && @battle_add_status[param_id]
|
|
|
|
sum = class_base + sub_class_base + passive_base + status_divide_base
|
|
sum *= 1 + battle_add
|
|
return sum.to_i
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ★ レベルアップ(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def level_up
|
|
@level += 1
|
|
learn_skill_specify_lv(@class_id,@level) unless $kure_base_script[:JobLvSystem]
|
|
|
|
if $kure_base_script[:Statusdivide] && @level > @last_level
|
|
@last_level = @level
|
|
@status_point += KURE::Statusdivide::LEVELUP_STATUS_POINT
|
|
@status_point += (KURE::Statusdivide::LEVELUP_STATUS_POINT_REVICE * @level).to_i
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ▲ 経験値の変更(再定義)
|
|
# show : レベルアップ表示フラグ
|
|
#--------------------------------------------------------------------------
|
|
def change_exp(exp, show)
|
|
#経験値増加
|
|
@exp[@class_id] = [exp, 0].max
|
|
last_level = @level
|
|
last_skills = learned_skill_list
|
|
|
|
#レベルアップ処理
|
|
level_up while !max_level? && self.exp >= next_level_exp
|
|
level_down while self.exp < current_level_exp
|
|
|
|
up_base = @level - last_level
|
|
|
|
new_skills = learned_skill_list
|
|
return unless show
|
|
|
|
display_level_up(new_skills - last_skills) if up_base > 0
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ▲ レベルアップメッセージの表示(再定義)
|
|
# new_skills : 新しく習得したスキルの配列
|
|
#--------------------------------------------------------------------------
|
|
def display_level_up(new_skills)
|
|
if $game_message.need_new_page
|
|
$game_message.new_page
|
|
$game_message.need_new_page = false
|
|
end
|
|
|
|
$game_message.add(sprintf(Vocab::LevelUp, @name, Vocab::level, @level))
|
|
|
|
#装備拡張の装備レベル使用時の判定
|
|
if $kure_base_script[:ExEquip] && KURE::ExEquip::USE_EQUIPLV_SYSTEM == 1
|
|
@equips.each do |obj|
|
|
if obj.object && obj.object.need_equip_limit_level < @level
|
|
$game_message.add(@name + "の" + @equips[slot].object.name + "が装備できなくなった。")
|
|
change_equip(slot, nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
new_skills.each do |skill|
|
|
$game_message.add(sprintf(Vocab::ObtainSkill, skill.name))
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ▲★◆ 職業の変更(再定義)
|
|
# keep_exp : 経験値を引き継ぐ
|
|
#--------------------------------------------------------------------------
|
|
def change_class(class_id, keep_exp = true)
|
|
self.need_passive_refresh = false
|
|
|
|
#転職前に習得スキルを保存する
|
|
@save_class_skills[@class_id] ||= []
|
|
@save_class_skills[@class_id] = @skills.clone
|
|
|
|
#共有スキルを配列に保存
|
|
common_list = Array.new
|
|
@skills.each do |skill|
|
|
common_list.push(skill) if $data_skills[skill].note.include?("<共有スキル>")
|
|
end
|
|
|
|
#転職処理
|
|
@exp[class_id] = exp if keep_exp
|
|
@class_id = class_id
|
|
change_exp(@exp[@class_id] || 0, false)
|
|
|
|
#動作テスト、職業レベルのチェックをスキップ
|
|
|
|
case KURE::BaseScript::C_DELETE_SKILL_MODE
|
|
when 0
|
|
if @save_class_skills[@class_id]
|
|
add_skills = @save_class_skills[@class_id].clone
|
|
@skills ||= []
|
|
@skills += add_skills
|
|
@skills.uniq!
|
|
end
|
|
|
|
if KURE::BaseScript::C_MEMORIZE_REFRSH == 1
|
|
@memory_skills = [] #スキルメモライズシステム
|
|
@extra_skills = [] #スキルメモライズシステム
|
|
end
|
|
when 1
|
|
if @save_class_skills[@class_id]
|
|
@skills = @save_class_skills[@class_id].clone
|
|
else
|
|
@skills = []
|
|
end
|
|
|
|
@memory_skills = [] #スキルメモライズシステム
|
|
@extra_skills = [] #スキルメモライズシステム
|
|
|
|
unless $kure_base_script[:SkillPoint]
|
|
common_list.each{|id| learn_skill(id)}
|
|
end
|
|
end
|
|
|
|
if $kure_base_script[:JobLvSystem]
|
|
#職業レベルを併用している場合は職業レベルを設定
|
|
@joblevel = 1
|
|
change_job_exp(@jobexp[@class_id] || 0, self.sub_class_exp, false)
|
|
#固有スキル習得
|
|
learn_actor_actor_peculiar_skill(@actor_id,@level,1)
|
|
end
|
|
|
|
#初期Lvで覚えるスキルを処理
|
|
learn_set_skill_lv(@class_id, first_skill_cheak_lv)
|
|
#クラスレベルリストを更新する
|
|
@classlevel_list[@class_id] = first_skill_cheak_lv
|
|
|
|
self.need_passive_refresh = true
|
|
refresh
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● HPの呼び出し(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def hp
|
|
@hp = [@hp,mhp].min
|
|
return @hp
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● MPの呼び出し(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def mp
|
|
@mp = [@mp,mmp].min
|
|
return @mp
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ TP の最大値を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def max_tp
|
|
base = $data_classes[@class_id].base_tp
|
|
base += $data_actors[@actor_id].base_tp
|
|
return base if KURE::BaseScript::C_TP_ADDER == 0
|
|
return @ability_data_cache[44] if @ability_data_cache && @ability_cheack_cache[44] && @ability_data_cache[44]
|
|
|
|
all_gain_tp = battler_add_ability(44)[0]
|
|
all_gain_tp_per = battler_add_ability(44)[1]
|
|
|
|
add_fix = ($data_actors[@actor_id].tp_level_revise).to_f / 100
|
|
add = (add_fix * (@level - 1)).to_i
|
|
limit = $data_classes[@class_id].upper_limit_tp
|
|
|
|
@ability_data_cache[44] = [limit, ((base + add + all_gain_tp) * (all_gain_tp_per.to_f / 100)).to_i].min
|
|
return @ability_data_cache[44]
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ TP の割合を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def tp_rate
|
|
return 0 if max_tp == 0
|
|
return @tp.to_f / max_tp
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ TP の再生(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def regenerate_tp
|
|
self.tp += max_tp * trg
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ☆ 通常攻撃のスキル ID を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def attack_skill_id
|
|
passive_list = passive_skills.select{|obj| obj.normal_attack_id != nil}.collect{|obj| obj.normal_attack_id}
|
|
passive_list.flatten!
|
|
if passive_list.size != 0
|
|
attack_skill = passive_list.sort_by{rand}
|
|
return attack_skill[0] if attack_skill[0]
|
|
end
|
|
|
|
if @equips[0].object != nil and equip_slots[0] == 0
|
|
if $data_weapons[@equips[0].id]
|
|
attack_skill = $data_weapons[@equips[0].id].normal_attack_id.sort_by{rand}
|
|
return attack_skill[0] if attack_skill[0]
|
|
end
|
|
end
|
|
|
|
if @equips[1].object != nil and equip_slots[1] == 0
|
|
if $data_weapons[@equips[1].id]
|
|
attack_skill = $data_weapons[@equips[1].id].normal_attack_id.sort_by{rand}
|
|
return attack_skill[0] if attack_skill[0]
|
|
end
|
|
end
|
|
|
|
attack_skill = $data_classes[@class_id].normal_attack_id.sort_by{rand}
|
|
return attack_skill[0] if attack_skill[0]
|
|
|
|
attack_skill = $data_actors[@actor_id].normal_attack_id.sort_by{rand}
|
|
return attack_skill[0] if attack_skill[0]
|
|
return 1
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ○ スキルの必要装備を装備しているか(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def skill_wtype_ok?(skill)
|
|
#防具判定
|
|
return false unless skill_etype_ok?(skill)
|
|
|
|
wtype_id1 = skill.required_wtype_id1
|
|
wtype_id2 = skill.required_wtype_id2
|
|
#追加武器タイプ
|
|
wtype_id_add = skill.required_add_wtype_id
|
|
|
|
#要求武器タイプ
|
|
wtype_id_need = skill.need_wtype_id_all
|
|
|
|
#同一タイプ二刀流判定
|
|
if skill.request_same_weapon_id && weapons.size > 1
|
|
return true if weapons[0].wtype_id == weapons[1].wtype_id
|
|
return false
|
|
end
|
|
|
|
#要求判定
|
|
wtype_id_need.each do |id|
|
|
next if id <= 0
|
|
return false unless wtype_equipped?(id)
|
|
end
|
|
|
|
#二刀流要求の判定
|
|
return true if skill.need_two_weapon && weapons.size > 1
|
|
return false if skill.need_two_weapon && weapons.size < 2
|
|
|
|
return true if wtype_id1 == 0 && wtype_id2 == 0 && wtype_id_add == []
|
|
return true if wtype_id1 > 0 && wtype_equipped?(wtype_id1)
|
|
return true if wtype_id2 > 0 && wtype_equipped?(wtype_id2)
|
|
#追加判定
|
|
wtype_id_add.each do |id|
|
|
next unless id
|
|
return true if id > 0 && wtype_equipped?(id)
|
|
end
|
|
return false
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 装備できない装備品を外す(再定義)
|
|
# item_gain : 外した装備品をパーティに戻す
|
|
#--------------------------------------------------------------------------
|
|
def release_unequippable_items(item_gain = true)
|
|
loop do
|
|
last_equips = equips.dup
|
|
|
|
cheack_arr = Array.new
|
|
@equips.each_with_index do |item, i|
|
|
if !equippable?(item.object) || item.object.etype_id != equip_slots[i]
|
|
#拡張装備タイプ判定
|
|
if item.object
|
|
cheack_obj = item.object.clone
|
|
unless item.object.add_etype_id.include?(equip_slots[i])
|
|
cheack_arr.push(cheack_obj)
|
|
trade_item_with_party(nil, item.object) if item_gain
|
|
item.object = nil
|
|
end
|
|
else
|
|
trade_item_with_party(nil, item.object) if item_gain
|
|
item.object = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
if KURE::BaseScript::C_AUTO_STATE_ADDER == 1
|
|
cheack_arr.each{|obj| auto_state_adder_ex(obj)}
|
|
end
|
|
|
|
return if equips == last_equips
|
|
end
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 新しいステートの付加(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def add_new_state(state_id)
|
|
die if state_id == death_state_id
|
|
@states.push(state_id)
|
|
on_restrict if restriction > 0
|
|
sort_states
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● マップ画面上でのターン終了処理
|
|
#--------------------------------------------------------------------------
|
|
def turn_end_on_map
|
|
return if KURE::BaseScript::C_WALK_PROCESS_EFFECT == 0
|
|
if $game_party.steps % steps_for_turn == 0
|
|
on_turn_end
|
|
set_passive_skills(2) if @result.added_state_objects != [] && @result.removed_state_objects != [] && KURE::BaseScript::C_WALK_PASSIVE_REFRESH == 1
|
|
perform_map_damage_effect if @result.hp_damage > 0
|
|
end
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Player(再定義)
|
|
#==============================================================================
|
|
class Game_Player < Game_Character
|
|
#--------------------------------------------------------------------------
|
|
# ● エンカウント進行値の取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def encounter_progress_value
|
|
value = $game_map.bush?(@x, @y) ? 2 : 1
|
|
|
|
if KURE::BaseScript::C_ENCOUNTER == 1
|
|
encount_rate = Array.new
|
|
encount_rate = $game_party.party_add_ability(2)
|
|
final_rate = encount_rate.inject(1) {|result, item| result * item}
|
|
value *= final_rate
|
|
end
|
|
|
|
value *= 0.5 if $game_party.encounter_half?
|
|
value *= 0.5 if in_ship?
|
|
value
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Enemy
|
|
#==============================================================================
|
|
class Game_Enemy < Game_Battler
|
|
#--------------------------------------------------------------------------
|
|
# ● ドロップアイテム取得率の倍率を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def drop_item_rate
|
|
final_drop_rate = Array.new
|
|
final_drop_rate = $game_party.party_add_ability(1)
|
|
final_drop_rate.push(2) if $game_party.drop_item_double?
|
|
|
|
#ドロップ率増加ステートの処理
|
|
state_rate = states.collect{|obj| obj.gain_drop_rate}
|
|
add_rate = state_rate.max.to_f / 100
|
|
|
|
max_rate = final_drop_rate.max * add_rate
|
|
return max_rate
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Troop
|
|
#==============================================================================
|
|
class Game_Troop < Game_Unit
|
|
#--------------------------------------------------------------------------
|
|
# ● 経験値の合計計算(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def exp_total
|
|
exp_total_g = dead_members.inject(0) {|r, enemy| r += enemy.exp }
|
|
exp_rate = $game_party.party_add_ability(3)
|
|
exp_total_g *= exp_rate.max
|
|
if $kure_base_script[:PartyEdit] && KURE::PartyEdit::SHARE_EXP_MODE == 1
|
|
max = $game_party.max_battle_members
|
|
now = $game_party.battle_members_size
|
|
ptm_rate = max.to_f / now
|
|
exp_total_g *= ptm_rate
|
|
end
|
|
return exp_total_g.to_i
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● お金の合計計算(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def gold_total
|
|
(dead_members.inject(0) {|r, enemy| r += enemy.gold } * gold_rate).to_i
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● お金の倍率を取得(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def gold_rate
|
|
final_gold_rate = Array.new
|
|
final_gold_rate = $game_party.party_add_ability(0)
|
|
final_gold_rate.push(2) if $game_party.gold_double?
|
|
max_rate = final_gold_rate.max
|
|
return max_rate
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Game_Action
|
|
#==============================================================================
|
|
class Game_Action
|
|
#--------------------------------------------------------------------------
|
|
# ● 通常攻撃判定(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def attack?
|
|
return false unless item.is_a?(RPG::Skill)
|
|
return true if item == $data_skills[1]
|
|
return true if item.normal_attack_skill?
|
|
return false
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 行動が有効か否かの判定(再定義)
|
|
# イベントコマンドによる [戦闘行動の強制] ではないとき、ステートの制限
|
|
# やアイテム切れなどで予定の行動ができなければ false を返す。
|
|
#--------------------------------------------------------------------------
|
|
def valid?
|
|
return true if @ramdom_effect
|
|
(forcing && item) || subject.usable?(item)
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ■ Scene_Battle(再定義)
|
|
#==============================================================================
|
|
class Scene_Battle < Scene_Base
|
|
#--------------------------------------------------------------------------
|
|
# ● 戦闘開始(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def battle_start
|
|
BattleManager.battle_start
|
|
|
|
if KURE::BaseScript::C_FIRST_INVOKE_SKILL == 1
|
|
unless @first_invoke_item_process
|
|
first_invoke_items
|
|
@first_invoke_item_process = true
|
|
end
|
|
end
|
|
|
|
process_event
|
|
start_party_command_selection
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● スキル/アイテムの使用(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def use_item
|
|
#使用スキルの判定、コストスキルの判定
|
|
item = @subject.current_action.item
|
|
cost = @subject.current_action.item
|
|
|
|
#複数回発動
|
|
@subject.multi_invoke(item).times{
|
|
|
|
random = @subject.current_action.random_item
|
|
change = @subject.current_action.change_item
|
|
force = @subject.current_action.force_action_item
|
|
|
|
#強制行動
|
|
if force
|
|
item = force
|
|
@subject.force_action_item_reset(item.id)
|
|
end
|
|
|
|
#通常攻撃再設定機能
|
|
if KURE::BaseScript::C_NORMAL_ATTACK_RESET == 1
|
|
if item.id == 1 or item.normal_attack_skill?
|
|
if item.is_a?(RPG::Skill)
|
|
item = $data_skills[@subject.attack_skill_id]
|
|
@subject.force_action_item_reset(item.id)
|
|
end
|
|
end
|
|
end
|
|
|
|
@log_window.display_use_item(@subject, item)
|
|
@subject.use_item(item)
|
|
@subject.add_skill_delay(item, random, change)
|
|
|
|
#ランダム発動
|
|
item = random if random
|
|
|
|
#スキル変化
|
|
item = change if change
|
|
|
|
#マルチエフェクト
|
|
multi_e = item.multi_skill_effect
|
|
targets = @subject.current_action.make_targets.compact
|
|
|
|
#エフェクト発動
|
|
effect_adopter(item, multi_e, targets)
|
|
|
|
#スキル使用後コスト
|
|
used_item_cost(cost)
|
|
|
|
#発動後ステート
|
|
wait_for_animation
|
|
after_add_state_process(item)
|
|
@log_window.display_sp_added_states(@subject)
|
|
refresh_status
|
|
|
|
#オートリザレクション
|
|
if KURE::BaseScript::C_AUTO_REVIVE == 1
|
|
all_battle_members.each do |battler|
|
|
auto_revive_process(battler)
|
|
end
|
|
end
|
|
|
|
@log_window.wait_and_clear
|
|
}
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● ターン終了(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def turn_end
|
|
#追撃バトラー配列を作成
|
|
chase_battler = Array.new
|
|
|
|
all_battle_members.each do |battler|
|
|
#ディレイカット
|
|
battler.result.clear
|
|
battler.delay_cutter
|
|
battler.actor_ability_delay_cutter
|
|
@log_window.display_auto_affected_status(battler)
|
|
@log_window.wait_and_clear
|
|
#追撃
|
|
if battler.alive? && KURE::BaseScript::C_CHASE_ATTACK == 1
|
|
push2 = battler.battler_add_ability(30)
|
|
chase_battler.push([battler,push2]) if push2 != []
|
|
end
|
|
end
|
|
|
|
#追撃実行
|
|
chase_attack_process(chase_battler) if KURE::BaseScript::C_CHASE_ATTACK == 1
|
|
|
|
#ターン間スキル
|
|
turn_invoke_items(2) if KURE::BaseScript::C_SE_TURN_SKILL == 1
|
|
|
|
#オートリザレクション
|
|
if KURE::BaseScript::C_AUTO_REVIVE == 1
|
|
all_battle_members.each do |battler|
|
|
auto_revive_process(battler)
|
|
@log_window.wait_and_clear
|
|
end
|
|
end
|
|
|
|
all_battle_members.each do |battler|
|
|
battler.on_turn_end
|
|
refresh_status
|
|
@log_window.display_auto_affected_status(battler)
|
|
@log_window.wait_and_clear
|
|
end
|
|
|
|
@log_window.wait_and_clear
|
|
BattleManager.turn_end
|
|
process_event
|
|
start_party_command_selection
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● スキル/アイテムの発動(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def invoke_item(target, item)
|
|
return if @subject.dead?
|
|
#反撃判定
|
|
if rand < target.multi_cnt_rate(@subject, item.hit_type, 0)
|
|
invoke_counter_attack(target, item)
|
|
#反射判定
|
|
elsif rand < target.item_mrf(@subject, item)
|
|
invoke_magic_reflection(target, item)
|
|
#献身判定
|
|
else
|
|
#献身者の指定
|
|
new_target = apply_substitute(target, item)
|
|
apply_item_effects(new_target, item)
|
|
#拡張反撃
|
|
if rand < new_target.multi_cnt_rate(@subject, item.hit_type, 1)
|
|
invoke_counter_attack(new_target, item)
|
|
end
|
|
end
|
|
@subject.last_target_index = target.index
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● 反撃の発動(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def invoke_counter_attack(target, item)
|
|
#return if target.dead?
|
|
@log_window.clear
|
|
attack_skill = $data_skills[target.attack_skill_id]
|
|
|
|
#反撃スキルの設定読み込み
|
|
counter = target.battler_add_ability(17).sample
|
|
case item.hit_type
|
|
when 0
|
|
counter = target.battler_add_ability(53).sample if target.battler_add_ability(53).sample
|
|
when 1
|
|
counter = target.battler_add_ability(51).sample if target.battler_add_ability(51).sample
|
|
when 2
|
|
counter = target.battler_add_ability(52).sample if target.battler_add_ability(52).sample
|
|
end
|
|
|
|
attack_skill = $data_skills[counter] if counter
|
|
|
|
|
|
@log_window.display_counter(target, attack_skill)
|
|
target.result.counter = true
|
|
@subject.item_apply(target, attack_skill)
|
|
show_counter_animation([@subject], target, attack_skill)
|
|
|
|
refresh_status
|
|
@log_window.display_action_results(@subject, attack_skill)
|
|
@log_window.wait_and_clear
|
|
end
|
|
#--------------------------------------------------------------------------
|
|
# ● パーティコマンドウィンドウの作成(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def create_party_command_window
|
|
@party_command_window = Window_PartyCommand.new
|
|
@party_command_window.viewport = @info_viewport
|
|
@party_command_window.set_handler(:fight, method(:command_fight))
|
|
@party_command_window.set_handler(:escape, method(:command_escape))
|
|
@party_command_window.set_handler(:partyedit, method(:command_partyedit))
|
|
@party_command_window.set_handler(:exequip, method(:command_exequip))
|
|
@party_command_window.unselect
|
|
end
|
|
end
|
|
|
|
#==============================================================================
|
|
# ▲ BattleManager(再定義)
|
|
#==============================================================================
|
|
module BattleManager
|
|
#--------------------------------------------------------------------------
|
|
# ● 勝利の処理(再定義)
|
|
#--------------------------------------------------------------------------
|
|
def self.process_victory
|
|
play_battle_end_me
|
|
replay_bgm_and_bgs
|
|
$game_message.add(sprintf(Vocab::Victory, $game_party.name))
|
|
#バトルリザルトの存在で処理を分岐
|
|
display_exp unless $kure_base_script[:BattleResult]
|
|
gain_gold
|
|
gain_drop_items
|
|
gain_exp
|
|
#拡張経験値獲得
|
|
gain_ex_exp
|
|
show_result_window if $kure_base_script[:BattleResult]
|
|
SceneManager.return
|
|
battle_end(0)
|
|
return true
|
|
end
|
|
end |