Project1

标题: HN_Light烛光脚本和layer脚本相冲突 [打印本页]

作者: qknight    时间: 2014-10-31 07:38
标题: HN_Light烛光脚本和layer脚本相冲突
本帖最后由 qknight 于 2014-11-1 15:25 编辑

在下想用layer这个地图叠加脚本很久了,奈何它总是和其他关键脚本相冲突。之前就因为和本站的一个叠加行走图的脚本相冲突被删掉了,后来在下换了个国外的更换行走图的脚本,似乎两者之间不冲突了,结果发现它又与烛光脚本相冲突,如果layer脚本在烛光脚本下面,烛光脚本就被屏蔽掉,反之layer脚本就会报错,求懂脚本的大神看看,要怎么改,能让这两个脚本兼容。

问题已解决,新的layer脚本与其他脚本并不冲突
作者: tseyik    时间: 2014-10-31 17:44
本帖最后由 tseyik 于 2014-10-31 18:01 编辑

http://canarialt.blog.fc2.com/blog-entry-57.html
你試試這個改良版的layer脚本
画面座標を整数値に補正
RUBY 代码复制
  1. #==============================================================================
  2. # ■ 画面座標を整数値に補正 (VX Ace用)
  3. #------------------------------------------------------------------------------
  4. # 製作者     : CanariAlternate
  5. # サイト名   : カルトの鳥篭
  6. # サイトURL  : [url]http://canarialt.blog.fc2.com[/url]
  7. #------------------------------------------------------------------------------
  8. # ■ 概要 : 画面をスクロールした時にイベントの表示が1ドットぶれるのを防止する。
  9. #
  10. # ■ 必須 : なし
  11. #
  12. # ■ 位置 : 「Game_Map」より下
  13. #------------------------------------------------------------------------------
  14. # 更新履歴 : 2012/10/20 Ver1.00 スクリプトを作成した。
  15. #            2013/02/19 Ver1.01 共通処理スクリプトの廃止による変更を施した。
  16. #==============================================================================
  17.  
  18. $imported ||= {}
  19. $imported[:CanariAlternate_CorrectionDisplay] = true
  20.  
  21. #==============================================================================
  22. # ■ Game_Map
  23. #------------------------------------------------------------------------------
  24. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  25. # このクラスのインスタンスは $game_map で参照されます。
  26. #==============================================================================
  27. class Game_Map
  28.   #--------------------------------------------------------------------------
  29.   # ● 表示座標を補正 [新規]
  30.   #--------------------------------------------------------------------------
  31.   def correction_display(coordinate)
  32.     return (coordinate * 32).round / 32.0
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 表示座標を差し引いた X 座標の計算 [追加]
  36.   #--------------------------------------------------------------------------
  37.   alias adjust_x_CorrectionDisplay adjust_x
  38.   def adjust_x(x)
  39.     adjust_x_CorrectionDisplay(correction_display(x))
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 表示座標を差し引いた Y 座標の計算 [追加]
  43.   #--------------------------------------------------------------------------
  44.   alias adjust_y_CorrectionDisplay adjust_y
  45.   def adjust_y(y)
  46.     adjust_y_CorrectionDisplay(correction_display(y))
  47.   end
  48.   #--------------------------------------------------------------------------
  49.   # ● 表示位置の設定 [追加]
  50.   #--------------------------------------------------------------------------
  51.   alias set_display_pos_CorrectionDisplay set_display_pos
  52.   def set_display_pos(x, y)
  53.     set_display_pos_CorrectionDisplay(correction_display(x), correction_display(y)) # 表示座標を修正
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● スクロールの更新 [◆再定義]
  57.   #--------------------------------------------------------------------------
  58.   def update_scroll
  59.     return unless scrolling?
  60.     last_x = @display_x
  61.     last_y = @display_y
  62.     distance = [scroll_distance, @scroll_rest].min  # スクロール距離を補正
  63.     do_scroll(@scroll_direction, distance)
  64.     if @display_x == last_x && @display_y == last_y
  65.       @scroll_rest = 0
  66.     else
  67.       @scroll_rest -= distance
  68.     end
  69.   end
  70. end

マルチレイヤーシステム (VX Ace用)
  1. #==============================================================================
  2. # ■ マルチレイヤーシステム (VX Ace用)
  3. #------------------------------------------------------------------------------
  4. # 制作者     : CanariAlternate
  5. # サイト名   : カルトの鳥篭
  6. # サイトURL  : http://canarialt.blog.fc2.com
  7. #------------------------------------------------------------------------------
  8. # ■ 概要 : 多層のマップを表現可能にする。
  9. #
  10. # ■ 必須 : 「画面座標を整数値に補正」
  11. #
  12. # ■ 位置 : 「フィールド並行戦闘」より下
  13. #------------------------------------------------------------------------------
  14. # 更新履歴 : 2012/12/07 Ver1.00 スクリプトを作成した。
  15. #            2012/12/18 Ver1.01 ラスタスクロールするピクチャーの管理・生成の方法を変更した。
  16. #            2012/12/25 Ver1.02 ラスタスクロールするピクチャーのバグを修正した。
  17. #            2012/12/30 Ver1.03 戦闘テストでエラーになるバグを修正した。
  18. #            2013/01/06 Ver1.04 RGSSが停止するバグの原因と思われる部分を修正した。
  19. #            2013/01/08 Ver1.05 基準にするイベントを指定するイテレータの仕様を変更した。
  20. #            2013/01/09 Ver1.06 乗り物のいるマップ以外でエラーが発生するバグを修正した。
  21. #            2013/01/11 Ver1.07 前景スプライトを改良した。
  22. #            2013/02/19 Ver1.08 共通処理スクリプトの廃止による変更を施した。
  23. #            2013/03/28 Ver1.09 乗り物を配置していない状態で起動するとエラーになるバグを修正した。
  24. #            2013/04/08 Ver1.10 タイルセットの変更と指定位置の情報取得のバグを修正した。
  25. #            2013/05/19 Ver1.11 スプライトの分割に関するバグを修正した。
  26. #            2013/09/26 Ver1.12 temp_execute() メソッドに後処理の記述を追加した。
  27. #            2014/06/08 Ver1.13 場所移動後は最下層を基準にイベントを実行するように修正した。
  28. #==============================================================================

  29. =begin
  30.   ■□■参考にしたスクリプト■□■
  31.   開発初期における基礎的な仕様・機能の決定にLibのツクールページ様が制作したマップレイヤーシステムを参考にさせてもらいました。
  32.   Libのツクールページ http://cwoweb2.bai.ne.jp/lib_rpg_tkool/
  33.   
  34.   ■□■仕様・設定に関する内容の箇条書き□■□
  35.   レイヤー番号は整数で重複しなければ何番でも可。あえて飛び番にしておけば後でレイヤーを追加するのが楽かもしれない。
  36.   レイヤー番号の一番小さいマップが最下層になり、最下層のエンカウント、BGM、戦闘背景などの設定が適用される。
  37.   飛行船は搭乗すると一番上のレイヤーに移動し着陸する時は空属性を設定したタイル以外で最も上のレイヤーに着陸する。
  38.   ジャンプも飛行船の着陸と同様に空属性を設定したタイル以外で最も上のレイヤーに着地する。場合によっては不自然なので着地場所の階層を手動で設定するメソッドを一応は用意してある。
  39.   レイヤー番号がマイナスのレイヤーには飛行船は着陸できない。マイナスの番号のレイヤーしかないマップでは永遠に着陸できなくなるので注意。
  40.   レイヤー数の制限はなし。スペックの許すならば何層にでも出来る。ただし、マップ製作の労力も比例して増大する。
  41.   マップのサイズは合わせる必要がある。マップIDの取得は基本的には最下層のIDを取得する。
  42.   タイルセットの変更は実行したイベントのレイヤーを変更する。
  43.   タイルIDやイベントIDの取得は実行したイベントのレイヤーから取得する。
  44.   タイル「上」「下」はレイヤー移動に使用する。
  45.   ※「上」「下」のタイルの場所に並列・自動起動以外のイベントを置いても無駄なので注意。イベントはレイヤー移動先に配置する。
  46.   タイル「浅」「深」は浅瀬・海の役割をする。タイル「浅」「深」の移動設定は"[☆]通行に影響しない"を推奨する。
  47.   タイル「草」は通行4方向の設定用に16枚ある。水に浸かっている表現などに使用を想定している。
  48.   タイル「上」「下」「浅」「深」「草」はタイルイベントで配置しても上記の効果は無い。
  49.   タイル「橋」「低」「高」「壁」は特に意味の無いタイルである。サンプルではマップ製作の視覚的な補助に使用した。
  50.   以上のタイル「上」「下」「浅」「深」「草」「橋」「低」「高」「壁」は画像を消去するタイルとして設定することを推奨する。
  51.   テストプレイ時のみマップが当スクリプトの規格に適合してるか簡単なチェックを行い問題を確認すれば表示する。
  52.   
  53.   ■□■スクリプトを操作する為のメソッドの目次&簡単な説明■□■
  54.   manual_jump(引数)       # 移動ルートの設定でジャンプ先の階層を手動で設定してジャンプを実行するメソッドです。
  55.   animation_current_floor_ON  # アニメーションを再生するレイヤーは対象のいるレイヤーにする。
  56.   animation_current_floor_OFF # アニメーションを再生するレイヤーは最上層のレイヤーにする(初期状態)。
  57.   get_foreground_sprite(引数) # レイヤーに表示するスプライトの設定クラスを取得する。
  58.   change_layer(引数)          # イベントIDで指定したイベントのレイヤーを変更する。
  59.   current_layer(引数)         # イベントIDで指定したイベントのレイヤー番号を取得する。
  60.   absolute_event_id(引数)     # 他のレイヤーのイベントを操作する為に必要な絶対イベントIDを取得する。
  61. =end

  62. $imported ||= {}
  63. $imported[:CanariAlternate_Multilayer] = true

  64. #==============================================================================
  65. # ■ Calt
  66. #------------------------------------------------------------------------------
  67. #  CanariAlternateが制作したスクリプト用のモジュールです。
  68. #==============================================================================
  69. module Calt
  70.   #----------------------------------------------------------------------------
  71.   # 1. マップ名の認識方法(仕様メモ:$1 == マップ名, $2 == レイヤー識別番号, $4 == ピクチャー名)
  72.   MULTILAYER_MAP_NAME = /(.+)\<LAY(\-?\d+)\>(\[(.+)\])?$/i
  73.   #
  74.   # 2. 上昇用のタイルのID(0 ~ 1023)
  75.   LAYER_UP_TILE   = 1022
  76.   #
  77.   # 2. 下降用のタイルのID(0 ~ 1023)
  78.   LAYER_DOWN_TILE = 1023
  79.   #
  80.   # 3. 小型船通行可にするタイルID
  81.   BOAT_PASSABLE_TILE_ID = [1020]
  82.   #
  83.   # 3. 大型船通行可にするタイルID
  84.   SHIP_PASSABLE_TILE_ID = [1020, 1021]
  85.   #
  86.   # 4. 空の扱いにするタイルID
  87.   #    飛行船は離陸すると最上層のレイヤーに移動する。着陸するときは空以外のタイルで最も階層の高いレイヤーに着陸する。
  88.   #    ジャンプの階層移動にも使用する。飛行船同様に空以外のタイルで最も階層の高いレイヤーに着地する。
  89.   AIR_TILE_ID = [1544]
  90.   #
  91.   # 5. 水没を表現するタイルID
  92.   SUBMERGENCE_TILE_ID = [
  93.     1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
  94.     1008, 1009, 1010, 1011,
  95.     1016, 1017, 1018, 1019, 1020, 1021            ]
  96.   #
  97.   # 6. 画像を消去する上層タイルのID(1024以上のIDは無視)
  98.   BITMAP_CLEAR_TILE = [
  99.     1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
  100.     1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,
  101.     1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023]
  102.   #
  103.   # 7. タイルIDを取得する際に 0 に変換(通常キャラより下に表示する通行に影響しないタイル用)
  104.   NOT_EXIST_TILE_ID = [
  105.      976,  977,  978,  979,  980,  981,  982,  983,
  106.      984,  985,  986,  987,        989,  990,  991,
  107.      992,  993,  994,  995,        997,  998,  999,

  108.                             1012, 1013, 1014, 1015
  109.                                                   ]
  110.   #----------------------------------------------------------------------------
  111.   BOAT_PASSABLE_TILE_ID_HASH = Hash.new
  112.   BOAT_PASSABLE_TILE_ID.each { |tile_id| BOAT_PASSABLE_TILE_ID_HASH[tile_id] = true }
  113.   SHIP_PASSABLE_TILE_ID_HASH = Hash.new
  114.   SHIP_PASSABLE_TILE_ID.each { |tile_id| SHIP_PASSABLE_TILE_ID_HASH[tile_id] = true }
  115.   AIR_TILE_ID_HASH = Hash.new
  116.   AIR_TILE_ID.each { |tile_id| AIR_TILE_ID_HASH[tile_id] = true }
  117.   SUBMERGENCE_TILE_ID_HASH = Hash.new
  118.   SUBMERGENCE_TILE_ID.each { |tile_id| SUBMERGENCE_TILE_ID_HASH[tile_id] = true }
  119.   NOT_EXIST_TILE_TABLE = Table.new(8192)  # 特定のタイルIDを 0 に変換するテーブルの生成
  120.   NOT_EXIST_TILE_TABLE.xsize.times { |id| NOT_EXIST_TILE_TABLE[id] = id }
  121.   NOT_EXIST_TILE_ID.each { |id| NOT_EXIST_TILE_TABLE[id] = 0 }
  122.   #----------------------------------------------------------------------------
  123. end

  124. #==============================================================================
  125. # ■ Sprite_Manager
  126. #------------------------------------------------------------------------------
  127. #  スプライトの設定値を記憶する為のクラスです。
  128. #==============================================================================
  129. class Sprite_Manager
  130.   #--------------------------------------------------------------------------
  131.   # ● 公開インスタンス変数
  132.   #--------------------------------------------------------------------------
  133.   attr_accessor :bitmap_name                    # 表示するピクチャー名(String)
  134.   attr_accessor :visible                        # スプライトの可視状態
  135.   attr_accessor :x                              # スプライトの X 座標
  136.   attr_accessor :y                              # スプライトの Y 座標
  137.   attr_accessor :z                              # スプライトの Z 座標
  138.   attr_accessor :ox                             # スプライトの転送元原点の X 座標
  139.   attr_accessor :oy                             # スプライトの転送元原点の Y 座標
  140.   attr_accessor :zoom_x                         # スプライトの X 方向拡大率
  141.   attr_accessor :zoom_y                         # スプライトの Y 方向拡大率
  142.   attr_accessor :angle                          # スプライトの回転角度
  143.   attr_accessor :wave_amp                       # 波形描画のための振幅
  144.   attr_accessor :wave_length                    # 波形描画のための周期
  145.   attr_accessor :wave_speed                     # 波形描画のための速度
  146.   attr_accessor :wave_phase                     # 波形描画のための位相
  147.   attr_accessor :mirror                         # スプライトの左右反転フラグ
  148.   attr_accessor :bush_depth                     # スプライトの茂みの深さ
  149.   attr_accessor :bush_opacity                   # スプライトの茂みの不透明度
  150.   attr_accessor :opacity                        # スプライトの不透明度
  151.   attr_accessor :blend_type                     # スプライトの合成方法
  152.   attr_accessor :color                          # スプライトにブレンドする色
  153.   attr_accessor :tone                           # スプライトの色調
  154.   #--------------------------------------------------------------------------
  155.   # ● オブジェクト初期化
  156.   #--------------------------------------------------------------------------
  157.   def initialize(bitmap_name)
  158.     @last_bitmap = nil                          # 最後に更新した時のピクチャー名
  159.     @bitmap_name = bitmap_name
  160.     # 以下の初期値は規定の範囲内で自由に変更可
  161.     @visible      = true
  162.     @x            = -10
  163.     @y            = 0
  164.     @z            = 500
  165.     @ox           = 0
  166.     @oy           = 0
  167.     @zoom_x       = 1.0
  168.     @zoom_y       = 1.0
  169.     [url=home.php?mod=space&uid=124954]@Angle[/url]        = 0
  170.     @wave_amp     = 3
  171.     @wave_length  = 10
  172.     @wave_speed   = 45
  173.     @wave_phase   = 0
  174.     [url=home.php?mod=space&uid=111303]@mirror[/url]       = false
  175.     @bush_depth   = 0
  176.     @bush_opacity = 128
  177.     @opacity      = 160
  178.     @blend_type   = 0
  179.     [url=home.php?mod=space&uid=10453]@color[/url]        = Color.new(0, 0, 0, 0)
  180.     @tone         = Tone.new(0, 0, 0, 0)
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● スプライトを生成するか判定
  184.   #--------------------------------------------------------------------------
  185.   def create_sprite?
  186.     return !@last_bitmap && @bitmap_name
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● スプライトを解放するか判定
  190.   #--------------------------------------------------------------------------
  191.   def dispose_sprite?
  192.     return @last_bitmap && !@bitmap_name
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● ビットマップを変更するか判定
  196.   #--------------------------------------------------------------------------
  197.   def bitmap_change?
  198.     return @last_bitmap != @bitmap_name && @bitmap_name
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● スプライトを更新するか判定
  202.   #--------------------------------------------------------------------------
  203.   def update_sprite?
  204.     return @bitmap_name
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ● スプライトの更新
  208.   #--------------------------------------------------------------------------
  209.   def update(sprite)
  210.     @last_bitmap = @bitmap_name
  211.     return unless update_sprite?
  212.     sprite.visible = @visible
  213.     sprite.x = @x
  214.     sprite.y = @y
  215.     sprite.z = @z
  216.     sprite.ox = @ox
  217.     sprite.oy = @oy
  218.     sprite.zoom_x = @zoom_x
  219.     sprite.zoom_y = @zoom_y
  220.     sprite.angle = @angle
  221.     sprite.wave_amp    = @wave_amp
  222.     sprite.wave_length = @wave_length
  223.     sprite.wave_speed  = @wave_speed
  224.     sprite.wave_phase  = @wave_phase
  225.     sprite.mirror = @mirror
  226.     sprite.bush_depth   = @bush_depth
  227.     sprite.bush_opacity = @bush_opacity
  228.     sprite.opacity = @opacity
  229.     sprite.blend_type = @blend_type
  230.     sprite.color = @color
  231.     sprite.tone = @tone
  232.     sprite.update
  233.     @wave_phase = sprite.wave_phase
  234.   end
  235. end

  236. #==============================================================================
  237. # ■ Game_Temp
  238. #------------------------------------------------------------------------------
  239. #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン
  240. # スタンスは $game_temp で参照されます。
  241. #==============================================================================
  242. class Game_Temp
  243.   #--------------------------------------------------------------------------
  244.   # ● 公開インスタンス変数
  245.   #--------------------------------------------------------------------------
  246.   attr_reader   :map_group_list                 # マップの所属するグループのIDのハッシュ
  247.   attr_reader   :map_index_list                 # グループに所属するマップのレイヤー番号をインデックスに変換するハッシュのハッシュ
  248.   attr_reader   :map_layer_list                 # グループに所属するマップのIDの配列(階層順)のハッシュ
  249.   attr_reader   :map_foreground                 # マップの前景スプライトのピクチャー名のハッシュ
  250.   attr_accessor :multi_viewport_accessor        # 各ビューポートへの参照
  251.   #--------------------------------------------------------------------------
  252.   # ● オブジェクト初期化 [追加]
  253.   #--------------------------------------------------------------------------
  254.   alias initialize_Multilayer initialize
  255.   def initialize
  256.     initialize_Multilayer
  257.     create_map_group_list
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● マップのグループを生成 [新規]
  261.   #--------------------------------------------------------------------------
  262.   def create_map_group_list
  263.     $data_mapinfos = load_data("Data/MapInfos.rvdata2") if $BTEST # 戦闘テストの場合
  264.    
  265.     @map_group_list = Hash.new  # map_id    => group_id
  266.     @layer_numbers  = Hash.new  # map_id    => layer_number
  267.     @map_foreground = Hash.new  # map_id    => foreground_sprite_picture_name
  268.     @map_layer_list = Hash.new  # group_id  => group_list
  269.     @map_index_list = Hash.new  # group_id  => links_list
  270.     @map_names_list = Hash.new  # code_name => group_id

  271.     # 集団リストを生成
  272.     $data_mapinfos.each do |map_id, map_info|
  273.       map_name = map_info.name
  274.       if map_name =~ Calt::MULTILAYER_MAP_NAME
  275.         code_name = $1
  276.         if group_id = @map_names_list[code_name]
  277.           @map_group_list[map_id] = group_id
  278.         else
  279.           @map_names_list[code_name] = @map_group_list[map_id] = @map_group_list.size
  280.         end
  281.       else
  282.         @map_group_list[map_id] = @map_group_list.size
  283.       end
  284.       @layer_numbers[map_id]  = $2.to_i
  285.       @map_foreground[map_id] = $4
  286.     end

  287.     # 階層リストを生成
  288.     @map_group_list.each do |map_id, group_id|
  289.       if layer_list = @map_layer_list[group_id]
  290.         layer_list.push map_id
  291.       else
  292.         @map_layer_list[group_id] = [map_id]
  293.       end
  294.     end
  295.     @map_layer_list.each_value do |layer_list|
  296.       layer_list.sort! {|a, b| @layer_numbers[a] <=> @layer_numbers[b] }
  297.     end

  298.     # 変換リストを生成
  299.     @map_layer_list.each do |group_id, layer_list|
  300.       links_list = Hash.new
  301.       layer_list.each_index do |index|
  302.         map_id = layer_list[index]
  303.         layer_number = @layer_numbers[map_id]
  304.         links_list[layer_number] = index
  305.       end
  306.       @map_index_list[group_id] = links_list
  307.     end
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # ● 階層を取得 [新規]
  311.   #--------------------------------------------------------------------------
  312.   def map_id_to_z(map_id)
  313.     return 0 if map_id == 0 # 存在しないマップIDの場合
  314.     group_id = @map_group_list[map_id]
  315.     layer_list = @map_layer_list[group_id]
  316.     return layer_list.index(map_id)
  317.   end
  318.   #--------------------------------------------------------------------------
  319.   # ● 最下層のマップIDを取得 [新規]
  320.   #--------------------------------------------------------------------------
  321.   def map_id_to_base_map_id(map_id)
  322.     return 0 if map_id == 0 # 存在しないマップIDの場合
  323.     group_id = @map_group_list[map_id]
  324.     return @map_layer_list[group_id][0]
  325.   end
  326. end

  327. #==============================================================================
  328. # ■ Game_Map
  329. #------------------------------------------------------------------------------
  330. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  331. # このクラスのインスタンスは $game_map で参照されます。
  332. #==============================================================================
  333. class Game_Map
  334.   #--------------------------------------------------------------------------
  335.   # ● 公開インスタンス変数
  336.   #--------------------------------------------------------------------------
  337.   attr_reader   :layer_index                # レイヤー番号をindexに変換するハッシュ
  338.   attr_reader   :event_id_transformation    # イベントIDの変換に使用する配列
  339.   attr_reader   :map_group_id               # マップのグループのID
  340.   attr_reader   :multi_map_data             # マルチレイヤーのマップデータの配列
  341.   attr_reader   :multi_tileset              # マルチレイヤーのタイルセットの配列
  342.   attr_reader   :foreground_sprites         # 前景ピクチャーの配列
  343.   attr_accessor :animation_current_floor    # アニメーションをキャラクターの現在地のレイヤーで再生
  344.   #--------------------------------------------------------------------------
  345.   # ● オブジェクト初期化 [追加]
  346.   #--------------------------------------------------------------------------
  347.   alias initialize_Multilayer initialize
  348.   def initialize
  349.     initialize_Multilayer
  350.     @map_group_id = -1  # マップの識別に使用する番号
  351.     @animation_current_floor = false
  352.   end
  353.   #--------------------------------------------------------------------------
  354.   # ● 基準にするイベントを指定してブロックを実行 [新規]
  355.   #--------------------------------------------------------------------------
  356.   def temp_execute(event)
  357.     temp = @updating_event
  358.     @updating_event = event
  359.     begin
  360.       result = yield  # ブロックを実行
  361.     ensure
  362.       @updating_event = temp  # 後処理を忘れずに
  363.     end
  364.     return result
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 更新しているイベントの記憶をリセット [新規]
  368.   #--------------------------------------------------------------------------
  369.   def reset_updating_event
  370.     @updating_event = $game_player
  371.   end
  372.   #--------------------------------------------------------------------------
  373.   # ● 省略された場合の階層を取得 [新規]
  374.   #--------------------------------------------------------------------------
  375.   def floor_omit
  376.     @updating_event ||= reset_updating_event
  377.     return @updating_event.current_floor
  378.   end
  379.   #--------------------------------------------------------------------------
  380.   # ● イベントの更新 [◆再定義]
  381.   #--------------------------------------------------------------------------
  382.   def update_events
  383.     @events.each_value do |event|
  384.       @updating_event = event # 更新するイベントを記憶
  385.       event.update
  386.     end
  387.     reset_updating_event
  388.     @common_events.each {|event| event.update }
  389.   end
  390.   #--------------------------------------------------------------------------
  391.   # ● 乗り物の更新 [◆再定義]
  392.   #--------------------------------------------------------------------------
  393.   def update_vehicles
  394.     @vehicles.each do |vehicle|
  395.       @updating_event = vehicle # 更新するイベントを記憶
  396.       vehicle.update
  397.     end
  398.     reset_updating_event
  399.   end
  400.   #--------------------------------------------------------------------------
  401.   # ● レイヤー数の取得 [新規]
  402.   #--------------------------------------------------------------------------
  403.   def layer_size
  404.     return @multi_map_data.size
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● マップデータのセット [新規]
  408.   #--------------------------------------------------------------------------
  409.   def create_multi_map_data(map_id)
  410.     @map_group_id   = $game_temp.map_group_list[map_id]
  411.     group_list      = $game_temp.map_layer_list[@map_group_id]
  412.     @map_id         = group_list[0]                             # 最下層を現在のマップIDにする
  413.     @layer_index    = $game_temp.map_index_list[@map_group_id]  # レイヤー番号⇒インデックスの変換を行うハッシュ
  414.     @multi_map_data = Array.new                                 # 複数のマップデータを格納する為の配列
  415.     group_list.each {|map_id| @multi_map_data.push load_data(sprintf("Data/Map%03d.rvdata2", map_id)) }
  416.   end
  417.   #--------------------------------------------------------------------------
  418.   # ● マップデータが規格に適合してるか判定 [新規]
  419.   #--------------------------------------------------------------------------
  420.   def standard_check
  421.     map_width  = @multi_map_data[0].width
  422.     map_height = @multi_map_data[0].height
  423.     for i in 1 ... @multi_map_data.size
  424.       next if map_width == @multi_map_data[i].width && map_height == @multi_map_data[i].height
  425.       msgbox "警告:マップのサイズが異なっています。"  # マップのサイズを確認し問題があれば警告する。
  426.     end
  427.     for x in 0 ... map_width
  428.       for y in 0 ... map_height
  429.         if @multi_map_data[0].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  430.           msgbox "警告:最下層のレイヤーにタイル「下」が設置されています。" +
  431.                  "\n問題の座標(x:#{x}, y:#{y})"
  432.         end
  433.         last_result = @multi_map_data.inject(false) do |result, map_data|
  434.           if result && map_data.data[x, y, 2] == Calt::LAYER_DOWN_TILE
  435.             msgbox "警告:タイル「上」の真上のレイヤーにタイル「下」が設置されています。" +
  436.                    "\n問題の座標(x:#{x}, y:#{y})"
  437.           end
  438.           next map_data.data[x, y, 2] == Calt::LAYER_UP_TILE
  439.         end
  440.         if last_result
  441.           msgbox "警告:最上層のレイヤーにタイル「上」が設置されています。" +
  442.                  "\n問題の座標(x:#{x}, y:#{y})"
  443.         end
  444.       end
  445.     end
  446.     @multi_map_data.each do |map_data|
  447.       map_data.events.each do |event_id, event_data|
  448.         event_data.pages.each do |page_data|
  449.           tile_id = page_data.graphic.tile_id
  450.           next if tile_id == 0
  451.           if tile_id == Calt::LAYER_UP_TILE || tile_id == Calt::LAYER_DOWN_TILE
  452.             p "注意:タイルイベントでタイル「上」及び「下」を設置しても効果はありません。"
  453.           end
  454.           if Calt::BOAT_PASSABLE_TILE_ID_HASH[tile_id] ||
  455.              Calt::SHIP_PASSABLE_TILE_ID_HASH[tile_id] ||
  456.              Calt::SUBMERGENCE_TILE_ID_HASH[tile_id] || Calt::AIR_TILE_ID_HASH[tile_id]
  457.             p "注意:タイルイベントでタイル「浅」、「深」、「空」及び「草」を設置しても効果はありません。"
  458.           end
  459.         end
  460.       end
  461.     end
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● イベントIDの変換に使用する配列の生成 [新規]
  465.   #--------------------------------------------------------------------------
  466.   def create_event_id_transformation
  467.     indirect = 0
  468.     max_key_list = Array.new
  469.     @multi_map_data.each do |map_data|
  470.       max_key_list.push max_key = map_data.events.keys.max || 0 # イベントIDの最大値
  471.       indirect = max_key if max_key > indirect  # 全てのレイヤーのうち最大のイベントIDを取得
  472.     end
  473.     @event_id_transformation = [indirect] # 間接的にイベントIDを指定する範囲(1 ~ indirect)
  474.     max_key_list.each do |max_key|
  475.       @event_id_transformation.push @event_id_transformation[-1] + max_key  # そのレイヤーのイベントの末尾インデックス
  476.     end
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● 全レイヤーのイベントを統合したマップデータの生成 [新規]
  480.   #--------------------------------------------------------------------------
  481.   def create_all_events_map_data
  482.     @map = @multi_map_data[0].clone # 最下層を使用
  483.     multi_events = Hash.new # 統合したイベントデータのハッシュ
  484.     @multi_map_data.each_index do |i|
  485.       standard_id = @event_id_transformation[i]
  486.       new_events = Hash.new # 変更したイベントデータのハッシュ
  487.       @multi_map_data[i].events.each do |event_id, event_data|
  488.         new_event_id  = standard_id + event_id  # 新しいイベントID
  489.         event_data.id = new_event_id  # イベントデータのIDを変更
  490.         new_events[new_event_id]   = event_data
  491.         multi_events[new_event_id] = event_data
  492.       end
  493.       @multi_map_data[i].events = new_events  # イベントIDを変更したので元のデータを更新
  494.     end
  495.     @map.events = multi_events  # 統合したイベントデータを代入
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 前景スプライトの配列の生成 [新規]
  499.   #--------------------------------------------------------------------------
  500.   def create_foreground_sprites
  501.     group_list = $game_temp.map_layer_list[@map_group_id]
  502.     @foreground_sprites = Array.new(layer_size) do |index|
  503.       map_id = group_list[index]
  504.       Sprite_Manager.new($game_temp.map_foreground[map_id] || nil)
  505.     end
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # ● セットアップ [◆再定義]
  509.   #--------------------------------------------------------------------------
  510.   def setup(map_id)
  511.     $game_player.current_floor = $game_temp.map_id_to_z(map_id) # プレイヤーの階層を更新
  512.     return if $game_temp.map_group_list[map_id] == @map_group_id  # グループIDで比較
  513.     create_multi_map_data(map_id)
  514.     standard_check if $TEST
  515.     create_event_id_transformation
  516.     create_all_events_map_data
  517.     create_foreground_sprites
  518.     @multi_tileset = Array.new
  519.     @multi_map_data.each { |map_data| @multi_tileset.push map_data.tileset_id }
  520.     # @tileset_id は使用しないので消去
  521.     @display_x = 0
  522.     @display_y = 0
  523.     referesh_vehicles
  524.     setup_events
  525.     setup_scroll
  526.     setup_parallax
  527.     setup_battleback
  528.     @need_refresh = false
  529.   end
  530.   #--------------------------------------------------------------------------
  531.   # ● イベントのセットアップ [◆再定義]
  532.   #--------------------------------------------------------------------------
  533.   def setup_events
  534.     @events = {}
  535.     @map.events.each do |i, event|
  536.       @events[i] = event_object = Game_Event.new(@map_id, event)
  537.       (@event_id_transformation.size - 2).downto(0) do |floor|
  538.         break event_object.init_floor(floor) if @event_id_transformation[floor] < i
  539.       end
  540.     end
  541.     @common_events = parallel_common_events.collect do |common_event|
  542.       Game_CommonEvent.new(common_event.id)
  543.     end
  544.     refresh_tile_events
  545.   end
  546.   #--------------------------------------------------------------------------
  547.   # ● タイルセットの取得 [◆再定義]
  548.   #--------------------------------------------------------------------------
  549.   def tileset(floor = floor_omit)
  550.     $data_tilesets[@multi_tileset[floor] || 1]
  551.   end
  552.   #--------------------------------------------------------------------------
  553.   # ● マップデータの取得 [◆再定義]
  554.   #--------------------------------------------------------------------------
  555.   def data(floor = floor_omit)
  556.     @multi_map_data[floor].data
  557.   end
  558.   #--------------------------------------------------------------------------
  559.   # ● フィールドタイプか否か [◆再定義]
  560.   #--------------------------------------------------------------------------
  561.   def overworld?(floor = floor_omit)
  562.     tileset(floor).mode == 0
  563.   end
  564.   #--------------------------------------------------------------------------
  565.   # ● 指定座標のタイルを判定して階層移動後の階層を取得 [新規]
  566.   #--------------------------------------------------------------------------
  567.   def floor_xy(x, y, floor = floor_omit)
  568.     return floor unless map_data = @multi_map_data[floor]
  569.     id = map_data.data[x, y, 2] || 0
  570.     if id == Calt::LAYER_UP_TILE
  571.       floor += 1
  572.       floor += 1 while @multi_map_data[floor].data[x, y, 2] == Calt::LAYER_UP_TILE
  573.     elsif id == Calt::LAYER_DOWN_TILE
  574.       floor -= 1
  575.       floor -= 1 while @multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  576.     end
  577.     return floor
  578.   end
  579.   #--------------------------------------------------------------------------
  580.   # ● 指定座標に存在するイベントの配列取得 [◆再定義]
  581.   #--------------------------------------------------------------------------
  582.   def events_xy(x, y, floor = floor_omit)
  583.     @events.values.select {|event| event.pos?(x, y, floor) }
  584.   end
  585.   #--------------------------------------------------------------------------
  586.   # ● 指定座標に存在するイベント(すり抜け以外)の配列取得 [◆再定義]
  587.   #--------------------------------------------------------------------------
  588.   def events_xy_nt(x, y, floor = floor_omit)
  589.     @events.values.select {|event| event.pos_nt?(x, y, floor) }
  590.   end
  591.   #--------------------------------------------------------------------------
  592.   # ● 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得 [◆再定義]
  593.   #--------------------------------------------------------------------------
  594.   def tile_events_xy(x, y, floor = floor_omit)
  595.     @tile_events.select {|event| event.pos_nt?(x, y, floor) }
  596.   end
  597.   #--------------------------------------------------------------------------
  598.   # ● 指定座標に存在するイベントの ID 取得(一つのみ) [◆再定義]
  599.   #--------------------------------------------------------------------------
  600.   def event_id_xy(x, y, floor = floor_omit)
  601.     list = events_xy(x, y, floor)
  602.     list.empty? ? 0 : list[0].id
  603.   end
  604.   #--------------------------------------------------------------------------
  605.   # ● 通行チェック [◆再定義]
  606.   #--------------------------------------------------------------------------
  607.   def check_passage(x, y, bit, floor = floor_omit)
  608.     floor2 = floor_xy(x, y, floor)
  609.     all_tiles(x, y, floor).each do |tile_id|
  610.       flag = tileset(floor2).flags[tile_id]
  611.       next if flag & 0x10 != 0            # [☆] : 通行に影響しない
  612.       return true  if flag & bit == 0     # [○] : 通行可
  613.       return false if flag & bit == bit   # [×] : 通行不可
  614.     end
  615.     return false                          # 通行不可
  616.   end
  617.   #--------------------------------------------------------------------------
  618.   # ● 指定座標にあるタイル ID の取得 [◆再定義]
  619.   #--------------------------------------------------------------------------
  620.   def tile_id(x, y, z, floor = floor_omit)
  621.     floor = floor_xy(x, y, floor)
  622.     return 0 unless map_data = @multi_map_data[floor]
  623.     return Calt::NOT_EXIST_TILE_TABLE[map_data.data[x, y, z] || 0]
  624.   end
  625.   #--------------------------------------------------------------------------
  626.   # ● 指定座標にある全レイヤーのタイル(上から順)を配列で取得 [◆再定義]
  627.   #--------------------------------------------------------------------------
  628.   def layered_tiles(x, y, floor = floor_omit)
  629.     [2, 1, 0].collect {|z| tile_id(x, y, z, floor) }
  630.   end
  631.   #--------------------------------------------------------------------------
  632.   # ● 指定座標にある全てのタイル(イベント含む)を配列で取得 [◆再定義]
  633.   #--------------------------------------------------------------------------
  634.   def all_tiles(x, y, floor = floor_omit)
  635.     tile_events_xy(x, y, floor).collect {|ev| Calt::NOT_EXIST_TILE_TABLE[ev.tile_id] } + layered_tiles(x, y, floor)
  636.   end
  637.   #--------------------------------------------------------------------------
  638.   # ● 指定座標にあるオートタイルの種類を取得 [◆再定義]
  639.   #--------------------------------------------------------------------------
  640.   def autotile_type(x, y, z, floor = floor_omit)
  641.     id = tile_id(x, y, z, floor)
  642.     id >= 2048 ? id / 48 : -1
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # ● 通常キャラの通行可能判定 [◆再定義]
  646.   #--------------------------------------------------------------------------
  647.   def passable?(x, y, d, floor = floor_omit)
  648.     check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f, floor)
  649.   end
  650.   #--------------------------------------------------------------------------
  651.   # ● 配列のIDが指定座標に有効に存在するか判定 [新規]
  652.   #--------------------------------------------------------------------------
  653.   def valid_tile_id?(x, y, floor, tile_id_hash)
  654.     floor2 = floor_xy(x, y, floor)
  655.     layered_tiles(x, y, floor).each do |tile_id|
  656.       return true if tile_id_hash[tile_id]
  657.       next if tileset(floor2).flags[tile_id] & 0x10 != 0  # [☆] : 通行に影響しない
  658.       return false
  659.     end
  660.     return false
  661.   end
  662.   #--------------------------------------------------------------------------
  663.   # ● 小型船の通行可能判定 [◆再定義]
  664.   #--------------------------------------------------------------------------
  665.   def boat_passable?(x, y, floor = floor_omit)
  666.     check_passage(x, y, 0x0200, floor) || valid_tile_id?(x, y, floor, Calt::BOAT_PASSABLE_TILE_ID_HASH)
  667.   end
  668.   #--------------------------------------------------------------------------
  669.   # ● 大型船の通行可能判定 [◆再定義]
  670.   #--------------------------------------------------------------------------
  671.   def ship_passable?(x, y, floor = floor_omit)
  672.     check_passage(x, y, 0x0400, floor) || valid_tile_id?(x, y, floor, Calt::SHIP_PASSABLE_TILE_ID_HASH)
  673.   end
  674.   #--------------------------------------------------------------------------
  675.   # ● 飛行船の着陸可能判定 [◆再定義]
  676.   #--------------------------------------------------------------------------
  677.   def airship_land_ok?(x, y, floor = floor_omit)
  678.     check_passage(x, y, 0x0800, floor) && check_passage(x, y, 0x0f, floor)
  679.   end
  680.   #--------------------------------------------------------------------------
  681.   # ● 指定座標の全レイヤーのフラグ判定 [◆再定義]
  682.   #--------------------------------------------------------------------------
  683.   def layered_tiles_flag?(x, y, bit, floor = floor_omit)
  684.     floor2 = floor_xy(x, y, floor)
  685.     layered_tiles(x, y, floor).any? {|tile_id| tileset(floor2).flags[tile_id] & bit != 0 }
  686.   end
  687.   #--------------------------------------------------------------------------
  688.   # ● 梯子判定 [◆再定義]
  689.   #--------------------------------------------------------------------------
  690.   def ladder?(x, y, floor = floor_omit)
  691.     valid?(x, y) && layered_tiles_flag?(x, y, 0x20, floor)
  692.   end
  693.   #--------------------------------------------------------------------------
  694.   # ● 茂み判定 [◆再定義]
  695.   #--------------------------------------------------------------------------
  696.   def bush?(x, y, floor = floor_omit)
  697.     valid?(x, y) && layered_tiles_flag?(x, y, 0x40, floor)
  698.   end
  699.   #--------------------------------------------------------------------------
  700.   # ● カウンター判定 [◆再定義]
  701.   #--------------------------------------------------------------------------
  702.   def counter?(x, y, floor = floor_omit)
  703.     valid?(x, y) && layered_tiles_flag?(x, y, 0x80, floor)
  704.   end
  705.   #--------------------------------------------------------------------------
  706.   # ● ダメージ床判定 [◆再定義]
  707.   #--------------------------------------------------------------------------
  708.   def damage_floor?(x, y, floor = floor_omit)
  709.     valid?(x, y) && layered_tiles_flag?(x, y, 0x100, floor)
  710.   end
  711.   #--------------------------------------------------------------------------
  712.   # ● 地形タグの取得 [◆再定義]
  713.   #--------------------------------------------------------------------------
  714.   def terrain_tag(x, y, floor = floor_omit)
  715.     return 0 unless valid?(x, y)
  716.     floor2 = floor_xy(x, y, floor)
  717.     layered_tiles(x, y, floor).each do |tile_id|
  718.       tag = tileset(floor2).flags[tile_id] >> 12
  719.       return tag if tag > 0
  720.     end
  721.     return 0
  722.   end
  723.   #--------------------------------------------------------------------------
  724.   # ● リージョン ID の取得 [◆再定義]
  725.   #--------------------------------------------------------------------------
  726.   def region_id(x, y, floor = floor_omit)
  727.     floor = floor_xy(x, y, floor)
  728.     valid?(x, y) ? @multi_map_data[floor].data[x, y, 3] >> 8 : 0
  729.   end
  730.   #--------------------------------------------------------------------------
  731.   # ● タイルセットの変更 [◆再定義]
  732.   #--------------------------------------------------------------------------
  733.   def change_tileset(tileset_id, floor = floor_omit)
  734.     @multi_tileset[floor] = tileset_id
  735.     refresh
  736.   end
  737. end

  738. #==============================================================================
  739. # ■ Game_CharacterBase
  740. #------------------------------------------------------------------------------
  741. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  742. # ラフィックなどの基本的な情報を保持します。
  743. #==============================================================================
  744. class Game_CharacterBase
  745.   #--------------------------------------------------------------------------
  746.   # ● 公開インスタンス変数
  747.   #--------------------------------------------------------------------------
  748.   attr_accessor :current_floor            # 現在地のレイヤー
  749.   attr_accessor :default_floor            # 初期地のレイヤー
  750.   #--------------------------------------------------------------------------
  751.   # ● 公開メンバ変数の初期化 [追加]
  752.   #--------------------------------------------------------------------------
  753.   alias init_public_members_Multilayer init_public_members
  754.   def init_public_members
  755.     init_public_members_Multilayer
  756.     @default_floor = 0
  757.     @current_floor = 0
  758.   end
  759.   #--------------------------------------------------------------------------
  760.   # ● 非公開メンバ変数の初期化 [追加]
  761.   #--------------------------------------------------------------------------
  762.   alias init_private_members_Multilayer init_private_members
  763.   def init_private_members
  764.     init_private_members_Multilayer
  765.     @last_x = -1
  766.     @last_y = -1
  767.   end
  768.   #--------------------------------------------------------------------------
  769.   # ● 階層(レイヤー)の初期化 [新規]
  770.   #--------------------------------------------------------------------------
  771.   def init_floor(floor)
  772.     @current_floor = floor
  773.     @default_floor = floor
  774.     update_bush_depth
  775.   end
  776.   #--------------------------------------------------------------------------
  777.   # ● 座標一致判定 [◆再定義]
  778.   #--------------------------------------------------------------------------
  779.   def pos?(x, y, floor = $game_map.floor_omit)
  780.     @x == x && @y == y && @current_floor == $game_map.floor_xy(x, y, floor)
  781.   end
  782.   #--------------------------------------------------------------------------
  783.   # ● 座標一致と「すり抜け OFF」判定(nt = No Through) [◆再定義]
  784.   #--------------------------------------------------------------------------
  785.   def pos_nt?(*args)
  786.     pos?(*args) && !@through
  787.   end
  788.   #--------------------------------------------------------------------------
  789.   # ● 階層の接続を確認 [新規]
  790.   #--------------------------------------------------------------------------
  791.   def update_current_floor(x, y)
  792.     return if x == @last_x && y == @last_y
  793.     @current_floor = $game_map.floor_xy(@last_x = x, @last_y = y, @current_floor) # 階層を更新
  794.   end
  795.   #--------------------------------------------------------------------------
  796.   # ● 指定位置に移動 [追加]
  797.   #--------------------------------------------------------------------------
  798.   alias moveto_Multilayer moveto
  799.   def moveto(x, y)
  800.     update_current_floor(x, y)  # 階層の接続を確認
  801.     moveto_Multilayer(x, y)
  802.   end
  803.   #--------------------------------------------------------------------------
  804.   # ● フレーム更新 [追加]
  805.   #--------------------------------------------------------------------------
  806.   alias update_Multilayer update
  807.   def update
  808.     update_Multilayer
  809.     update_current_floor(@x, @y)  # 階層の接続を確認
  810.   end
  811.   #--------------------------------------------------------------------------
  812.   # ● ジャンプ時の更新 [追加]
  813.   #--------------------------------------------------------------------------
  814.   alias update_jump_Multilayer update_jump
  815.   def update_jump
  816.     if @jump_count == 1
  817.       @current_floor = @landing_floor || 0  # 着地時に階層を更新
  818.       @landing_floor = false
  819.     end
  820.     update_jump_Multilayer
  821.   end
  822.   #--------------------------------------------------------------------------
  823.   # ● 茂み深さの更新 [◆再定義]
  824.   #--------------------------------------------------------------------------
  825.   alias update_bush_depth_Multilayer update_bush_depth
  826.   def update_bush_depth
  827.     if normal_priority? && !jumping? && $game_map.valid_tile_id?(@x, @y, @current_floor, Calt::SUBMERGENCE_TILE_ID_HASH)
  828.       @bush_depth = 4 unless moving?
  829.     else
  830.       update_bush_depth_Multilayer
  831.     end
  832.   end
  833.   #--------------------------------------------------------------------------
  834.   # ● 歩数増加 [追加]
  835.   #--------------------------------------------------------------------------
  836.   alias increase_steps_Multilayer increase_steps
  837.   def increase_steps
  838.     update_current_floor(@x, @y)  # 階層の接続を確認
  839.     increase_steps_Multilayer
  840.   end
  841. end

  842. #==============================================================================
  843. # ■ Game_Character
  844. #------------------------------------------------------------------------------
  845. #  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、
  846. # Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。
  847. #==============================================================================
  848. class Game_Character < Game_CharacterBase
  849.   #--------------------------------------------------------------------------
  850.   # ● ジャンプ [◆再定義]
  851.   #--------------------------------------------------------------------------
  852.   def jump(x_plus, y_plus)
  853.     if x_plus.abs > y_plus.abs
  854.       set_direction(x_plus < 0 ? 4 : 6) if x_plus != 0
  855.     else
  856.       set_direction(y_plus < 0 ? 8 : 2) if y_plus != 0
  857.     end
  858.     @x += x_plus
  859.     @y += y_plus
  860.     floor = $game_map.layer_size - 1 # 最上層
  861.     floor -= 1 while $game_map.multi_map_data[floor].data[@x, @y, 2] == Calt::LAYER_DOWN_TILE
  862.     while floor > 0
  863.       break unless $game_map.valid_tile_id?(@x, @y, floor, Calt::AIR_TILE_ID_HASH)
  864.       floor -= 1
  865.       floor -= 1 while $game_map.multi_map_data[floor].data[@x, @y, 2] == Calt::LAYER_DOWN_TILE
  866.     end
  867.     @landing_floor = floor  # 着地場所の階層を記憶
  868.     @current_floor = [@current_floor, @landing_floor].max # ジャンプ中の階層
  869.     distance = Math.sqrt(x_plus * x_plus + y_plus * y_plus).round
  870.     @jump_peak = 10 + distance - @move_speed
  871.     @jump_count = @jump_peak * 2
  872.     @stop_count = 0
  873.     straighten
  874.   end
  875.   #--------------------------------------------------------------------------
  876.   # ● 詳細設定してジャンプさせる [新規]
  877.   #   flying_floor  : ジャンプ開始~ジャンプ終了までのレイヤー番号
  878.   #   landing_floor : ジャンプ終了後のレイヤー番号
  879.   #--------------------------------------------------------------------------
  880.   def manual_jump(x_plus, y_plus, flying_floor_index, landing_floor_index)
  881.     jump(x_plus, y_plus)
  882.     @current_floor = $game_map.layer_index[flying_floor_index]
  883.     @landing_floor = $game_map.layer_index[landing_floor_index]
  884.   end
  885. end

  886. #==============================================================================
  887. # ■ Game_Player
  888. #------------------------------------------------------------------------------
  889. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  890. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  891. #==============================================================================
  892. class Game_Player < Game_Character
  893.   #--------------------------------------------------------------------------
  894.   # ● 場所移動の実行 [◆再定義]
  895.   #--------------------------------------------------------------------------
  896.   def perform_transfer
  897.     if transfer?
  898.       set_direction(@new_direction)
  899.       if $game_temp.map_group_list[@new_map_id] != $game_map.map_group_id
  900.         $game_map.setup(@new_map_id)
  901.         $game_map.autoplay
  902.       else
  903.         $game_map.setup(@new_map_id)
  904.       end
  905.       moveto(@new_x, @new_y)
  906.       clear_transfer_info
  907.     end
  908.   end
  909.   #--------------------------------------------------------------------------
  910.   # ● 階層の接続を確認 [新規]
  911.   #--------------------------------------------------------------------------
  912.   def update_current_floor(x, y)
  913.     return if in_airship? # 飛行船は最上層を飛ぶので処理しない
  914.     super
  915.   end
  916. end

  917. #==============================================================================
  918. # ■ Game_Followers
  919. #------------------------------------------------------------------------------
  920. #  フォロワーの配列のラッパーです。このクラスは Game_Player クラスの内部で使
  921. # 用されます。
  922. #==============================================================================
  923. class Game_Followers
  924.   #--------------------------------------------------------------------------
  925.   # ● イテレータ [◆再定義]
  926.   #--------------------------------------------------------------------------
  927.   def each
  928.     return unless block_given?
  929.     @data.each do |follower|
  930.       $game_map.temp_execute(follower) { yield follower } # 追従者を基準に実行するように変更
  931.     end
  932.   end
  933.   #--------------------------------------------------------------------------
  934.   # ● イテレータ(逆順) [◆再定義]
  935.   #--------------------------------------------------------------------------
  936.   def reverse_each
  937.     return unless block_given?
  938.     @data.reverse.each do |follower|
  939.       $game_map.temp_execute(follower) { yield follower } # 追従者を基準に実行するように変更
  940.     end
  941.   end
  942.   #--------------------------------------------------------------------------
  943.   # ● 同期 [◆再定義]
  944.   #--------------------------------------------------------------------------
  945.   def synchronize(x, y, d)
  946.     each do |follower|
  947.       follower.current_floor = $game_player.current_floor
  948.       follower.moveto(x, y)
  949.       follower.set_direction(d)
  950.     end
  951.   end
  952.   #--------------------------------------------------------------------------
  953.   # ● 階層のみプレイヤーと同期 [新規]
  954.   #--------------------------------------------------------------------------
  955.   def synchronize_floor
  956.     each do |follower|
  957.       follower.current_floor = $game_player.current_floor
  958.     end
  959.   end
  960. end

  961. #==============================================================================
  962. # ■ Game_Vehicle
  963. #------------------------------------------------------------------------------
  964. #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
  965. # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
  966. #==============================================================================
  967. class Game_Vehicle < Game_Character
  968.   #--------------------------------------------------------------------------
  969.   # ● 現在地のレイヤーの取得 [◆再定義]
  970.   #--------------------------------------------------------------------------
  971.   def current_floor
  972.     return @map_id == $game_map.map_id ? @current_floor : 0
  973.   end
  974.   #--------------------------------------------------------------------------
  975.   # ● システム設定のロード [追加]
  976.   #--------------------------------------------------------------------------
  977.   alias load_system_settings_Multilayer load_system_settings
  978.   def load_system_settings
  979.     load_system_settings_Multilayer
  980.     @current_floor = $game_temp.map_id_to_z(@map_id)  # IDから階層を取得
  981.     @map_id = $game_temp.map_id_to_base_map_id(@map_id)   # IDから最下層のIDを取得
  982.   end
  983.   #--------------------------------------------------------------------------
  984.   # ● 位置の変更 [追加]
  985.   #--------------------------------------------------------------------------
  986.   alias set_location_Multilayer set_location
  987.   def set_location(map_id, x, y)
  988.     @current_floor = $game_temp.map_id_to_z(map_id) # IDから階層を取得
  989.     map_id = $game_temp.map_id_to_base_map_id(map_id)   # IDから最下層のIDを取得
  990.     set_location_Multilayer(map_id, x, y)
  991.   end
  992.   #--------------------------------------------------------------------------
  993.   # ● プレイヤーとの同期 [追加]
  994.   #--------------------------------------------------------------------------
  995.   alias sync_with_player_Multilayer sync_with_player
  996.   def sync_with_player
  997.     @current_floor = $game_player.current_floor
  998.     sync_with_player_Multilayer
  999.   end
  1000.   #--------------------------------------------------------------------------
  1001.   # ● 階層の接続を確認 [新規]
  1002.   #--------------------------------------------------------------------------
  1003.   def update_current_floor(x, y)
  1004.     return if @driving  # 運転中はプレイヤーに同期するので処理しない
  1005.     super
  1006.   end
  1007.   #--------------------------------------------------------------------------
  1008.   # ● 乗り物に乗る [追加]
  1009.   #--------------------------------------------------------------------------
  1010.   alias get_on_Multilayer get_on
  1011.   def get_on
  1012.     get_on_Multilayer
  1013.     if @type == :airship  # 飛行船は離陸すると最上層へ移動
  1014.       $game_player.current_floor = @current_floor = $game_map.layer_size - 1
  1015.       $game_player.followers.synchronize_floor
  1016.     end
  1017.   end
  1018.   #--------------------------------------------------------------------------
  1019.   # ● 乗り物から降りる [追加]
  1020.   #--------------------------------------------------------------------------
  1021.   alias get_off_Multilayer get_off
  1022.   def get_off
  1023.     get_off_Multilayer
  1024.     if @type == :airship
  1025.       floor = @current_floor
  1026.       floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1027.       while floor > 0
  1028.         break unless $game_map.valid_tile_id?(x, y, floor, Calt::AIR_TILE_ID_HASH)
  1029.         floor -= 1
  1030.         floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1031.       end
  1032.       @land_floor = $game_player.current_floor = floor  # プレイヤーは着陸前に階層を更新
  1033.       $game_player.followers.synchronize_floor
  1034.     end
  1035.   end
  1036.   #--------------------------------------------------------------------------
  1037.   # ● 画面 Z 座標の取得 [追加]
  1038.   #--------------------------------------------------------------------------
  1039.   alias screen_z_Multilayer screen_z
  1040.   def screen_z
  1041.     return screen_z_Multilayer + (@altitude > max_altitude ? 10 : 0)  # 高高度でも上層イベントより上に表示されるように
  1042.   end
  1043.   #--------------------------------------------------------------------------
  1044.   # ● 飛行船の高度を更新 [◆再定義]
  1045.   #--------------------------------------------------------------------------
  1046.   def update_airship_altitude
  1047.     floor = current_floor
  1048.     floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1049.     while floor > 0
  1050.       break unless $game_map.valid_tile_id?(x, y, floor, Calt::AIR_TILE_ID_HASH)
  1051.       floor -= 1
  1052.       floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1053.     end
  1054.     horizon_floor = $game_map.layer_index.keys.select { |key| key < 0 }.size  # レイヤー番号が負の値のレイヤー数
  1055.     floor = [floor, horizon_floor].max
  1056.     multi_max_altitude = max_altitude + 8 * (floor - horizon_floor)
  1057.     if @driving
  1058.       if @altitude < multi_max_altitude && (takeoff_ok? || @altitude >= max_altitude)
  1059.         @altitude += 1
  1060.       elsif @altitude > multi_max_altitude
  1061.         @altitude -= 1
  1062.       end
  1063.     elsif @altitude > 0
  1064.       @altitude -= 1
  1065.       if @altitude == 0
  1066.         @current_floor = @land_floor || 0 # 飛行船は着陸時に階層を更新
  1067.         @priority_type = 0
  1068.       end
  1069.     end
  1070.     @step_anime = (@altitude == multi_max_altitude)
  1071.     @priority_type = 2 if @altitude > 0
  1072.   end
  1073.   #--------------------------------------------------------------------------
  1074.   # ● 接岸/着陸可能判定 [◆再定義]
  1075.   #--------------------------------------------------------------------------
  1076.   def land_ok?(x, y, d)
  1077.     if @type == :airship
  1078.       floor = @current_floor
  1079.       floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1080.       while floor > 0
  1081.         break unless $game_map.valid_tile_id?(x, y, floor, Calt::AIR_TILE_ID_HASH)
  1082.         return false unless $game_map.events_xy(x, y, floor).empty?
  1083.         floor -= 1
  1084.         floor -= 1 while $game_map.multi_map_data[floor].data[x, y, 2] == Calt::LAYER_DOWN_TILE
  1085.       end
  1086.       return false unless $game_map.events_xy(x, y, floor).empty?
  1087.       return false unless $game_map.airship_land_ok?(x, y, floor)
  1088.       return false if $game_map.layer_index.index(floor) < 0
  1089.     else
  1090.       x2 = $game_map.round_x_with_direction(x, d)
  1091.       y2 = $game_map.round_y_with_direction(y, d)
  1092.       return false unless $game_map.valid?(x2, y2)
  1093.       return false unless $game_map.passable?(x2, y2, reverse_dir(d), @current_floor)
  1094.       return false if collide_with_characters?(x2, y2)
  1095.     end
  1096.     return true
  1097.   end
  1098. end

  1099. #==============================================================================
  1100. # ■ Game_Interpreter
  1101. #------------------------------------------------------------------------------
  1102. #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
  1103. # Game_Troop クラス、Game_Event クラスの内部で使用されます。
  1104. #==============================================================================
  1105. class Game_Interpreter
  1106.   #--------------------------------------------------------------------------
  1107.   # ● キャラクターの取得 [追加]
  1108.   #--------------------------------------------------------------------------
  1109.   alias get_character_Multilayer get_character
  1110.   def get_character(param)
  1111.     if 0 < param && param <= $game_map.event_id_transformation[0] # 間接指定の範囲
  1112.       event = get_character_Multilayer(@event_id)
  1113.       default_floor = event && same_map? ? event.default_floor : 0
  1114.       param = ($game_map.event_id_transformation[default_floor] || 0) + param
  1115.     end
  1116.     return get_character_Multilayer(param)
  1117.   end
  1118.   #--------------------------------------------------------------------------
  1119.   # ● アニメーションは対象の現在地の階層で再生する [新規]
  1120.   #--------------------------------------------------------------------------
  1121.   def animation_current_floor_ON
  1122.     $game_map.animation_current_floor = true
  1123.   end
  1124.   #--------------------------------------------------------------------------
  1125.   # ● アニメーションは対象の現在地の階層で再生しない [新規]
  1126.   #--------------------------------------------------------------------------
  1127.   def animation_current_floor_OFF
  1128.     $game_map.animation_current_floor = false
  1129.   end
  1130.   #--------------------------------------------------------------------------
  1131.   # ● 前景スプライトを取得( Sprite_Manager クラス) [新規]
  1132.   #   index        : レイヤー番号
  1133.   #--------------------------------------------------------------------------
  1134.   def get_foreground_sprite(index)
  1135.     return $game_map.foreground_sprites[$game_map.layer_index[index]]
  1136.   end
  1137.   #--------------------------------------------------------------------------
  1138.   # ● 指定したIDのイベントのレイヤーを変更 [新規]
  1139.   #   event_id : 操作するイベントのID
  1140.   #   index    : 新しいレイヤー番号
  1141.   #--------------------------------------------------------------------------
  1142.   def change_layer(event_id, index)
  1143.     get_character(event_id).current_floor = $game_map.layer_index[index]
  1144.   end
  1145.   #--------------------------------------------------------------------------
  1146.   # ● 指定したIDのイベントの現在地のレイヤー番号を取得 [新規]
  1147.   #   event_id : 操作するイベントのID
  1148.   #--------------------------------------------------------------------------
  1149.   def current_layer(event_id)
  1150.     return $game_map.layer_index.index(get_character(event_id).current_floor)
  1151.   end
  1152.   #--------------------------------------------------------------------------
  1153.   # ● レイヤー番号とイベントIDから絶対イベントIDを取得 [新規]
  1154.   #   ※所属するレイヤー以外のイベントを対象にする時に使用する。「命令の対象を変更」のスクリプトとの併用を想定
  1155.   #   event_id : イベントID
  1156.   #   index    : レイヤー番号
  1157.   #--------------------------------------------------------------------------
  1158.   def absolute_event_id(event_id, index)
  1159.     if 0 < event_id && event_id <= $game_map.event_id_transformation[0] # 間接指定の範囲
  1160.       floor = $game_map.layer_index[index]
  1161.       event_id = ($game_map.event_id_transformation[floor] || 0) + event_id
  1162.     end
  1163.     return event_id
  1164.   end
  1165.   #--------------------------------------------------------------------------
  1166.   # ● タイルセットの変更 [◆再定義]
  1167.   #--------------------------------------------------------------------------
  1168.   alias command_282_Multilayer command_282
  1169.   def command_282
  1170.     $game_map.temp_execute(get_character(@event_id)) { command_282_Multilayer } # 実行したイベントを基準に実行
  1171.   end
  1172.   #--------------------------------------------------------------------------
  1173.   # ● 指定位置の情報取得 [◆再定義]
  1174.   #--------------------------------------------------------------------------
  1175.   alias command_285_Multilayer command_285
  1176.   def command_285
  1177.     $game_map.temp_execute(get_character(@event_id)) { command_285_Multilayer } # 実行したイベントを基準に取得
  1178.   end
  1179. end

  1180. #==============================================================================
  1181. # ■ Sprite_Character
  1182. #------------------------------------------------------------------------------
  1183. #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
  1184. # 監視し、スプライトの状態を自動的に変化させます。
  1185. #==============================================================================
  1186. class Sprite_Character < Sprite_Base
  1187.   #--------------------------------------------------------------------------
  1188.   # ● オブジェクト初期化 [追加]
  1189.   #--------------------------------------------------------------------------
  1190.   alias initialize_Multilayer initialize
  1191.   def initialize(viewport, character = nil)
  1192.     @current_floor = character.current_floor
  1193.     viewport = multi_viewport[@current_floor] # 引数は無視してビューポートを設定
  1194.     initialize_Multilayer(viewport, character)
  1195.   end
  1196.   #--------------------------------------------------------------------------
  1197.   # ● ビューポートの取得 [新規]
  1198.   #--------------------------------------------------------------------------
  1199.   def multi_viewport
  1200.     return $game_temp.multi_viewport_accessor
  1201.   end
  1202.   #--------------------------------------------------------------------------
  1203.   # ● 解放 [追加]
  1204.   #--------------------------------------------------------------------------
  1205.   alias dispose_Multilayer dispose
  1206.   def dispose
  1207.     @sprites_cash_size = 0
  1208.     dispose_junction_sprites
  1209.     dispose_Multilayer
  1210.   end
  1211.   #--------------------------------------------------------------------------
  1212.   # ● フレーム更新 [◆再定義]
  1213.   #--------------------------------------------------------------------------
  1214.   def update
  1215.     super
  1216.     update_bitmap
  1217.     update_src_rect
  1218.     update_tile_src_rect    # タイルイベントの矩形を更新
  1219.     update_position
  1220.     update_other
  1221.     update_junction_sprite  # 階層の更新
  1222.     update_balloon
  1223.     setup_new_effect
  1224.   end
  1225.   #--------------------------------------------------------------------------
  1226.   # ● 指定されたタイルが含まれるタイルセット画像の取得 [◆再定義]
  1227.   #--------------------------------------------------------------------------
  1228.   def tileset_bitmap(tile_id)
  1229.     Cache.tileset($game_map.tileset(@character.default_floor).tileset_names[5 + tile_id / 256])
  1230.   end
  1231.   #--------------------------------------------------------------------------
  1232.   # ● タイルのビットマップを設定 [追加]
  1233.   #--------------------------------------------------------------------------
  1234.   alias set_tile_bitmap_Multilayer set_tile_bitmap
  1235.   def set_tile_bitmap
  1236.     set_tile_bitmap_Multilayer
  1237.     @cw = @ch = 32  # キャラクターと同様にサイズを記憶しておく
  1238.   end
  1239.   #--------------------------------------------------------------------------
  1240.   # ● タイルイベントの矩形を更新(変更した値の初期化) [新規]
  1241.   #--------------------------------------------------------------------------
  1242.   def update_tile_src_rect
  1243.     return if @tile_id == 0     # タイルイベントでない
  1244.     return unless @sprites_cash # レイヤー接合を行っていない
  1245.     self.src_rect.set((@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32, @tile_id % 256 / 8 % 16 * 32, 32, 32)
  1246.     self.ox = 16
  1247.     self.oy = 32
  1248.   end
  1249.   #--------------------------------------------------------------------------
  1250.   # ● 階層の更新 [新規]
  1251.   #--------------------------------------------------------------------------
  1252.   def update_junction_sprite
  1253.     @sprites_cash_size = 0  # レイヤー接合スプライトの枚数

  1254.     screen_x = @character.screen_x  # 画面の転送元原点を基準にしたx座標
  1255.     return dispose_junction_sprites if screen_x < -@cw || Graphics.width  + @cw < screen_x  # 処理軽減(画面外)
  1256.     screen_y = @character.screen_y  # 画面の転送元原点を基準にしたy座標
  1257.     return dispose_junction_sprites if screen_y < 0    || Graphics.height + @ch < screen_y  # 処理軽減(画面外)
  1258.     return dispose_junction_sprites unless self.visible # 処理軽減(非表示は処理しない)

  1259.     reset_sprite_origin                                 # 転送元原点の再設定
  1260.     dot_x = $game_map.display_x * 32 + screen_x         # マップの原点を基準にした X 座標
  1261.     dot_y = $game_map.display_y * 32 + screen_y         # マップの原点を基準にした Y 座標
  1262.     map_x = $game_map.round_x(((dot_x - 1) / 32).floor) # マップの原点を基準にした論理 X 座標
  1263.     map_y = $game_map.round_y(((dot_y - 1) / 32).floor) # マップの原点を基準にした論理 Y 座標
  1264.     rem_x = -dot_x % 32 - 16                            # 停止状態を基準に左にずれてるドット数
  1265.     rem_y = -dot_y % 32                                 # 停止状態を基準に上にずれてるドット数
  1266.     left_width  = @cw / 2                               # 転送元原点から左側の幅
  1267.     right_width = @cw - left_width                      # 転送元原点から右側の幅
  1268.     jun_l = ((left_width  + 16 + rem_x) / 32.0).ceil    # 左のタイル数
  1269.     jun_r = ((right_width + 16 - rem_x) / 32.0).ceil    # 右のタイル数
  1270.     jun_h = ((@ch + rem_y) / 32.0).ceil                 # 縦のタイル数

  1271.     old_floor  = $game_map.floor_xy(map_x, map_y, @character.current_floor)
  1272.     old_sprite = self
  1273.     old_sprite.viewport = multi_viewport[old_floor]  # 階層の更新
  1274.     base_floors  = [old_floor]  # 中央の階層の配列
  1275.     base_sprites = [old_sprite] # 中央のスプライトの配列
  1276.     base_valid_y = [true]       # 有効座標の判定結果
  1277.     for i in 1 ... jun_h
  1278.       new_map_y = $game_map.round_y(map_y - i)
  1279.       if valid_y?(new_map_y)
  1280.         base_valid_y.push new_map_y # 有効座標を記憶
  1281.         new_floor = $game_map.floor_xy(map_x, new_map_y, old_floor)
  1282.         unless old_floor == new_floor
  1283.           new_sprite = get_junction_sprite
  1284.           new_rect_height = old_sprite.height + rem_y - 32 * i
  1285.           horz_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_height)  # 横分割
  1286.           old_floor  = new_floor
  1287.           old_sprite = new_sprite
  1288.         end
  1289.       else
  1290.         base_valid_y.push false # 有効座標の判定を記憶
  1291.       end
  1292.       base_floors.push  old_floor
  1293.       base_sprites.push old_sprite
  1294.     end

  1295.     # 左側の処理
  1296.     left_floors  = base_floors  # 右隣の階層の配列
  1297.     left_sprites = base_sprites # 右隣のスプライトの配列
  1298.     for i in 1 ... jun_l
  1299.       new_map_x = $game_map.round_x(map_x - i)
  1300.       if valid_x?(new_map_x)
  1301.         floor = $game_map.floor_xy(new_map_x, map_y, left_floors[0])  # 右隣の下端の階層を基準にする
  1302.         floors = [floor]
  1303.         for j in 1 ... jun_h
  1304.           if base_valid_y[j]
  1305.             new_map_y = base_valid_y[j]
  1306.             floor = $game_map.floor_xy(new_map_x, new_map_y, floor)
  1307.           end
  1308.           floors.push floor
  1309.         end
  1310.         
  1311.         unless floors == left_floors  # 右隣と階層に変化があるか比較
  1312.           sprites = left_sprites.dup  # 右隣の階層の配列をコピー
  1313.           count = 0
  1314.           while count < jun_h
  1315.             unless floors[count] == left_floors[count]
  1316.               old_sprite  = left_sprites[count] # 基準にするスプライト
  1317.               index_floor = count # 同じスプライトが使用されている下端のインデックス
  1318.               index_ceil  = count # 同じスプライトが使用されている上端のインデックス
  1319.               index_floor -= 1 while index_floor > 0         && old_sprite == left_sprites[index_floor - 1]
  1320.               index_ceil  += 1 while index_ceil  < jun_h - 1 && old_sprite == left_sprites[index_ceil  + 1]
  1321.               count = index_ceil
  1322.               
  1323.               new_sprite = get_junction_sprite
  1324.               new_floor  = floors[index_floor]
  1325.               new_rect_width = left_width + 16 + rem_x - 32 * i
  1326.               left_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_width) # 縦分割(左側用)

  1327.               old_floor = new_floor
  1328.               sprites[index_floor] = old_sprite = new_sprite
  1329.               for index in index_floor + 1 .. index_ceil
  1330.                 new_floor = floors[index]
  1331.                 unless old_floor == new_floor
  1332.                   new_sprite = get_junction_sprite
  1333.                   new_rect_height = old_sprite.height + rem_y - 32 * index
  1334.                   horz_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_height)  # 横分割
  1335.                   old_floor  = new_floor
  1336.                   old_sprite = new_sprite
  1337.                 end
  1338.                 sprites[index] = old_sprite
  1339.               end
  1340.             end
  1341.             count += 1
  1342.           end
  1343.           left_sprites.push sprites # 演算で得られたスプライトの配列を追加
  1344.         end
  1345.         left_floors = floors  # 右隣の階層の配列を更新
  1346.       end
  1347.     end

  1348.     # 右側の処理
  1349.     right_floors  = base_floors   # 左隣の階層の配列
  1350.     right_sprites = base_sprites  # 左隣のスプライトの配列
  1351.     for i in 1 ... jun_r
  1352.       new_map_x = $game_map.round_x(map_x + i)
  1353.       if valid_x?(new_map_x)
  1354.         floor = $game_map.floor_xy(new_map_x, map_y, right_floors[0]) # 左隣の下端の階層を基準にする
  1355.         floors = [floor]
  1356.         for j in 1 ... jun_h
  1357.           if base_valid_y[j]
  1358.             new_map_y = base_valid_y[j]
  1359.             floor = $game_map.floor_xy(new_map_x, new_map_y, floor)
  1360.           end
  1361.           floors.push floor
  1362.         end

  1363.         unless floors == right_floors # 左隣と階層に変化があるか比較
  1364.           sprites = right_sprites.dup # 左隣の階層の配列をコピー
  1365.           count = 0
  1366.           while count < jun_h
  1367.             unless floors[count] == right_floors[count]
  1368.               old_sprite  = right_sprites[count] # 縦分割するスプライトを取得
  1369.               index_floor = count # 同じスプライトが使用されている下端のインデックス
  1370.               index_ceil  = count # 同じスプライトが使用されている上端のインデックス
  1371.               index_floor -= 1 while index_floor > 0         && old_sprite == right_sprites[index_floor - 1]
  1372.               index_ceil  += 1 while index_ceil  < jun_h - 1 && old_sprite == right_sprites[index_ceil  + 1]
  1373.               count = index_ceil

  1374.               new_sprite = get_junction_sprite
  1375.               new_floor  = floors[index_floor]
  1376.               new_rect_width = right_width + 16 - rem_x - 32 * i
  1377.               right_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_width)  # 縦分割(右側用)

  1378.               old_floor = new_floor
  1379.               sprites[index_floor] = old_sprite = new_sprite
  1380.               for index in index_floor + 1 .. index_ceil
  1381.                 new_floor = floors[index]
  1382.                 unless old_floor == new_floor
  1383.                   new_sprite = get_junction_sprite
  1384.                   new_rect_height = old_sprite.height + rem_y - 32 * index
  1385.                   horz_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_height)  # 横分割
  1386.                   old_floor  = new_floor
  1387.                   old_sprite = new_sprite
  1388.                 end
  1389.                 sprites[index] = old_sprite
  1390.               end
  1391.             end
  1392.             count += 1
  1393.           end
  1394.           right_sprites = sprites # 左隣のスプライトの配列を更新
  1395.         end
  1396.         right_floors = floors # 左隣の階層の配列を更新
  1397.       end
  1398.     end

  1399.     dispose_junction_sprites  # 不要なレイヤー接合スプライトの解放
  1400.   end
  1401.   #--------------------------------------------------------------------------
  1402.   # ● 有効座標判定(x座標) [新規]
  1403.   #--------------------------------------------------------------------------
  1404.   def valid_x?(x)
  1405.     return x >= 0 && x < $game_map.width
  1406.   end
  1407.   #--------------------------------------------------------------------------
  1408.   # ● 有効座標判定(y座標) [新規]
  1409.   #--------------------------------------------------------------------------
  1410.   def valid_y?(y)
  1411.     return y >= 0 && y < $game_map.height
  1412.   end
  1413.   #--------------------------------------------------------------------------
  1414.   # ● 転送元原点を再設定 [新規]
  1415.   #--------------------------------------------------------------------------
  1416.   def reset_sprite_origin
  1417.     self.ox = @cw / 2 # 転送元原点の再設定
  1418.     self.oy = @ch     # 転送元原点の再設定
  1419.   end
  1420.   #--------------------------------------------------------------------------
  1421.   # ● スプライトを横分割 [新規]
  1422.   #--------------------------------------------------------------------------
  1423.   def horz_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_height)
  1424.     # ビューポートを設定
  1425.     new_sprite.viewport = multi_viewport[new_floor]

  1426.     # 転送元の矩形を計算
  1427.     new_rect_x      = old_sprite.src_rect.x
  1428.     new_rect_y      = old_sprite.src_rect.y
  1429.     new_rect_width  = old_sprite.width
  1430.     # new_rect_height = new_rect_height
  1431.     old_rect_x      = old_sprite.src_rect.x
  1432.     old_rect_y      = old_sprite.src_rect.y + new_rect_height
  1433.     old_rect_width  = old_sprite.width
  1434.     old_rect_height = old_sprite.height - new_rect_height

  1435.     # 転送元原点を設定
  1436.     new_sprite.ox = old_sprite.ox
  1437.     new_sprite.oy = old_sprite.oy
  1438.     # old_sprite.ox = old_sprite.ox
  1439.     old_sprite.oy = old_sprite.oy - old_sprite.height + old_rect_height

  1440.     # その他の同期
  1441.     set_junction_sprite(new_sprite, old_sprite)

  1442.     # 転送元の矩形を設定
  1443.     new_sprite.src_rect.set(new_rect_x, new_rect_y, new_rect_width, new_rect_height)
  1444.     old_sprite.src_rect.set(old_rect_x, old_rect_y, old_rect_width, old_rect_height)
  1445.    
  1446.     # 茂みの同期
  1447.     new_sprite.bush_depth = [old_sprite.bush_depth - old_rect_height, 0].max
  1448.   end
  1449.   #--------------------------------------------------------------------------
  1450.   # ● スプライトを縦分割(左側用) [新規]
  1451.   #--------------------------------------------------------------------------
  1452.   def left_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_width)
  1453.     # ビューポートを設定
  1454.     new_sprite.viewport = multi_viewport[new_floor]

  1455.     # 転送元の矩形を計算
  1456.     new_rect_x      = old_sprite.src_rect.x
  1457.     new_rect_y      = old_sprite.src_rect.y
  1458.     # new_rect_width  = new_rect_width
  1459.     new_rect_height = old_sprite.height
  1460.     old_rect_x      = old_sprite.src_rect.x + new_rect_width
  1461.     old_rect_y      = old_sprite.src_rect.y
  1462.     old_rect_width  = old_sprite.width - new_rect_width
  1463.     old_rect_height = old_sprite.height

  1464.     # 転送元原点を設定
  1465.     new_sprite.ox = old_sprite.ox
  1466.     new_sprite.oy = old_sprite.oy
  1467.     old_sprite.ox = old_sprite.ox - old_sprite.width + old_rect_width
  1468.     # old_sprite.oy = old_sprite.oy

  1469.     # その他の同期
  1470.     set_junction_sprite(new_sprite, old_sprite)

  1471.     # 転送元の矩形を設定
  1472.     new_sprite.src_rect.set(new_rect_x, new_rect_y, new_rect_width, new_rect_height)
  1473.     old_sprite.src_rect.set(old_rect_x, old_rect_y, old_rect_width, old_rect_height)
  1474.    
  1475.     # 茂みの同期
  1476.     new_sprite.bush_depth = old_sprite.bush_depth
  1477.   end
  1478.   #--------------------------------------------------------------------------
  1479.   # ● スプライトを縦分割(右側用) [新規]
  1480.   #--------------------------------------------------------------------------
  1481.   def right_divide_sprite(old_sprite, new_sprite, new_floor, new_rect_width)
  1482.     # ビューポートを設定
  1483.     new_sprite.viewport = multi_viewport[new_floor]

  1484.     # 転送元の矩形を計算
  1485.     old_rect_x      = old_sprite.src_rect.x
  1486.     old_rect_y      = old_sprite.src_rect.y
  1487.     old_rect_width  = old_sprite.width - new_rect_width
  1488.     old_rect_height = old_sprite.height
  1489.     new_rect_x      = old_sprite.src_rect.x + old_rect_width
  1490.     new_rect_y      = old_sprite.src_rect.y
  1491.     # new_rect_width  = new_rect_width
  1492.     new_rect_height = old_sprite.height

  1493.     # 転送元原点を設定
  1494.     new_sprite.ox = old_sprite.ox - old_sprite.width + new_rect_width
  1495.     new_sprite.oy = old_sprite.oy
  1496.     old_sprite.ox = old_sprite.ox
  1497.     # old_sprite.oy = old_sprite.oy

  1498.     # その他の同期
  1499.     set_junction_sprite(new_sprite, old_sprite)

  1500.     # 転送元の矩形を設定
  1501.     new_sprite.src_rect.set(new_rect_x, new_rect_y, new_rect_width, new_rect_height)
  1502.     old_sprite.src_rect.set(old_rect_x, old_rect_y, old_rect_width, old_rect_height)
  1503.    
  1504.     # 茂みの同期
  1505.     new_sprite.bush_depth = old_sprite.bush_depth
  1506.   end
  1507.   #--------------------------------------------------------------------------
  1508.   # ● レイヤー接合スプライトの同期 [新規]
  1509.   #--------------------------------------------------------------------------
  1510.   def set_junction_sprite(new_sprite, old_sprite)
  1511.     new_sprite.bitmap  = old_sprite.bitmap
  1512.     new_sprite.visible = old_sprite.visible
  1513.     new_sprite.x = old_sprite.x
  1514.     new_sprite.y = old_sprite.y
  1515.     new_sprite.z = old_sprite.z
  1516.     # new_sprite.zoom_x = old_sprite.zoom_x # 同期は可能だが演算量の増加&面倒
  1517.     # new_sprite.zoom_y = old_sprite.zoom_y # 同期は可能だが演算量の増加&面倒
  1518.     # new_sprite.angle  = old_sprite.angle  # 完全な同期は困難
  1519.     # new_sprite.wave_amp    = old_sprite.wave_amp
  1520.     # new_sprite.wave_length = old_sprite.wave_length
  1521.     # new_sprite.wave_speed  = old_sprite.wave_speed
  1522.     # new_sprite.wave_phase  = old_sprite.wave_phase  # 同期は可能だが演算量の増加&面倒
  1523.     # new_sprite.mirror = old_sprite.mirror # 同期は可能だが演算量の増加&面倒
  1524.     new_sprite.bush_opacity = old_sprite.bush_opacity
  1525.     new_sprite.opacity    = old_sprite.opacity
  1526.     new_sprite.blend_type = old_sprite.blend_type
  1527.     new_sprite.color      = old_sprite.color
  1528.     new_sprite.tone       = old_sprite.tone
  1529.   end
  1530.   #--------------------------------------------------------------------------
  1531.   # ● レイヤー接合スプライトの取得 [新規]
  1532.   #--------------------------------------------------------------------------
  1533.   def get_junction_sprite
  1534.     @sprites_cash ||= []
  1535.     if @sprites_cash_size < @sprites_cash.size
  1536.       sprite = @sprites_cash[@sprites_cash_size]
  1537.     else
  1538.       @sprites_cash.push sprite = Sprite.new
  1539.     end
  1540.     @sprites_cash_size += 1
  1541.     return sprite
  1542.   end
  1543.   #--------------------------------------------------------------------------
  1544.   # ● レイヤー接合スプライトの解放 [新規]
  1545.   #--------------------------------------------------------------------------
  1546.   def dispose_junction_sprites
  1547.     return unless @sprites_cash # レイヤー接合を行っていない
  1548.     (@sprites_cash.size - @sprites_cash_size).times { @sprites_cash.pop.dispose }
  1549.     if @sprites_cash_size == 0  # 転送元原点の初期化が必要か?
  1550.       reset_sprite_origin # 転送元原点の再設定
  1551.       @sprites_cash = nil
  1552.     end
  1553.   end
  1554.   #--------------------------------------------------------------------------
  1555.   # ● アニメーション用のビューポートを取得 [新規]
  1556.   #--------------------------------------------------------------------------
  1557.   def get_animation_viewport
  1558.     floor = @character.current_floor
  1559.     # 現在の階層のビューポートで再生が真、または現在の階層のビューポートが非表示の場合
  1560.     return multi_viewport[floor] if $game_map.animation_current_floor || !multi_viewport[floor].visible
  1561.     # 通常再生(非表示のビューポートを除いた最上層のビューポートで再生)
  1562.     return multi_viewport.reverse.find { |viewport| viewport.visible } || multi_viewport[floor]
  1563.   end
  1564.   #--------------------------------------------------------------------------
  1565.   # ● 一時的にビューポートを変更してブロックを実行 [新規]
  1566.   #--------------------------------------------------------------------------
  1567.   def temp_viewport
  1568.     temp = self.viewport
  1569.     self.viewport = get_animation_viewport
  1570.     yield # ブロックを実行
  1571.     self.viewport = temp
  1572.   end
  1573.   #--------------------------------------------------------------------------
  1574.   # ● フキダシアイコン表示の開始 [追加]
  1575.   #--------------------------------------------------------------------------
  1576.   alias start_balloon_Multilayer start_balloon
  1577.   def start_balloon
  1578.     temp_viewport do
  1579.       start_balloon_Multilayer
  1580.     end
  1581.   end
  1582.   #--------------------------------------------------------------------------
  1583.   # ● アニメーションの開始 [追加]
  1584.   #--------------------------------------------------------------------------
  1585.   alias start_animation_Multilayer start_animation
  1586.   def start_animation(*args)
  1587.     temp_viewport do
  1588.       start_animation_Multilayer(*args)
  1589.     end
  1590.   end
  1591.   #--------------------------------------------------------------------------
  1592.   # ● アニメーションの更新 [追加]
  1593.   #--------------------------------------------------------------------------
  1594.   alias update_animation_Multilayer update_animation
  1595.   def update_animation
  1596.     return unless animation?
  1597.     temp_viewport do
  1598.       update_animation_Multilayer
  1599.     end
  1600.   end
  1601. end

  1602. #==============================================================================
  1603. # ■ Spriteset_Map
  1604. #------------------------------------------------------------------------------
  1605. #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは
  1606. # Scene_Map クラスの内部で使用されます。
  1607. #==============================================================================
  1608. class Spriteset_Map
  1609.   #--------------------------------------------------------------------------
  1610.   # ● マルチレイヤーの生成(更新でも使用) [新規]
  1611.   #--------------------------------------------------------------------------
  1612.   def create_multilayer
  1613.     new_size = $game_map.layer_size
  1614.     old_size = @multi_viewport.size
  1615.     if old_size > new_size
  1616.       (old_size - new_size).times do
  1617.         @trash_objects.push @multi_tilemap.pop  # ゴミ箱に移動
  1618.         @trash_objects.push @multi_viewport.pop # ゴミ箱に移動
  1619.       end
  1620.     elsif old_size < new_size
  1621.       (new_size - old_size).times do
  1622.         @multi_viewport.push viewport = Viewport.new  # 不足しているビューポートを生成
  1623.         @multi_tilemap.push Tilemap.new(viewport)     # 不足しているタイルマップを生成
  1624.       end
  1625.     end
  1626.     $game_temp.multi_viewport_accessor = @multi_viewport
  1627.   end
  1628.   #--------------------------------------------------------------------------
  1629.   # ● マルチタイルマップにマップデータをセット [新規]
  1630.   #--------------------------------------------------------------------------
  1631.   def set_multi_tilemap
  1632.     multi_map_data = $game_map.multi_map_data
  1633.     multi_map_data.each_index do |index|
  1634.       @multi_tilemap[index].map_data = multi_map_data[index].data # マップデータをセット
  1635.     end
  1636.   end
  1637.   #--------------------------------------------------------------------------
  1638.   # ● 前景スプライトを格納する配列の作成 [新規]
  1639.   #--------------------------------------------------------------------------
  1640.   def create_foreground_sprites
  1641.     sprite_managers = $game_map.foreground_sprites
  1642.     @foreground_sprites = Array.new(sprite_managers.size) do |index|
  1643.       sprite_manager = sprite_managers[index]
  1644.       next nil unless sprite_manager.bitmap_name
  1645.       sprite = Sprite.new(@multi_viewport[index])                 # スプライトを生成
  1646.       if !sprite_manager.bitmap_change?
  1647.         sprite.bitmap = Cache.picture(sprite_manager.bitmap_name) # ビットマップを設定
  1648.       end
  1649.       next sprite
  1650.     end
  1651.   end
  1652.   #--------------------------------------------------------------------------
  1653.   # ● オブジェクト初期化 [追加]
  1654.   #--------------------------------------------------------------------------
  1655.   alias initialize_Multilayer initialize
  1656.   def initialize
  1657.     @multi_viewport = []  # ビューポートを格納する配列
  1658.     @multi_tilemap  = []  # タイルマップを格納する配列
  1659.     @trash_objects  = []  # ゴミ箱(更新処理の最後で解放処理をして消去)
  1660.     create_multilayer
  1661.     create_foreground_sprites
  1662.     initialize_Multilayer
  1663.   end
  1664.   #--------------------------------------------------------------------------
  1665.   # ● ビューポートの作成 [◆再定義]
  1666.   #--------------------------------------------------------------------------
  1667.   def create_viewports
  1668.     @viewport1 = @multi_viewport[0] # @viewport1 の代替として最下層を割り当てておく
  1669.     @viewport2 = Viewport.new
  1670.     @viewport3 = Viewport.new
  1671.     @viewport2.z = 50
  1672.     @viewport3.z = 100
  1673.   end
  1674.   #--------------------------------------------------------------------------
  1675.   # ● タイルマップの作成 [◆再定義]
  1676.   #--------------------------------------------------------------------------
  1677.   def create_tilemap
  1678.     # マルチレイヤーの生成でタイルマップは生成済み
  1679.     set_multi_tilemap # マップデータをセットする
  1680.     load_tileset      # タイルセットを読み込む
  1681.   end
  1682.   #--------------------------------------------------------------------------
  1683.   # ● タイルセットのロード [◆再定義]
  1684.   #--------------------------------------------------------------------------
  1685.   def load_tileset
  1686.     @multi_tileset = $game_map.multi_tileset.dup  # 後で更新の比較に使用するので参照ではなくコピー
  1687.     @multi_tilemap.each_index do |index|
  1688.       tileset = $game_map.tileset(index)
  1689.       tilemap = @multi_tilemap[index]
  1690.       tileset.tileset_names.each_with_index do |name, i|
  1691.         tilemap.bitmaps[i] = Cache.tileset(name)
  1692.       end
  1693.       Calt::BITMAP_CLEAR_TILE.each { |id| clear_tile_rect(tilemap.bitmaps, id) }  # 上層タイルの画像を消去
  1694.       tilemap.flags = tileset.flags
  1695.     end
  1696.   end
  1697.   #--------------------------------------------------------------------------
  1698.   # ● 上層タイルの画像を消去 [新規]
  1699.   #--------------------------------------------------------------------------
  1700.   def clear_tile_rect(bitmaps, tile_id)
  1701.     return unless tile_id < 1024
  1702.     number = tile_id % 256  # タイルの位置
  1703.     rect_x = 32 * (number % 8 + number / 128 * 8) # x座標
  1704.     rect_y = 32 * (number % 128 / 8)              # y座標
  1705.     bitmaps[tile_id / 256 + 5].clear_rect(rect_x, rect_y, 32, 32)
  1706.   end
  1707.   #--------------------------------------------------------------------------
  1708.   # ● キャラクタースプライトの作成 [◆再定義]
  1709.   #--------------------------------------------------------------------------
  1710.   def create_characters
  1711.     @character_sprites = []
  1712.     $game_map.events.values.each do |event|
  1713.       @character_sprites.push(Sprite_Character.new(nil, event))
  1714.     end
  1715.     $game_map.vehicles.each do |vehicle|
  1716.       @character_sprites.push(Sprite_Character.new(nil, vehicle))
  1717.     end
  1718.     $game_player.followers.reverse_each do |follower|
  1719.       @character_sprites.push(Sprite_Character.new(nil, follower))
  1720.     end
  1721.     @character_sprites.push(Sprite_Character.new(nil, $game_player))
  1722.     @map_group_id = $game_map.map_group_id  # マップのグループのID
  1723.   end
  1724.   #--------------------------------------------------------------------------
  1725.   # ● 飛行船の影スプライトの作成 [追加]
  1726.   #--------------------------------------------------------------------------
  1727.   alias create_shadow_Multilayer create_shadow
  1728.   def create_shadow
  1729.     create_shadow_Multilayer
  1730.     @shadow_sprite.viewport = @multi_viewport[$game_map.airship.current_floor]
  1731.   end
  1732.   #--------------------------------------------------------------------------
  1733.   # ● 解放 [追加]
  1734.   #--------------------------------------------------------------------------
  1735.   alias dispose_Multilayer dispose
  1736.   def dispose
  1737.     dispose_foreground_sprites
  1738.     dispose_Multilayer
  1739.     dispose_trash_objects
  1740.   end
  1741.   #--------------------------------------------------------------------------
  1742.   # ● 前景スプライトの解放 [新規]
  1743.   #--------------------------------------------------------------------------
  1744.   def dispose_foreground_sprites
  1745.     @foreground_sprites.each { |sprite| sprite.dispose if sprite }
  1746.   end
  1747.   #--------------------------------------------------------------------------
  1748.   # ● タイルマップの解放 [◆再定義]
  1749.   #--------------------------------------------------------------------------
  1750.   def dispose_tilemap
  1751.     @multi_tilemap.each { |tilemap| tilemap.dispose }
  1752.   end
  1753.   #--------------------------------------------------------------------------
  1754.   # ● ビューポートの解放 [◆再定義]
  1755.   #--------------------------------------------------------------------------
  1756.   def dispose_viewports
  1757.     @multi_tilemap.each { |viewport| viewport.dispose }
  1758.     @viewport2.dispose
  1759.     @viewport3.dispose
  1760.   end
  1761.   #--------------------------------------------------------------------------
  1762.   # ● 不要になったオブジェクトの解放 [新規]
  1763.   #--------------------------------------------------------------------------
  1764.   def dispose_trash_objects
  1765.     return if @trash_objects.empty?
  1766.     @trash_objects.each { |object| object.dispose }
  1767.     @trash_objects.clear
  1768.   end
  1769.   #--------------------------------------------------------------------------
  1770.   # ● フレーム更新 [追加]
  1771.   #--------------------------------------------------------------------------
  1772.   alias update_Multilayer update
  1773.   def update
  1774.     update_multilayer     # 場所移動を確認したらレイヤー数の調整を行う。
  1775.     update_foreground_sprites
  1776.     update_Multilayer
  1777.     dispose_trash_objects # レイヤー数の調整で出たゴミを解放
  1778.   end
  1779.   #--------------------------------------------------------------------------
  1780.   # ● マルチレイヤーの更新 [新規]
  1781.   #--------------------------------------------------------------------------
  1782.   def update_multilayer
  1783.     if @map_group_id != $game_map.map_group_id
  1784.       create_multilayer
  1785.       set_multi_tilemap
  1786.     end
  1787.   end
  1788.   #--------------------------------------------------------------------------
  1789.   # ● 前景スプライトの更新 [新規]
  1790.   #--------------------------------------------------------------------------
  1791.   def update_foreground_sprites
  1792.     if @map_group_id != $game_map.map_group_id
  1793.       dispose_foreground_sprites
  1794.       create_foreground_sprites
  1795.     end
  1796.     @foreground_sprites.each_index do |index|
  1797.       sprite = @foreground_sprites[index]
  1798.       sprite_manager = $game_map.foreground_sprites[index]        # スプライトの管理クラス
  1799.       if sprite_manager.create_sprite? && !sprite
  1800.         sprite = Sprite.new(@multi_viewport[index])               # スプライトを生成
  1801.         @foreground_sprites[index] = sprite
  1802.       end
  1803.       if sprite_manager.dispose_sprite? && sprite
  1804.         sprite.dispose                                            # スプライトを解放
  1805.         sprite = nil
  1806.         @foreground_sprites[index] = sprite
  1807.       end
  1808.       if sprite_manager.bitmap_change?
  1809.         sprite.bitmap = Cache.picture(sprite_manager.bitmap_name) # ビットマップを更新
  1810.       end
  1811.       sprite_manager.update(sprite)                               # スプライトを更新
  1812.     end
  1813.   end
  1814.   #--------------------------------------------------------------------------
  1815.   # ● タイルセットの更新 [◆再定義]
  1816.   #--------------------------------------------------------------------------
  1817.   def update_tileset
  1818.     if @multi_tileset != $game_map.multi_tileset
  1819.       load_tileset
  1820.       refresh_characters
  1821.     end
  1822.   end
  1823.   #--------------------------------------------------------------------------
  1824.   # ● タイルマップの更新 [◆再定義]
  1825.   #--------------------------------------------------------------------------
  1826.   def update_tilemap
  1827.     tilemap_ox = $game_map.display_x * 32
  1828.     tilemap_oy = $game_map.display_y * 32
  1829.     @multi_tilemap.each_index do |index|
  1830.       tilemap = @multi_tilemap[index]
  1831.       tilemap.ox = tilemap_ox
  1832.       tilemap.oy = tilemap_oy
  1833.       tilemap.update
  1834.     end
  1835.   end
  1836.   #--------------------------------------------------------------------------
  1837.   # ● キャラクタースプライトの更新 [◆再定義]
  1838.   #--------------------------------------------------------------------------
  1839.   def update_characters
  1840.     refresh_characters if @map_group_id != $game_map.map_group_id
  1841.     @character_sprites.each {|sprite| sprite.update }
  1842.   end
  1843.   #--------------------------------------------------------------------------
  1844.   # ● 飛行船の影スプライトの更新 [追加]
  1845.   #--------------------------------------------------------------------------
  1846.   alias update_shadow_Multilayer update_shadow
  1847.   def update_shadow
  1848.     @shadow_sprite.viewport = @multi_viewport[$game_map.airship.current_floor]
  1849.     update_shadow_Multilayer
  1850.   end
  1851.   #--------------------------------------------------------------------------
  1852.   # ● ビューポートの更新 [◆再定義]
  1853.   #--------------------------------------------------------------------------
  1854.   NONE_TONE = Tone.new(0, 0, 0, 0)
  1855.   def update_viewports
  1856.     tone_viewport = @viewport1  # トーンを反映するビューポート
  1857.     @multi_viewport.each do |viewport|
  1858.       viewport.tone.set(NONE_TONE)
  1859.       viewport.ox = $game_map.screen.shake
  1860.       viewport.update
  1861.       tone_viewport = viewport if viewport.visible
  1862.     end
  1863.     tone_viewport.tone.set($game_map.screen.tone) # 非表示でない最上層のビューポート
  1864.     @viewport2.color.set($game_map.screen.flash_color)
  1865.     @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  1866.     @viewport2.update
  1867.     @viewport3.update
  1868.   end
  1869. end
复制代码
MultilayerTileset.png(TilesetE)放在\Graphics\Tilesets
  
作者: qknight    时间: 2014-11-1 06:34
tseyik 发表于 2014-10-31 17:44
http://canarialt.blog.fc2.com/blog-entry-57.html
你試試這個改良版的layer脚本
画面座標を整数値に補正

网络连接错误,下不下来范例,自己摸索了一下,结果就是……
269行报错
unknow regexp options-MapIf
作者: tseyik    时间: 2014-11-1 09:11
範本
CAltScript.zip (2.12 MB, 下载次数: 167)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1