| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 1593 |  
| 最后登录 | 2012-8-8 |  
| 在线时间 | 24 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间24 小时注册时间2010-6-29帖子21 | 
5楼
 
 
 楼主|
发表于 2010-10-26 23:58:36
|
只看该作者 
| 回复 saturnfjh 的帖子 #==============================================================================
 # ■ Scene_Map
 #------------------------------------------------------------------------------
 #  マップ画面の処理を行うクラスです。
 #==============================================================================
 
 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
 
   | 
 |