#--------------------------------------------------------------------------
# ● メインフェーズ開始
#--------------------------------------------------------------------------
def start_phase4
$game_temp.battle_main_phase = true
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ)
#--------------------------------------------------------------------------
def update_phase4
# アクションを強制されているバトラーが存在する場合
if $game_temp.forcing_battler != nil
battler = $game_temp.forcing_battler
if battler.current_action.forcing == false
if @action_battlers.include?(battler)
if @action > 0 or @action_battlers[0].phase == 1
@action_battlers.delete(battler)
@action_battlers.push(battler)
end
if battler.phase == 1
battler.current_action.forcing = true
force_action(battler)
end
else
battler.current_action.forcing = true
force_action(battler)
action_start(battler)
@action_battlers.delete(battler)
@action_battlers.push(battler)
end
battler.at = @max
battler.atp = 100 * battler.at / @max
end
end
# action が1以上の場合、一斉に行動を起こす
for battler in @action_battlers.reverse
# ウェイト中の場合
if battler.wait > 0
# ウェイトカウントを減らす
battler.wait -= 1
break if @action == 0
next
end
unless fin? and battler.phase < 3 and
not $game_system.battle_interpreter.running?
action_phase(battler)
end
break if @action == 0
end
# アクションを強制されているバトラーが存在しない場合
if $game_temp.forcing_battler == nil
# バトルイベントをセットアップ
setup_battle_event
# バトルイベント実行中の場合
if $game_system.battle_interpreter.running?
return
end
end
# 勝敗を決した際の処理
if fin?
# 敗北時、指定時間ウェイト
if $game_party.all_dead? and @after_wait[0] > 0
@after_wait[0] -= 1
return
end
# 勝利時、指定時間ウェイト
if victory? and @after_wait[1] > 0
@after_wait[1] -= 1
return
end
# 戦闘が終了し、かつアクターが行動直前の場合はアクターの行動を消去
for battler in @action_battlers.reverse
if battler.phase < 3 and not $game_system.battle_interpreter.running?
@action_battlers.delete(battler)
end
end
# 勝敗判定
if @action_battlers.empty? and
not $game_system.battle_interpreter.running?
judge
end
end
end
#--------------------------------------------------------------------------
# ● アクション更新 (メインフェーズ)
#--------------------------------------------------------------------------
def action_phase(battler)
# action が 1 の場合、バトラーが行動中かどうか確認
if @action == 1 and battler.phase <= 3
for target in battler.target
speller = synthe?(target)
if speller == nil
# ターゲットが通常行動中の場合
if @action_battlers.include?(target)
if target.phase > 2
return
end
end
else
# ターゲットが連携スキル発動中の場合
for spell in speller
if @action_battlers.include?(spell)
if spell.phase > 2
return
end
end
end
end
end
end
case battler.phase
when 1
update_phase4_step1(battler)
when 2
update_phase4_step2(battler)
when 3
update_phase4_step3(battler)
when 4
update_phase4_step4(battler)
when 5
update_phase4_step5(battler)
when 6
update_phase4_step6(battler)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
#--------------------------------------------------------------------------
def update_phase4_step1(battler)
# すでに戦闘から外されている場合
if battler.index == nil
@action_battlers.delete(battler)
anime_wait_return
return
end
speller = synthe?(battler)
if speller == nil
# ダメージ食らい中の場合
unless battler.damage.empty? or @action > 2
return
end
# 行動可能かどうか判定
unless battler.movable?
battler.phase = 6
return
end
else
# ダメージ食らい中の場合
for spell in speller
unless spell.damage.empty? or @action > 2
return
end
# 行動可能かどうか判定
unless spell.movable?
battler.phase = 6
return
end
end
end
# スキル使用時、詠唱時間設定
# 強制アクションかつ @force が 2 の時はスキルを即時発動
if battler.current_action.kind == 1 and
(not battler.current_action.forcing or @force != 2)
if battler.rtp == 0
# スキル詠唱中ならば、解除
skill_reset(battler)
# スキル詠唱時間設定
recite_time(battler)
# 連携技設定
synthe_spell(battler)
# スキルを詠唱する場合
if battler.rtp > 0
# 強制アクションかつ @force が 1 の時は連携スキルのみ即時発動
speller = synthe?(battler)
if battler.current_action.forcing and @force > 0 and speller != nil
for spell in speller
spell.rt = spell.rtp
end
else
battler.blink = true
if battler.current_action.forcing
$game_temp.forcing_battler = nil
battler.current_action.forcing = false
end
@action_battlers.delete(battler)
return
end
end
end
end
# アクターの明滅エフェクト OFF
if battler != nil
battler.blink = false
end
speller = synthe?(battler)
if speller == nil
@spell_p.delete(battler)
@spell_e.delete(battler)
else
for spell in speller
spell.blink = false
@spell_p.delete(spell)
@spell_e.delete(spell)
end
end
# ステップ 2 に移行
battler.phase = 2
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
#--------------------------------------------------------------------------
def update_phase4_step2(battler)
# 強制アクションでなければ
unless battler.current_action.forcing
# 制約が [敵を通常攻撃する] か [味方を通常攻撃する] の場合
if battler.restriction == 2 or battler.restriction == 3
# アクションに攻撃を設定
battler.current_action.kind = 0
battler.current_action.basic = 0
end
end
# アクションの種別で分岐
case battler.current_action.kind
when 0 # 基本
if fin?
battler.phase = 6
return
end
make_basic_action_result(battler)
when 1 # スキル
if fin? and $data_skills[battler.current_action.skill_id].scope == 1..2
battler.phase = 6
return
end
make_skill_action_result(battler)
when 2 # アイテム
if fin? and $data_items[battler.current_action.item_id].scope == 1..2
battler.phase = 6
return
end
make_item_action_result(battler)
end
if battler.phase == 2
# ステップ 3 に移行
battler.phase = 3
end
end
#--------------------------------------------------------------------------
# ● 基本アクション 結果作成
#--------------------------------------------------------------------------
def make_basic_action_result(battler)
# 攻撃の場合
if battler.current_action.basic == 0
# アニメーション ID を設定
battler.anime1 = battler.animation1_id
battler.anime2 = battler.animation2_id
# 行動側バトラーがエネミーの場合
if battler.is_a?(Game_Enemy)
if battler.restriction == 3
target = $game_troop.random_target_enemy
elsif battler.restriction == 2
target = $game_party.random_target_actor
else
index = battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
end
# 行動側バトラーがアクターの場合
if battler.is_a?(Game_Actor)
if battler.restriction == 3
target = $game_party.random_target_actor
elsif battler.restriction == 2
target = $game_troop.random_target_enemy
else
index = battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
end
end
# 対象側バトラーの配列を設定
battler.target = [target]
# 通常攻撃の効果を適用
for target in battler.target
target.attack_effect(battler)
end
return
end
# 防御の場合
if battler.current_action.basic == 1
return
end
# 逃げるの場合
# if battler.is_a?(Game_Enemy) and battler.current_action.basic == 2
# 逃げる
# @help_window.set_text("逃げる", 1)
# @help_wait = @help_time
# battler.escape
# return
# end
#========RTAB 1.16=====================================================
# 逃げるの場合
if battler.is_a?(Game_Enemy) and battler.current_action.basic == 2
return
end
#======================================================================
# 何もしないの場合
if battler.current_action.basic == 3
# ステップ 6 に移行
battler.phase = 6
return
end
end
#--------------------------------------------------------------------------
# ● スキルまたはアイテムの対象側バトラー設定
# scope : スキルまたはアイテムの効果範囲
#--------------------------------------------------------------------------
def set_target_battlers(scope, battler)
# 行動側バトラーがエネミーの場合
if battler.is_a?(Game_Enemy)
# 効果範囲で分岐
case scope
when 1 # 敵単体
index =battler.current_action.target_index
battler.target.push($game_party.smooth_target_actor(index))
when 2 # 敵全体
for actor in $game_party.actors
if actor.exist?
battler.target.push(actor)
end
end
when 3 # 味方単体
index = battler.current_action.target_index
battler.target.push($game_troop.smooth_target_enemy(index))
when 4 # 味方全体
for enemy in $game_troop.enemies
if enemy.exist?
battler.target.push(enemy)
end
end
when 5 # 味方単体 (HP 0)
index = battler.current_action.target_index
enemy = $game_troop.enemies[index]
if enemy != nil and enemy.hp0?
battler.target.push(enemy)
end
when 6 # 味方全体 (HP 0)
for enemy in $game_troop.enemies
if enemy != nil and enemy.hp0?
battler.target.push(enemy)
end
end
when 7 # 使用者
battler.target.push(battler)
end
end
# 行動側バトラーがアクターの場合
if battler.is_a?(Game_Actor)
# 効果範囲で分岐
case scope
when 1 # 敵単体
index = battler.current_action.target_index
battler.target.push($game_troop.smooth_target_enemy(index))
when 2 # 敵全体
for enemy in $game_troop.enemies
if enemy.exist?
battler.target.push(enemy)
end
end
when 3 # 味方単体
index = battler.current_action.target_index
battler.target.push($game_party.smooth_target_actor(index))
when 4 # 味方全体
for actor in $game_party.actors
if actor.exist?
battler.target.push(actor)
end
end
when 5 # 味方単体 (HP 0)
index = battler.current_action.target_index
actor = $game_party.actors[index]
if actor != nil and actor.hp0?
battler.target.push(actor)
end
when 6 # 味方全体 (HP 0)
for actor in $game_party.actors
if actor != nil and actor.hp0?
battler.target.push(actor)
end
end
when 7 # 使用者
battler.target.push(battler)
end
end
end
#--------------------------------------------------------------------------
# ● スキルアクション 結果作成
#--------------------------------------------------------------------------
def make_skill_action_result(battler)
# スキルを取得
@skill = $data_skills[battler.current_action.skill_id]
# 連携スキルであるかどうか確認
speller = synthe?(battler)
# 強制アクションでなければ
unless battler.current_action.forcing
# SP 切れなどで使用できなくなった場合
if speller == nil
unless battler.skill_can_use?(@skill.id)
# ステップ 6 に移行
battler.phase = 6
return
end
end
end
# SP 消費
temp = false
if speller != nil
for spell in speller
if spell.current_action.spell_id == 0
spell.sp -= @skill.sp_cost
else
spell.sp -= $data_skills[spell.current_action.spell_id].sp_cost
end
# ステータスウィンドウをリフレッシュ
status_refresh(spell)
end
else
battler.sp -= @skill.sp_cost
# ステータスウィンドウをリフレッシュ
status_refresh(battler)
end
# アニメーション ID を設定
battler.anime1 = @skill.animation1_id
battler.anime2 = @skill.animation2_id
# コモンイベント ID を設定
battler.event = @skill.common_event_id
# 対象側バトラーを設定
set_target_battlers(@skill.scope, battler)
# スキルの効果を適用
for target in battler.target
if speller != nil
damage = 0
d_result = false
effective = false
state_p = []
state_m = []
for spell in speller
if spell.current_action.spell_id != 0
@skill = $data_skills[spell.current_action.spell_id]
end
effective |= target.skill_effect(spell, @skill)
if target.damage[spell].class != String
d_result = true
damage += target.damage[spell]
elsif effective
effect = target.damage[spell]
end
state_p += target.state_p[spell]
state_m += target.state_m[spell]
target.damage.delete(spell)
target.state_p.delete(spell)
target.state_m.delete(spell)
end
if d_result
target.damage[battler] = damage
elsif effective
target.damage[battler] = effect
else
target.damage[battler] = 0
end
target.state_p[battler] = state_p
target.state_m[battler] = state_m
else
target.skill_effect(battler, @skill)
end
end
end
#--------------------------------------------------------------------------
# ● アイテムアクション 結果作成
#--------------------------------------------------------------------------
def make_item_action_result(battler)
# アイテムを取得
@item = $data_items[battler.current_action.item_id]
# アイテム切れなどで使用できなくなった場合
unless $game_party.item_can_use?(@item.id)
# ステップ 6 に移行
battler.phase = 6
return
end
# 消耗品の場合
if @item.consumable
# 使用したアイテムを 1 減らす
$game_party.lose_item(@item.id, 1)
end
# アニメーション ID を設定
battler.anime1 = @item.animation1_id
battler.anime2 = @item.animation2_id
# コモンイベント ID を設定
battler.event = @item.common_event_id
# 対象を決定
index = battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
# 対象側バトラーを設定
set_target_battlers(@item.scope, battler)
# アイテムの効果を適用
for target in battler.target
target.item_effect(@item, battler)
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
#--------------------------------------------------------------------------
def update_phase4_step3(battler)
# ヘルプウィンドウの更新。アクションの種別で分岐
case battler.current_action.kind
when 0 # 基本
if battler.current_action.basic == 1
@help_window.set_text($data_system.words.guard, 1)
@help_wait = @help_time
end
#========RTAB 1.16==================================
if battler.current_action.basic == 2
# 逃げる
@help_window.set_text("逃げる", 1)
@help_wait = @help_time
battler.escape
battler.phase = 4
return
end
#===================================================
when 1 # スキル
skill = $data_skills[battler.current_action.skill_id]
@help_window.set_text(skill.name, 1)
@help_wait = @help_time
when 2 # アイテム
item = $data_items[battler.current_action.item_id]
@help_window.set_text(item.name, 1)
@help_wait = @help_time
end
# 行動側アニメーション (ID が 0 の場合は白フラッシュ)
if battler.anime1 == 0
battler.white_flash = true
battler.wait = 5
# カメラ設定
if battler.target[0].is_a?(Game_Enemy)
camera_set(battler)
end
else
battler.animation.push([battler.anime1, true])
speller = synthe?(battler)
if speller != nil
for spell in speller
if spell != battler
if spell.current_action.spell_id == 0
spell.animation.push([battler.anime1, true])
else
skill = spell.current_action.spell_id
spell.animation.push([$data_skills[skill].animation1_id, true])
spell.current_action.spell_id = 0
end
end
end
end
battler.wait = 2 * $data_animations[battler.anime1].frame_max - 10
end
# ステップ 4 に移行
battler.phase = 4
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
#--------------------------------------------------------------------------
def update_phase4_step4(battler)
# カメラ設定
if battler.target[0].is_a?(Game_Enemy) and battler.anime1 != 0
camera_set(battler)
end
# 対象側アニメーション
for target in battler.target
target.animation.push([battler.anime2,
(target.damage[battler] != "Miss")])
unless battler.anime2 == 0
battler.wait = 2 * $data_animations[battler.anime2].frame_max - 10
end
end
# ステップ 5 に移行
battler.phase = 5
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
#--------------------------------------------------------------------------
def update_phase4_step5(battler)
# ダメージ表示
for target in battler.target
if target.damage[battler] != nil
target.damage_pop[battler] = true
target.damage_effect(battler, battler.current_action.kind)
battler.wait = @damage_wait
# ステータスウィンドウをリフレッシュ
status_refresh(target)
end
end
# ステップ 6 に移行
battler.phase = 6
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
#--------------------------------------------------------------------------
def update_phase4_step6(battler)
# カメラを戻す
if battler.target[0].is_a?(Game_Enemy) and @camera == battler
@spriteset.screen_target(0, 0, 1)
end
# スキルラーニング
if battler.target[0].is_a?(Game_Actor) and battler.current_action.kind == 1
for target in battler.target
skill_learning(target, target.class_id,
battler.current_action.skill_id)
end
end
# アクション強制対象のバトラーをクリア
if battler.current_action.forcing == true and
battler.current_action.force_kind == 0 and
battler.current_action.force_basic == 0 and
battler.current_action.force_skill_id == 0
$game_temp.forcing_battler = nil
battler.current_action.forcing = false
end
refresh_phase(battler)
speller = synthe?(battler)
if speller != nil
for spell in speller
if spell != battler
refresh_phase(spell)
end
end
synthe_delete(speller)
end
# コモンイベント ID が有効の場合
if battler.event > 0
# イベントをセットアップ
common_event = $data_common_events[battler.event]
$game_system.battle_interpreter.setup(common_event.list, 0)
end
act = 0
for actor in $game_party.actors + $game_troop.enemies
if actor.movable?
act += 1
end
end
if @turn_cnt >= act and act > 0
@turn_cnt %= act
$game_temp.battle_turn += 1
# バトルイベントの全ページを検索
for index in 0...$data_troops[@troop_id].pages.size
# イベントページを取得
page = $data_troops[@troop_id].pages[index]
# このページのスパンが [ターン] の場合
if page.span == 1
# 実行済みフラグをクリア
$game_temp.battle_event_flags[index] = false
end
end
end
battler.phase = 1
@action_battlers.delete(battler)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh_phase(battler)
battler.at -= @max
if battler.movable?
battler.atp = 100 * battler.at / @max
end
spell_reset(battler)
# スリップダメージ
if battler.hp > 0 and battler.slip_damage?
battler.slip_damage_effect
battler.damage_pop["slip"] = true
end
# ステート自然解除
battler.remove_states_auto
# ステータスウィンドウをリフレッシュ
status_refresh(battler, true)
unless battler.movable?
return
end
# ターン数カウント
@turn_cnt += 1
end
#--------------------------------------------------------------------------
# ● バトラーアクションスタート
#--------------------------------------------------------------------------
def action_start(battler)
battler.phase = 1
battler.anime1 = 0
battler.anime2 = 0
battler.target = []
battler.event = 0
@action_battlers.unshift(battler)
end
#--------------------------------------------------------------------------
# ● ステータスウィンドウをリフレッシュ
#--------------------------------------------------------------------------
def status_refresh(battler, at = false)
if battler.is_a?(Game_Actor)
for i in 0...$game_party.actors.size
if battler == $game_party.actors
number = i + 1
end
end
@status_window.refresh(number)
if at == true
@status_window.at_refresh(number)
end
end
end
#--------------------------------------------------------------------------
# ● アニメウェイト判断処理
#--------------------------------------------------------------------------
def anime_wait_return
if (@action_battlers.empty? or @anime_wait == false) and
not $game_system.battle_interpreter.running?
# エネミーアローが有効の場合
if @enemy_arrow != nil
return [@active - 2, 0].min == 0
# アクターアローが有効の場合
elsif @actor_arrow != nil
return [@active - 2, 0].min == 0
# スキルウィンドウが有効の場合
elsif @skill_window != nil
return [@active - 3, 0].min == 0
# アイテムウィンドウが有効の場合
elsif @item_window != nil
return [@active - 3, 0].min == 0
# アクターコマンドウィンドウが有効の場合
elsif @actor_command_window.active
return [@active - 1, 0].min == 0
else
return true
end
else
return false
end
end
#--------------------------------------------------------------------------
# ● アクターコマンド消去判断
#--------------------------------------------------------------------------
def command_delete
# エネミーアローが有効の場合
if @enemy_arrow != nil
end_enemy_select
# アクターアローが有効の場合
elsif @actor_arrow != nil
end_actor_select
end
# スキルウィンドウが有効の場合
if @skill_window != nil
end_skill_select
# アイテムウィンドウが有効の場合
elsif @item_window != nil
end_item_select
end
# アクターコマンドウィンドウが有効の場合
if @actor_command_window.active
@command.shift
@command_a = false
# メインフェーズフラグをセット
$game_temp.battle_main_phase = true
# アクターコマンドウィンドウを無効化
@actor_command_window.active = false
@actor_command_window.visible = false
# アクターの明滅エフェクト OFF
if @active_actor != nil
@active_actor.blink = false
end
end
end
#--------------------------------------------------------------------------
# ● 強制アクション設定
#--------------------------------------------------------------------------
def force_action(battler)
battler.current_action.kind = battler.current_action.force_kind
battler.current_action.basic = battler.current_action.force_basic
battler.current_action.skill_id = battler.current_action.force_skill_id
battler.current_action.force_kind = 0
battler.current_action.force_basic = 0
battler.current_action.force_skill_id = 0
end
#--------------------------------------------------------------------------
# ● カメラセット
#--------------------------------------------------------------------------
def camera_set(battler)
@camera = battler
if battler.target.size == 1
if battler.current_action.kind == 0
zoom = 1.2 / battler.target[0].zoom
elsif synthe?(battler) == nil
zoom = 1.5 / battler.target[0].zoom
else
zoom = 2.0 / battler.target[0].zoom
end
@spriteset.screen_target(battler.target[0].attack_x(zoom),
battler.target[0].attack_y(zoom), zoom)
else
@spriteset.screen_target(0, 0, 0.75)
end
end
#--------------------------------------------------------------------------
# ● スキル詠唱タイム作成
#--------------------------------------------------------------------------
def recite_time(battler)
end
#--------------------------------------------------------------------------
# ● 連携スキル判別
#--------------------------------------------------------------------------
def synthe_spell(battler)
end
#--------------------------------------------------------------------------
# ● スキルラーニングシステム
#--------------------------------------------------------------------------
def skill_learning(actor, class_id, skill_id)
end
#--------------------------------------------------------------------------
# ● 行動可能判定
#--------------------------------------------------------------------------
def active?(battler)
speller = synthe?(battler)
if speller != nil
if synthe_delete?(speller)
return false
end
else
unless battler.inputable?
spell_reset(battler)
unless battler.movable?
battler.atp = 0
return false
end
end
if battler.current_action.forcing
spell_reset(battler)
end
end
return true
end
#--------------------------------------------------------------------------
# ● 合成スキル詠唱中か?
#--------------------------------------------------------------------------
def synthe?(battler)
for speller in @synthe
if speller.include?(battler)
return speller
end
end
return nil
end
#--------------------------------------------------------------------------
# ● 合成スキル消去判断
#--------------------------------------------------------------------------
def synthe_delete?(speller)
for battler in speller
if not battler.inputable? and dead_ok?(battler)
synthe_delete(speller)
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● 合成スキル消去
#--------------------------------------------------------------------------
def synthe_delete(speller)
for battler in speller
spell_reset(battler)
if dead_ok?(battler)
@action_battlers.delete(battler)
end
end
@synthe.delete(speller)
end
#--------------------------------------------------------------------------
# ● 連携含むスキル詠唱解除
#--------------------------------------------------------------------------
def skill_reset(battler)
speller = synthe?(battler)
if speller != nil
synthe_delete(speller)
else
spell_reset(battler)
end
end
#--------------------------------------------------------------------------
# ● スキル詠唱解除
#--------------------------------------------------------------------------
def spell_reset(battler)
battler.rt = 0
battler.rtp = 0
battler.blink = false
battler.spell = false
battler.current_action.spell_id = 0
@spell_p.delete(battler)
@spell_e.delete(battler)
end
#--------------------------------------------------------------------------
# ● 戦闘終了判定
#--------------------------------------------------------------------------
def fin?
return (victory? or $game_party.all_dead? or $game_party.actors.size == 0)
end
#--------------------------------------------------------------------------
# ● 敵全滅判定
#--------------------------------------------------------------------------
def victory?
for battler in $game_troop.enemies
if not battler.hidden and (battler.rest_hp > 0 or
battler.immortal or battler.damage_pop.size > 0)
return false
end
end
return true
end
#--------------------------------------------------------------------------
# ● 死亡許可判定
#--------------------------------------------------------------------------
def dead_ok?(battler)
speller = synthe?(battler)
if speller == nil
if @action_battlers.include?(battler)
if battler.phase > 2
return false
end
end
else
for battler in speller
if @action_battlers.include?(battler)
if battler.phase > 2
return false
end
end
end
end
return true
end
end
class Game_Party
#--------------------------------------------------------------------------
# ● 全滅判定
#--------------------------------------------------------------------------
def all_dead?
# パーティ人数が 0 人の場合
if $game_party.actors.size == 0
return false
end
# HP 0 以上のアクターがパーティにいる場合
for actor in @actors
if actor.rest_hp > 0
return false
end
end
# 全滅
return true
end
#--------------------------------------------------------------------------
# ● 対象アクターのランダムな決定
# hp0 : HP 0 のアクターに限る
#--------------------------------------------------------------------------
# オリジナルのターゲット決定ルーチンを smooth_target_actor_rtab と名前変更
alias :random_target_actor_rtab :random_target_actor
def random_target_actor(hp0 = false)
# ルーレットを初期化
roulette = []
# ループ
for actor in @actors
# 条件に該当する場合
if (not hp0 and actor.exist? and actor.rest_hp > 0) or
(hp0 and actor.hp0?)
# アクターのクラスの [位置] を取得
position = $data_classes[actor.class_id].position
# 前衛のとき n = 4、中衛のとき n = 3、後衛のとき n = 2
n = 4 - position
# ルーレットにアクターを n 回追加
n.times do
roulette.push(actor)
end
end
end
# ルーレットのサイズが 0 の場合
if roulette.size == 0
return random_target_actor_rtab(hp0)
end
# ルーレットを回し、アクターを決定
return roulette[rand(roulette.size)]
end
#--------------------------------------------------------------------------
# ● 対象アクターのスムーズな決定
# actor_index : アクターインデックス
#--------------------------------------------------------------------------
# オリジナルのターゲット決定ルーチンを smooth_target_actor_rtab と名前変更
alias :smooth_target_actor_rtab :smooth_target_actor
def smooth_target_actor(actor_index)
# アクターを取得
actor = @actors[actor_index]
# アクターが存在する場合
if actor != nil and actor.exist? and actor.rest_hp > 0
return actor
end
# ループ
for actor in @actors
# アクターが存在する場合
if actor.exist? and actor.rest_hp > 0
return actor
end
end
# 味方が全滅している場合、オリジナルのターゲット決定ルーチンを実行する
return smooth_target_actor_rtab(actor_index)
end
end
class Game_Troop
#--------------------------------------------------------------------------
# ● 対象エネミーのランダムな決定
# hp0 : HP 0 のエネミーに限る
#--------------------------------------------------------------------------
# オリジナルのターゲット決定ルーチンを random_target_enemy_rtab と名前変更
alias :random_target_enemy_rtab :random_target_enemy
def random_target_enemy(hp0 = false)
# ルーレットを初期化
roulette = []
# ループ
for enemy in @enemies
# 条件に該当する場合
if (not hp0 and enemy.exist? and enemy.rest_hp > 0) or
(hp0 and enemy.hp0?)
# ルーレットにエネミーを追加
roulette.push(enemy)
end
end
# ルーレットのサイズが 0 の場合
if roulette.size == 0
return random_target_enemy_rtab(hp0)
end
# ルーレットを回し、エネミーを決定
return roulette[rand(roulette.size)]
end
#--------------------------------------------------------------------------
# ● 対象エネミーのスムーズな決定
# enemy_index : エネミーインデックス
#--------------------------------------------------------------------------
# オリジナルのターゲット決定ルーチンを smooth_target_enemy_rtab と名前変更
alias :smooth_target_enemy_rtab :smooth_target_enemy
def smooth_target_enemy(enemy_index)
# エネミーを取得
enemy = @enemies[enemy_index]
# エネミーが存在する場合
if enemy != nil and enemy.exist? and enemy.rest_hp > 0
return enemy
end
# ループ
for enemy in @enemies
# エネミーが存在する場合
if enemy.exist? and enemy.rest_hp > 0
return enemy
end
end
# 敵が全滅している場合、再度敵の検索を行う
return smooth_target_enemy_rtab(enemy_index)
end
end
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
# バトラーが nil の場合
if @battler == nil
self.bitmap = nil
loop_animation(nil)
return
end
# ファイル名か色相が現在のものと異なる場合
if @battler.battler_name != @battler_name or
@battler.battler_hue != @battler_hue
# ビットマップを取得、設定
@battler_name = @battler.battler_name
@battler_hue = @battler.battler_hue
self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
@width = bitmap.width
@height = bitmap.height
self.ox = @width / 2
self.oy = @height
if @battler.is_a?(Game_Enemy)
@battler.height = @height
end
# 戦闘不能または隠れ状態なら不透明度を 0 にする
if @battler.dead? or @battler.hidden
self.opacity = 0
end
end
# アニメーション ID が現在のものと異なる場合
if @battler.state_animation_id != @state_animation_id
@state_animation_id = @battler.state_animation_id
loop_animation($data_animations[@state_animation_id])
end
# 表示されるべきアクターの場合
if @battler.is_a?(Game_Actor) and @battler_visible
# メインフェーズでないときは不透明度をやや下げる
if $game_temp.battle_main_phase
self.opacity += 3 if self.opacity < 255
else
self.opacity -= 3 if self.opacity > 207
end
end
# 明滅
if @battler.blink
blink_on
else
blink_off
end
# 不可視の場合
unless @battler_visible
# 出現
if not @battler.hidden and not @battler.dead? and
(@battler.damage.size < 2 or @battler.damage_pop.size < 2)
appear
@battler_visible = true
end
end
# ダメージ
for battler in @battler.damage_pop
if battler[0].class == Array
if battler[0][1] >= 0
$scene.skill_se
else
$scene.levelup_se
end
damage(@battler.damage[battler[0]], false, 2)
else
damage(@battler.damage[battler[0]], @battler.critical[battler[0]])
end
if @battler.damage_sp.include?(battler[0])
damage(@battler.damage_sp[battler[0]],
@battler.critical[battler[0]], 1)
@battler.damage_sp.delete(battler[0])
end
@battler.damage_pop.delete(battler[0])
@battler.damage.delete(battler[0])
@battler.critical.delete(battler[0])
end
# 可視の場合
if @battler_visible
# 逃走
if @battler.hidden
$game_system.se_play($data_system.escape_se)
escape
@battler_visible = false
end
# 白フラッシュ
if @battler.white_flash
whiten
@battler.white_flash = false
end
# アニメーション
unless @battler.animation.empty?
for animation in @battler.animation.reverse
animation($data_animations[animation[0]], animation[1])
@battler.animation.delete(animation)
end
end
# コラプス
if @battler.damage.empty? and @battler.dead?
if $scene.dead_ok?(@battler)
if @battler.is_a?(Game_Enemy)
$game_system.se_play($data_system.enemy_collapse_se)
else
$game_system.se_play($data_system.actor_collapse_se)
end
collapse
@battler_visible = false
end
end
end
# スプライトの座標を設定
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
if @battler.is_a?(Game_Enemy)
self.zoom_x = @battler.real_zoom * @battler.zoom
self.zoom_y = @battler.real_zoom * @battler.zoom
end
end
end
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
x = (4 - $game_party.actors.size) * 80
width = $game_party.actors.size * 160
super(x, 320, width, 160)
self.back_opacity = 160
@actor_window = []
for i in 0...$game_party.actors.size
@actor_window.push(Window_ActorStatus.new(i, x + i * 160))
end
@level_up_flags = [false, false, false, false]
refresh
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
for window in @actor_window
window.dispose
end
super
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh(number = 0)
if number == 0
cnt = 0
for window in @actor_window
window.refresh(@level_up_flags[cnt])
cnt += 1
end
else
@actor_window[number - 1].refresh(@level_up_flags[number - 1])
end
end
#--------------------------------------------------------------------------
# ● ATゲージリフレッシュ
#--------------------------------------------------------------------------
def at_refresh(number = 0)
if number == 0
for window in @actor_window
window.at_refresh
end
else
@actor_window[number - 1].at_refresh
end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
if self.x != (4 - $game_party.actors.size) * 80
self.x = (4 - $game_party.actors.size) * 80
self.width = $game_party.actors.size * 160
for window in @actor_window
window.dispose
end
@actor_window = []
for i in 0...$game_party.actors.size
@actor_window.push(Window_ActorStatus.new(i, x + i * 160))
end
refresh
end
for window in @actor_window
window.update
end
end
end
class Interpreter
#--------------------------------------------------------------------------
# ● アクターの入れ替え
#--------------------------------------------------------------------------
def command_129
# アクターを取得
actor = $game_actors[@parameters[0]]
# アクターが有効の場合
if actor != nil
# 操作で分岐
if @parameters[1] == 0
if @parameters[2] == 1
$game_actors[@parameters[0]].setup(@parameters[0])
end
$game_party.add_actor(@parameters[0])
if $game_temp.in_battle
$game_actors[@parameters[0]].at = 0
$game_actors[@parameters[0]].atp = 0
$scene.spell_reset($game_actors[@parameters[0]])
$game_actors[@parameters[0]].damage_pop = {}
$game_actors[@parameters[0]].damage = {}
$game_actors[@parameters[0]].damage_sp = {}
$game_actors[@parameters[0]].critical = {}
$game_actors[@parameters[0]].recover_hp = {}
$game_actors[@parameters[0]].recover_sp = {}
$game_actors[@parameters[0]].state_p = {}
$game_actors[@parameters[0]].state_m = {}
$game_actors[@parameters[0]].animation = []
end
else
$game_party.remove_actor(@parameters[0])
end
end
if $game_temp.in_battle
$scene.status_window.update
end
# 継続
return true
end
#--------------------------------------------------------------------------
# ● HP の増減
#--------------------------------------------------------------------------
alias :command_311_rtab :command_311
def command_311
command_311_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● SP の増減
#--------------------------------------------------------------------------
alias :command_312_rtab :command_312
def command_312
command_312_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● ステートの変更
#--------------------------------------------------------------------------
alias :command_313_rtab :command_313
def command_313
command_313_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● 全回復
#--------------------------------------------------------------------------
alias :command_314_rtab :command_314
def command_314
command_314_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● EXP の増減
#--------------------------------------------------------------------------
alias :command_315_rtab :command_315
def command_315
command_315_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● レベルの増減
#--------------------------------------------------------------------------
alias :command_316_rtab :command_316
def command_316
command_316_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● パラメータの増減
#--------------------------------------------------------------------------
alias :command_317_rtab :command_317
def command_317
command_317_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● 装備の変更
#--------------------------------------------------------------------------
alias :command_319_rtab :command_319
def command_319
command_319_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● アクターの名前変更
#--------------------------------------------------------------------------
alias :command_320_rtab :command_320
def command_320
command_320_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● アクターのクラス変更
#--------------------------------------------------------------------------
alias :command_321_rtab :command_321
def command_321
command_321_rtab
if $game_temp.in_battle
$scene.status_window.refresh
end
end
#--------------------------------------------------------------------------
# ● アニメーションの表示
#--------------------------------------------------------------------------
def command_337
# イテレータで処理
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# バトラーが存在する場合
if battler.exist?
# アニメーション ID を設定
battler.animation.push([@parameters[2], true])
end
end
# 継続
return true
end
#--------------------------------------------------------------------------
# ● ダメージの処理
#--------------------------------------------------------------------------
def command_338
# 操作する値を取得
value = operate_value(0, @parameters[2], @parameters[3])
# イテレータで処理
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# バトラーが存在する場合
if battler.exist?
# HP を変更
battler.hp -= value
# 戦闘中なら
if $game_temp.in_battle
# ダメージを設定
battler.damage["event"] = value
battler.damage_pop["event"] = true
end
end
end
if $game_temp.in_battle
$scene.status_window.refresh
end
# 継続
return true
end
#--------------------------------------------------------------------------
# ● アクションの強制
#--------------------------------------------------------------------------
def command_339
# 戦闘中でなければ無視
unless $game_temp.in_battle
return true
end
# ターン数が 0 なら無視
if $game_temp.battle_turn == 0
return true
end
# イテレータで処理 (便宜的なもので、複数になることはない)
iterate_battler(@parameters[0], @parameters[1]) do |battler|
# バトラーが存在する場合
if battler.exist?
# アクションを設定
battler.current_action.force_kind = @parameters[2]
if battler.current_action.force_kind == 0
battler.current_action.force_basic = @parameters[3]
else
battler.current_action.force_skill_id = @parameters[3]
end
# 行動対象を設定
if @parameters[4] == -2
if battler.is_a?(Game_Enemy)
battler.current_action.decide_last_target_for_enemy
else
battler.current_action.decide_last_target_for_actor
end
elsif @parameters[4] == -1
if battler.is_a?(Game_Enemy)
battler.current_action.decide_random_target_for_enemy
else
battler.current_action.decide_random_target_for_actor
end
elsif @parameters[4] >= 0
battler.current_action.target_index = @parameters[4]
end
# アクションが有効かつ [すぐに実行] の場合
if battler.current_action.valid? and @parameters[5] == 1
# 強制対象のバトラーを設定
$game_temp.forcing_battler = battler
# インデックスを進める
@index += 1
# 終了
return false
elsif battler.current_action.valid? and @parameters[5] == 0
battler.current_action.forcing = true
end
end
end
# 継続
return true
end
end