Advertisement
LiTTleDRAgo

[RGSS/3] DRG - Multi Layer

Aug 6th, 2013
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 13.03 KB | None | 0 0
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  2. # Drago - Multi Layer
  3. # Version: 2.03
  4. # Author : LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  6.  
  7. ($imported ||= {})[:drg_multi_layer] = 2.03
  8.  
  9. core = "This script needs Drago - Core Engine ver 1.43 or above"
  10. rmvx = "This script not for RMVX"
  11.  
  12. $imported[:drg_core_engine]         || raise(core)
  13. LiTTleDRAgo::XP || LiTTleDRAgo::VXA || raise(rmvx)
  14.    
  15. #==============================================================================
  16. # ** Spriteset_Map
  17. #------------------------------------------------------------------------------
  18. #  This class brings together map screen sprites, tilemaps, etc. It's used
  19. # within the Scene_Map class.
  20. #==============================================================================
  21. class Spriteset_Map
  22.   #--------------------------------------------------------------------------
  23.   # * Public Instance Variables
  24.   #--------------------------------------------------------------------------
  25.   attr_sec_reader :tilemap_layer, 'Array.new'
  26.   #--------------------------------------------------------------------------
  27.   # * Alias Listing
  28.   #--------------------------------------------------------------------------
  29.   alias_method     :initialize_multi_layer_cr, :initialize
  30.   alias_sec_method :update_multi_layer_cr,     :update
  31.   alias_sec_method :dispose_multi_layer_cr,    :dispose
  32.   #--------------------------------------------------------------------------
  33.   # * New Method : create_multi_layer
  34.   #--------------------------------------------------------------------------
  35.   def create_multi_layer
  36.     return if $game_map.map_type == 'XP' &&
  37.               ($imported[:drg_custom_resolution]||0) >= 2
  38.     tilemap_layer.dispose
  39.     tilemap_layer.clear
  40.     @layer_data = $game_map.layer_data
  41.     $game_map.layer_data.each_with_index do |data,index|
  42.       temp_map = Game_Map.new
  43.       temp_map.setup($game_map.layer_subs.at(index))
  44.       tileset = LiTTleDRAgo.cache.tileset(temp_map.tileset_name)
  45.       tilemap_layer[index] = @tilemap.class.new(@viewport1)
  46.       tilemap_layer[index].map_data = temp_map.data
  47.       if $game_map.map_type == 'XP'
  48.         tilemap_layer[index].tileset = tileset
  49.         for i in 0..6
  50.           autotile_name = LiTTleDRAgo.cache.autotile(temp_map.autotile_names[i])
  51.           tilemap_layer[index].autotiles[i] = autotile_name
  52.         end
  53.         tilemap_layer[index].priorities = temp_map.priorities
  54.       else
  55.         load = "This script needs Drago - XP Map Loader ver 1.10 or above"
  56.         $imported[:drg_xp_map_loader] || raise(load)
  57.         temp_map.tileset.tileset_names.each_with_index do |name, i|
  58.           @tilemap_layer[index].bitmaps[i] = LiTTleDRAgo.cache.tileset(name)
  59.         end
  60.         @tilemap_layer[index].flags = temp_map.tileset.flags
  61.       end
  62.     end
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # * Aliased Method : update
  66.   #--------------------------------------------------------------------------
  67.   def update
  68.     update_multi_layer_cr
  69.     create_multi_layer if @layer_data != $game_map.layer_data
  70.     tilemap_layer.ox = @tilemap.ox
  71.     tilemap_layer.oy = @tilemap.oy
  72.     tilemap_layer.update
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # * Aliased Method : dispose
  76.   #--------------------------------------------------------------------------
  77.   def dispose
  78.     tilemap_layer.dispose
  79.     dispose_multi_layer_cr
  80.   end
  81.   #-------------------------------------------------------------------------
  82.   # * Drago - Custom Resolution
  83.   #-------------------------------------------------------------------------
  84.   if $imported[:drg_custom_resolution]
  85.     if $imported[:drg_custom_resolution] < 2 && LiTTleDRAgo::XP
  86.       #-------------------------------------------------------------------------
  87.       # * Alias Listing
  88.       #-------------------------------------------------------------------------
  89.       alias_sec_method :create_tilemap_ex_multi_layer,  :create_tilemap_ex
  90.       alias_sec_method :update_new_tilemap_multi_layer, :update_tilemap_ex
  91.       alias_sec_method :dispose_tilemap_ex_multi_layer, :dispose_tilemap_ex
  92.       #-------------------------------------------------------------------------
  93.       # * Aliased method: create_tilemap_ex
  94.       #-------------------------------------------------------------------------
  95.       def create_tilemap_ex
  96.         create_tilemap_ex_multi_layer
  97.         create_multi_layer_ex
  98.       end
  99.       #-------------------------------------------------------------------------
  100.       # * New method: create_multi_layer_ex
  101.       #-------------------------------------------------------------------------
  102.       def create_multi_layer_ex
  103.         @tilemap_layer_ex && @tilemap_layer_ex.flatten.dispose
  104.         @tilemap_layer_ex = []
  105.         @extra_res.each_index do |a|
  106.           @tilemap_layer_ex[a] ||= []
  107.           $game_map.layer_data.each_with_index do |d,b|
  108.             temp_map = Game_Map.new
  109.             temp_map.setup($game_map.layer_subs.at(b))
  110.             tileset = LiTTleDRAgo.cache.tileset(temp_map.tileset_name)
  111.             @tilemap_layer_ex[a][b] = Tilemap.new(@viewport_ex[a])
  112.             @tilemap_layer_ex[a][b].tileset = tileset
  113.             for i in 0..6
  114.               autotile = LiTTleDRAgo.cache.autotile(temp_map.autotile_names[i])
  115.               @tilemap_layer_ex[a][b].autotiles[i] = autotile
  116.             end
  117.             @tilemap_layer_ex[a][b].map_data   = temp_map.data
  118.             @tilemap_layer_ex[a][b].priorities = temp_map.priorities
  119.           end
  120.         end
  121.       end
  122.       #-------------------------------------------------------------------------
  123.       # * Aliased method: update_new_tilemap
  124.       #-------------------------------------------------------------------------
  125.       def update_tilemap_ex
  126.         update_new_tilemap_multi_layer
  127.         @tilemap_ex && @extra_res.each_index do |a|
  128.           $game_map.layer_data.each_index do |b|
  129.             if @tilemap_layer_ex && @tilemap_layer_ex[a] &&
  130.               @tilemap_layer_ex[a][b] && @tilemap_layer_ex[a][b].not.disposed?
  131.               @tilemap_ex[a].not.disposed?
  132.               @tilemap_layer_ex[a][b].ox = @tilemap_ex[a].ox
  133.               @tilemap_layer_ex[a][b].oy = @tilemap_ex[a].oy
  134.               @tilemap_layer_ex[a][b].update
  135.             end
  136.           end
  137.         end
  138.       end
  139.       #-------------------------------------------------------------------------
  140.       # * Aliased method: dispose_tilemap_ex
  141.       #-------------------------------------------------------------------------
  142.       def dispose_tilemap_ex
  143.         @tilemap_layer_ex && @tilemap_layer_ex.flatten.dispose
  144.         dispose_tilemap_ex_multi_layer
  145.       end
  146.     end
  147.   end
  148. end
  149.  
  150. #==============================================================================
  151. # ** Game_Map
  152. #------------------------------------------------------------------------------
  153. #  This class handles maps. It includes scrolling and passage determination
  154. # functions. The instance of this class is referenced by $game_map.
  155. #==============================================================================
  156. class Game_Map
  157.   #--------------------------------------------------------------------------
  158.   # * Public Instance Variables
  159.   #--------------------------------------------------------------------------  
  160.   attr_sec_accessor :layer_data, :layer_subs, 'Array.new'
  161.   attr_reader       :map_type
  162.   #--------------------------------------------------------------------------
  163.   # * Alias Method
  164.   #--------------------------------------------------------------------------
  165.   alias_sec_method :setup_multilayer, :setup
  166.   #--------------------------------------------------------------------------
  167.   # * Aliased Method : setup
  168.   #--------------------------------------------------------------------------
  169.   def setup(*args)
  170.     setup_multilayer(*args)  
  171.     @map_type ||= 'XP'
  172.     decide_map_layer(*args)          
  173.   end
  174.   #--------------------------------------------------------------------------
  175.   # * Overwriten Method : decide_map_layer
  176.   #--------------------------------------------------------------------------
  177.   def decide_map_layer(*args)
  178.     return if layer_subs.include?(@map_id)
  179.     @layer_data, @layer_subs = [], []
  180.     child_ids.each do |submap_id|
  181.       map_info = mapInfo[submap_id]
  182.       unless map_info.nil?
  183.         if map_info.parent_id == map_id &&
  184.           map_info.name.include?("[" + 'join' + "]")
  185.         then
  186.           submap = load_map_data(submap_id, @map_type=='XP' ? :rxdata : :rvdata2)
  187.           unless submap
  188.             print "Map #{submap_id} doesn't exist"
  189.             next
  190.           end
  191.           if [submap.width,submap.height] != [width,height]
  192.             raise "Dimension of child maps must be same with parent's dimension"
  193.           end
  194.           @layer_data << data
  195.           @layer_subs << submap_id
  196.           old_zsize = data.zsize
  197.           data.resize(data.xsize, data.ysize, old_zsize + 3)
  198.           for x in 0...data.xsize
  199.             for y in 0...data.ysize
  200.               if @map_type == 'XP'
  201.                 data[x, y, old_zsize]     = submap.data[x, y, 0]
  202.                 data[x, y, old_zsize + 1] = submap.data[x, y, 1]
  203.                 data[x, y, old_zsize + 2] = submap.data[x, y, 2]
  204.               else
  205.                 data[x, y, old_zsize]     = submap.data[x, y, 1]
  206.                 data[x, y, old_zsize + 1] = submap.data[x, y, 2]
  207.               end
  208.             end
  209.           end
  210.         end
  211.         @need_redraw = true
  212.       end
  213.     end
  214.   end
  215.   #--------------------------------------------------------------------------
  216.   # * If RMXP
  217.   #--------------------------------------------------------------------------
  218.   if LiTTleDRAgo::XP
  219.     #--------------------------------------------------------------------------
  220.     # * Overwriten Method : passable?
  221.     #--------------------------------------------------------------------------
  222.     def passable?(x, y, d, s = nil)
  223.       return false unless valid?(x, y)
  224.       bit = (1 << (d / 2 - 1)) & 0x0f
  225.       (event_tiles(x, y, s) + layered_tiles(x, y)).each do |tile_id|
  226.         return false if tile_id.nil?
  227.         if @passages[tile_id] & bit != 0
  228.           return false
  229.         elsif @passages[tile_id] & 0x0f == 0x0f
  230.           return false
  231.         elsif @priorities[tile_id] == 0
  232.           return true
  233.         end
  234.       end
  235.       return true
  236.     end
  237.     #--------------------------------------------------------------------------
  238.     # * Overwriten Method : bush?
  239.     #--------------------------------------------------------------------------
  240.     def bush?(x, y)
  241.       return false if @map_id == 0
  242.         layered_tiles(x, y).each do |tile_id|
  243.         return false if tile_id.nil?
  244.         passage = @passages[tile_id]
  245.         return true if passage & 0x40 == 0x40
  246.       end
  247.       return false
  248.     end
  249.     #--------------------------------------------------------------------------
  250.     # * Overwriten Method : counter?
  251.     #--------------------------------------------------------------------------
  252.     def counter?(x, y)
  253.       return false if @map_id == 0
  254.       layered_tiles(x, y).each do |tile_id|
  255.         return false if tile_id.nil?
  256.         passage = @passages[tile_id]
  257.         return true if passage & 0x80 == 0x80
  258.       end
  259.       return false
  260.     end
  261.     #--------------------------------------------------------------------------
  262.     # * Overwriten Method : terrain_tag
  263.     #--------------------------------------------------------------------------
  264.     def terrain_tag(x, y)
  265.       return 0 if @map_id == 0
  266.       layered_tiles(x, y).each do |tile_id|
  267.         return 0 if tile_id.nil?
  268.         tag = @terrain_tags[tile_id]
  269.         return tag if tag > 0
  270.       end
  271.       return 0
  272.     end
  273.     #--------------------------------------------------------------------------
  274.     # * New Method : layered_tiles
  275.     #--------------------------------------------------------------------------
  276.     def layered_tiles(x, y)
  277.       z_data.collect {|z| tile_id(x, y, z) }
  278.     end
  279.     #--------------------------------------------------------------------------
  280.     # * New Method : z_data
  281.     #--------------------------------------------------------------------------
  282.     unless method_defined?(:z_data)
  283.       def z_data
  284.         (0...data.zsize).to_a.reverse
  285.       end
  286.     end
  287.     #--------------------------------------------------------------------------
  288.     # * New Method : event_tiles
  289.     #--------------------------------------------------------------------------
  290.     def event_tiles(x, y, s=nil)
  291.       return [] unless self.respond_to?(:events_xy_nt)
  292.       e = events_xy_nt(x,y).select {|e| e.tile_id >= 0 && e != s }
  293.       e.collect {|event| event.tile_id }
  294.     end
  295.     #--------------------------------------------------------------------------
  296.     # * New Method : tile_id
  297.     #--------------------------------------------------------------------------
  298.     unless method_defined?(:tile_id)
  299.       def tile_id(x, y, z)
  300.         data[x, y, z]
  301.       end
  302.     end
  303.   end
  304. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement