查看: 2237|回复: 3

[已经过期] 语法问题,如何将一个代码块框起来?

[复制链接]
梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2016-2-10 23:24:39 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 七重 于 2016-2-10 23:57 编辑

如何将一个代码块框起来?

遇到两个脚本冲突。
因为其中一个脚本只在一张地图用到。
所以我打算用开关控制是否运行这两个脚本。

当某个开关打开时才执行脚本。
↓
==================================

if $game_switches[??] == ture
  {
     想控制的脚本代码
}

==================================

这个是错的。
记得以前好像看过是有这么一个写法的,但是又记不清楚具体怎么写,正确的写法应该是什么呢。。?

这个问题好像很小白。。但是没有找到。。十分抱歉又来伸手

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2016-2-11 00:18:44 | 显示全部楼层
若脚本本身没提供相应的功能的话
除非你看得懂该脚本,否则请不要这么进行尝试
回复

使用道具 举报

梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

 楼主| 发表于 2016-2-11 08:02:11 | 显示全部楼层
本帖最后由 七重 于 2016-2-11 08:08 编辑
喵呜喵5 发表于 2016-2-11 00:18
若脚本本身没提供相应的功能的话
除非你看得懂该脚本,否则请不要这么进行尝试 ...


好像是有点乱来。。

出现冲突的脚本是:
ulds,
Khas Awesome Light Effects
以及一个没有作者信息的脚本layer,效果是将多个地图的内容在一个地图分层显示,效果和立交桥脚本差不多。附上代码。
(有冲突的就是第三个,其实和很多脚本冲突,之前本来放弃用这个了,但是这个效果有点炫啊。。所以想要抢救一下)
layer代码

  1. #这是某天在6r上面拉下来的脚本。本身就没有标注作者信息
  2. #==============================================================================
  3. # ■ Game_System
  4. #------------------------------------------------------------------------------
  5. #  システム周りのデータを扱うクラスです。乗り物や BGM などの管理も行います。
  6. # このクラスのインスタンスは $game_system で参照されます。
  7. #==============================================================================
  8. class Game_System
  9.   #--------------------------------------------------------------------------
  10.   # ● 公開インスタンス変数
  11.   #--------------------------------------------------------------------------
  12.   attr_accessor :layer                    # レイヤー
  13.   #--------------------------------------------------------------------------
  14.   # ● オブジェクト初期化
  15.   #--------------------------------------------------------------------------
  16.   alias game_system_initialize initialize
  17.   def initialize
  18.     game_system_initialize
  19.     @layer = -1
  20.   end
  21. end

  22. #==============================================================================
  23. # ■ Game_Temp
  24. #------------------------------------------------------------------------------
  25. #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン
  26. # スタンスは $game_temp で参照されます。
  27. #==============================================================================
  28. class Game_Temp
  29.   #--------------------------------------------------------------------------
  30.   # ● 定数
  31.   #--------------------------------------------------------------------------
  32.   MAX_LAYER = 5       # レイヤの最大数
  33.   #--------------------------------------------------------------------------
  34.   # ● 公開インスタンス変数
  35.   #--------------------------------------------------------------------------
  36.   attr_accessor :map_name   #再読み込み回避
  37.   attr_accessor :link_array #再読み込み回避
  38.   attr_accessor :check      #再読み込み回避
  39.   #--------------------------------------------------------------------------
  40.   # ● オブジェクト初期化
  41.   #--------------------------------------------------------------------------
  42.   alias game_temp_initialize initialize
  43.   def initialize
  44.     game_temp_initialize
  45.     @map_name = []     #再読み込み回避
  46.     @link_array = [[0]]  #再読み込み回避
  47.     @check = false     #再読み込み回避
  48.     create_link_data
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ● マップの親IDを探す
  52.   #--------------------------------------------------------------------------
  53.   def get_parent_map_id(map_id)
  54.     return @link_array[map_id][0]
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● リンク配列を作成する。
  58.   #--------------------------------------------------------------------------
  59.   def create_link_data
  60.     return if @check
  61.     return if $BTEST
  62.    
  63.     range = 0..MAX_LAYER-1
  64.     id_array = []
  65.     $data_mapinfos.each do | i,data |
  66.       @map_name[i] = data.name
  67.       id_array.push(i)
  68.     end
  69.    
  70.     id_array.each do | id |
  71.       buf = []
  72.       name = @map_name[id].gsub(/\<(\w+)\>/,"")
  73.       name = name.gsub(/\[(\w+)\]/,"")
  74.       
  75.       id_array.each do |id2|
  76.         temp_name = @map_name[id2]
  77.         if temp_name.match(name) && temp_name.match(/\<lay(\d+)\>/)
  78.           buf[$1.to_i] = id2
  79.         end
  80.       end
  81.       buf[0] = id if buf[0] == nil
  82.       @link_array[id] = buf
  83.     end
  84.     @check = true
  85.   end
  86. end

  87. #==============================================================================
  88. # ■ Game_Map
  89. #------------------------------------------------------------------------------
  90. #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
  91. # このクラスのインスタンスは $game_map で参照されます。
  92. #==============================================================================
  93. class Game_Map
  94.   #--------------------------------------------------------------------------
  95.   # ● 定数
  96.   #--------------------------------------------------------------------------
  97.   MAX_EVENT = 1000    # 1レイヤ当たりのイベント数
  98.   MAX_LAYER = 5       # レイヤの最大数
  99.   LAYER_UP = 1022     # レイヤを上げるチップID
  100.   LAYER_DW = 1023     # レイヤを下げるチップID
  101.   #--------------------------------------------------------------------------
  102.   # ● 公開インスタンス変数
  103.   #--------------------------------------------------------------------------
  104.   attr_accessor :name
  105.   attr_accessor :para_layer
  106.   attr_accessor :spe_layer
  107.   attr_reader   :spe_picture_name
  108.   attr_reader   :spe_picture_layer
  109.   attr_reader   :fog_name            # フォグ ファイル名
  110.   attr_reader   :map_lay
  111.   #--------------------------------------------------------------------------
  112.   # ● セットアップ
  113.   #     map_id : マップ ID
  114.   #     enable : 所属レイヤーの変更
  115.   #--------------------------------------------------------------------------
  116.   def setup(map_id,enable=false)
  117.    
  118.     #########################################################################
  119.     #レイヤー
  120.     @map_id = map_id
  121.     @name = $data_mapinfos[@map_id].name
  122.     @map_lay = []         #各レイヤーのマップデータ
  123.     @layer_no = 0
  124.     $game_player.set_active_layer(0)
  125.    
  126.     @pl_layer = 0
  127.     @name.gsub(/\<lay(\d+)\>/i) { @pl_layer = enable || $game_system.layer == -1 ? $1.to_i : $game_system.layer }
  128.     $game_player.set_active_layer(@pl_layer)
  129.     $game_player.link_layer_followers      #フォロワーのレイヤーをリンク
  130.    
  131.     @layer_num = $game_temp.link_array[@map_id].size
  132.     @map_id = $game_temp.link_array[@map_id][0]
  133.    
  134.     #リンクするマップをレイヤーとして読み込む
  135.     @spe_picture_name = ""
  136.     @para_layer = 0
  137.     $game_temp.link_array[@map_id].each do | id |
  138.       @map_lay.push(load_data(sprintf("Data/Map%03d.rvdata2",id)))
  139.       link_name = $game_temp.map_name[id]
  140.       link_id = $game_temp.link_array[@map_id].index(id)
  141.       link_name.gsub(/<para>/)   { @para_layer = link_id }
  142.       link_name.gsub(/\[(\w+)\]/){ set_spe_picture(link_id,$1) }
  143.     end
  144.     set_layer_no(0)
  145.     @map_lay.each { |map| map.display_name = @map_lay[0].display_name }
  146.         
  147.     @display_x = [0,0,0,0,0]
  148.     @display_y = [0,0,0,0,0]
  149.     @speed_x = [0,0,0,0,0]
  150.     @speed_y = [0,0,0,0,0]
  151.     #########################################################################
  152.    
  153.     @tileset_id = []
  154.     @map_lay.each {|map| @tileset_id.push(map.tileset_id)}
  155.    
  156.     referesh_vehicles
  157.     setup_events
  158.     setup_scroll
  159.     setup_parallax
  160.     setup_fog
  161.     setup_battleback
  162.     setup_event_list
  163.     @need_refresh = false
  164.   end
  165.   #--------------------------------------------------------------------------
  166.   # ● フレーム更新
  167.   #     main : インタプリタ更新フラグ
  168.   #--------------------------------------------------------------------------
  169.   def update(main = false)
  170.     refresh if @need_refresh
  171.     update_interpreter if main
  172.     update_scroll
  173.     update_move_layer
  174.     update_events
  175.     update_event_list
  176.     update_vehicles
  177.     update_parallax
  178.     update_fog
  179.     @screen.update
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   # ● タイルセットの取得
  183.   #--------------------------------------------------------------------------
  184.   def tileset(lay=0)
  185.     $data_tilesets[@tileset_id[lay]]
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # ● イベントのセットアップ
  189.   #--------------------------------------------------------------------------
  190.   def setup_events
  191.     @events = {}
  192.     @map_lay.each_with_index do | map,index |
  193.       map.events.each do |i, event|
  194.         event.id += MAX_EVENT*index
  195.         @events[i+MAX_EVENT*index] = Game_Event.new(@map_id, event)
  196.       end
  197.     end
  198.    
  199.     @common_events = parallel_common_events.collect do |common_event|
  200.       Game_CommonEvent.new(common_event.id)
  201.     end
  202.     refresh_tile_events
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ● キャラクターを優先順位が低い順に並べた配列を生成する。
  206.   #--------------------------------------------------------------------------
  207.   def setup_event_list
  208.     @atari_array = []
  209.    
  210.     #イベントの場合
  211.     $game_map.events.each_value do |ev|
  212.       next if ev.event.name.index("接続イベント")
  213.       @atari_array.push(ev)
  214.     end

  215.     #乗り物の場合
  216.     $game_map.vehicles.each do |vehicle|
  217.       @atari_array.push(vehicle)
  218.     end
  219.    
  220.     #フォロワーの場合
  221.     $game_player.followers.reverse_each do |follower|
  222.       @atari_array.push(follower)
  223.     end
  224.    
  225.     #プレイヤーの場合
  226.     @atari_array.push($game_player)   
  227.   end
  228.   #--------------------------------------------------------------------------
  229.   # ● キャラクターを優先順位が低い順に並べた配列を生成する。
  230.   #--------------------------------------------------------------------------
  231.   def update_event_list
  232.     return unless SceneManager.scene_is?(Scene_Map)
  233.    
  234.     sprite_ctrl = SceneManager.scene.spriteset
  235.     return if sprite_ctrl == nil
  236.     return if sprite_ctrl.spriteset.size != get_layer_num
  237.    
  238.     @pri_array = []
  239.     @atari_array.each do |ev|
  240.       if ev.instance_of?(Game_Event) || ev.instance_of?(Game_Vehicle)
  241.         @pri_array.push(ev) if ev.pre_hit?
  242.       else
  243.         @pri_array.push(ev)
  244.       end
  245.     end
  246.    
  247.     @pri_array.sort! {|a,b| a.priority_type*1000000 + a.y*100000 + d_sprite(a).z*100 + a.sprite_id <=> b.priority_type*1000000 + b.y*100000 + d_sprite(b).z*100 + b.sprite_id}
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● キャラクターを優先順位が低い順に並べた配列を取得する。
  251.   #--------------------------------------------------------------------------
  252.   def event_list
  253.     @pri_array
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● イベントに対応したスプライト
  257.   #--------------------------------------------------------------------------
  258.   def d_sprite(ev)
  259.     sprite_ctrl = SceneManager.scene.spriteset
  260.     return sprite_ctrl.spriteset[ev.active_layer].character_sprites[ev.sprite_id]
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 乗っているタイルIDを取得する
  264.   #--------------------------------------------------------------------------
  265.   def get_chip_id(x=$game_player.x,y=$game_player.y,layer=0)
  266.     [2, 1, 0].each do |i|
  267.       tile_id = @map_lay[layer].data[x, y, i]
  268.       return tile_id if tile_id != 0      # タイル ID 取得できたら終了      
  269.     end   
  270.     return nil
  271.   end
  272.   #--------------------------------------------------------------------------
  273.   # ● 取得するレイヤーNoの設定
  274.   #--------------------------------------------------------------------------
  275.   def set_layer_no(no)
  276.     @layer_no = no
  277.     @layer_no %= @layer_num
  278.     @layer_no = 0 if @layer_no < 0
  279.     @map = @map_lay[@layer_no]
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   # ● レイヤー数の取得
  283.   #--------------------------------------------------------------------------
  284.   def get_layer_num
  285.     return @layer_num
  286.   end
  287.   #--------------------------------------------------------------------------
  288.   # ● リージョン ID の取得
  289.   #--------------------------------------------------------------------------
  290.   def region_id(x, y, layer=$game_player.active_layer)
  291.     valid?(x, y) ? @map_lay[layer].data[x, y, 3] >> 8 : 0
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # ● エンカウントリストの取得
  295.   #--------------------------------------------------------------------------
  296.   def encounter_list
  297.     @map_lay[$game_player.active_layer].encounter_list
  298.   end
  299.   #--------------------------------------------------------------------------
  300.   # ● エンカウント歩数の取得
  301.   #--------------------------------------------------------------------------
  302.   def encounter_step
  303.     @map_lay[$game_player.active_layer].encounter_step
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # ● マップデータの取得
  307.   #--------------------------------------------------------------------------
  308.   def data
  309.     return @map_lay[@layer_no].data
  310.   end
  311.   #--------------------------------------------------------------------------
  312.   # ● 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得
  313.   #--------------------------------------------------------------------------
  314.   def tile_events_xy(x, y, layer=0)
  315.     @tile_events.select {|event| event.pos_nt?(x, y) && event.active_layer==layer }
  316.   end
  317.   #--------------------------------------------------------------------------
  318.   # ● 指定座標にある全てのタイル(イベント含む)を配列で取得
  319.   #--------------------------------------------------------------------------
  320.   def all_tiles(x, y, layer=0)
  321.     tile_events_xy(x, y, layer).collect {|ev| ev.tile_id} + layered_tiles(x, y)
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ● 通行可能判定
  325.   #     x    : X 座標
  326.   #     y    : Y 座標
  327.   #     flag : 調べる通行禁止ビット (通常 0x01、乗り物の場合のみ変更)
  328.   #--------------------------------------------------------------------------
  329.   def passable?(x, y, d, active_layer=0)
  330.     check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f, active_layer)
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 小型船の通行可能判定
  334.   #--------------------------------------------------------------------------
  335.   def boat_passable?(x, y, active_layer=0)
  336.     check_passage(x, y, 0x0200, active_layer)
  337.   end
  338.   #--------------------------------------------------------------------------
  339.   # ● 大型船の通行可能判定
  340.   #--------------------------------------------------------------------------
  341.   def ship_passable?(x, y, active_layer=0)
  342.     check_passage(x, y, 0x0400, active_layer)
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 通行チェック
  346.   #     bit : 調べる通行禁止ビット
  347.   #--------------------------------------------------------------------------
  348.   def check_passage(x, y, bit, active_layer=0)
  349.    
  350.     set_layer_no(active_layer)
  351.     if bit == 0x0200 || bit == 0x0400
  352.       if LAYER_DW == tile_id(x,y,2) || LAYER_UP == tile_id(x,y,2)
  353.         return true
  354.       end
  355.     end
  356.    
  357.     check_layer = active_layer
  358.    
  359.     #上レイヤーの接続チップは"上"のみチェック
  360.     if LAYER_UP == tile_id(x,y,2)
  361.       check_layer += 1
  362.     elsif LAYER_DW == tile_id(x,y,2)
  363.       check_layer -= 1
  364.     end
  365.     set_layer_no(check_layer)
  366.    
  367.     all_tiles(x, y, check_layer).each do |tile_id|
  368.       flag = tileset(check_layer).flags[tile_id]
  369.       next if flag & 0x10 != 0  # [☆] : 通行に影響しない
  370.       if flag & bit == 0        # [○] : 通行可
  371.         set_layer_no(active_layer)
  372.         return true
  373.       end
  374.       if flag & bit == bit      # [×] : 通行不可
  375.         set_layer_no(active_layer)
  376.         return false
  377.       end
  378.     end
  379.     set_layer_no(active_layer)
  380.     return false                # 通行不可
  381.   end
  382.   #--------------------------------------------------------------------------
  383.   # ● 横方向にループするか?
  384.   #--------------------------------------------------------------------------
  385.   def loop_horizontal?(lay=0)
  386.     return false if lay > @layer_num-1
  387.     return (@map_lay[lay].scroll_type == 2 or @map_lay[lay].scroll_type == 3)
  388.   end
  389.   #--------------------------------------------------------------------------
  390.   # ● 縦方向にループするか?
  391.   #--------------------------------------------------------------------------
  392.   def loop_vertical?(lay=0)
  393.     return false if lay > @layer_num-1
  394.     return (@map_lay[lay].scroll_type == 1 or @map_lay[lay].scroll_type == 3)
  395.   end  
  396.   #--------------------------------------------------------------------------
  397.   # ● ダッシュ禁止か否かの取得
  398.   #--------------------------------------------------------------------------
  399.   def disable_dash?
  400.     return @map_lay[0].disable_dashing
  401.   end
  402.   #--------------------------------------------------------------------------
  403.   # ● 遠景のセットアップ
  404.   #--------------------------------------------------------------------------
  405.   alias setup_parallax_game_map setup_parallax
  406.   def setup_parallax
  407.     old_map = @map
  408.     @map = @map_lay[@para_layer]
  409.     setup_parallax_game_map
  410.     @map = old_map
  411.   end
  412.   #--------------------------------------------------------------------------
  413.   # ● タイルセットの変更
  414.   #--------------------------------------------------------------------------
  415.   def change_tileset(tileset_id)
  416.     @tileset_id.each_with_index do |t,i|
  417.       if @tileset_id != nil
  418.         @tileset_id[i] = tileset_id
  419.       end      
  420.     end
  421.     refresh
  422.   end
  423.   #--------------------------------------------------------------------------
  424.   # ● BGM / BGS 自動切り替え
  425.   #--------------------------------------------------------------------------
  426.   alias autoplay_game_map autoplay
  427.   def autoplay
  428.     old_map = @map
  429.     @map = @map_lay[0]
  430.     autoplay_game_map
  431.     @map = old_map
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ● 茂み判定
  435.   #     x : X 座標
  436.   #     y : Y 座標
  437.   #--------------------------------------------------------------------------
  438.   def bush?(x, y, layer=0)
  439.     @map = @map_lay[layer]
  440.     valid?(x, y) && layered_tiles_flag?(x, y, 0x40)
  441.   end
  442.   #--------------------------------------------------------------------------
  443.   # ● 地形タグの取得
  444.   #--------------------------------------------------------------------------
  445.   alias terrain_tag_layer terrain_tag
  446.   def terrain_tag(x, y, layer=0)
  447.     @map = @map_lay[layer]
  448.     terrain_tag_layer(x, y)
  449.   end
  450.   #--------------------------------------------------------------------------
  451.   # ● カウンター判定
  452.   #     x : X 座標
  453.   #     y : Y 座標
  454.   #--------------------------------------------------------------------------
  455.   def counter?(x, y, layer=0)
  456.     @map = @map_lay[layer]
  457.     valid?(x, y) && layered_tiles_flag?(x, y, 0x80)
  458.   end
  459.   #--------------------------------------------------------------------------
  460.   # ● レイヤースクロール
  461.   #--------------------------------------------------------------------------
  462.   def set_move_layer(lay,speed_x,speed_y)
  463.     @speed_x[lay] = speed_x
  464.     @speed_y[lay] = speed_y
  465.   end
  466.   #--------------------------------------------------------------------------
  467.   # ● レイヤースクロール
  468.   #--------------------------------------------------------------------------
  469.   def update_move_layer
  470.     return if scrolling?  #通常のスクロール処理が行われている
  471. #    return unless scrolling?
  472.    
  473.     @speed_x.each_with_index do | x,i |
  474.       a_x = x
  475. #      a_x += @speed_x[$game_player.active_layer] if $game_player.active_layer != i
  476.       if a_x > 0
  477.         scroll_left(2 ** a_x.abs / 256.0,i)
  478.       elsif a_x < 0
  479.         scroll_right(2 ** a_x.abs / 256.0,i)
  480.       end
  481.     end
  482.     @speed_y.each_with_index do | y,i |
  483.       a_y = y
  484. #      a_y += @speed_y[$game_player.active_layer] if $game_player.active_layer != i
  485.       if a_y > 0
  486.         scroll_up(2 ** a_y.abs / 256.0,i)
  487.       elsif a_y < 0
  488.         scroll_down(2 ** a_y.abs / 256.0,i)
  489.       end
  490.     end
  491.   end
  492.   #--------------------------------------------------------------------------
  493.   # ● 表示位置の設定
  494.   #     x : 新しい表示 X 座標 (*256)
  495.   #     y : 新しい表示 Y 座標 (*256)
  496.   #--------------------------------------------------------------------------
  497.   def set_display_pos(x, y)
  498.     range = 0..4
  499.     range.each do | i |
  500.       x = [0, [x, width - screen_tile_x].min].max unless loop_horizontal?(i)
  501.       y = [0, [y, height - screen_tile_y].min].max unless loop_vertical?(i)
  502.       @display_x[i] = (x + width) % width
  503.       @display_y[i] = (y + height) % height
  504.     end
  505.     @parallax_x = x
  506.     @parallax_y = y
  507.     range.each do | i |
  508.       @fog_x[i] = x
  509.       @fog_y[i] = y
  510.     end
  511.   end
  512.   #--------------------------------------------------------------------------
  513.   # ● 表示座標を差し引いた X 座標の計算
  514.   #     x : X 座標
  515.   #--------------------------------------------------------------------------
  516.   def adjust_x(x,lay=0)
  517.     if loop_horizontal?(lay) && x < @display_x[lay] - (width - screen_tile_x) / 2
  518.       x - @display_x[lay] + @map.width
  519.     else
  520.       x - @display_x[lay]
  521.     end
  522.   end
  523.   #--------------------------------------------------------------------------
  524.   # ● 表示座標を差し引いた Y 座標の計算
  525.   #     y : Y 座標
  526.   #--------------------------------------------------------------------------
  527.   def adjust_y(y,lay=0)
  528.     if loop_vertical?(lay) && y < @display_y[lay] - (height - screen_tile_y) / 2
  529.       y - @display_y[lay] + @map.height
  530.     else
  531.       y - @display_y[lay]
  532.     end
  533.   end
  534.   #--------------------------------------------------------------------------
  535.   # ● 下にスクロール
  536.   #     distance : スクロールする距離
  537.   #--------------------------------------------------------------------------
  538.   def scroll_down(distance,lay=-1)
  539.     range = lay==-1 ? 0..4 : lay..lay   
  540.     range.each do | i |
  541.       if loop_vertical?(i)
  542.         @display_y[i] += distance
  543.         @display_y[i] %= @map.height
  544.         @parallax_y += distance if @parallax_loop_y && i==@para_layer
  545.         @fog_y[i] += distance
  546.       else
  547.         last_y = @display_y[i]
  548.         @display_y[i] = [@display_y[i] + distance, height - screen_tile_y].min
  549.         @parallax_y += @display_y[i] - last_y if i==@para_layer
  550.         @fog_y[i] += @display_y[i] - last_y
  551.       end
  552.     end
  553.   end
  554.   #--------------------------------------------------------------------------
  555.   # ● 左にスクロール
  556.   #     distance : スクロールする距離
  557.   #--------------------------------------------------------------------------
  558.   def scroll_left(distance,lay=-1)
  559.     range = lay==-1 ? 0..4 : lay..lay
  560.     range.each do | i |
  561.       if loop_horizontal?(i)
  562.         @display_x[i] += @map.width - distance
  563.         @display_x[i] %= @map.width
  564.         @parallax_x -= distance if @parallax_loop_x && i==@para_layer
  565.         @fog_x[i] -= distance
  566.       else
  567.         last_x = @display_x[i]
  568.         @display_x[i] = [@display_x[i] - distance, 0].max
  569.         @parallax_x += @display_x[i] - last_x if i==@para_layer
  570.         @fog_x[i] += @display_x[i] - last_x
  571.       end
  572.     end
  573.   end
  574.   #--------------------------------------------------------------------------
  575.   # ● 右にスクロール
  576.   #     distance : スクロールする距離
  577.   #--------------------------------------------------------------------------
  578.   def scroll_right(distance,lay=-1)
  579.     range = lay==-1 ? 0..4 : lay..lay
  580.     range.each do | i |
  581.       if loop_horizontal?(i)
  582.         @display_x[i] += distance
  583.         @display_x[i] %= @map.width
  584.         @parallax_x += distance if @parallax_loop_x && i==@para_layer
  585.         @fog_x[i] += distance
  586.       else
  587.         last_x = @display_x[i]
  588.         @display_x[i] = [@display_x[i] + distance, (width - screen_tile_x)].min
  589.         @parallax_x += @display_x[i] - last_x if i==@para_layer
  590.         @fog_x[i] += @display_x[i] - last_x
  591.       end
  592.     end
  593.   end
  594.   #--------------------------------------------------------------------------
  595.   # ● 上にスクロール
  596.   #     distance : スクロールする距離
  597.   #--------------------------------------------------------------------------
  598.   def scroll_up(distance,lay=-1)
  599.     range = lay==-1 ? 0..4 : lay..lay
  600.     range.each do | i |
  601.       if loop_vertical?(i)
  602.         @display_y[i] += @map.height - distance
  603.         @display_y[i] %= @map.height
  604.         @parallax_y -= distance if @parallax_loop_y if i==@para_layer
  605.         @fog_y[i] -= distance
  606.       else
  607.         last_y = @display_y[i]
  608.         @display_y[i] = [@display_y[i] - distance, 0].max
  609.         @parallax_y += @display_y[i] - last_y if i==@para_layer
  610.         @fog_y[i] += @display_y[i] - last_y
  611.       end
  612.     end
  613.   end
  614.   #--------------------------------------------------------------------------
  615.   # ● スクロールの更新
  616.   #--------------------------------------------------------------------------
  617.   def update_scroll
  618.     return unless scrolling?
  619.     lay = $game_player.active_layer
  620.     last_x = @display_x[lay]
  621.     last_y = @display_y[lay]
  622.     do_scroll(@scroll_direction, scroll_distance)
  623.     if @display_x[lay] == last_x && @display_y[lay] == last_y
  624.       @scroll_rest = 0
  625.     else
  626.       @scroll_rest -= scroll_distance
  627.     end
  628.   end
  629.   #--------------------------------------------------------------------------
  630.   # ● 挟み込む特殊ピクチャスプライトを表示
  631.   #--------------------------------------------------------------------------
  632.   def set_spe_picture(layer,filename)
  633.     @spe_picture_name = filename
  634.     @spe_picture_layer = layer
  635.   end
  636.   #--------------------------------------------------------------------------
  637.   # ● 挟み込む特殊ピクチャスプライトを表示
  638.   #--------------------------------------------------------------------------
  639.   def get_spe_picture
  640.     return @spe_picture_name
  641.   end
  642.   #--------------------------------------------------------------------------
  643.   # ● 挟み込む特殊ピクチャスプライトを解放
  644.   #--------------------------------------------------------------------------
  645.   def clear_spe_picture
  646.     @spe_picture_name = ""   
  647.   end
  648.   #--------------------------------------------------------------------------
  649.   # ● フォグの更新
  650.   #--------------------------------------------------------------------------
  651.   def update_fog
  652.     range = 0..4
  653.     range.each do | i |
  654.       @fog_x[i] += @fog_sx[i] / 64.0
  655.       @fog_y[i] += @fog_sy[i] / 64.0
  656.     end
  657.   end
  658.   #--------------------------------------------------------------------------
  659.   # ● フォグ表示 X 座標の計算
  660.   #     bitmap : 遠景ビットマップ
  661.   #--------------------------------------------------------------------------
  662.   def fog_ox(bitmap,lay)
  663.     @fog_x[lay] * 16
  664.   end
  665.   #--------------------------------------------------------------------------
  666.   # ● フォグ表示 Y 座標の計算
  667.   #     bitmap : 遠景ビットマップ
  668.   #--------------------------------------------------------------------------
  669.   def fog_oy(bitmap,lay)
  670.     @fog_y[lay] * 16
  671.   end
  672.   #--------------------------------------------------------------------------
  673.   # ● フォグ初期化
  674.   #--------------------------------------------------------------------------
  675.   def setup_fog
  676.     @fog_name = [nil,nil,nil,nil,nil]
  677.     @fog_sx = [0,0,0,0,0]
  678.     @fog_sy = [0,0,0,0,0]
  679.     @fog_x = [0,0,0,0,0]
  680.     @fog_y = [0,0,0,0,0]
  681.   end
  682.   #--------------------------------------------------------------------------
  683.   # ● フォグの開始
  684.   #--------------------------------------------------------------------------
  685.   def start_fog(bitmap,lay,x=0,y=0)
  686.     @fog_name[lay] = bitmap
  687.     @fog_sx[lay] = x
  688.     @fog_sy[lay] = y
  689.   end
  690.   #--------------------------------------------------------------------------
  691.   # ● 幅の取得
  692.   #--------------------------------------------------------------------------
  693.   def width
  694.     @map = @map_lay[0] if @map == nil
  695.     @map.width
  696.   end
  697.   #--------------------------------------------------------------------------
  698.   # ● 高さの取得
  699.   #--------------------------------------------------------------------------
  700.   def height
  701.     @map = @map_lay[0] if @map == nil
  702.     @map.height
  703.   end
  704. end

  705. #==============================================================================
  706. # ■ Scene_Map
  707. #------------------------------------------------------------------------------
  708. #  マップ画面の処理を行うクラスです。
  709. #==============================================================================
  710. class Scene_Map < Scene_Base
  711.   #--------------------------------------------------------------------------
  712.   # ● 公開インスタンス変数
  713.   #--------------------------------------------------------------------------
  714.   attr_accessor :spriteset
  715.   #--------------------------------------------------------------------------
  716.   # ● スプライトセットの作成
  717.   #--------------------------------------------------------------------------
  718.   def create_spriteset
  719.     @spriteset = Spriteset_Map_Ctrl.new
  720.   end
  721.   #--------------------------------------------------------------------------
  722.   # ● 場所移動の処理
  723.   #--------------------------------------------------------------------------
  724.   def perform_transfer
  725.     pre_transfer
  726.     $game_player.perform_transfer
  727.     dispose_spriteset
  728.     create_spriteset
  729.     post_transfer
  730.   end
  731. end

  732. #==============================================================================
  733. # ■ Spriteset_Map_Ctrl
  734. #------------------------------------------------------------------------------
  735. #  レイヤー毎に持っているスプライトセットをまとめて管理
  736. #==============================================================================
  737. class Spriteset_Map_Ctrl
  738.   #--------------------------------------------------------------------------
  739.   # ● 公開インスタンス変数
  740.   #--------------------------------------------------------------------------
  741.   attr_accessor :spriteset  
  742.   #--------------------------------------------------------------------------
  743.   # ● オブジェクト初期化
  744.   #--------------------------------------------------------------------------
  745.   def initialize
  746.     @spriteset = []   
  747.     range = 0..$game_map.get_layer_num-1
  748.     range.each do |i|
  749.       $game_map.set_layer_no(i)
  750.       upper_flg = i==$game_map.get_layer_num-1 ? true : false
  751.       @spriteset.push(Spriteset_Map.new(i,upper_flg))      
  752.     end
  753.   end
  754.   #--------------------------------------------------------------------------
  755.   # ● フレーム更新
  756.   #--------------------------------------------------------------------------
  757.   def update
  758.     @spriteset.each { | sprite | sprite.update }   
  759.   end
  760.   #--------------------------------------------------------------------------
  761.   # ● 終了処理
  762.   #--------------------------------------------------------------------------
  763.   def dispose
  764.     @spriteset.each { | sprite | sprite.dispose }
  765.   end
  766.   #--------------------------------------------------------------------------
  767.   # ● 内部のレイヤースプライトを取得
  768.   #--------------------------------------------------------------------------  
  769.   def get_layer_sprite
  770.     return @spriteset
  771.   end
  772.   #--------------------------------------------------------------------------
  773.   # ● キャラクターのスプライトを解放
  774.   #--------------------------------------------------------------------------  
  775.   def dispose_characters
  776.     @spriteset.each { | sprite | sprite.dispose_characters }
  777.   end
  778. end

  779. #==============================================================================
  780. # ■ Spriteset_Map
  781. #------------------------------------------------------------------------------
  782. #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは
  783. # Scene_Map クラスの内部で使用されます。
  784. #==============================================================================
  785. class Spriteset_Map
  786.   #--------------------------------------------------------------------------
  787.   # ● 公開インスタンス変数
  788.   #--------------------------------------------------------------------------
  789.   attr_accessor :viewport1
  790.   attr_accessor :viewport2
  791.   attr_accessor :viewport3
  792.   attr_accessor :character_sprites
  793.   #--------------------------------------------------------------------------
  794.   # ● オブジェクト初期化
  795.   #--------------------------------------------------------------------------
  796.   def initialize(pri,top)
  797.     @pri = pri
  798.     @top = top
  799.     create_viewports
  800.     create_tilemap
  801.     create_parallax   if update_parallaxes?
  802.     create_fog
  803.     create_spe_pic    if update_spe?
  804.     create_characters
  805.     create_shadow     if update?
  806.     create_weather    if update?
  807.     create_pictures   if update?
  808.     create_timer      if update?
  809.     update
  810.   end
  811.   #--------------------------------------------------------------------------
  812.   # ● 解放
  813.   #--------------------------------------------------------------------------
  814.   def dispose
  815.     dispose_tilemap
  816.     dispose_parallax  if update_parallaxes?
  817.     dispose_fog
  818.     dispose_spe_pic   if update_spe?
  819.     dispose_characters
  820.     dispose_attachs
  821.     dispose_shadow    if update?
  822.     dispose_weather   if update?
  823.     dispose_pictures  if update?
  824.     dispose_timer     if update?
  825.     dispose_viewports
  826.   end
  827.   #--------------------------------------------------------------------------
  828.   # ● フレーム更新
  829.   #--------------------------------------------------------------------------
  830.   def update
  831.     $game_map.set_layer_no(@pri)
  832.     update_tileset
  833.     update_tilemap
  834.     update_parallax   if update_parallaxes?
  835.     update_fog
  836.     update_spe_pic    if update_spe?
  837.     update_characters
  838.     update_attachs   
  839.     update_shadow     if update?
  840.     update_weather    if update?
  841.     update_pictures   if update?
  842.     update_timer      if update?
  843.     update_viewports
  844.   end
  845.   #--------------------------------------------------------------------------
  846.   # ● タイルマップの作成
  847.   #--------------------------------------------------------------------------
  848.   alias create_tilemap_layer create_tilemap
  849.   def create_tilemap
  850.     create_tilemap_layer
  851.     load_tileset
  852.     refresh_tilemap
  853.   end
  854.   #--------------------------------------------------------------------------
  855.   # ● タイルセットのロード
  856.   #--------------------------------------------------------------------------
  857.   def load_tileset
  858.     @tileset = $game_map.tileset(@pri)
  859.     @tileset.tileset_names.each_with_index do |name, i|
  860.       @tilemap.bitmaps[i] = Cache.tileset(name)
  861.     end
  862.     @tilemap.flags = @tileset.flags
  863.   end
  864.   #--------------------------------------------------------------------------
  865.   # ● いらないタイルを消す
  866.   #--------------------------------------------------------------------------
  867.   def refresh_tilemap
  868.     if $game_map.get_layer_num > 1
  869.       erase_tile(Game_Map::LAYER_UP)
  870.       erase_tile(Game_Map::LAYER_DW)
  871.     end
  872.   end
  873.   #--------------------------------------------------------------------------
  874.   # ● いらないタイルを消す
  875.   #--------------------------------------------------------------------------
  876.   def erase_tile(id)
  877.     x=(id%8)*32 + 256*(id/888)
  878.     y=(id-768)/8*32 - 512*(id/888)
  879.     @tilemap.bitmaps[8].clear_rect(x, y, 32, 32)
  880.   end  
  881.   #--------------------------------------------------------------------------
  882.   # ● キャラクタースプライトの作成
  883.   #--------------------------------------------------------------------------
  884.   def create_characters
  885.     @character_sprites = []
  886.     @attach_sprites = []
  887.     sprite_id=0
  888.     attach_id=0
  889.     $game_map.events.values.each do |event|
  890.       if event.event.name.index("接続イベント")
  891.         @attach_sprites.push(Sprite_Attach.new(@viewport1, event, @pri))
  892.         event.set_sprite_id(attach_id)
  893.         attach_id+=1
  894.       else
  895.         @character_sprites.push(Sprite_Character.new(@viewport1, event, @pri))
  896.         event.set_sprite_id(sprite_id)
  897.         sprite_id+=1
  898.       end
  899.     end
  900.     $game_map.vehicles.each do |vehicle|
  901.       @character_sprites.push(Sprite_Character.new(@viewport1, vehicle, @pri))
  902.       vehicle.set_sprite_id(sprite_id)
  903.       sprite_id+=1
  904.     end
  905.     $game_player.followers.reverse_each do |follower|
  906.       @character_sprites.push(Sprite_Character.new(@viewport1, follower, @pri))
  907.       follower.set_sprite_id(sprite_id)
  908.       sprite_id+=1
  909.     end
  910.     @character_sprites.push(Sprite_Character.new(@viewport1, $game_player, @pri))
  911.     $game_player.set_sprite_id(sprite_id)
  912.     @map_id = $game_map.map_id
  913.   end
  914.   #--------------------------------------------------------------------------
  915.   # ● キャラクタースプライトの更新
  916.   #--------------------------------------------------------------------------
  917.   def update_characters
  918.     refresh_characters if @map_id != $game_map.map_id
  919.     @character_sprites.each {|sprite| sprite.update }
  920.   end
  921.   #--------------------------------------------------------------------------
  922.   # ● アタッチスプライトの更新
  923.   #--------------------------------------------------------------------------
  924.   def update_attachs
  925.     @attach_sprites.each {|sprite| sprite.update }
  926.   end
  927.   #--------------------------------------------------------------------------
  928.   # ● アタッチスプライトの解放
  929.   #--------------------------------------------------------------------------
  930.   def dispose_attachs
  931.     @attach_sprites.each {|sprite| sprite.dispose }
  932.   end
  933.   #--------------------------------------------------------------------------
  934.   # ● アップデートするか?
  935.   #--------------------------------------------------------------------------
  936.   def update?
  937.     @pri==0 ? true : false
  938.   end
  939.   #--------------------------------------------------------------------------
  940.   # ● アップデートするか?(遠景)
  941.   #--------------------------------------------------------------------------
  942.   def update_parallaxes?
  943.     return @pri==$game_map.para_layer ? true : false
  944.   end
  945.   #--------------------------------------------------------------------------
  946.   # ● アップデートするか?(最上層)
  947.   #--------------------------------------------------------------------------
  948.   def update_top?
  949.     return @top
  950.   end
  951.   #--------------------------------------------------------------------------
  952.   # ● アップデートするか?(挟み込むピクチャ)
  953.   #--------------------------------------------------------------------------
  954.   def update_spe?
  955.     return @pri==$game_map.spe_picture_layer ? true : false
  956.   end
  957.   #--------------------------------------------------------------------------
  958.   # ● ビューポートの更新
  959.   #--------------------------------------------------------------------------
  960.   def update_viewports
  961.     if update_top?
  962.       @viewport1.tone = $game_map.screen.tone
  963.     end
  964.     @viewport1.ox = $game_map.screen.shake
  965.     if update_top?
  966.       @viewport2.color = $game_map.screen.flash_color
  967.       @viewport3.color.set(0, 0, 0, 255 - $game_map.screen.brightness)
  968.     end
  969.     @viewport1.update
  970.     @viewport2.update
  971.     @viewport3.update
  972.   end
  973.   #--------------------------------------------------------------------------
  974.   # ● タイルマップの更新
  975.   #--------------------------------------------------------------------------
  976.   def update_tilemap
  977.     @tilemap.map_data = $game_map.data
  978.     @tilemap.ox = $game_map.display_x[@pri] * 32
  979.     @tilemap.oy = $game_map.display_y[@pri] * 32
  980.     @tilemap.update
  981.   end
  982.   #--------------------------------------------------------------------------
  983.   # ● 天候の更新
  984.   #--------------------------------------------------------------------------
  985.   def update_weather
  986.     @weather.type = $game_map.screen.weather_type
  987.     @weather.power = $game_map.screen.weather_power
  988.     @weather.ox = $game_map.display_x[@pri] * 32
  989.     @weather.oy = $game_map.display_y[@pri] * 32
  990.     @weather.update
  991.   end
  992.   #--------------------------------------------------------------------------
  993.   # ● 挟み込む特殊ピクチャスプライトを作成
  994.   #--------------------------------------------------------------------------
  995.   def create_spe_pic
  996.     @layer_sprite = Sprite.new
  997.     @filename = ""
  998.     @old_filename = ""
  999.   end
  1000.   #--------------------------------------------------------------------------
  1001.   # ● 挟み込む特殊ピクチャスプライトを更新
  1002.   #--------------------------------------------------------------------------
  1003.   def update_spe_pic
  1004.     @layer_sprite.update
  1005.    
  1006.     filename = $game_map.spe_picture_name
  1007.     if @pri == $game_map.spe_picture_layer && filename != @old_filename
  1008.       if filename != ""
  1009.         name = "Graphics/Pictures/" + $game_map.spe_picture_name
  1010.         @layer_sprite.bitmap = Bitmap.new(name)
  1011.         @layer_sprite.wave_amp = 5
  1012.         @layer_sprite.wave_length = 5
  1013.         @layer_sprite.wave_speed = 20
  1014.         @layer_sprite.x = -20
  1015.         @layer_sprite.y = 0
  1016.         @layer_sprite.z = 0
  1017.         @layer_sprite.opacity = 200
  1018.         @layer_sprite.visible = true
  1019.       else
  1020.         @layer_sprite.visible = false
  1021.       end
  1022.       @old_filename = filename
  1023.     end
  1024.   end
  1025.   #--------------------------------------------------------------------------
  1026.   # ● 挟み込む特殊ピクチャスプライトを解放
  1027.   #--------------------------------------------------------------------------
  1028.   def dispose_spe_pic
  1029.     @layer_sprite.dispose if @layer_sprite != nil
  1030.   end
  1031.   #--------------------------------------------------------------------------
  1032.   # ● タイルセットの更新
  1033.   #--------------------------------------------------------------------------
  1034.   def update_tileset
  1035.     if @tileset != $game_map.tileset(@pri) #&& $game_map.tileset(@pri) != nil
  1036.       load_tileset
  1037.       refresh_characters
  1038.       refresh_tilemap
  1039.     end
  1040.   end
  1041.   #--------------------------------------------------------------------------
  1042.   # ● フォグの作成
  1043.   #--------------------------------------------------------------------------
  1044.   def create_fog
  1045.     @fog = Plane.new
  1046.     @fog.opacity = 100
  1047.   end
  1048.   #--------------------------------------------------------------------------
  1049.   # ● フォグの更新
  1050.   #--------------------------------------------------------------------------
  1051.   def update_fog
  1052.     return if $game_map.fog_name == nil
  1053.     if @fog_name != $game_map.fog_name[@pri]
  1054.       @fog_name = $game_map.fog_name[@pri]
  1055.       @fog.bitmap.dispose if @fog.bitmap
  1056.       @fog.bitmap = Cache.parallax(@fog_name)
  1057.       Graphics.frame_reset
  1058.     end
  1059.     @fog.ox = $game_map.fog_ox(@fog.bitmap,@pri)
  1060.     @fog.oy = $game_map.fog_oy(@fog.bitmap,@pri)
  1061.   end
  1062.   #--------------------------------------------------------------------------
  1063.   # ● フォグの解放
  1064.   #--------------------------------------------------------------------------
  1065.   def dispose_fog
  1066.     @fog.bitmap.dispose if @fog.bitmap
  1067.     @fog.dispose
  1068.   end
  1069.   #--------------------------------------------------------------------------
  1070.   # ● 遠景の解放
  1071.   #--------------------------------------------------------------------------
  1072.   def dispose_parallax
  1073.     return if @parallax == nil
  1074.     @parallax.bitmap.dispose  && @parallax.bitmap
  1075.     @parallax.dispose
  1076.   end
  1077. end

  1078. #==============================================================================
  1079. # ■ Game_Player
  1080. #------------------------------------------------------------------------------
  1081. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  1082. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  1083. #==============================================================================
  1084. class Game_Player < Game_Character
  1085.   #--------------------------------------------------------------------------
  1086.   # ● マップ通行可能判定
  1087.   #     d : 方向(2,4,6,8)
  1088.   #--------------------------------------------------------------------------
  1089.   def map_passable?(x, y, d)
  1090.     case @vehicle_type
  1091.     when :boat
  1092.       $game_map.boat_passable?(x, y, @active_layer)
  1093.     when :ship
  1094.       $game_map.ship_passable?(x, y, @active_layer)
  1095.     when :airship
  1096.       true
  1097.     else
  1098.       super
  1099.     end
  1100.   end
  1101.   #--------------------------------------------------------------------------
  1102.   # ● 場所移動の実行
  1103.   #--------------------------------------------------------------------------
  1104.   def perform_transfer
  1105.     if transfer?
  1106.       set_direction(@new_direction)
  1107.       if @new_map_id != $game_map.map_id
  1108.         $game_map.setup(@new_map_id,true) # レイヤー間を移動するので常にセット
  1109.         $game_map.autoplay
  1110.       end
  1111.       moveto(@new_x, @new_y)
  1112.       link_layer_followers
  1113.       clear_transfer_info
  1114.     end
  1115.   end
  1116.   #--------------------------------------------------------------------------
  1117.   # ● マップイベントの起動
  1118.   #     triggers : トリガーの配列
  1119.   #     normal   : プライオリティ[通常キャラと同じ]かそれ以外か
  1120.   #--------------------------------------------------------------------------
  1121.   def start_map_event(x, y, triggers, normal)
  1122.     $game_map.events_xy(x, y).each do |event|
  1123.       next unless check_enable_layer(event)
  1124.       if event.trigger_in?(triggers) && event.normal_priority? == normal
  1125.         event.start
  1126.       end
  1127.     end
  1128.   end
  1129.   #--------------------------------------------------------------------------
  1130.   # ● 更新
  1131.   #--------------------------------------------------------------------------
  1132.   alias game_player_update update
  1133.   def update
  1134.     game_player_update
  1135.     $game_system.layer = $game_player.active_layer
  1136.   end
  1137.   #--------------------------------------------------------------------------
  1138.   # ● 乗り物に乗る
  1139.   #    現在乗り物に乗っていないことが前提。
  1140.   #--------------------------------------------------------------------------
  1141.   def get_on_vehicle
  1142.     add = 0
  1143.     add =-1 if $game_map.get_chip_id(self.x, self.y, @active_layer) == Game_Map::LAYER_DW
  1144.     add = 1 if $game_map.get_chip_id(self.x, self.y, @active_layer) == Game_Map::LAYER_UP
  1145.    
  1146.     front_x = $game_map.x_with_direction(@x, @direction)
  1147.     front_y = $game_map.y_with_direction(@y, @direction)
  1148.     @vehicle_type = :boat    if $game_map.boat.pos?(front_x, front_y) && @active_layer+add == $game_map.boat.active_layer   # 正面に大型船がある?
  1149.     @vehicle_type = :ship    if $game_map.ship.pos?(front_x, front_y) && @active_layer+add == $game_map.ship.active_layer   # 正面に小型船がある?
  1150.     @vehicle_type = :airship if $game_map.airship.pos?(@x, @y)
  1151.    
  1152.     if vehicle
  1153.       @vehicle_getting_on = true
  1154.       force_move_forward unless in_airship?
  1155.       @followers.gather
  1156.     end
  1157.     link_layer_followers      #フォロワーのレイヤーをリンク
  1158.     @vehicle_getting_on
  1159.   end
  1160.   #--------------------------------------------------------------------------
  1161.   # ● 乗り物から降りる
  1162.   #    現在乗り物に乗っていることが前提。
  1163.   #--------------------------------------------------------------------------
  1164.   alias game_player_get_off_vehicle get_off_vehicle
  1165.   def get_off_vehicle
  1166.     front_x = $game_map.x_with_direction(@x, @direction)
  1167.     front_y = $game_map.y_with_direction(@y, @direction)
  1168.     id0 = $game_map.get_chip_id(front_x, front_y, @active_layer)
  1169.     id1 = $game_map.get_chip_id(front_x, front_y, (@active_layer+1)%$game_map.get_layer_num)
  1170.     return if id0 == Game_Map::LAYER_UP || id0 == Game_Map::LAYER_DW
  1171.     return if id1 == Game_Map::LAYER_UP || id1 == Game_Map::LAYER_DW
  1172.     link_layer_followers      #フォロワーのレイヤーをリンク
  1173.     game_player_get_off_vehicle
  1174.   end
  1175.   #--------------------------------------------------------------------------
  1176.   # ● スクロール処理
  1177.   #--------------------------------------------------------------------------
  1178.   def update_scroll(last_real_x, last_real_y)
  1179.     ax1 = $game_map.adjust_x(last_real_x, @active_layer)
  1180.     ay1 = $game_map.adjust_y(last_real_y, @active_layer)
  1181.     ax2 = $game_map.adjust_x(@real_x, @active_layer)
  1182.     ay2 = $game_map.adjust_y(@real_y, @active_layer)
  1183.     $game_map.scroll_down (ay2 - ay1) if ay2 > ay1 && ay2 > center_y
  1184.     $game_map.scroll_left (ax1 - ax2) if ax2 < ax1 && ax2 < center_x
  1185.     $game_map.scroll_right(ax2 - ax1) if ax2 > ax1 && ax2 > center_x
  1186.     $game_map.scroll_up   (ay1 - ay2) if ay2 < ay1 && ay2 < center_y   
  1187.   end
  1188.   #--------------------------------------------------------------------------
  1189.   # ● フォロワーのレイヤーをリンクする
  1190.   #--------------------------------------------------------------------------
  1191.   def link_layer_followers
  1192.     @followers.each { |f| f.set_active_layer(@active_layer) }
  1193.   end
  1194. end

  1195. #==============================================================================
  1196. # ■ Game_Vehicle
  1197. #------------------------------------------------------------------------------
  1198. #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
  1199. # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
  1200. #==============================================================================
  1201. class Game_Vehicle < Game_Character
  1202.   #--------------------------------------------------------------------------
  1203.   # ● 公開インスタンス変数
  1204.   #--------------------------------------------------------------------------
  1205.   attr_reader :map_id
  1206.   #--------------------------------------------------------------------------
  1207.   # ● 座標一致判定
  1208.   #--------------------------------------------------------------------------
  1209.   def pos?(x, y)
  1210.     #親のマップIDと同じか調べる&同レイヤーか調べる&同じ座標か調べる
  1211.     $game_temp.link_array[@map_id][0] == $game_map.map_id && super(x, y)
  1212.   end
  1213.   #--------------------------------------------------------------------------
  1214.   # ● 透明判定
  1215.   #--------------------------------------------------------------------------
  1216.   def transparent
  1217.     #親のマップIDと同じか調べる
  1218.     $game_temp.link_array[@map_id][0] != $game_map.map_id || super
  1219.   end
  1220.   #--------------------------------------------------------------------------
  1221.   # ● オブジェクト初期化
  1222.   #     type : 乗り物タイプ(:boat, :ship, :airship)
  1223.   #--------------------------------------------------------------------------
  1224.   alias initialize_game_vehicle initialize
  1225.   def initialize(type)
  1226.     initialize_game_vehicle(type)
  1227.     return if $BTEST
  1228.    
  1229.     if $data_mapinfos[@map_id] != nil
  1230.       temp_name = $data_mapinfos[@map_id].name
  1231.       if temp_name.match(/\<lay(\d+)\>/)
  1232.         set_active_layer($1.to_i)
  1233.       else
  1234.         set_active_layer(0)
  1235.       end
  1236.     end
  1237.   end
  1238.   #--------------------------------------------------------------------------
  1239.   # ● リフレッシュ
  1240.   #--------------------------------------------------------------------------
  1241.   def refresh
  1242.     if @driving
  1243.       @map_id = $game_map.map_id
  1244.       sync_with_player
  1245.     elsif $game_temp.link_array[@map_id][0] == $game_map.map_id
  1246.       #乗り物が存在するレイヤーなら位置とレイヤーをリセット
  1247.       moveto(@x, @y)
  1248.     end
  1249.     if @type == :airship
  1250.       @priority_type = @driving ? 2 : 0
  1251.     else
  1252.       @priority_type = 1
  1253.     end
  1254.     @walk_anime = @step_anime = @driving
  1255.   end
  1256.   #--------------------------------------------------------------------------
  1257.   # ● 接岸/着陸可能判定
  1258.   #     d : 方向(2,4,6,8)
  1259.   #--------------------------------------------------------------------------
  1260.   def land_ok?(x, y, d)
  1261.     if @type == :airship
  1262.       return false unless $game_map.airship_land_ok?(x, y)
  1263.       return false unless $game_map.events_xy(x, y).empty?
  1264.     else
  1265.       x2 = $game_map.round_x_with_direction(x, d)
  1266.       y2 = $game_map.round_y_with_direction(y, d)
  1267.       return false unless $game_map.valid?(x2, y2)
  1268.       return false unless $game_map.passable?(x2, y2, reverse_dir(d), @active_layer)
  1269.       return false if collide_with_characters?(x2, y2)
  1270.     end
  1271.     return true
  1272.   end  
  1273.   #--------------------------------------------------------------------------
  1274.   # ● 転送判定から除外できるか?
  1275.   #--------------------------------------------------------------------------
  1276.   def pre_hit?
  1277.     return false if @active_layer > $game_map.get_layer_num-1
  1278.     return true
  1279.   end
  1280. end

  1281. #==============================================================================
  1282. # ■ Game_Character
  1283. #------------------------------------------------------------------------------
  1284. #  主に移動ルートなどの処理を追加したキャラクターのクラスです。Game_Player、
  1285. # Game_Follower、GameVehicle、Game_Event のスーパークラスとして使用されます。
  1286. #==============================================================================
  1287. class Game_Character < Game_CharacterBase
  1288.   #--------------------------------------------------------------------------
  1289.   # ● 公開インスタンス変数
  1290.   #--------------------------------------------------------------------------
  1291.   attr_reader   :sprite_id
  1292.   #--------------------------------------------------------------------------
  1293.   # ● スプライトIDのセット
  1294.   #--------------------------------------------------------------------------
  1295.   def set_sprite_id(id)
  1296.     @sprite_id = id
  1297.   end
  1298. end

  1299. #==============================================================================
  1300. # ■ Game_Event
  1301. #------------------------------------------------------------------------------
  1302. #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
  1303. # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
  1304. #==============================================================================
  1305. class Game_Event < Game_Character
  1306.   #--------------------------------------------------------------------------
  1307.   # ● 公開インスタンス変数
  1308.   #--------------------------------------------------------------------------
  1309.   attr_accessor :id
  1310.   attr_reader   :event
  1311.   attr_reader   :name
  1312.   #--------------------------------------------------------------------------
  1313.   # ● オブジェクト初期化
  1314.   #     event : RPG::Event
  1315.   #--------------------------------------------------------------------------
  1316.   def initialize(map_id, event)
  1317.     super()
  1318.     @map_id = map_id
  1319.     @event = event
  1320.     @id = @event.id
  1321.     set_active_layer(@id / Game_Map::MAX_EVENT)
  1322.     moveto(@event.x, @event.y)
  1323.     refresh
  1324.   end
  1325.   #--------------------------------------------------------------------------
  1326.   # ● 接触イベントの起動判定
  1327.   #--------------------------------------------------------------------------
  1328.   def check_event_trigger_touch(x, y)
  1329.     return if $game_map.interpreter.running?
  1330.     if @trigger == 2 && $game_player.pos?(x, y) && check_enable_layer($game_player)
  1331.       start if !jumping? && normal_priority?
  1332.     end
  1333.   end
  1334.   #--------------------------------------------------------------------------
  1335.   # ● 画面の可視領域付近にいるか判定
  1336.   #     dx : 画面中央から左右何マス以内を判定するか
  1337.   #     dy : 画面中央から上下何マス以内を判定するか
  1338.   #--------------------------------------------------------------------------
  1339.   def near_the_screen?(dx = 12, dy = 8)
  1340.     ax = $game_map.adjust_x(@real_x,@active_layer) - Graphics.width / 2 / 32
  1341.     ay = $game_map.adjust_y(@real_y,@active_layer) - Graphics.height / 2 / 32
  1342.     ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
  1343.   end
  1344.   #--------------------------------------------------------------------------
  1345.   # ● オブジェクトキャラクター判定
  1346.   #--------------------------------------------------------------------------
  1347.   def object_character?
  1348.     if @event.name.index("接続イベント")
  1349.       return  0
  1350.     else
  1351.       super
  1352.     end
  1353.   end
  1354.   #--------------------------------------------------------------------------
  1355.   # ● 転送判定から除外できるか?
  1356.   #--------------------------------------------------------------------------
  1357.   def pre_hit?
  1358.     return false unless near_the_screen?
  1359.     return false if $game_map.d_sprite(self).character == ""
  1360.     return true
  1361.   end
  1362.   
  1363. end

  1364. #==============================================================================
  1365. # ■ Game_CharacterBase
  1366. #------------------------------------------------------------------------------
  1367. #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ
  1368. # ラフィックなどの基本的な情報を保持します。
  1369. #==============================================================================
  1370. class Game_CharacterBase
  1371.   #--------------------------------------------------------------------------
  1372.   # ● 公開インスタンス変数
  1373.   #--------------------------------------------------------------------------
  1374.   attr_reader   :active_layer
  1375.   attr_reader   :pattern
  1376.   attr_accessor :tensou_rect_x
  1377.   attr_accessor :tensou_rect_y
  1378.   #--------------------------------------------------------------------------
  1379.   # ● オブジェクト初期化
  1380.   #--------------------------------------------------------------------------
  1381.   alias initialize2 initialize
  1382.   def initialize
  1383.     initialize2
  1384.     @active_layer = 0
  1385.     @tensou_rect_x = Rect.new
  1386.     @tensou_rect_y = Rect.new
  1387.   end
  1388.   #--------------------------------------------------------------------------
  1389.   # ● フレーム更新
  1390.   #--------------------------------------------------------------------------
  1391.   def update
  1392.     update_layer_change
  1393.     update_animation
  1394.     return update_jump if jumping?
  1395.     return update_move if moving?
  1396.     return update_stop
  1397.   end
  1398.   #--------------------------------------------------------------------------
  1399.   # ● 所属レイヤーの変更
  1400.   #--------------------------------------------------------------------------
  1401.   def update_layer_change
  1402.     return false if $game_map.get_layer_num == 1
  1403.     return if @old_x == self.x && @old_y == self.y
  1404.     id = $game_map.get_chip_id(self.x,self.y,@active_layer)
  1405.     if id == Game_Map::LAYER_UP
  1406.       @active_layer+=1
  1407.     elsif id == Game_Map::LAYER_DW
  1408.       @active_layer-=1      
  1409.     end
  1410.    
  1411.     @old_x = self.x
  1412.     @old_y = self.y
  1413.   end
  1414.   #--------------------------------------------------------------------------
  1415.   # ● キャラクター衝突判定
  1416.   #     x : X 座標
  1417.   #     y : Y 座標
  1418.   #    プレイヤーと乗り物を含め、通常キャラの衝突を検出する。
  1419.   #--------------------------------------------------------------------------
  1420.   def collide_with_characters?(x, y)
  1421.     #一歩前を見るのでこの形に
  1422.     add = 0
  1423.     check_layer = @active_layer
  1424.     add = 1 if $game_map.get_chip_id(x, y, check_layer) == Game_Map::LAYER_UP
  1425.     check_layer = @active_layer
  1426.     add =-1 if $game_map.get_chip_id(x, y, check_layer) == Game_Map::LAYER_DW
  1427.     collide_with_events?(x, y, add) || collide_with_vehicles?(x, y, add)   
  1428.   end
  1429.   #--------------------------------------------------------------------------
  1430.   # ● イベントとの衝突判定
  1431.   #--------------------------------------------------------------------------
  1432.   def collide_with_events?(x, y, add=0)
  1433.     $game_map.events_xy_nt(x, y).any? do |event|
  1434.       if event.active_layer == @active_layer || event.active_layer == @active_layer+add
  1435.         event.normal_priority? || self.is_a?(Game_Event)
  1436.       end
  1437.     end
  1438.   end
  1439.   #--------------------------------------------------------------------------
  1440.   # ● 乗り物との衝突判定
  1441.   #--------------------------------------------------------------------------
  1442.   def collide_with_vehicles?(x, y, add=0)
  1443.     collide_with_boat?(x, y, add) || collide_with_ship?(x, y, add)
  1444.   end
  1445.   #--------------------------------------------------------------------------
  1446.   # ● 大型船との衝突判定
  1447.   #--------------------------------------------------------------------------
  1448.   def collide_with_ship?(x, y, add=0)
  1449.     if $game_map.ship.active_layer != @active_layer+add && $game_map.ship.active_layer != @active_layer
  1450.       return false
  1451.     end
  1452.     $game_map.ship.pos_nt?(x, y)
  1453.   end
  1454.   #--------------------------------------------------------------------------
  1455.   # ● 小型船との衝突判定
  1456.   #--------------------------------------------------------------------------
  1457.   def collide_with_boat?(x, y, add=0)
  1458.     if $game_map.boat.active_layer != @active_layer+add && $game_map.boat.active_layer != @active_layer
  1459.       return false
  1460.     end
  1461.     $game_map.boat.pos_nt?(x, y)
  1462.   end
  1463.   #--------------------------------------------------------------------------
  1464.   # ● 位置設定(イベント位置設定用)
  1465.   #--------------------------------------------------------------------------
  1466.   def set_pos(new_x,new_y,dir=@direction,lay=@active_layer)
  1467.     moveto(new_x, new_y)
  1468.     set_active_layer(lay)
  1469.     case dir   # 向き
  1470.     when 8  # 上
  1471.       turn_up
  1472.     when 6  # 右
  1473.       turn_right
  1474.     when 2  # 下
  1475.       turn_down
  1476.     when 4  # 左
  1477.       turn_left
  1478.     end
  1479.   end
  1480.   #--------------------------------------------------------------------------
  1481.   # ● 茂み判定
  1482.   #--------------------------------------------------------------------------
  1483.   def bush?
  1484.     $game_map.bush?(@x, @y, @active_layer)
  1485.   end  
  1486.   #--------------------------------------------------------------------------
  1487.   # ● 地形タグの取得
  1488.   #--------------------------------------------------------------------------
  1489.   def terrain_tag
  1490.     $game_map.terrain_tag(@x, @y, @active_layer)
  1491.   end
  1492.   #--------------------------------------------------------------------------
  1493.   # ● マップ通行可能判定
  1494.   #     x : X 座標
  1495.   #     y : Y 座標
  1496.   #--------------------------------------------------------------------------
  1497.   def map_passable?(x, y, d)
  1498.     $game_map.passable?(x, y, d, @active_layer)
  1499.   end
  1500.   #--------------------------------------------------------------------------
  1501.   # ● 違うレイヤーのイベント起動判定
  1502.   #--------------------------------------------------------------------------
  1503.   def check_enable_layer(object)
  1504.     layer_num = $game_map.get_layer_num
  1505.     id = $game_map.get_chip_id(self.x, self.y, (@active_layer+1)%layer_num)
  1506.     if id == Game_Map::LAYER_DW
  1507.       layer =(@active_layer+1) % $game_map.get_layer_num
  1508.       return true if object.active_layer == @active_layer
  1509.       return true if object.active_layer == @active_layer+1
  1510.     end
  1511.    
  1512.     id = $game_map.get_chip_id(self.x, self.y, (@active_layer-1)%layer_num)
  1513.     if id == Game_Map::LAYER_UP
  1514.       layer =(@active_layer-1) % $game_map.get_layer_num
  1515.       return true if object.active_layer == @active_layer
  1516.       return true if object.active_layer == @active_layer-1
  1517.     end
  1518.    
  1519.     #どちらでもない場合
  1520.     return true if object.active_layer == @active_layer
  1521.     return false
  1522.   end
  1523.   #--------------------------------------------------------------------------
  1524.   # ● 画面 X 座標の取得
  1525.   #--------------------------------------------------------------------------
  1526.   def screen_x
  1527.     $game_map.adjust_x(@real_x,@active_layer) * 32 + 16
  1528.   end
  1529.   #--------------------------------------------------------------------------
  1530.   # ● 画面 Y 座標の取得
  1531.   #--------------------------------------------------------------------------
  1532.   def screen_y
  1533.     $game_map.adjust_y(@real_y,@active_layer) * 32 + 32 - shift_y - jump_height
  1534.   end
  1535.   #--------------------------------------------------------------------------
  1536.   # ● 所属レイヤーのセット
  1537.   #--------------------------------------------------------------------------
  1538.   def set_active_layer(no)
  1539.     @active_layer = no
  1540.   end
  1541.   #--------------------------------------------------------------------------
  1542.   # ● アニメパターンの更新
  1543.   #--------------------------------------------------------------------------
  1544.   def set_anime_pattern(pattern)
  1545.     @pattern = pattern
  1546.   end
  1547. end

  1548. #==============================================================================
  1549. # ■ Sprite_Character
  1550. #------------------------------------------------------------------------------
  1551. #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを
  1552. # 監視し、スプライトの状態を自動的に変化させます。
  1553. #==============================================================================
  1554. class Sprite_Character < Sprite_Base
  1555.   
  1556.   #--------------------------------------------------------------------------
  1557.   # ● 公開インスタンス変数
  1558.   #--------------------------------------------------------------------------
  1559.   attr_reader :cw
  1560.   attr_reader :ch
  1561.   #--------------------------------------------------------------------------
  1562.   # ● オブジェクト初期化
  1563.   #     viewport  : ビューポート
  1564.   #     character : キャラクター (Game_Character)
  1565.   #--------------------------------------------------------------------------
  1566.   alias sprite_character_initialize initialize
  1567.   def initialize(viewport, character = nil, layer = 0)
  1568.     @layer = layer
  1569.     @char_layer = character != nil ? character.active_layer : 0   
  1570.     sprite_character_initialize(viewport, character)
  1571.   end
  1572.   #--------------------------------------------------------------------------
  1573.   # ● 指定されたタイルが含まれるタイルセット画像の取得
  1574.   #--------------------------------------------------------------------------
  1575.   def tileset_bitmap(tile_id)
  1576.     Cache.tileset($game_map.tileset(@char_layer).tileset_names[5 + tile_id / 256])
  1577.   end
  1578.   #--------------------------------------------------------------------------
  1579.   # ● フレーム更新を行うか?
  1580.   #--------------------------------------------------------------------------
  1581.   def update?
  1582.     return false if SceneManager.scene.spriteset == nil

  1583.     test_x = @character.x
  1584.     test_y = @character.y
  1585.     char_layer = @character.active_layer    #キャラクターのレイヤー

  1586.     id = $game_map.get_chip_id(test_x,test_y,[char_layer-1,0].max)
  1587.     return false if id == Game_Map::LAYER_UP
  1588.     id = $game_map.get_chip_id(test_x,test_y,[char_layer+1,$game_map.get_layer_num-1].min)
  1589.     return false if id == Game_Map::LAYER_DW
  1590.    
  1591.     return false if char_layer != @layer
  1592.         
  1593.     return true
  1594.   end
  1595.   #--------------------------------------------------------------------------
  1596.   # ● 幅と高さを調べるだけ
  1597.   #--------------------------------------------------------------------------
  1598.   def pre_set_character_bitmap
  1599.     @tile_id = @character.tile_id
  1600.     if @tile_id > 0
  1601.       @cw = 32
  1602.       @ch = 32
  1603.     else
  1604.       @character_name = @character.character_name
  1605.       bitmap0 = Cache.character(@character_name)   
  1606.       sign = @character_name[/^[\!\$]./]
  1607.       if sign && sign.include?('[/fold]


  1608. )
  1609.         @cw = bitmap0.width / 3
  1610.         @ch = bitmap0.height / 4      
  1611.       else
  1612.         @cw = bitmap0.width / 12
  1613.         @ch = bitmap0.height / 8
  1614.       end
  1615.     end
  1616.   end
  1617.   #--------------------------------------------------------------------------
  1618.   # ● タイルのビットマップを設定
  1619.   #--------------------------------------------------------------------------
  1620.   alias sprite_character_set_tile_bitmap set_tile_bitmap
  1621.   def set_tile_bitmap
  1622.     sprite_character_set_tile_bitmap
  1623.     @cw = 32
  1624.     @ch = 32
  1625.   end  
  1626.   #--------------------------------------------------------------------------
  1627.   # ● フレーム更新
  1628.   #--------------------------------------------------------------------------
  1629.   def update
  1630.     return  unless SceneManager.scene_is?(Scene_Map)
  1631.    
  1632.     super
  1633.    
  1634.     unless update?
  1635.       self.visible = false
  1636.       return
  1637.     end
  1638.    
  1639.     update_bitmap
  1640.     update_src_rect
  1641.     update_position
  1642.     update_other
  1643.     update_balloon
  1644.     setup_new_effect
  1645.   end
  1646.    
  1647. end

  1648. #==============================================================================
  1649. # ■ Sprite_Attach
  1650. #------------------------------------------------------------------------------
  1651. #  接続イベント
  1652. #==============================================================================
  1653. class Sprite_Attach < Sprite_Base
  1654.   
  1655.   #--------------------------------------------------------------------------
  1656.   # ● オブジェクト初期化
  1657.   #     viewport  : ビューポート
  1658.   #     character : キャラクター (Game_Character)
  1659.   #--------------------------------------------------------------------------
  1660.   def initialize(viewport, character = nil, layer = 0)
  1661.     super(viewport)
  1662.     @layer = layer
  1663.     @char_layer = character != nil ? character.active_layer : 0
  1664.     @character = character
  1665.     @balloon_duration = 0
  1666.    
  1667.     array = @character.event.name.scan(/接続イベント\((\d+),(\d+)\)/)
  1668.     w = array[0] != nil ? array[0][0].to_i : 160
  1669.     h = array[0] != nil ? array[0][1].to_i : 96
  1670.     self.bitmap = Bitmap.new(w,h)
  1671.    
  1672.     @limit_x = w / 32
  1673.     @limit_x += 1  if w % 32
  1674.     @limit_y = h / 32
  1675.     @limit_y += 1  if h % 32
  1676.   end
  1677.   #--------------------------------------------------------------------------
  1678.   # ● 解放
  1679.   #--------------------------------------------------------------------------
  1680.   def dispose
  1681.     super
  1682.   end
  1683.   #--------------------------------------------------------------------------
  1684.   # ● フレーム更新を行うか?
  1685.   #--------------------------------------------------------------------------
  1686.   def update?
  1687.     sprite_ctrl = SceneManager.scene.spriteset
  1688.     return false if sprite_ctrl == nil
  1689.     return false if sprite_ctrl.spriteset.size != $game_map.get_layer_num   
  1690.     return false if @character.active_layer != @layer
  1691.     return true   
  1692.   end
  1693.   #--------------------------------------------------------------------------
  1694.   # ● 位置の更新
  1695.   #--------------------------------------------------------------------------
  1696.   def update_position
  1697.     self.x = @character.screen_x
  1698.     self.y = @character.screen_y
  1699.     self.z = 101
  1700.   end
  1701.   #--------------------------------------------------------------------------
  1702.   # ● 接続位置に本来表示されるべき絵を描く
  1703.   # 自分の位置にはみだしている下のレイヤーのキャラの頭の部分を
  1704.   # 自分のスプライトに転送する
  1705.   #--------------------------------------------------------------------------
  1706.   def update_s
  1707.     self.bitmap.clear   
  1708.     self.ox = self.bitmap.width/2
  1709.     self.oy = self.bitmap.height/2+16
  1710.     $game_map.event_list.each {|ev| update_attach_bitmap(ev) if atari(ev)}
  1711.   end
  1712.   #--------------------------------------------------------------------------
  1713.   # ● キャラクタースプライトがレイヤー移動チップと接触しているか?
  1714.   #--------------------------------------------------------------------------
  1715.   def hit_attach?(ev)
  1716.     array_y = []
  1717.    
  1718.     return false  if d_sprite(ev) == nil
  1719.     return false  if sprite_w(ev) == nil || sprite_h(ev) == nil
  1720.    
  1721.     #スプライトの大きさをチップ数に変換
  1722.     chip_h = sprite_h(ev) / 32
  1723.     chip_h += 1 if sprite_h(ev) % 32 > 0
  1724.    
  1725.     while 1
  1726.       chip_h -= 1
  1727.       array_y.push(ev.y - chip_h)
  1728.       break if chip_h == 0
  1729.     end
  1730.    
  1731.     ret = false
  1732.     if ev.active_layer+1 == @character.active_layer
  1733.       array_y.each do |y|
  1734.         id = $game_map.get_chip_id(ev.x,y,@character.active_layer)
  1735.         ret = true if id == Game_Map::LAYER_DW
  1736.       end
  1737.     elsif ev.active_layer-1 == @character.active_layer
  1738.       array_y.each do |y|
  1739.         id = $game_map.get_chip_id(ev.x,y,@character.active_layer)
  1740.         ret = true if id == Game_Map::LAYER_UP
  1741.       end
  1742.     end
  1743.    
  1744.     if ev.active_layer != @character.active_layer && ret == false
  1745.       return false
  1746.     end
  1747.     return true
  1748.   end
  1749.   #--------------------------------------------------------------------------
  1750.   # ● アタリ判定
  1751.   #--------------------------------------------------------------------------
  1752.   def atari(ev)
  1753.    
  1754.     #接続イベントはチェックしない
  1755.     return false  if d_sprite(ev) == nil
  1756.    
  1757.     #アップデートされない時の対処
  1758.     if sprite_w(ev) == nil || sprite_h(ev) == nil
  1759.       d_sprite(ev).pre_set_character_bitmap
  1760.     end
  1761.    
  1762.     #ある程度の所で足切り
  1763.     sa_x = (@character.x.abs - ev.x.abs).abs
  1764.     sa_y = (@character.y.abs - ev.y.abs).abs
  1765.     return false if sa_x > @limit_x || sa_y > @limit_y
  1766.    
  1767.     #キャラクタースプライトがレイヤー移動チップと接触しているか?
  1768.     return false unless hit_attach?(ev)
  1769.    
  1770.     c_x0 = @character.screen_x-self.bitmap.width/2  #左上
  1771.     c_x1 = c_x0+self.bitmap.width
  1772.     e_x0 = ev.screen_x-sprite_w(ev)/2
  1773.     e_x1 = e_x0+sprite_w(ev)
  1774.    
  1775.     c_y0 = @character.screen_y-self.bitmap.height/2-16   #左上
  1776.     c_y1 = c_y0+self.bitmap.height
  1777.     e_y0 = ev.screen_y-sprite_h(ev)
  1778.     e_y1 = e_y0+sprite_h(ev)
  1779.    
  1780.     #AのPがBのQより左上にあり、かつ、AのQがBのPより右下にある場合
  1781.     if (c_x0 <= e_x1 && c_y0 <= e_y1) && (c_x1 >= e_x0 && c_y1 >= e_y0)
  1782.       ev.tensou_rect_x.set(c_x0,c_x1,e_x0,e_x1)
  1783.       ev.tensou_rect_y.set(c_y0,c_y1,e_y0,e_y1)      
  1784.       return true
  1785.     end
  1786.     return false
  1787.   end
  1788.   #--------------------------------------------------------------------------
  1789.   # ● イベントに対応したスプライト
  1790.   #--------------------------------------------------------------------------
  1791.   def d_sprite(ev)
  1792.     sprite_ctrl = SceneManager.scene.spriteset
  1793.     return sprite_ctrl.spriteset[ev.active_layer].character_sprites[ev.sprite_id]
  1794.   end
  1795.   #--------------------------------------------------------------------------
  1796.   # ● スプライトのwidthを取得
  1797.   # bitmapの値を取らない!
  1798.   #--------------------------------------------------------------------------
  1799.   def sprite_w(ev)
  1800.     d_sprite(ev)==nil ? nil : d_sprite(ev).cw
  1801.   end
  1802.   #--------------------------------------------------------------------------
  1803.   # ● スプライトのwidthを取得
  1804.   # bitmapの値を取らない!
  1805.   #--------------------------------------------------------------------------
  1806.   def sprite_h(ev)
  1807.     d_sprite(ev)==nil ? nil : d_sprite(ev).ch
  1808.   end
  1809.   #--------------------------------------------------------------------------
  1810.   # ● 自分のスプライトに転送する
  1811.   #--------------------------------------------------------------------------
  1812.   def update_attach_bitmap(ev)   
  1813.     src_bitmap = d_sprite(ev).bitmap   #相手のビットマップ
  1814.     @character_name       = ev.character_name
  1815.     @character_index      = ev.character_index
  1816.     @character_direction  = ev.direction
  1817.     @character_pattern    = ev.pattern
  1818.    
  1819.     #相手のビットマップと同じものを生成
  1820.     @tile_id = ev.tile_id
  1821.     if @tile_id > 0
  1822.       #タイル
  1823.       bitmap0 = tileset_bitmap(@tile_id)
  1824.       @cw = 32
  1825.       @ch = 32
  1826.       
  1827.       sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
  1828.       sy = @tile_id % 256 / 8 % 16 * 32;      
  1829.     else
  1830.       #キャラクター
  1831.       bitmap0 = Cache.character(@character_name)   
  1832.       sign = @character_name[/^[\!\$]./]
  1833.       if sign && sign.include?('[/fold]


  1834. )
  1835.         @cw = bitmap0.width / 3
  1836.         @ch = bitmap0.height / 4
  1837.       else
  1838.         @cw = bitmap0.width / 12
  1839.         @ch = bitmap0.height / 8
  1840.       end
  1841.       
  1842.       index = @character_index
  1843.       pattern = @character_pattern < 3 ? @character_pattern : 1
  1844.       sx = (index % 4 * 3 + pattern) * @cw
  1845.       sy = (index / 4 * 4 + (@character_direction - 2) / 2) * @ch      
  1846.     end
  1847.             
  1848.     #重なっている部分の矩形
  1849.     c_x0 = ev.tensou_rect_x.x
  1850.     c_x1 = ev.tensou_rect_x.y
  1851.     e_x0 = ev.tensou_rect_x.width
  1852.     e_x1 = ev.tensou_rect_x.height
  1853.    
  1854.     c_y0 = ev.tensou_rect_y.x
  1855.     c_y1 = ev.tensou_rect_y.y
  1856.     e_y0 = ev.tensou_rect_y.width
  1857.     e_y1 = ev.tensou_rect_y.height
  1858.    
  1859.     #はみ出している部分
  1860.     k_w = 0
  1861.     if e_x0 <= c_x0
  1862.       k_w = e_x1 - c_x0
  1863.     elsif e_x0 >= c_x0
  1864.       k_w = c_x1 - e_x0
  1865.     end
  1866.    
  1867.     k_h = 0
  1868.     if e_y0 <= c_y0
  1869.       k_h = e_y1 - c_y0
  1870.     elsif e_y0 >= c_y0
  1871.       k_h = c_y1 - e_y0
  1872.     end
  1873.    
  1874.     #転送先の矩形
  1875.     #転送先は必ず接続イベント
  1876.     k_x = [e_x0-c_x0,c_x0-c_x0].max
  1877.     k_y = [e_y0-c_y0,c_y0-c_y0].max
  1878.    
  1879.     k_w = [k_w,sprite_w(ev)].min
  1880.     k_h = [k_h,sprite_h(ev)].min
  1881.    
  1882.     dest_rect = Rect.new(k_x,k_y,k_w,k_h)
  1883.    
  1884.     t_x = 0
  1885.     if c_x0 >= e_x0
  1886.       t_x = sx + c_x0 - e_x0
  1887.     elsif c_x0 <= e_x0
  1888.       t_x = sx
  1889.     end
  1890.    
  1891.     t_y = 0
  1892.     if c_y0 >= e_y0
  1893.       t_y = sy + c_y0 - e_y0
  1894.     elsif c_y0 <= e_y0
  1895.       t_y = sy
  1896.     end
  1897.    
  1898.     return if k_w <= 0 || k_h <= 0
  1899.     return if ev.transparent == true
  1900.    
  1901.     src_rect = Rect.new(t_x,t_y,k_w,k_h)
  1902.     self.bitmap.stretch_blt(dest_rect, bitmap0, src_rect)   
  1903.   end
  1904.   #--------------------------------------------------------------------------
  1905.   # ● フレーム更新
  1906.   #--------------------------------------------------------------------------
  1907.   def update
  1908.     return  unless SceneManager.scene_is?(Scene_Map)

  1909.     super
  1910.    
  1911.     unless update?
  1912.       self.visible = false
  1913.       return
  1914.     else
  1915.       self.visible = true
  1916.     end
  1917.         
  1918.     update_s
  1919.     update_position
  1920.   end
  1921.   #--------------------------------------------------------------------------
  1922.   # ● グラフィックの変更判定
  1923.   #--------------------------------------------------------------------------
  1924.   def graphic_changed?
  1925.     @tile_id != @character.tile_id ||
  1926.     @character_name != @character.character_name ||
  1927.     @character_index != @character.character_index
  1928.   end
  1929.   #--------------------------------------------------------------------------
  1930.   # ● 指定されたタイルが含まれるタイルセット画像の取得
  1931.   #--------------------------------------------------------------------------
  1932.   def tileset_bitmap(tile_id)
  1933.     Cache.tileset($game_map.tileset.tileset_names[5 + tile_id / 256])
  1934.   end  
  1935. end

  1936. #==============================================================================
  1937. # ■ Game_Interpreter
  1938. #------------------------------------------------------------------------------
  1939. #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
  1940. # Game_Troop クラス、Game_Event クラスの内部で使用されます。
  1941. #==============================================================================
  1942. class Game_Interpreter
  1943.   #--------------------------------------------------------------------------
  1944.   # ● イベントのセットアップ
  1945.   #     list     : 実行内容
  1946.   #     event_id : イベント ID
  1947.   #--------------------------------------------------------------------------
  1948.   alias Game_Interpreter_setup setup
  1949.   def setup(list, event_id = 0)
  1950.     Game_Interpreter_setup(list, event_id)
  1951.     #どのレイヤーのイベントが起動したか
  1952.     @setup_layer = event_id / Game_Map::MAX_EVENT
  1953.   end
  1954.   #--------------------------------------------------------------------------
  1955.   # ● レイヤーの変更
  1956.   #--------------------------------------------------------------------------
  1957.   def set_active_layer(lay)
  1958.     $game_map.events[@event_id].active_layer=lay if @event_id > 0
  1959.   end
  1960.   #--------------------------------------------------------------------------
  1961.   # ● キャラクターの取得
  1962.   #     param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID
  1963.   #--------------------------------------------------------------------------
  1964.   def get_character(param)
  1965.     if $game_party.in_battle
  1966.       nil
  1967.     elsif param < 0
  1968.       $game_player
  1969.     else
  1970.       events = same_map? ? $game_map.events : {}
  1971.       add = @setup_layer * Game_Map::MAX_EVENT
  1972.       events[param > 0 ? param+add : @event_id]
  1973.     end  
  1974.   end
  1975.   #--------------------------------------------------------------------------
  1976.   # ● 指定位置の情報取得
  1977.   #--------------------------------------------------------------------------
  1978.   def command_285
  1979.     if @params[2] == 0      # 直接指定
  1980.       x = @params[3]
  1981.       y = @params[4]
  1982.     else                    # 変数で指定
  1983.       x = $game_variables[@params[3]]
  1984.       y = $game_variables[@params[4]]
  1985.     end
  1986.     case @params[1]
  1987.     when 0      # 地形タグ
  1988.       value = $game_map.terrain_tag(x, y, $game_map.events[@event_id].active_layer)
  1989.     when 1      # イベント ID
  1990.       value = $game_map.event_id_xy(x, y)
  1991.     when 2..4   # タイル ID
  1992.       value = $game_map.tile_id(x, y, @params[1] - 2)
  1993.     else        # リージョン ID
  1994.       value = $game_map.region_id(x, y)
  1995.     end
  1996.     $game_variables[@params[0]] = value
  1997.   end
  1998.   
  1999. end
复制代码



  
回复

使用道具 举报

梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2016-2-16 17:11:14 | 显示全部楼层
本帖最后由 Vortur 于 2016-2-20 18:27 编辑

这个方法可能行:

1.找到脚本的最顶端class
2.在该class下加入判断



试试这样,以Scene_Base为例:
[pre lang="ruby"]  #--------------------------------------------------------------------------
  # ● 主逻辑
  #--------------------------------------------------------------------------
  def main
    start
    post_start
    update until scene_changing?
    pre_terminate
    terminate
  end[/pre]
这段改为
[pre lang="ruby"]  #--------------------------------------------------------------------------
  # ● 主逻辑
  #--------------------------------------------------------------------------
  def main
if $66RPG==1
then
    start
    post_start
    update until scene_changing?
    pre_terminate
    terminate
eng
  end[/pre]

当需要该功能时,就在事件里插入脚本
$66RPG=1,
否则
$66RPG=0


未测试,可能无效。猜测无效原因是:
该脚本于游戏进入时加载一遍,因编写的缘故,没有提供在游戏中刷新的功能;所以即使修改了变量,也无法被系统知道。


点评

测试一下看看吧!说不定行呢?  发表于 2016-2-20 18:26
。。。  发表于 2016-2-20 12:03
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部