#============================================================================== # ■ プレイヤーの8方向移動+斜め歩行グラに対応+その他 (VX Ace用) #------------------------------------------------------------------------------ # 製作者 : CanariAlternate # サイト名 : カルトの鳥篭 # サイトURL : http://canarialt.blog.fc2.com #------------------------------------------------------------------------------ # ■ 概要 : 移動関連の機能を詰め込んだスクリプトです。 # 必要な機能だけ追加するように設定することも出来ます。 # # ■ 必須 : 「注釈取得スクリプト」※斜め歩行グラフィックを使用しない場合は不要 # # ■ 位置 : 「イベント起動判定拡張」より下 # 「注釈取得スクリプト」より下 #------------------------------------------------------------------------------ # ■ 機能 : プレイヤーの8方向移動&斜め移動でスムーズに移動など # 臼井の会様にて配布されている斜め歩行グラフィックに対応 # 走行状態をダッシュのデフォルトにする。 # プレイヤーの移動操作禁止と許可をスイッチで切り替える。 # 斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更 #------------------------------------------------------------------------------ # 更新履歴 : 2013/07/08 Ver1.00 複数のスクリプトを再設計し、これにまとめた。 # 2013/07/10 Ver1.01 斜め向きでの起動不可が機能していないバグを修正した。 # 2013/07/10 Ver1.02 スクリプトの設定に関する説明を修正した。 #============================================================================== $imported ||= {} $imported[:CanariAlternate_MoveSystems] = true #============================================================================== # ■ Calt #------------------------------------------------------------------------------ #  CanariAlternateが製作したスクリプト用のモジュールです。 #============================================================================== module Calt #---------------------------------------------------------------------------- # ◆プレイヤーの8方向移動を使用するか DiagonalMovePlayer = true # true / false # # 設定した番後のスイッチがONの時は8方向移動を禁止(0の場合は常にOFF) DiagonalMoveProhibition = 0 # スイッチ番号 # # 設定した番号のスイッチがONの時は斜め方向の移動に失敗した場合に # 滑るように縦または横に移動する機能を無効化(0の場合は常にOFF) DiagonalMoveSlide = 0 # スイッチ番号 # # そのキーを押している間は斜め移動しか出来なくなるキーを設定(nil を設定で無効) # キー候補一覧 :SHIFT :CTRL :ALT :A :B :C :X :Y :Z :L :R :F5 :F6 :F7 :F8 :F9 DiagonalMoveOnlyKey = :ALT # Inputモジュールの定数 # # そのキーを押している間は移動はせず方向転換をするキーを設定(nil を設定で無効) # キー候補一覧 :SHIFT :CTRL :ALT :A :B :C :X :Y :Z :L :R :F5 :F6 :F7 :F8 :F9 ChangeTurnModeKey = :CTRL # Inputモジュールの定数 #---------------------------------------------------------------------------- # ◆斜め歩行グラフィックを使用するか DiagonalCharacterGraphic = true # true / false # # 斜め向きでの起動不可のキーワード # ※プレイヤーに斜めの歩行グラフィックを用意すると斜め方向からイベントを起動出来るようになります。 # 一部のイベントは斜め方向から起動されると都合が悪い場合があります。(例えば、扉など) # イベントの実行内容の先頭に注釈でキーワードを記述することで斜め方向から起動出来なくなります。 DiagonalNotStartNote = /\[斜め向きでの起動不可\]/ # 記述した頁に適用 DiagonalNotStartAllNote = /\<斜め向きでの起動不可\>/ # 全ての頁に適用(1頁目に記述) DiagonalNotStartReverse = false # 全てのイベントの初期状態を反転 # # 斜め歩行グラフィック画像の名前 # ※この名前の画像を用意すると斜めを向いた時にその画像になる # # ◇画像名の先頭に $ がついている場合(1キャラ分の画像) # 初期設定では斜め向き画像の名前は 画像名-X となる。 # 例えば、$mainActor に斜め画像をつけたければ $mainActor-X という画像を用意する。 DiagonalCharacterName = "%s-X" # # ◇画像名の先頭に $ がついていない場合(8キャラ分の画像) # 初期設定では斜め向き画像の名前は $画像名-X-番号 となる。 # 番号は 1~8 でどのキャラの斜め画像か指定する。1 2 3 4 # 5 6 7 8 # 例えば、actor5 の4番のキャラに斜め画像をつけたければ $actor5-X-4 という画像を用意する。 DiagonalCharacterIndexName = "$%s-X-%s" #---------------------------------------------------------------------------- # ◆走行状態をダッシュのデフォルトにするを使用するか DashDefaultDash = true # true / false # # 設定した番号のスイッチがONの時は歩行がデフォルトになる(0の場合は常にOFF) DashDefaultWalk = 0 # スイッチ番号 #---------------------------------------------------------------------------- # ◆プレイヤーの移動操作禁止を使用するか PlayerImpossibleOperation = true # true / false # # 設定した番号のスイッチがONの時はプレイヤーの移動操作を禁止(0の場合は常にOFF) MoveByInputProhibition = 0 # スイッチ番号 #---------------------------------------------------------------------------- # ◆斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更を使用するか DiagonalMoveNatural = true # true / false # # 斜め通過を許可する地形タグ(A1タイルに設定した場合は元々が許可なので禁止に) # ここで設定した地形タグを設定したタイルは斜め通過を許可(A1タイルは禁止)する。 DiagonalMoveNaturalTag = [] # 例 [1, 2, 5] #---------------------------------------------------------------------------- end ############################################################################### # ■ プレイヤーの8方向移動に関する変更 ############################################################################### if Calt::DiagonalMovePlayer #============================================================================== # ■ Game_CharacterBase #------------------------------------------------------------------------------ #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ # ラフィックなどの基本的な情報を保持します。 #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ● キャラクターの斜め画像の有無を取得 [新規] #-------------------------------------------------------------------------- def character_diagonal return false end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 方向ボタン入力による移動処理 [◆再定義] #-------------------------------------------------------------------------- def move_by_input return if !movable? || $game_map.interpreter.running? if $game_switches[Calt::DiagonalMoveProhibition] move_4_way # 斜め移動を禁止のスイッチがON (4方向移動) else move_8_way # 斜め移動を禁止のスイッチがOFF(8方向移動) end end #-------------------------------------------------------------------------- # ● 4方向移動の処理 [新規] #-------------------------------------------------------------------------- def move_4_way if Calt::ChangeTurnModeKey && Input.press?(Calt::ChangeTurnModeKey) set_direction(Input.dir4) if Input.dir4 > 0 # 方向転換 else move_straight(Input.dir4) if Input.dir4 > 0 # 移動処理 end end #-------------------------------------------------------------------------- # ● 8方向移動の処理 [新規] #-------------------------------------------------------------------------- def move_8_way if Calt::ChangeTurnModeKey && Input.press?(Calt::ChangeTurnModeKey) if character_diagonal # 方向転換(斜め画像あり) if Input.dir8 > 0 if Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey) set_direction(Input.dir8) if Input.dir8 % 2 == 1 # 方向転換(斜めのみ) else set_direction(Input.dir8) # 方向転換8方向 end end else set_direction(Input.dir4) if Input.dir4 > 0 # 方向転換(斜め画像なし) end else # 移動処理8方向 if (d = Input.dir8) > 0 case d when 1 ; move_diagonal_select(4, 2) when 3 ; move_diagonal_select(6, 2) when 7 ; move_diagonal_select(4, 8) when 9 ; move_diagonal_select(6, 8) else # 移動処理4方向 unless Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey) move_straight(d) end end end end end #-------------------------------------------------------------------------- # ● 滑り移動の有無を判定して適当な方の斜め移動を実行 [新規] #-------------------------------------------------------------------------- def move_diagonal_select(horz, vert) if $game_switches[Calt::DiagonalMoveSlide] || Calt::DiagonalMoveOnlyKey && Input.press?(Calt::DiagonalMoveOnlyKey) move_diagonal(horz, vert) # 滑り移動は無効 else move_diagonal_slide(horz, vert) # 滑り移動は有効 end end #-------------------------------------------------------------------------- # ● 移動成功か判定(滑り移動付き斜めに移動の処理用) [新規] #-------------------------------------------------------------------------- def move_succeed_slide? return true if @move_succeed # 普通に移動成功の場合 return true if $game_map.any_event_starting? # イベントを起動準備中の場合 return true if $game_map.interpreter.running? # イベントを実行中の場合 return false end #-------------------------------------------------------------------------- # ● 滑り移動付き斜めに移動(プレイヤー操作専用) [新規] #-------------------------------------------------------------------------- def move_diagonal_slide(horz, vert, turn_ok = true) old_direction = @direction # 現在の向きを記憶 if Calt::DiagonalCharacterGraphic move_diagonal(horz, vert, turn_ok) # 斜めグラを使用する場合 else move_diagonal(horz, vert) # 斜めグラを使用しない場合 end new_direction = @direction # 新しい向きを記憶 unless move_succeed_slide? if old_direction == 2 || old_direction == 8 direction1 = horz # 現在、縦の場合は横優先 direction2 = vert elsif old_direction == 4 || old_direction == 6 direction1 = vert # 現在、横の場合は縦優先 direction2 = horz else direction1 = vert # 現在、斜めの場合は縦優先 direction2 = horz end if passable?(x, y, direction1) move_straight(direction1, turn_ok) # 移動可能なので移動 #@direction = new_direction if Calt::DiagonalCharacterGraphic # 向きを斜めに戻す elsif passable?(x, y, direction2) move_straight(direction2, turn_ok) # 移動可能なので移動 #@direction = new_direction if Calt::DiagonalCharacterGraphic # 向きを斜めに戻す else # 縦横ともに移動不可なのでイベントの起動を試行 move_straight(direction1, turn_ok) move_straight(direction2, turn_ok) unless move_succeed_slide? # 縦横ともに起動不可の場合は向きを戻す @direction = new_direction unless move_succeed_slide? end end end end end ############################################################################### # ■ 斜め歩行グラフィックに関する変更 ############################################################################### if Calt::DiagonalCharacterGraphic #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正なし)[追加] #-------------------------------------------------------------------------- alias x_with_direction_MoveSystems x_with_direction def x_with_direction(x, d) d = d == 1 || d == 7 ? 4 : 6 if d % 2 == 1 && d != 5 # dをx方向に変換 x_with_direction_MoveSystems(x, d) end #-------------------------------------------------------------------------- # ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正なし)[追加] #-------------------------------------------------------------------------- alias y_with_direction_MoveSystems y_with_direction def y_with_direction(y, d) d = d == 1 || d == 3 ? 2 : 8 if d % 2 == 1 && d != 5 # dをy方向に変換 y_with_direction_MoveSystems(y, d) end #-------------------------------------------------------------------------- # ● 特定の方向に 1 マスずらした X 座標の計算(ループ補正あり)[追加] #-------------------------------------------------------------------------- alias round_x_with_direction_MoveSystems round_x_with_direction def round_x_with_direction(x, d) d = d == 1 || d == 7 ? 4 : 6 if d % 2 == 1 && d != 5 # dをx方向に変換 round_x_with_direction_MoveSystems(x, d) end #-------------------------------------------------------------------------- # ● 特定の方向に 1 マスずらした Y 座標の計算(ループ補正あり)[追加] #-------------------------------------------------------------------------- alias round_y_with_direction_MoveSystems round_y_with_direction def round_y_with_direction(y, d) d = d == 1 || d == 3 ? 2 : 8 if d % 2 == 1 && d != 5 # dをy方向に変換 round_y_with_direction_MoveSystems(y, d) end #-------------------------------------------------------------------------- # ● 通常キャラの通行可能判定 [追加] #-------------------------------------------------------------------------- alias passable_MoveSystems? passable? def passable?(x, y, d, *args) if d % 2 == 1 && d != 5 horz = d == 1 || d == 7 ? 4 : 6 vert = d == 1 || d == 3 ? 2 : 8 x2 = round_x_with_direction(x, horz) y2 = round_y_with_direction(y, vert) return (passable_MoveSystems?(x, y, vert, *args) && passable_MoveSystems?(x, y2, 10 - vert, *args) && passable_MoveSystems?(x, y2, horz, *args)) || (passable_MoveSystems?(x, y, horz, *args) && passable_MoveSystems?(x2, y, 10 - horz, *args) && passable_MoveSystems?(x2, y, vert, *args)) else return passable_MoveSystems?(x, y, d, *args) end end end #============================================================================== # ■ Game_CharacterBase #------------------------------------------------------------------------------ #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ # ラフィックなどの基本的な情報を保持します。 #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :character_diagonal # キャラクターの斜め画像の有無を取得 # ■変数への直接アクセスによる取得は禁止■ #-------------------------------------------------------------------------- # ● 公開メンバ変数の初期化 [追加] #-------------------------------------------------------------------------- alias init_public_members_MoveSystems init_public_members def init_public_members init_public_members_MoveSystems @character_diagonal = false end #-------------------------------------------------------------------------- # ● 斜め向きか判定 [新規] #-------------------------------------------------------------------------- def direction_diagonal?(d = @direction) return d % 2 == 1 && d != 5 end #-------------------------------------------------------------------------- # ● 斜め画像の有無を設定 [新規] #-------------------------------------------------------------------------- def set_character_diagonal(flag) @character_diagonal = flag unless @character_diagonal # 斜め向きの画像が無い場合の処理 if direction_diagonal? @direction = @direction > 5 ? 8 : 2 end if direction_diagonal?(@prelock_direction) @prelock_direction = @prelock_direction > 5 ? 8 : 2 end end end #-------------------------------------------------------------------------- # ● 指定方向に向き変更 [◆再定義] #-------------------------------------------------------------------------- def set_direction(d) if character_diagonal || !direction_diagonal?(d) @direction = d if !@direction_fix && d != 0 elsif !@direction_fix && d != 0 @direction = d > 5 ? 8 : 2 end @stop_count = 0 end #-------------------------------------------------------------------------- # ● 通行可能判定 [追加] #-------------------------------------------------------------------------- alias passable_MoveSystems? passable? def passable?(x, y, d) if direction_diagonal?(d) horz = d == 1 || d == 7 ? 4 : 6 vert = d == 1 || d == 3 ? 2 : 8 diagonal_passable?(x, y, horz, vert) # 斜め向きの時は斜めの判定を実行 else passable_MoveSystems?(x, y, d) end end #-------------------------------------------------------------------------- # ● まっすぐに移動 [追加] #-------------------------------------------------------------------------- alias move_straight_MoveSystems move_straight def move_straight(d, turn_ok = true) if direction_diagonal?(d) horz = d == 1 || d == 7 ? 4 : 6 vert = d == 1 || d == 3 ? 2 : 8 move_diagonal(horz, vert, turn_ok) # 斜め向きの時は斜め移動を実行 else move_straight_MoveSystems(d, turn_ok) end end #-------------------------------------------------------------------------- # ● 斜めに移動 [◆再定義] #-------------------------------------------------------------------------- def move_diagonal(horz, vert, turn_ok = true) # 向き変更の可否を追加 @move_succeed = diagonal_passable?(x, y, horz, vert) if @move_succeed set_direction_diagonal(horz, vert) # 向き変更 @x = $game_map.round_x_with_direction(@x, horz) @y = $game_map.round_y_with_direction(@y, vert) @real_x = $game_map.x_with_direction(@x, reverse_dir(horz)) @real_y = $game_map.y_with_direction(@y, reverse_dir(vert)) increase_steps elsif turn_ok set_direction_diagonal(horz, vert) # 向き変更 check_event_trigger_touch_front if character_diagonal # 斜め画像がある end end #-------------------------------------------------------------------------- # ● 向きの変更(斜め向き) [新規] #-------------------------------------------------------------------------- def set_direction_diagonal(horz, vert) if character_diagonal d = horz == 4 ? (vert == 2 ? 1 : 7) : (vert == 2 ? 3 : 9) set_direction(d) # 斜め画像があれば斜めを向く else set_direction(horz) if @direction == reverse_dir(horz) set_direction(vert) if @direction == reverse_dir(vert) end end end #============================================================================== # ■ Game_Character #------------------------------------------------------------------------------ #  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、 # Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。 #============================================================================== class Game_Character < Game_CharacterBase #-------------------------------------------------------------------------- # ● 距離に最適な向きを向く [新規] #-------------------------------------------------------------------------- def set_diagonal_distance_xy_from(sx, sy) # distance_x_from, distance_y_fromの返り値をそれぞれsx, syに入れて使う。 sxabs = sx.abs syabs = sy.abs if sx == 0 || sy == 0 || (sxabs - syabs).abs * 2 >= sxabs + syabs if sxabs > syabs set_direction(sx > 0 ? 4 : 6) elsif sy != 0 set_direction(sy > 0 ? 8 : 2) end else set_direction_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2) end end #-------------------------------------------------------------------------- # ● ジャンプ [追加] #-------------------------------------------------------------------------- alias jump_MoveSystems jump def jump(x_plus, y_plus) jump_MoveSystems(x_plus, y_plus) set_diagonal_distance_xy_from(-x_plus, -y_plus) if character_diagonal end #-------------------------------------------------------------------------- # ● キャラクターに近づく(斜め移動可) [追加] #-------------------------------------------------------------------------- alias move_toward_character_MoveSystems move_toward_character def move_toward_character(character) return move_toward_character_MoveSystems(character) unless character_diagonal sx = distance_x_from(character.x) sy = distance_y_from(character.y) if sx == 0 || sy == 0 if sx.abs > sy.abs move_straight(sx > 0 ? 4 : 6) move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0 elsif sy != 0 move_straight(sy > 0 ? 8 : 2) move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0 end else move_diagonal(sx > 0 ? 4 : 6, sy > 0 ? 8 : 2) if !@move_succeed if sx.abs > sy.abs move_straight(sx > 0 ? 4 : 6) move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0 elsif sy != 0 move_straight(sy > 0 ? 8 : 2) move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0 end end end end #-------------------------------------------------------------------------- # ● キャラクターから遠ざかる(斜め移動可) [追加] #-------------------------------------------------------------------------- alias move_away_from_character_MoveSystems move_away_from_character def move_away_from_character(character) return move_away_from_character_MoveSystems(character) unless character_diagonal sx = distance_x_from(character.x) sy = distance_y_from(character.y) if sx == 0 || sy == 0 if sx.abs > sy.abs move_straight(sx > 0 ? 6 : 4) move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0 elsif sy != 0 move_straight(sy > 0 ? 2 : 8) move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0 end else move_diagonal(sx > 0 ? 6 : 4, sy > 0 ? 2 : 8) if !@move_succeed if sx.abs > sy.abs move_straight(sx > 0 ? 6 : 4) move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0 elsif sy != 0 move_straight(sy > 0 ? 2 : 8) move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0 end end end end #-------------------------------------------------------------------------- # ● キャラクターの方を向く(斜め向き可) [追加] #-------------------------------------------------------------------------- alias turn_toward_character_MoveSystems turn_toward_character def turn_toward_character(character) return turn_toward_character_MoveSystems(character) unless character_diagonal sx = distance_x_from(character.x) sy = distance_y_from(character.y) set_diagonal_distance_xy_from(sx, sy) end #-------------------------------------------------------------------------- # ● キャラクターの逆を向く(斜め向き可) [追加] #-------------------------------------------------------------------------- alias turn_away_from_character_MoveSystems turn_away_from_character def turn_away_from_character(character) return turn_away_from_character_MoveSystems(character) unless character_diagonal sx = distance_x_from(character.x) sy = distance_y_from(character.y) set_diagonal_distance_xy_from(-sx, -sy) end #-------------------------------------------------------------------------- # ● 右に 90 度回転 [◆再定義] #-------------------------------------------------------------------------- def turn_right_90 case @direction when 2; set_direction(4) when 4; set_direction(8) when 6; set_direction(2) when 8; set_direction(6) when 1; set_direction(7) when 3; set_direction(1) when 7; set_direction(9) when 9; set_direction(3) end end #-------------------------------------------------------------------------- # ● 左に 90 度回転 [◆再定義] #-------------------------------------------------------------------------- def turn_left_90 case @direction when 2; set_direction(6) when 4; set_direction(2) when 6; set_direction(8) when 8; set_direction(4) when 1; set_direction(3) when 3; set_direction(9) when 7; set_direction(1) when 9; set_direction(7) end end #-------------------------------------------------------------------------- # ● 右に 45 度回転 [新規] #-------------------------------------------------------------------------- def turn_right_45 return turn_right_90 unless character_diagonal case @direction when 1; set_direction(4) when 2; set_direction(1) when 3; set_direction(2) when 4; set_direction(7) when 6; set_direction(3) when 7; set_direction(8) when 8; set_direction(9) when 9; set_direction(6) end end #-------------------------------------------------------------------------- # ● 左に 45 度回転 [新規] #-------------------------------------------------------------------------- def turn_left_45 return turn_left_90 unless character_diagonal case @direction when 1; set_direction(2) when 2; set_direction(3) when 3; set_direction(6) when 4; set_direction(1) when 6; set_direction(9) when 7; set_direction(4) when 8; set_direction(7) when 9; set_direction(8) end end #-------------------------------------------------------------------------- # ● 右に 135 度回転 [新規] #-------------------------------------------------------------------------- def turn_right_135 return turn_right_90 unless character_diagonal case @direction when 1; set_direction(8) when 2; set_direction(7) when 3; set_direction(4) when 4; set_direction(9) when 6; set_direction(1) when 7; set_direction(6) when 8; set_direction(3) when 9; set_direction(2) end end #-------------------------------------------------------------------------- # ● 左に 135 度回転 [新規] #-------------------------------------------------------------------------- def turn_left_135 return turn_left_90 unless character_diagonal case @direction when 1; set_direction(6) when 2; set_direction(9) when 3; set_direction(8) when 4; set_direction(3) when 6; set_direction(7) when 7; set_direction(2) when 8; set_direction(1) when 9; set_direction(4) end end #-------------------------------------------------------------------------- # ● 右か左に 45 度回転 [新規] #-------------------------------------------------------------------------- def turn_right_or_left_45 case rand(2) when 0; turn_right_45 when 1; turn_left_45 end end #-------------------------------------------------------------------------- # ● 右か左に 135 度回転 [新規] #-------------------------------------------------------------------------- def turn_right_or_left_135 case rand(2) when 0; turn_right_135 when 1; turn_left_135 end end #-------------------------------------------------------------------------- # ● ランダムに方向転換(斜め向き可) [追加] #-------------------------------------------------------------------------- alias turn_random_MoveSystems turn_random def turn_random return turn_random_MoveSystems unless character_diagonal d = 1 + rand(8) d += 1 if d > 4 set_direction(d) end #-------------------------------------------------------------------------- # ● ランダムに移動(斜め向き可) [追加] #-------------------------------------------------------------------------- alias move_random_MoveSystems move_random def move_random return move_random_MoveSystems unless character_diagonal d = 1 + rand(8) d += 1 if d > 4 move_straight(d, false) end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 歩行グラフィック 斜め画像の有無を取得 [新規] #-------------------------------------------------------------------------- def character_diagonal return @character_diagonal if @vehicle_type == :walk # 歩行の場合は通常通り # プレイヤーに斜め画像が無い場合は処理が面倒なので乗り物に斜め画像があっても無効 return @character_diagonal && vehicle.character_diagonal # 乗り物に搭乗中はその乗り物 end #-------------------------------------------------------------------------- # ● 斜めに移動 [◆再定義] #-------------------------------------------------------------------------- def move_diagonal(horz, vert, turn_ok = true) # 向き変更の可否を追加 @followers.move if diagonal_passable?(@x, @y, horz, vert) super end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :diagonal_dont_start # 斜め向きでのイベント起動不可 #-------------------------------------------------------------------------- # ● 公開メンバ変数の初期化 [追加] #-------------------------------------------------------------------------- alias init_public_members_MoveSystems2 init_public_members def init_public_members init_public_members_MoveSystems2 @diagonal_dont_start = false end #-------------------------------------------------------------------------- # ● 斜め向きでのイベント起動不可か判定 [新規] #-------------------------------------------------------------------------- def diagonal_dont_start? event_result = event_note_include?(Calt::DiagonalNotStartNote) whole_result = whole_note_include?(Calt::DiagonalNotStartAllNote) return event_result ^ whole_result ^ Calt::DiagonalNotStartReverse end #-------------------------------------------------------------------------- # ● 注釈から設定を取得する処理 [追加] #-------------------------------------------------------------------------- alias setup_page_settings_MoveSystems setup_page_settings def setup_page_settings setup_page_settings_MoveSystems @diagonal_dont_start = diagonal_dont_start? end unless $imported[:CanariAlternate_EventEveryone] #-------------------------------------------------------------------------- # ● イベント起動 [追加] #-------------------------------------------------------------------------- alias start_MoveSystems start def start return if $game_player.direction_diagonal? && @diagonal_dont_start start_MoveSystems end else #-------------------------------------------------------------------------- # ● イベント起動(イベント起動判定拡張との競合回避バージョン) [追加] #-------------------------------------------------------------------------- alias start_MoveSystems start def start @invoker_event ||= $game_player # 明示されてない場合はプレイヤーが実行者 if @invoker_event.direction_diagonal? && @diagonal_dont_start @invoker_event = nil if @invoker_event # 処理終了時に初期化 return end start_MoveSystems end end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを # 監視し、スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ● 転送元ビットマップの更新 [◆再定義] #-------------------------------------------------------------------------- def update_bitmap if graphic_changed? @tile_id = @character.tile_id @character_name = @character.character_name @character_index = @character.character_index if @tile_id > 0 set_tile_bitmap @cross_character_name = nil # 初期化 @character.set_character_diagonal(false) # 斜め画像無しを設定 else set_character_bitmap @cross_character_name = get_cross_character_name # 斜め向き画像名の取得 end @cross_bitmap = false # 初期化 end end #-------------------------------------------------------------------------- # ● 斜め向き画像名の取得 [新規] #-------------------------------------------------------------------------- def get_cross_character_name if @character_name =~ /^\!?\$./ setting = Calt::DiagonalCharacterName cross_name = sprintf(setting, @character_name) else setting = Calt::DiagonalCharacterIndexName index = @character.character_index cross_name = sprintf(setting, @character_name, index + 1) end begin Cache.character(cross_name) # 取得を試みて失敗なら斜め画像は存在しない rescue @character.set_character_diagonal(false) # 斜め画像無しを設定 return nil end @character.set_character_diagonal(true) # 斜め画像有りを設定 return cross_name end #-------------------------------------------------------------------------- # ● 斜め向きキャラクターのビットマップを設定 [新規] #-------------------------------------------------------------------------- def set_cross_character_bitmap unless @cross_character_name p "エラー:斜め向き画像が存在しないキャラが斜め向きになっています!!" return end self.bitmap = Cache.character(@cross_character_name) @cw = bitmap.width / 3 @ch = bitmap.height / 4 self.ox = @cw / 2 self.oy = @ch end #-------------------------------------------------------------------------- # ● 転送元矩形の更新 [◆再定義] #-------------------------------------------------------------------------- def update_src_rect if @tile_id == 0 d = @character.direction if @character.direction_diagonal? index = 0 unless @cross_bitmap set_cross_character_bitmap # 斜め向き画像をセット @cross_bitmap = true end d = case d when 1; 2 # 左斜め下(1行目) when 7; 4 # 左斜め上(2行目) when 3; 6 # 右斜め下(3行目) when 9; 8 # 右斜め上(4行目) end else index = @character.character_index if @cross_bitmap set_character_bitmap # 通常の画像をセット @cross_bitmap = false end end pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (d - 2) / 2) * @ch self.src_rect.set(sx, sy, @cw, @ch) end end end end ############################################################################### # ■ 走行状態をダッシュのデフォルトにするに関する変更 ############################################################################### if Calt::DashDefaultDash #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● ダッシュ状態判定 [◆再定義] #-------------------------------------------------------------------------- def dash? return false if @move_route_forcing || $game_map.disable_dash? || vehicle return Input.press?(:A) ^ !$game_switches[Calt::DashDefaultWalk] end end end ############################################################################### # ■ プレイヤーの移動操作禁止に関する変更 ############################################################################### if Calt::PlayerImpossibleOperation #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● ダッシュ状態判定 [追加] #-------------------------------------------------------------------------- alias dash_MoveSystems? dash? def dash? return false if $game_switches[Calt::MoveByInputProhibition] return dash_MoveSystems? end #-------------------------------------------------------------------------- # ● 方向ボタン入力による移動処理 [追加] #-------------------------------------------------------------------------- alias move_by_input_MoveSystems move_by_input def move_by_input return if $game_switches[Calt::MoveByInputProhibition] move_by_input_MoveSystems end end end ############################################################################### # ■ 斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更に関する変更 ############################################################################### if Calt::DiagonalMoveNatural #============================================================================== # ■ Game_CharacterBase #------------------------------------------------------------------------------ #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ # ラフィックなどの基本的な情報を保持します。 #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- AutoTile_UpLeft = {34=>:T, 35=>:T, 42=>:T, 43=>:T, 46=>:T} # 左上が通行可のパターン AutoTile_UpRight = {36=>:T, 37=>:T, 42=>:T, 45=>:T, 46=>:T} # 右上が通行可のパターン AutoTile_DownLeft = {40=>:T, 41=>:T, 43=>:T, 44=>:T, 46=>:T} # 左下が通行可のパターン AutoTile_DownRight = {38=>:T, 39=>:T, 44=>:T, 45=>:T, 46=>:T} # 右下が通行可のパターン #-------------------------------------------------------------------------- # ● 斜めの通行可能判定 [◆再定義] #-------------------------------------------------------------------------- def diagonal_passable?(x, y, horz, vert) x2 = $game_map.round_x_with_direction(x, horz) y2 = $game_map.round_y_with_direction(y, vert) route_vert = passable?(x, y, vert) && passable?(x, y2, horz) # 縦横ルート route_horz = passable?(x, y, horz) && passable?(x2, y, vert) # 横縦ルート return true if route_vert && route_horz # 全ルート通行可能 if map_passable?(x, y, horz) && map_passable?(x, y, vert) && map_passable?(x2, y2, reverse_dir(horz)) && map_passable?(x2, y2, reverse_dir(vert)) && !collide_with_characters?(x2, y2) # 現在地と移動先は斜めに通行可 if route_vert || passable_tile?(x, y2, horz, vert, false) if route_horz || passable_tile?(x2, y, horz, vert, true) return true end end end return false # 通行不可 end #-------------------------------------------------------------------------- # ● 斜めの通行可能判定(タイル判定) [新規] #-------------------------------------------------------------------------- def passable_tile?(x, y, horz, vert, route_horz=false) $game_map.all_tiles(x, y).each do |tile_id| flag = $game_map.tileset.flags[tile_id] next if flag & 0x10 != 0 # [☆] : 通行に影響しない if tile_id.between?(2048, 2815) # A1タイル(海・水辺など) return false if Calt::DiagonalMoveNaturalTag.include?(flag >> 12) # 通行不可 auto_id = (tile_id - 2048) % 48 # オートタイルのパターンを取得 auto_id_list = auto_id_list_A1_tile(horz, vert, route_horz) return false unless auto_id_list[auto_id] # 通行不可 else unless diagonal_passable_tile?(flag, horz, vert, route_horz) return false unless Calt::DiagonalMoveNaturalTag.include?(flag >> 12) # 通行不可 end end return false if collide_with_characters?(x, y) # イベントとの衝突判定 return true # 通行可 end return false # 通行不可 end #-------------------------------------------------------------------------- # ● 通行可能なA1タイルの配列を取得 [新規] #-------------------------------------------------------------------------- def auto_id_list_A1_tile(horz, vert, route_horz) if horz == 4 # 方向とルートに対応する通行可のパターンを取得 if vert == 2 return route_horz ? AutoTile_DownRight : AutoTile_UpLeft else return route_horz ? AutoTile_UpRight : AutoTile_DownLeft end else if vert == 2 return route_horz ? AutoTile_DownLeft : AutoTile_UpRight else return route_horz ? AutoTile_UpLeft : AutoTile_DownRight end end end #-------------------------------------------------------------------------- # ● 斜め通行可能なタイルか判定 [新規] #-------------------------------------------------------------------------- def diagonal_passable_tile?(flag, horz, vert, route_horz) corner_flag = if horz == 4 vert == 2 ? (route_horz ? 0x05 : 0x0a) : (route_horz ? 0x0c : 0x03) else vert == 2 ? (route_horz ? 0x03 : 0x0c) : (route_horz ? 0x0a : 0x05) end return flag & corner_flag == 0x00 ? true : false end end end