#----------------------------------------------------------------------------
# ツクールXPで2000の機能を実現 先制攻撃/全体攻撃/
# 回避無視/必殺防止 改 by 貪藻矢射妥←
#----------------------------------------------------------------------------
# 原作: ◆ ツクールXPで2000の機能を実現 先制攻撃/全体攻撃/
# 回避無視/必殺防止 ◆
# ◇ Last update : 2004/08/03 ◇
# 原作者: するめ様
# HP: チームするめ
# アドレス: http://surume.s140.xrea.com/
#
# ※ツクールXPで2000の機能を実現 準備スクリプト 改 が別途必要です
#
# 改造内容:
# ・変更点
# 一度に2回攻撃 は 連続攻撃 を採用しているため未使用
# SP消費量半分 は 特殊消費スキル を採用しているため未使用
# (製作者の都合などでテストプレイの)途中から仕様変更が入ってもいいように
# システム-属性から定義値を自動的に算出している部分を固定値に変更
#
# ・ついでに以下も実装
# ターンの一番最後に攻撃、防御無視
#
#==============================================================================
# 更新っぽいもの
# 2024:02:01
# ・靴装備対応
#
# 2024:04:01
# ・他スクリプト併用時のアップデート反映
#
# 2024:10:01
# ・パラメータ追加対応
#
# 2024:12:01
# ・VX風VocabをよりVXに近づける対応
module KGC
# SP Damage用属性
SP_DAMAGE = 50
end
class Game_Battler
include KGC
include DIAMOND
include BM
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者 (バトラー)
# skill : スキル
#--------------------------------------------------------------------------
def skill_effect(user, skill)
@sp_damage_flg = false
# 他サイトのスクリプトとの競合を考えて(武器の全体攻撃とか)
# スキルがnilの場合は処理を行わない
if $imported["SPDamage"]
if @skill != nil && skill.element_set.include?(KGC::SP_DAMAGE)
@sp_damage_flg = true
end
end # $imported["SPDamage"]
# クリティカルフラグをクリア
self.critical = false
# 隊列乱しフラグの初期化
break_position = false
if $imported["RankConception"]
# 射程外の場合
if KGC::RC_OUT_RANGE_MODE== 0 && !self.within_range?(user, skill) &&
!self.over_range?(skill)
# ダメージに "Miss" を設定
self.damage = Vocab::MISS_WORD
# 偽を返す
return false
end
# 隊列乱し判定
break_position = self.range_break?(skill)
# 隊列移動属性判定
for element in skill.element_set.compact
element_name = $data_system.elements[element]
# 射程属性を持っている場合
if $game_special_elements["move_rank"] =~ element_name
move_position = $1
break
end
end
end # $imported["RankConception"]
# スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
# またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
if $OuterFlgs["Recover_Dead_or_Alive"]
# 上記の状態で生死問わず回復スキルでない場合
if !skill.element_set.include?(DIAMOND::RECV_HYPER)
# メソッド終了
return false
end
else # 元の処理
# メソッド終了
return false
end # $OuterFlgs["Recover_Dead_or_Alive"]
end
# 有効フラグをクリア
effective = false
# コモンイベント ID が有効の場合は有効フラグをセット
effective |= skill.common_event_id > 0
# 第一命中判定
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
# 基本命中率の設定
base_hitrate = 100
if $OuterFlgs["Weapon_HitRate"]
# 命中精度から命中率を再設定
base_hitrate = get_hitrate_base(user)
end # $OuterFlgs["Weapon_HitRate"]
hit_result = (rand(base_hitrate) < hit)
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
if $OuterFlgs["Decoy_De_Koi"]
if $game_system.act_tgt != nil
# アクターとターゲットが違う場合(同じだとデコイ作った瞬間に砕け散ります)
if ($game_system.act_tgt.is_a?(Game_Actor) && user.is_a?(Game_Enemy)) ||
($game_system.act_tgt.is_a?(Game_Enemy) && user.is_a?(Game_Actor))
# ターゲットがデコイ状態の場合
if $game_system.act_tgt.states.include?(DIAMOND::DECOY_ID)
effective |= states_minus([DIAMOND::DECOY_ID])
hit_result = false
#if DIAMOND::CSE_USE_FLG
# $game_system.se_play(DIAMOND::CRASH_SE)
#end
end
end
end
end # $OuterFlgs["Decoy_De_Koi"]
# Ex-命中フラグ初期化
ex_hit_flg = true
if $imported["RankConception"]
# 隊列移動属性を持っている場合、Ex-命中フラグを落とす
if move_position == nil && break_position == false
# 何もしない
else
ex_hit_flg = false
end
end # $imported["RankConception"]
# 命中の場合 part1
if hit_result == true && ex_hit_flg == true
# 威力を計算
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
# 防御無視フラグ初期化
pdef_ignore_flg = false
mdef_ignore_flg = false
if $OuterFlgs["Tkl_2K_2_XP"]
# 防御無視判定
pdef_ignore_flg = user.element_set.include?(Tkl2K_2_XP::PDEF_IGNORE)
mdef_ignore_flg = user.element_set.include?(Tkl2K_2_XP::MDEF_IGNORE)
end # $OuterFlgs["Tkl_2K_2_XP"]
if !pdef_ignore_flg
power -= self.pdef * skill.pdef_f / 200
end
if !mdef_ignore_flg
power -= self.mdef * skill.mdef_f / 200
end
if skill.str_f != 0
power = [power, 0].max
end
end
# 倍率を計算
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# 基本ダメージを計算
tmp_damage = power * rate / 20
if $OuterFlgs["Skill_Specialite"]
# ★ モードによる威力の増減
tmp_damage *= user.actor_pow_rate / 100
tmp_damage = tmp_damage.to_i
end # $OuterFlgs["Skill_Specialite"]
# 属性修正
ec_skill = elements_correct(skill.element_set)
ec_self = elements_correct(self.element_set)
#エネミー補正
if user.is_a?(Game_Enemy)
ec_skill = 40 if ec_skill == 0
ec_self = 40 if ec_self == 0
end
tmp_damage *= ec_skill # elements_correct(skill.element_set)
tmp_damage /= 100
tmp_damage *= ec_self # elements_correct(self.element_set)
tmp_damage /= 100
guard_flg = false
# ダメージの符号が正の場合
if tmp_damage > 0
# 防御修正
if self.guarding?
if $OuterFlgs["VX_2_XP"]
# 強力防御
for st_id in VX_TO_XP::SUPER_GUARD
if self.states.include?(st_id)
tmp_damage /= VX_TO_XP::GUARD_RATE[st_id]
guard_flg = true
end
end
end # $OuterFlgs["VX_2_XP"]
# 二重計上防止
if !guard_flg
tmp_damage /= 2
end
end
end
# 分散
if skill.variance > 0 and tmp_damage.abs > 0
amp = [tmp_damage.abs * skill.variance / 100, 1].max
tmp_damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / user.dex + self.eva / 100.0
hit = tmp_damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
if $OuterFlgs["Param_Add"]
# Luk補正
hit = [hit - self.luk / 50.0, 5].max if user.is_a?(Game_Enemy)
end # $OuterFlgs["Param_Add"]
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(base_hitrate) < hit)
#p hit, hit_result, base_hitrate
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
if $imported["RankConception"]
# 隊列によるダメージ補正
if KGC::RC_OUT_RANGE_MODE == 1 && !self.over_range?(skill)
tmp_damage *= damage_by_range(user, skill)
tmp_damage = Integer(tmp_damage)
end
end # $imported["RankConception"]
end # 命中の場合 part1
if $SilfeedArks["Special_Attack"]
# 当身ダメージ吸収の場合、符号反転
if @counter[0] == 1 && @counter[6]
tmp_damage *= -1
end
# 当身SP吸収の場合、SP回復
if @counter[0] == 2 && @counter[6] && !@sp_damage_flg
self.sp += skill.sp_cost
end
# スキルキャンセルの場合ダメージを空白して終了
if @counter[4] and @counter[6]
if @sp_damage_flg
self.damage2 = nil
else
self.damage = nil
end
return effective
end
end # $SilfeedArks["Special_Attack"]
# 命中の場合 part 2
if hit_result == true
# Ex-命中フラグが有効の場合
# 隊列概念カスタムを使用していない場合必ず true
if ex_hit_flg == true
if $OuterFlgs["Death_Critical"]
# 即死判定 ★ 一撃必殺カスタマイズ
dead_end(DEATH_KILLER::DC_SKILL, skill)
end # $OuterFlgs["Death_Critical"]
# 威力 0 以外の物理攻撃の場合
if skill.power != 0 and skill.atk_f > 0
if $OuterFlgs["Death_Critical"]
# 即死判定 ★ 一撃必殺カスタマイズ
dead_end(DEATH_KILLER::DC_ATTACK, skill)
end # $OuterFlgs["Death_Critical"]
# ステート衝撃解除
remove_states_shock
# 有効フラグをセット
effective = true
end
if @sp_damage_flg
self.damage2 = tmp_damage
# SP からダメージを減算
last_sp = self.sp
# 現SPを上回るダメージはなし。
if self.damage2 > self.sp
self.damage2 = self.sp
end
self.sp -= self.damage2
effective |= self.sp != last_sp
else
self.damage = tmp_damage
# HP からダメージを減算
last_hp = self.hp
self.hp -= self.damage
effective |= self.hp != last_hp
end
end # Ex-命中フラグが有効の場合
# ステート変化
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
if $OuterFlgs["Recover_Dead_or_Alive"]
if skill.element_set.include?(DIAMOND::RECV_HYPER)
effective |= states_minus([1])
end
end # $OuterFlgs["Recover_Dead_or_Alive"]
if $imported["RankConception"]
if break_position
# 隊列維持かどうか
if @states.include?($game_special_states["b_pos_gd"])
# ダメージにの設定
self.damage = KGC::RC_KEEP_POS_POP if self.damage == nil
# ステート変化(隊列維持の解除)
states_minus([$game_special_states["b_pos_gd"]])
@state_changed = true
effective = true
# 戻る
return false
else
# 隊列を乱す場合
if self.range_break?(skill)
pos_list = [2, 1, 0]
self.position = pos_list[self.position]
# ダメージの設定
self.damage = KGC::RC_BREAK_POS_POP if self.damage == nil
# 戻る
return true
end
end
end
if move_position != nil
# 指定位置に移動
case move_position
when "前"
self.position = 0
when "中"
self.position = 1
when "後"
self.position = 2
end
# 戻る
return true
end
end # $imported["RankConception"]
# 威力が 0 の場合
if skill.power == 0
if self.states.include?(1) && $OuterFlgs["Death_Critical"]
# ダメージに"即死"を設定
if @sp_damage_flg
self.damage2 = DEATH_KILLER::DEATH_WORD
else
self.damage = DEATH_KILLER::DEATH_WORD
end
else # 元の処理
# ダメージに空文字列を設定
if @sp_damage_flg
self.damage2 = ""
else
self.damage = ""
end
end # $OuterFlgs["Death_Critical"]
# ステートに変化がない場合
unless @state_changed
# ★ 一撃必殺カスタマイズ
if self.states.include?(1) && $OuterFlgs["Death_Critical"]
# ダメージに"即死"を設定
if @sp_damage_flg
self.damage2 = DEATH_KILLER::DEATH_WORD
else
self.damage = DEATH_KILLER::DEATH_WORD
end
else # 元の処理
# ダメージに "Miss" を設定
if @sp_damage_flg
self.damage2 = Vocab::MISS_WORD
else
self.damage = Vocab::MISS_WORD
end
end # $OuterFlgs["Death_Critical"]
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
if @sp_damage_flg
self.damage2 = Vocab::MISS_WORD
else
self.damage = Vocab::MISS_WORD
end
end
# 戦闘中でない場合
unless $game_temp.in_battle
# ダメージに nil を設定
if @sp_damage_flg
self.damage2 = nil
else
self.damage = nil
end
end
# メソッド終了
return effective
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● アクションスピードの決定
#--------------------------------------------------------------------------
def make_action_speed
@current_action.speed = agi + rand(10 + agi / 4)
if $OuterFlgs["Tkl_2K_2_XP"]
if element_set.include?(Tkl2K_2_XP::FASTEST_MOVE) ||
element_set_mlt_all.include?(Tkl2K_2_XP::FASTEST_MOVE)
# 先制攻撃用に行動スピードを 99999 に設定する
@current_action.speed += 99999
elsif element_set.include?(Tkl2K_2_XP::LASTEST_MOVE) ||
element_set_mlt_all.include?(Tkl2K_2_XP::LASTEST_MOVE)
# 最遅攻撃用に行動スピードを 1 に設定する
@current_action.speed = 1
end
end # $OuterFlgs["Tkl_2K_2_XP"]
end
end
class Scene_Battle
include KGC
include Rand_Select
include Multi_Attack
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
#--------------------------------------------------------------------------
★★★ Surume_多刀流 参照 ★★★
#--------------------------------------------------------------------------
# ● 基本アクション 結果作成
#--------------------------------------------------------------------------
def make_basic_action_result
# 攻撃の場合
if @active_battler.current_action.basic == 0
# アニメーション ID を設定
@animation1_id = @active_battler.animation1_id
@animation2_id = @active_battler.animation2_id
# ★素手の場合
if @animation2_id == 0
@animation2_id = 4
end
# ★素手の場合
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
target = $game_troop.random_target_enemy
elsif @active_battler.restriction == 2
target = $game_party.random_target_actor
else
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
# 対象側バトラーの配列を設定
@target_battlers = [target]
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
target = $game_party.random_target_actor
# 対象側バトラーの配列を設定
@target_battlers = [target]
elsif @active_battler.restriction == 2
target = $game_troop.random_target_enemy
# 対象側バトラーの配列を設定
@target_battlers = [target]
elsif $OuterFlgs["Tkl_2K_2_XP"] && @active_battler.element_set.include?(Tkl2K_2_XP::ALLIZE_ATTACK)
# 対象側バトラーを設定(敵全体)
set_target_battlers(2)
else
index = @active_battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
# 対象側バトラーの配列を設定
@target_battlers = [target]
end
end
# 通常攻撃の効果を適用
for target in @target_battlers
if $SilfeedArks["Special_Attack"]
# 当身判定
if target.counter[2].include?(0) or target.counter[2].include?(5)
target.counter[6] = true
end
end # $SilfeedArks["Special_Attack"]
target.attack_effect(@active_battler)
if target.critical_skill_flg
@active_battler.current_action.skill_id = @active_battler.critical_skill
@target_battlers = []
target.critical_skill_flg = false
@critical_skill = true
if $imported["SkillMessage"]
@skill_cnt = []
end # Add $imported["SkillMessage"]
make_skill_action_result
if $imported["SkillMessage"]
@skill_cnt = []
end # Add $imported["SkillMessage"]
return
end
end
return
end
# 防御の場合
if @active_battler.current_action.basic == 1
# ヘルプウィンドウに "防御" を表示
@help_window.set_text(Vocab::guard, 1)
return
end
# 逃げるの場合
if @active_battler.is_a?(Game_Enemy) and
@active_battler.current_action.basic == 2
# ヘルプウィンドウに "逃げる" を表示
@help_window.set_text(Vocab::escape, 1)
# 逃げる
@active_battler.escape
return
end
# 何もしないの場合
if @active_battler.current_action.basic == 3
# アクション強制対象のバトラーをクリア
$game_temp.forcing_battler = nil
# ステップ 1 に移行
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
# ● スキルまたはアイテムの対象側バトラー設定
# scope : スキルまたはアイテムの効果範囲
#--------------------------------------------------------------------------
alias diamond_set_target_battlers set_target_battlers
def set_target_battlers(scope)
#呼び戻す
diamond_set_target_battlers(scope)
@recover_flg = false
if $OuterFlgs["Recover_Dead_or_Alive"]
if @skill != nil && @skill.element_set.include?(DIAMOND::RECV_HYPER)
@recover_flg = true
end
if @item != nil && @item.element_set.include?(DIAMOND::RECV_HYPER)
@recover_flg = true
end
end # $OuterFlgs["Recover_Dead_or_Alive"]
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
change_enemy = $game_party.actors
change_friend = $game_troop.enemies
# 行動側バトラーがアクターの場合
elsif @active_battler.is_a?(Game_Actor)
change_enemy = $game_troop.enemies
change_friend = $game_party.actors
end
# 超回復スキルが設定される場合で除外されていたターゲットを梱包
case scope
when 4 # 味方全体
for obj in change_friend
if !obj.exist? && @recover_flg
@target_battlers.push(obj)
end
end
when 5 # 味方単体 (HP 0)
index = @active_battler.current_action.target_index
obj = change_friend[index]
if obj != nil && !obj.hp0? && @recover_flg
@target_battlers.push(obj)
end
when 6 # 味方全体 (HP 0)
for obj in change_friend
if obj != nil && !obj.hp0? && @recover_flg
@target_battlers.push(obj)
end
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
#--------------------------------------------------------------------------
def update_phase4_step5
# ヘルプウィンドウを隠す
@help_window.hide
# ステータスウィンドウをリフレッシュ
@status_window.refresh
if @active_battler.damage != nil
@active_battler.damage_pop = true
end
# ダメージ表示
for target in @target_battlers
if target.damage != nil
target.damage_pop = true
end
if $SilfeedArks["Special_Attack"]
# 当身技の発動エフェクト もしくは 反撃スキル準備
if ( target.counter[6] )
target.counter[6] = false
if ( target.counter[0] == 1 or target.counter[0] == 2)
target.animation_id = target.counter[5]
end
if ( target.counter[0] == 3 )
target.current_action.kind = 1
target.current_action.skill_id = target.counter[1]
@action_battlers.unshift(target)
$game_temp.counter_mode += 1
end
if ( target.counter[0] == 4 )
@counter_temp = target.current_action.skill_id
target.current_action.kind = 1
target.current_action.skill_id = @active_battler.current_action.skill_id
@action_battlers.unshift(target)
$game_temp.counter_mode += 1
end
end
end # $SilfeedArks["Special_Attack"]
end
# 連続攻撃
# 通常攻撃の場合、攻撃回数を増やす
if @active_battler.current_action.kind == 0 &&
@active_battler.current_action.basic == 0
@attakked_num += 1
end
if $OuterFlgs["Rand_Select"]
# スキルの場合、攻撃対象インデックスを増やす
if @active_battler.current_action.kind == 1
@selected_num += 1
end
end # $OuterFlgs["Rand_Select"]
# 攻撃した敵が生き残っているか確認
f = false
for target in @target_battlers
if target.exist?
f = true
end
end
# ステップ 6 に移行
@phase4_step = 6
# 攻撃した敵が生き残っていれば
if f
# 「基本動作」で、「攻撃」なら
if @active_battler.current_action.kind == 0 &&
@active_battler.current_action.basic == 0
if $OuterFlgs["Multi_Atk_Wep"]
# 武器に設定された最大攻撃数の取得
@max_atk_num = get_max_attack(@active_battler.weapon_id)
end # $OuterFlgs["Multi_Atk_Wep"]
# 攻撃回数が最大攻撃数を超えていない場合
if @attakked_num < @max_atk_num
# ステップ 2 に移行
@phase4_step = 2
return
end
end
if $OuterFlgs["Equip_Extend"]
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
# 「スキル(魔法ではない)」もしくは、「基本動作」で「攻撃」なら
if (@active_battler.current_action.kind == 1 && @skill.atk_f != 0) ||
(@active_battler.current_action.kind == 0 &&
@active_battler.current_action.basic == 0)
# 多刀装備なら装備箇所で再攻撃
for i in 0...@active_battler.armors_weapon.size
if @active_battler.armors_weapon[i] && !@mlt_blade_atked[i]
# 装備交換
case i
when 0
@active_battler.weapon_id = @armor1_id_tmp
@active_battler.armor1_id = @weapon_id_tmp
when 1
@active_battler.weapon_id = @armor2_id_tmp
@active_battler.armor2_id = @weapon_id_tmp
when 2
@active_battler.weapon_id = @armor6_id_tmp
@active_battler.armor6_id = @weapon_id_tmp
when 3
@active_battler.weapon_id = @armor3_id_tmp
@active_battler.armor3_id = @weapon_id_tmp
when 4
@active_battler.weapon_id = @armor4_id_tmp
@active_battler.armor4_id = @weapon_id_tmp
when 5
@active_battler.weapon_id = @armor5_id_tmp
@active_battler.armor5_id = @weapon_id_tmp
when 6
@active_battler.weapon_id = @armor7_id_tmp
@active_battler.armor7_id = @weapon_id_tmp
when 7
@active_battler.weapon_id = @armor8_id_tmp
@active_battler.armor8_id = @weapon_id_tmp
end
@mlt_blade_atked[i] = true
@attakked_num = 0
@phase4_step = 2
return
end
end
end
end
end # $OuterFlgs["Equip_Extend"]
if $OuterFlgs["Rand_Select"]
# スキルの場合
if @active_battler.current_action.kind == 1
# ランダムセレクト数が残っている場合
if @selected_num < $game_system.sel_num
# ステップ 2 に移行
@phase4_step = 2
return
end
end
end # $OuterFlgs["Rand_Select"]
end
end
end
|