・まず、攻撃した際、変な方向を向いてしまうバグ修正です。 SurumeSim_Attack の 752行目 def turn_pos(sx, sy) を以下に変更 def turn_pos(x, y) ・以降は、未発見処理のスクリプトです。 メインの上に、新しくセクション挿入して下さい。名称は「SurumeSim_Sakuteki」にでもして下さい。 # 隠蔽ユニット(索敵範囲外なら攻撃されない)に必要なスキル $SKILL_SINOBIASI= 81 # 未発見時ステート $STATE_MIHAKKEN = 17 # 発見されたときに表示するアニメーション $ANIME_HAKKEN= 98 #============================================================================== # ■ Game_Sakuteki #------------------------------------------------------------------------------ #  敵の索敵範囲(隠蔽ユニットが隠れられる場所)を計算する。 #============================================================================== class Game_Sakuteki attr_accessor :sakuteki # attr_accessor :sisen_map # #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @sakuteki = {} end #-------------------------------------------------------------------------- # ● イベントごとの索敵マップ初期化 #-------------------------------------------------------------------------- def unit_map_init(id, x, y) @sakuteki[id] = Table.new(x, y) end #-------------------------------------------------------------------------- # ● 視線を妨害されていないか調べる #-------------------------------------------------------------------------- def line_check(x1, y1, x2, y2) xs = x1 ys = y1 x0 = x2 y0 = y2 x1 = x1 * 3 + 1 y1 = y1 * 3 + 1 x2 = x2 * 3 + 1 y2 = y2 * 3 + 1 if (x2 - x1).abs < (y2 - y1).abs dy = 1 if y1 > y2 dy = -1 end dx = 1 if x1 > x2 dx = -1 end nLoop = (y2 - y1).abs dd = (x2 - x1).abs.to_f / (y2 - y1).abs d = 0.5 for i in 0...nLoop y1 += dy d += dd if d >= 1 d -= 1 x1 += dx end if @sisen_map[x1/3,y1/3] & 1 != 0 return false elsif @sisen_map[x1/3,y1/3] & 2 != 0 if x1/3 == x2/3 && y1/3 == y2/3 return true else return false end end end return true else dx = 1 if x1 > x2 dx = -1 end dy = 1 if y1 > y2 dy = -1 end nLoop = (x2 - x1).abs dd = (y2 - y1).abs.to_f / (x2 - x1).abs d = 0.5 for i in 0..nLoop x1 += dx d += dd if d >= 1 d -= 1 y1 += dy end if @sisen_map[x1/3,y1/3] & 1 != 0 return false elsif @sisen_map[x1/3,y1/3] & 2 != 0 if x1/3 == x2/3 && y1/3 == y2/3 return true else return false end end end return true end end #-------------------------------------------------------------------------- # ● 指定位置から隠蔽ユニットが発見されない場所を列挙する # sx : X座標 # sy : Y座標 # id : ユニットID # d : 索敵方向 #-------------------------------------------------------------------------- def make_line_single_unit(sx, sy, id, d) for x in 0...@sakuteki[id].xsize for y in 0...@sakuteki[d].ysize @sakuteki[id][x, y] = 0 # 調べている場所が指定場所から索敵距離以内なら if distance(x, y, sx, sy) <= 8 # 向いている方向チェック if (d == 2 && sy <= y) or (d == 8 && sy >= y) or (d == 4 && sx >= x) or (d == 6 && sx <= x) # そこまで視線が通るか? if line_check(sx, sy, x, y) @sakuteki[id][x, y] = 4 end end end end end end #-------------------------------------------------------------------------- # ● 隠蔽ユニットが発見されない場所を列挙する #-------------------------------------------------------------------------- def make_line(unit = nil, enemy = nil) # 視線マップ初期化 @sisen_map = Table.new($game_map.width,$game_map.height) for x in 0...@sisen_map.xsize for y in 0...@sisen_map.ysize # カウンター設定されているチップは視線を遮る if $game_map.counter?(x, y) == true @sisen_map[x, y] = 1 else @sisen_map[x, y] = 0 end end end # 味方ユニットのいる場所は視線を遮る for event in $game_map.events.values if event.group == 1 @sisen_map[event.x, event.y] |= 2 end end # 高速化のため指定されたユニットのみ、視線チェック if unit != nil # 移動したユニットがプレイヤーユニット if unit.group & 1 != 0 for event in $game_map.events.values if event.group == 2 if @sakuteki[event.id][unit.x, unit.y] != 0 or @sakuteki[event.id][$srmsim_sakuteki_old_x, $srmsim_sakuteki_old_y] != 0 make_line_single_unit(event.x, event.y, event.id, event.direction) end end end # 攻撃したユニットが敵 if enemy != nil make_line_single_unit(enemy.x, enemy.y, enemy.id, enemy.direction) end elsif unit.group & 2 != 0 make_line_single_unit(unit.x, unit.y, unit.id, unit.direction) if $srmsim_sakuteki_defence_x != nil && $srmsim_sakuteki_defence_y != nil for event in $game_map.events.values if event.group & 2 != 0 if @sakuteki[event.id][$srmsim_sakuteki_defence_x, $srmsim_sakuteki_defence_y] != 0 make_line_single_unit(event.x, event.y, event.id, event.direction) end end end $srmsim_sakuteki_defence_x = nil $srmsim_sakuteki_defence_y = nil end else return end else # 全ユニット視線チェック for event in $game_map.events.values if event.group & 2 != 0 make_line_single_unit(event.x, event.y, event.id, event.direction) end end end end #-------------------------------------------------------------------------- # ● 隠蔽ユニットが発見されない場所を列挙する #-------------------------------------------------------------------------- def make_mihakken mihakken = [] for event in $game_map.events.values if event.data.state?($STATE_MIHAKKEN) mihakken.push(event) end event.data.remove_state($STATE_MIHAKKEN) end for event in mihakken unless event.data.state?($STATE_MIHAKKEN) event.animation_id = 98 end end end end #============================================================================== # ■ Move_Algorythm #============================================================================== class Move_Algorythm #-------------------------------------------------------------------------- # ● 未発見場所と未発見ユニットを設定 #-------------------------------------------------------------------------- def set_move_action_mihakken for x in 0...@move_action.xsize for y in 0...@move_action.ysize @move_action[x,y] &= 0xfffb for event in $game_map.events.values if event.group == 2 if $data_sakuteki.sakuteki[event.id][x, y] != 0 @move_action[x,y] |= 4 end end end end end mihakken = [] for event in $game_map.events.values if event.group & 7 != 0 if event.actor.state?($STATE_MIHAKKEN) mihakken.push(event) end event.actor.remove_state($STATE_MIHAKKEN) end end for event in $game_map.events.values if event.group & 7 != 0 if @move_action[event.x, event.y] & 4 == 0 if event.group == 1 && event.actor.skill_learn?($SKILL_SINOBIASI) event.actor.add_state($STATE_MIHAKKEN) end end end end for event in mihakken unless event.actor.state?($STATE_MIHAKKEN) event.animation_id = $ANIME_HAKKEN end end end end #============================================================================== # ■ Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● セットアップ # map_id : マップ ID #-------------------------------------------------------------------------- alias :srmsim_sakuteki_setup :setup def setup(map_id) if $game_temp.in_simulation $data_sakuteki = Game_Sakuteki.new end srmsim_sakuteki_setup(map_id) end end #-------------------------------------------------------------------------- # ● アクター用イテレータ (未発見状態のユニットは排除) # group : #-------------------------------------------------------------------------- def iterate_enemy(group) # イベント全体分ループ for event in $game_map.events.values # ブロックを評価 yield event if (event.group & group) != 0 && event.actor.state?($STATE_MIHAKKEN) == false end end #============================================================================== # Game_Event を継承したシミュレーション用のユニット #============================================================================== class Game_Unit #-------------------------------------------------------------------------- # ● オブジェクト初期化 # map_id : マップ ID # event : イベント (RPG::Event) #-------------------------------------------------------------------------- alias :srmsim_sakuteki_initialize :initialize def initialize(map_id, event) srmsim_sakuteki_initialize(map_id, event) if $game_map.in_simulation $data_sakuteki.unit_map_init(event.id, $game_map.width, $game_map.height) end end #-------------------------------------------------------------------------- # ● 行動終了 #-------------------------------------------------------------------------- alias :srmsim_sakuteki_action_end :action_end def action_end enemy = nil if @actor.current_action.target_index != 0 enemy = $game_map.events[@actor.current_action.target_index] end $data_sakuteki.make_line(self, enemy) $game_map.move_algorythm.set_move_action_mihakken $scene.wait_for_effect_end srmsim_sakuteki_action_end end end #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新 # マップ画面上でもステートアニメーションを表示するよう変更 #-------------------------------------------------------------------------- alias :srmsim_sakuteki_update :update def update # アニメーション ID が現在のものと異なる場合 if @character.is_a?(Game_Unit) && @character.group & 7 != 0 && @character.actor.state_animation_id != @state_animation_id @state_animation_id = @character.actor.state_animation_id loop_animation($data_animations[@state_animation_id]) end srmsim_sakuteki_update return end end #============================================================================== # ■ Spriteset_Map #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● エフェクト表示中判定 #-------------------------------------------------------------------------- def effect? # エフェクトが一つでも表示中なら true を返す for sprite in @character_sprites return true if sprite.effect? end return false end end #============================================================================== # ■ Scene_Map #============================================================================== class Scene_Map #-------------------------------------------------------------------------- # ● プレイヤーの場所移動 #-------------------------------------------------------------------------- alias :srmsim_sakuteki_transfer_player :transfer_player def transfer_player srmsim_sakuteki_transfer_player if $game_map.in_simulation $data_sakuteki.make_line(nil) $game_map.move_algorythm.set_move_action_mihakken $game_map.move_algorythm.make_map end end #-------------------------------------------------------------------------- # ● エフェクト終了まで待つ #-------------------------------------------------------------------------- def wait_for_effect_end # ゲーム画面を更新 Graphics.update # フレーム更新 update while @spriteset.effect? # ゲーム画面を更新 Graphics.update # フレーム更新 update end end #-------------------------------------------------------------------------- # ● 目的地を選択 # 索敵高速化用に過去のユニットの座標を保存 # e : 動かすユニット番号 #-------------------------------------------------------------------------- alias :srmsim_sakuteki_select_goal :select_goal def select_goal(e) $srmsim_sakuteki_old_x = $game_map.events[e].x $srmsim_sakuteki_old_y = $game_map.events[e].y srmsim_sakuteki_select_goal(e) end #-------------------------------------------------------------------------- # ● 攻撃 #-------------------------------------------------------------------------- alias :srmsim_sakuteki_sim_battle :sim_battle def sim_battle(attack_id, defence_id, skill_id) $srmsim_sakuteki_defence_x = $game_map.events[defence_id].x $srmsim_sakuteki_defence_y = $game_map.events[defence_id].y srmsim_sakuteki_sim_battle(attack_id, defence_id, skill_id) end end