class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ● 敵ターン更新
#--------------------------------------------------------------------------
def update_turn_enemy
for event in @unit_list
next unless event.enemy_flag # エネミーユニットでなければ次へ
next if event.unit.dead? # 死んでいれば次へ
next if event.unit.restriction > 1 # 行動不能なら次へ
return if event.moving? # 移動中ならば終了
@event = event
unless @event.action_end or @event.move_end
focus_event(@event)
@status_window.refresh(@event)
wait(20)
@event.unit.make_action # 行動の決定
end
# 移動が終わっていなければ移動する
unless @event.move_end
if @event.move_target != nil ? update_enemy_move_target : update_enemy_move
@event.move_end = true
Graphics.frame_reset # フレームスキップ対策
return
else
@event.move_end = true if @event.move_end
end
end
# 行動処理
unless @event.action_end
if update_enemy_action
@event.action_end = true
Graphics.frame_reset # フレームスキップ対策
return
else
@event.action_end = true if @event.move_end
end
end
return unless @event.action_end and @event.move_end
end
change_turn # 味方ターンへ戻す
end
#--------------------------------------------------------------------------
# ● 移動処理
#--------------------------------------------------------------------------
def update_enemy_move
# 行動対象が味方なら味方、敵なら敵を移動目標にする
target = @event.get_near_enemy(@event.unit.action.for_friend?)
return true if target.empty? # 対象がいなければ終了
# 行動前でなおかつ最優先対象が行動範囲内にいるなら移動を後回しにする
unless @event.action_end
attack_dist = 1 # 攻撃が届く距離を計算
if @event.unit.action.skill?
attack_dist = @event.unit.action.skill.attack_dist +
@event.unit.action.skill.effect_dist
end
if @event.get_distance(target[0]) <= attack_dist
return false
end
end
make_movable_cell # 移動可能範囲を作成
# 逃走移動
if @event.unit.hp * 100 / @event.unit.maxhp <= @event.away_hp
# 対象の中で一番近くにいるものを選ぶ
d = 1024
for event in target
if @event.get_distance(event) < d
d = @event.get_distance(event)
enemy = event
end
end
# 一番近い敵との距離が一番遠くなるセルをテーブルから選択
scope_dist = enemy.get_distance(@event)
for pos in @movable_cell.keys
if @movable_cell[pos] != ""
d = enemy.get_distance_cell(pos[0], pos[1])
if d > scope_dist
scope_dist = d
x = pos[0]
y = pos[1]
end
end
end
# 接近移動
else
# 接近目標に攻撃が届く移動可能なセルがあるか調べる
attack_dist = 1 # 攻撃が届く距離を計算
if @event.unit.action.skill?
attack_dist = @event.unit.action.skill.attack_dist +
@event.unit.action.skill.effect_dist
end
for event in target
for pos in @movable_cell.keys
if @movable_cell[pos] != ""
d = event.get_distance_cell(pos[0], pos[1])
if d <= attack_dist
x = pos[0]
y = pos[1]
break
end
end
end
break if x != nil
end
if x == nil
# 対象との距離が一番短くなるセルをテーブルから選択
scope_dist = target[0].get_distance(@event)
for pos in @movable_cell.keys
if @movable_cell[pos] != ""
d = target[0].get_distance_cell(pos[0], pos[1])
if d < scope_dist
scope_dist = d
x = pos[0]
y = pos[1]
end
end
end
end
end
# 移動ルートを作成する
if x != nil
make_move_route(x, y)
$game_player.set_auto_move(x, y)
end
return true
end
#--------------------------------------------------------------------------
# ● 移動目標への移動処理
#--------------------------------------------------------------------------
def update_enemy_move_target
# すでに到着していれば終了
return true if @event.x == @event.move_target[0] and @event.y == @event.move_target[1]
make_movable_cell # 移動可能範囲を作成
# 目標との距離が一番短くなるセルをテーブルから選択
dist = 1024
for pos in @movable_cell.keys
if @movable_cell[pos] != ""
d = (pos[0] - @event.move_target[0]).abs + (pos[1] - @event.move_target[1]).abs
if d < dist
dist = d
x = pos[0]
y = pos[1]
end
end
end
# 移動ルートを作成する
if x != nil
make_move_route(x, y)
$game_player.set_auto_move(x, y)
end
return true
end
#--------------------------------------------------------------------------
# ● 行動処理
#--------------------------------------------------------------------------
def update_enemy_action
check_attack_cell # 攻撃可能セルを調べる
check_effect_cell # 効果範囲の作成
# 効果範囲内に一番多くの対象がいる攻撃可能セル選ぶ
max = 0
maxhp = 99999
for pos in @attack_cell
n = 0
hp = 99999
for pos2 in @effect_cell
enemy = unit_xy(pos[0] + pos2[0], pos[1] + pos2[1])
next if enemy == nil # 誰もいなければ次のセルへ
# 行動対象が味方の場合
if @event.unit.action.for_friend?
next unless enemy.enemy_flag
# スキルの効果が適用されない相手なら次へ
if @event.unit.action.skill?
next unless enemy.unit.skill_effective?(@event.unit, @event.unit.action.skill)
end
# 行動対象が敵の場合
else
next if enemy.id == @event.id
next if enemy.enemy_flag
end
n += 1
hp = enemy.unit.hp if enemy.unit.hp < hp
end
if n > max or (n == max and hp < maxhp)
x = pos[0]
y = pos[1]
max = n
maxhp = hp
end
end
return false if max == 0
$game_player.set_auto_move(x, y)
enemy = unit_xy(x, y)
@status_window.refresh(enemy) if enemy != nil
wait(10)
attack(x, y)
return true
end
end