1123 lines
No EOL
53 KiB
Ruby
1123 lines
No EOL
53 KiB
Ruby
=begin
|
||
私のサイトにて配布している下記の4つのスクリプトをまとめたスクリプトです。
|
||
『プレイヤー操作拡張』
|
||
『斜め向き画像の実装』
|
||
『ダッシュ入力を反転』
|
||
『斜めの通行可能判定』
|
||
ただし、まとめる際に修正と変更を加えてます。それと新機能を1つ追加しました。
|
||
|
||
◆このスクリプトのVer1.00からアップデートする場合
|
||
スクリプトの設定をコピー&ペーストで上書きして下さい。
|
||
※設定を変更していない場合はスクリプトを新しいものに入れ替えるだけでokです。
|
||
#==============================================================================
|
||
# ■ Calt
|
||
#------------------------------------------------------------------------------
|
||
# CanariAlternateが製作したスクリプト用のモジュールです。
|
||
#==============================================================================
|
||
module Calt
|
||
#----------------------------------------------------------------------------
|
||
<中略>
|
||
#----------------------------------------------------------------------------
|
||
end
|
||
|
||
=end
|
||
|
||
#==============================================================================
|
||
# ■ プレイヤーの8方向移動+斜め歩行グラに対応+その他 (VX Ace用)
|
||
#------------------------------------------------------------------------------
|
||
# 製作者 : CanariAlternate
|
||
# サイト名 : カルトの鳥篭
|
||
# サイトURL : http://canarialt.blog.fc2.com
|
||
#------------------------------------------------------------------------------
|
||
# ■ 概要 : 移動関連の機能を詰め込んだスクリプトです。
|
||
# 必要な機能だけ追加するように設定することも出来ます。
|
||
#
|
||
# ■ 必須 : なし
|
||
#
|
||
# ■ 位置 : 「イベント起動判定拡張」より下 ※私のサイトにて配布しているそれを導入している場合のみ
|
||
# 「注釈取得スクリプト」より下 ※私のサイトにて配布しているそれを導入している場合のみ
|
||
#------------------------------------------------------------------------------
|
||
# ■ 機能 : 1. プレイヤーの8方向移動&斜め移動でスムーズに移動など
|
||
# 2. 臼井の会様にて配布されている斜め歩行グラフィックに対応
|
||
# 3. 走行状態をダッシュのデフォルトにする。
|
||
# 4. プレイヤーの移動操作禁止と許可をスイッチで切り替える。
|
||
# 5. 斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更
|
||
#------------------------------------------------------------------------------
|
||
# 更新履歴 : 2013/07/08 Ver1.00 複数のスクリプトを再設計し、これにまとめた。
|
||
# 2013/07/10 Ver1.01 斜め向きでの起動不可が機能していないバグを修正した。
|
||
#==============================================================================
|
||
|
||
$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 = 1000 # スイッチ番号
|
||
#----------------------------------------------------------------------------
|
||
# ◆プレイヤーの移動操作禁止を使用するか
|
||
PlayerImpossibleOperation = true # true / false
|
||
#
|
||
# 設定した番号のスイッチがONの時はプレイヤーの移動操作を禁止(0の場合は常にOFF)
|
||
MoveByInputProhibition = 0 # スイッチ番号
|
||
#----------------------------------------------------------------------------
|
||
# ◆斜めの通行可能判定をオートタイル(A1タイル)を考慮したものに変更を使用するか
|
||
DiagonalMoveNatural = true # true / false
|
||
#
|
||
# 斜め通過を許可する地形タグ(A1タイルに設定した場合は元々が許可なので禁止に)
|
||
DiagonalMoveNaturalTag = [] # 例 [1, 2, 43, 5]
|
||
#----------------------------------------------------------------------------
|
||
end
|
||
|
||
#==============================================================================
|
||
# ■ 注釈取得スクリプト (VX Ace用)
|
||
#------------------------------------------------------------------------------
|
||
# 製作者 : CanariAlternate
|
||
# サイト名 : カルトの鳥篭
|
||
# サイトURL : http://canarialt.blog.fc2.com
|
||
#------------------------------------------------------------------------------
|
||
# ■ 概要 : 注釈を取得する処理を定義する。
|
||
#
|
||
# ■ 必須 : なし
|
||
#
|
||
# ■ 位置 : 「Game_Event」より下
|
||
#------------------------------------------------------------------------------
|
||
# ■ 注釈での設定方法
|
||
# 以下の例のように実行内容の1行目から注釈以外のコマンドまでの注釈のどこかに
|
||
# キーワードを記述すると有効(結果を反転してる場合には無効)になります。
|
||
#
|
||
# 例 : 実行内容
|
||
# ◆注釈:キーワードA キーワードC
|
||
# : :キーワードG キーワードF
|
||
# : :キーワードE
|
||
# ◆注釈:キーワードD
|
||
# : :キーワードH キーワードB
|
||
# ◆変数の操作などの注釈以外のイベントコマンド
|
||
# ◆注釈:ここ以下に書いても無視される。
|
||
# ◆
|
||
#
|
||
# ※キーワードとなる文字列の設定は正規表現です。詳しいことはヘルプを「正規表現」で検索すると出てきます。
|
||
# 簡単に言うと / で囲まれた文字列があるかないかで判定します。
|
||
# \ とか ! みたいな記号を使いたい時はヘルプを参照して下さい。
|
||
# 設定例、/\[キーワード\]/ #=> [キーワード]
|
||
#
|
||
# ※キーワードを記述すると有効と無効が切り替わります。初期状態は無効です。
|
||
# 例 : 初期状態を反転, 記述したイベントの全ての頁を反転, 記述した頁のみを反転
|
||
# まず 「初期状態を反転」 で有効に
|
||
# 次に 「記述したイベントの全ての頁を反転」で無効に
|
||
# 最後に「記述した頁のみを反転」 で有効に
|
||
#------------------------------------------------------------------------------
|
||
# 更新履歴 : 2012/10/05 Ver1.00 コードを共通処理スクリプトに統一
|
||
# 2012/10/06 Ver1.01 コードを共通処理スクリプトから分離
|
||
# 2012/10/08 Ver1.02 コードの整理
|
||
# 2013/02/19 Ver1.03 共通処理スクリプトの廃止による変更を施した。
|
||
#==============================================================================
|
||
|
||
$imported ||= {}
|
||
unless $imported[:CanariAlternate_EventNote]
|
||
$imported[:CanariAlternate_EventNote] = true
|
||
|
||
#==============================================================================
|
||
# ■ Calt
|
||
#------------------------------------------------------------------------------
|
||
# CanariAlternateが製作したスクリプトの管理用モジュール
|
||
#==============================================================================
|
||
module Calt
|
||
#--------------------------------------------------------------------------
|
||
# ● イベントコマンドから注釈を取得 [新規]
|
||
#--------------------------------------------------------------------------
|
||
def self.Read_EventNote(list)
|
||
return String.new unless list && list[i = 0].code == 108
|
||
note = list[i].parameters[0]
|
||
note += "\n#{list[i].parameters[0]}" while [108, 408].include?(list[i += 1].code)
|
||
return note
|
||
end
|
||
end
|
||
|
||
#==============================================================================
|
||
# ■ Game_Event
|
||
#------------------------------------------------------------------------------
|
||
# イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
|
||
# イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
|
||
#==============================================================================
|
||
class Game_Event < Game_Character
|
||
#--------------------------------------------------------------------------
|
||
# ● イベントページの設定をセットアップ [追加]
|
||
#--------------------------------------------------------------------------
|
||
alias setup_page_settings_EventNote setup_page_settings
|
||
def setup_page_settings
|
||
setup_page_settings_EventNote
|
||
setup_note_settings
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● イベントページ更新時に注釈から設定を取得 [新規]
|
||
#--------------------------------------------------------------------------
|
||
def setup_note_settings
|
||
# 注釈の取得処理はここに追加
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 1頁目の注釈にキーワードが含まれているか判定 [新規]
|
||
#--------------------------------------------------------------------------
|
||
def whole_note_include?(keyword)
|
||
return @event.pages[0].event_note =~ keyword ? true : false
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● この頁の注釈にキーワードが含まれているか判定 [新規]
|
||
#--------------------------------------------------------------------------
|
||
def event_note_include?(keyword)
|
||
return @page.event_note =~ keyword ? true : false
|
||
end
|
||
end
|
||
|
||
#==============================================================================
|
||
# ■ RPG::Event::Page
|
||
#------------------------------------------------------------------------------
|
||
# イベントページのデータクラス。
|
||
#==============================================================================
|
||
class RPG::Event::Page
|
||
#--------------------------------------------------------------------------
|
||
# ● 取得する注釈内容を変更 [新規]
|
||
#--------------------------------------------------------------------------
|
||
attr_writer :event_note
|
||
#--------------------------------------------------------------------------
|
||
# ● この頁の注釈を取得 [新規]
|
||
#--------------------------------------------------------------------------
|
||
def event_note
|
||
return @event_note ||= Calt::Read_EventNote(@list)
|
||
end
|
||
end
|
||
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 |