Advertisement
LiTTleDRAgo

[RGSS/3] XP Map Loader II

Aug 9th, 2014
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 34.18 KB | None | 0 0
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  2. # XP Map Loader & Multi Layer
  3. # Version: 2.05
  4. # Author : LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  6. ($imported ||= {})[:drg_xp_map_loader] = 2.05
  7. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  8. #
  9. # Introduction :
  10. #
  11. #   Version 2 from XP Map Loader (Merged with multi layer script)
  12. #
  13. # Issue :
  14. #  
  15. #  XP Map Loader :
  16. #  - You cannot use Drago - Custom Resolution II's zoom feature.
  17. #  - You cannot join XP maps with VXA maps, but you can join VXA
  18. #    maps with XP maps.
  19. #  - Only for VXAce
  20. #
  21. #  Multi Layer :
  22. #  - More Layer = More Lag
  23. #
  24. #==============================================================================
  25. module LiTTleDRAgo
  26.  
  27.   # Condition for layer to be joined
  28.   MultiLayerCond = proc do |i|
  29.     condition = {
  30.    
  31.       1 => $game_switches[1], # This means this layer will be joined when
  32.                               # switch 1 is ON and will disappear when OFF
  33.       2 => $game_variables[1] == 200,
  34.      
  35.       }
  36.     condition[i]   # Do not remove this line
  37.   end
  38.  
  39.  
  40. end
  41.  
  42. core  = "This script needs Drago - Core Engine ver 1.44 or above"
  43. implemented = "%1$s has already implemented, Please remove the %1$s script"
  44.  
  45. ($imported[:drg_core_engine] || 0) >= 1.44 || raise(core)
  46. ($imported[:drg_multi_layer])&& raise(sprintf(implemented,"Multi Layer"))
  47. #==============================================================================
  48. # ** Game_Map
  49. #------------------------------------------------------------------------------
  50. #  This class handles maps. It includes scrolling and passage determination
  51. # functions. The instance of this class is referenced by $game_map.
  52. #==============================================================================
  53. class Game_Map
  54.   #--------------------------------------------------------------------------
  55.   # * Public Instance Variables
  56.   #--------------------------------------------------------------------------
  57.   attr_sec_accessor :panorama_name, :fog_name,             'String.new'      
  58.   attr_sec_accessor :panorama_hue, :fog_hue, :fog_zoom,    1        
  59.   attr_sec_accessor :fog_opacity, :fog_blend_type,         0
  60.   attr_sec_accessor :fog_sx, :fog_sy, :fog_ox, :fog_oy,    0
  61.   attr_sec_accessor :fog_tone, :fog_tone_target,           'Tone.new(0,0,0)'
  62.   attr_sec_accessor :multi_layer_condition_true,           'Array.new'
  63.   attr_sec_accessor :multi_layer_condition_false,          'Array.new'
  64.   attr_sec_reader   :xpmap,  'Array.new'            
  65.   attr_sec_reader   :vxamap, 'Array.new'
  66.   #--------------------------------------------------------------------------
  67.   # * Class Variable
  68.   #--------------------------------------------------------------------------
  69.   tileset = "Data/Tilesets.rxdata"
  70.   @@tileset_xp = File.exist?(tileset) ? load_data(tileset) : nil
  71.   @@rpgmakerxp = LiTTleDRAgo::XP
  72.   #--------------------------------------------------------------------------
  73.   # * Define Method
  74.   #--------------------------------------------------------------------------
  75.   unless @@rpgmakerxp
  76.     define_method(:zoom_x) { 1 }
  77.     define_method(:zoom_y) { 1 }
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # * Undefine Method
  81.   #--------------------------------------------------------------------------
  82.   if !@@rpgmakerxp && method_defined?(:zoom)
  83.     undef :zoom, :zoom_in, :zoom_out, :zoom_x=, :zoom_y=, :start_zoom
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # * Alias Listing
  87.   #--------------------------------------------------------------------------
  88.   alias_sec_method :xpmap_loader_setup,         :setup
  89.   alias_sec_method :xpmap_loader_update,        :update
  90.   alias_sec_method :layered_tiles_flag_vxlayer, :layered_tiles_flag?
  91.   #--------------------------------------------------------------------------
  92.   # * Aliased Method : setup
  93.   #--------------------------------------------------------------------------
  94.   def setup(*args)
  95.     xpmap_loader_setup(*args)
  96.     setup_map_xp
  97.     setup_map_layer
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # * New Method : setup_map_xp
  101.   #--------------------------------------------------------------------------
  102.   def setup_map_xp
  103.     reset_map_xp
  104.     map = sprintf("Map%03d",@map_id)
  105.     b   = "The dimension on %1$s.rvdata2 %2$s and %1$s.rxdata %3$s is not same"
  106.    
  107.     return unless @@tileset_xp && File.exist?("Data/"+map+".rxdata")
  108.     return if @@rpgmakerxp
  109.     return if self.xpmap.detect {|xp| xp && xp[:map_id] == @map_id }
  110.    
  111.    
  112.     _xp = load_map_data(@map_id,:rxdata)
  113.     _sz   = [@map,_xp].flatten.map {|m| [m.width,m.height]}.uniq
  114.     fail( sprintf( b, map, *_sz.map {|s| s.inspect})) if _sz.size > 1
  115.    
  116.     self.xpmap[0]                   = {}
  117.     self.xpmap[0][:map_id]          = @map_id
  118.     self.xpmap[0][:map]             = _xp
  119.     self.xpmap[0][:tileset_id]      = _xp.tileset_id
  120.     _xp = @@tileset_xp[_xp.tileset_id]
  121.     self.xpmap[0][:tileset_name]    = _xp.tileset_name
  122.     self.xpmap[0][:autotile_names]  = _xp.autotile_names
  123.     self.xpmap[0][:passages]        = _xp.passages
  124.     self.xpmap[0][:priorities]      = _xp.priorities
  125.     self.xpmap[0][:terrain_tags]    = _xp.terrain_tags
  126.    
  127.     @panorama_name   = _xp.panorama_name
  128.     @panorama_hue    = _xp.panorama_hue
  129.     @fog_name        = _xp.fog_name
  130.     @fog_hue         = _xp.fog_hue
  131.     @fog_opacity     = _xp.fog_opacity
  132.     @fog_blend_type  = _xp.fog_blend_type
  133.     @fog_zoom        = _xp.fog_zoom
  134.     @fog_sx          = _xp.fog_sx
  135.     @fog_sy          = _xp.fog_sy
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # * Aliased Method : update
  139.   #--------------------------------------------------------------------------
  140.   def update(*args)
  141.     xpmap_loader_update(*args)
  142.     update_fog unless @@rpgmakerxp
  143.     update_layer_condition
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # * New Method : reset_map_xp
  147.   #--------------------------------------------------------------------------
  148.   def reset_map_xp
  149.     self.xpmap.clear
  150.     self.vxamap.clear
  151.     self.multi_layer_condition_true.clear
  152.     self.multi_layer_condition_false.clear
  153.     @mapinfo = nil
  154.     self.clear_panorama unless @@rpgmakerxp
  155.     self.clear_fog      unless @@rpgmakerxp
  156.   end  
  157.   #--------------------------------------------------------------------------
  158.   # * New Method : setup_map_layer
  159.   #--------------------------------------------------------------------------
  160.   def setup_map_layer
  161.     layered = false
  162.     self.child_ids.each_with_index do |submap_id,index|
  163.       next if self.vxamap.detect {|vxa| vxa && vxa[:map_id] == submap_id }
  164.       next if self.xpmap.detect {|xp| xp && xp[:map_id] == submap_id }
  165.       next unless (map_info = mapInfo[submap_id]).not.nil?
  166.       next unless (map_info.parent_id == map_id)
  167.       join = map_info.name[/\[\s*join\s*\]/]
  168.       if map_info.name[/\[\s*join:\s*([-]?\d+)\s*\]/]
  169.         id = $1.to_i
  170.         cond = LiTTleDRAgo::MultiLayerCond.call(id)
  171.         if !cond && multi_layer_condition_true.not.include?(id)
  172.           @multi_layer_condition_true << id
  173.         end
  174.         if cond && multi_layer_condition_false.not.include?(id)
  175.           @multi_layer_condition_false << id
  176.         end
  177.         join ||= cond
  178.       end
  179.       next unless join
  180.       map     = sprintf("Map%03d",submap_id)
  181.       org     = sprintf("Map%03d",map_id)
  182.       notsame = "The dimension of Parent map and Child map must be same"
  183.      
  184.       if @@tileset_xp && File.exist?("Data/"+map+".rxdata")
  185.         _xp = load_map_data(submap_id,:rxdata)
  186.         _sz = [@map,_xp].flatten.map {|m| [m.width,m.height]}.uniq
  187.         _sz.size > 1 && fail(notsame)
  188.          
  189.         self.xpmap[index+1]                   = {}
  190.         self.xpmap[index+1][:map_id]          = submap_id
  191.         self.xpmap[index+1][:map]             = _xp
  192.         self.xpmap[index+1][:tileset_id]      = _xp.tileset_id
  193.         _xp = @@tileset_xp[_xp.tileset_id]
  194.         self.xpmap[index+1][:tileset_name]    = _xp.tileset_name
  195.         self.xpmap[index+1][:autotile_names]  = _xp.autotile_names
  196.         self.xpmap[index+1][:passages]        = _xp.passages
  197.         self.xpmap[index+1][:priorities]      = _xp.priorities
  198.         self.xpmap[index+1][:terrain_tags]    = _xp.terrain_tags
  199.       elsif File.exist?("Data/"+map+".rvdata2")
  200.         _vxa = load_map_data(submap_id,:rvdata2)
  201.         _sz  = [@map,_vxa].flatten.map {|m| [m.width,m.height]}.uniq
  202.         _sz.size > 1 && fail(notsame)
  203.    
  204.         self.vxamap[index] = {}
  205.         self.vxamap[index][:map_id]     = submap_id
  206.         self.vxamap[index][:map]        = _vxa
  207.         self.vxamap[index][:tileset_id] = _vxa.tileset_id
  208.         tileset = $data_tilesets[_vxa.tileset_id]
  209.         self.vxamap[index][:tileset]    = tileset
  210.       end
  211.       layered = _xp || _vxa
  212.     end
  213.     spriteset.create_multi_layer if spriteset
  214.   end  
  215.   #--------------------------------------------------------------------------
  216.   # * New Method : update_layer_condition
  217.   #--------------------------------------------------------------------------
  218.   def update_layer_condition
  219.     meth = LiTTleDRAgo::MultiLayerCond
  220.     condition = multi_layer_condition_true.any?  {|id| meth.call(id)    } ||
  221.                 multi_layer_condition_false.any? {|id| meth.not.call(id)}
  222.     condition && [setup_map_xp, setup_map_layer]
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # * New Method : reset_fog_variable
  226.   #--------------------------------------------------------------------------
  227.   def reset_fog_variable
  228.     @fog_ox               =
  229.     @fog_oy               =
  230.     @fog_tone             =
  231.     @fog_tone_target      = nil
  232.     @fog_tone_duration    =
  233.     @fog_opacity_duration =
  234.     @fog_opacity_target   = 0
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # * New Method : start_fog_tone_change
  238.   #--------------------------------------------------------------------------
  239.   unless method_defined?(:start_fog_tone_change)
  240.     def start_fog_tone_change(tone, duration)
  241.       @fog_tone_target = tone.clone
  242.       @fog_tone_duration = duration
  243.       if @fog_tone_duration == 0
  244.         @fog_tone = @fog_tone_target.clone
  245.       end
  246.     end
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # * New Method : start_fog_opacity_chang
  250.   #--------------------------------------------------------------------------
  251.   unless method_defined?(:start_fog_opacity_change)
  252.     def start_fog_opacity_change(opacity, duration)
  253.       @fog_opacity_target = opacity * 1.0
  254.       @fog_opacity_duration = duration
  255.       if @fog_opacity_duration == 0
  256.         @fog_opacity = @fog_opacity_target
  257.       end
  258.     end
  259.   end
  260.   #--------------------------------------------------------------------------
  261.   # * New Method : change_panorama
  262.   #--------------------------------------------------------------------------
  263.   def change_panorama(panorama_name = '',panorama_hue = 0)
  264.     @panorama_name = panorama_name
  265.     @panorama_hue  = panorama_hue
  266.   end
  267.   #--------------------------------------------------------------------------
  268.   # * New Method : clear_panorama
  269.   #--------------------------------------------------------------------------
  270.   def clear_panorama(*args)
  271.     change_panorama
  272.   end
  273.   #--------------------------------------------------------------------------
  274.   # * New Method : change_fog
  275.   #--------------------------------------------------------------------------
  276.   def change_fog(name='',hue=0,opac = 60, blend = 0,zoom = 1.0,sx = 0,sy = 0)
  277.     @fog_name       = name
  278.     @fog_hue        = hue
  279.     @fog_opacity    = opac
  280.     @fog_blend_type = blend
  281.     @fog_zoom       = zoom
  282.     @fog_sx         = sx
  283.     @fog_sy         = sy
  284.   end
  285.   #--------------------------------------------------------------------------
  286.   # * New Method : clear_fog
  287.   #--------------------------------------------------------------------------
  288.   def clear_fog(*args)
  289.     change_fog
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # * New Method : update_fog
  293.   #--------------------------------------------------------------------------
  294.   unless method_defined?(:update_fog)
  295.     def update_fog
  296.       @fog_ox = fog_ox - fog_sx / 8.0
  297.       @fog_oy = fog_oy - fog_sy / 8.0
  298.       if (@fog_tone_duration ||= 0) >= 1
  299.         d = (@fog_tone_duration ||= 0)
  300.         target = fog_tone_target
  301.         fog_tone.red   = (fog_tone.red * (d - 1) + target.red) / d
  302.         fog_tone.green = (fog_tone.green * (d - 1) + target.green) / d
  303.         fog_tone.blue  = (fog_tone.blue * (d - 1) + target.blue) / d
  304.         fog_tone.gray  = (fog_tone.gray * (d - 1) + target.gray) / d
  305.         @fog_tone_duration -= 1
  306.       end
  307.       if (@fog_opacity_duration ||= 0) >= 1
  308.         d = (@fog_opacity_duration ||= 0)
  309.         @fog_opacity  = (fog_opacity * (d-1) + (@fog_opacity_target||=0)) / d
  310.         @fog_opacity_duration -= 1
  311.       end
  312.     end
  313.   end
  314.   #--------------------------------------------------------------------------
  315.   # * New Method : tile_id_obj
  316.   #--------------------------------------------------------------------------
  317.   def tile_id_obj(obj, x, y, z)
  318.     if $game_map.respond_to?(:reverse) && $game_map.reverse && LiTTleDRAgo::XP
  319.       obj.reverse_data[x, y, z] || 0
  320.     else
  321.       obj.data[x, y, z] || 0
  322.     end
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # * New Method : collect_flag_tiles_vxa
  326.   #--------------------------------------------------------------------------
  327.   def collect_flag_tiles_vxa(x,y,*flag)
  328.     result = []
  329.     vxamap.compact.each do |map|
  330.       result += [2, 1, 0].collect do |z|
  331.         tile_id = tile_id_obj(map[:map],x, y, z)
  332.         [tile_id] + flag.collect {|s| map[s].flags[tile_id]}
  333.       end
  334.     end
  335.     return result
  336.   end
  337.   #--------------------------------------------------------------------------
  338.   # * New Method : collect_flag_tiles_xp
  339.   #--------------------------------------------------------------------------
  340.   def collect_flag_tiles_xp(x,y,*flag)
  341.     result = []
  342.     xpmap.compact.each do |map|
  343.       result += [2, 1, 0].collect do |z|
  344.         tile_id = tile_id_obj(map[:map],x, y, z)
  345.         [tile_id] + flag.collect {|s| map[s][tile_id]}
  346.       end
  347.     end
  348.     return result
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # * New Method : collect_flag_tiles_original
  352.   #--------------------------------------------------------------------------
  353.   def collect_flag_tiles_original(x,y,*flag)
  354.     all_tiles_rep(x, y).collect do |t_id|
  355.       @@rpgmakerxp ? [t_id] + flag.collect {|map| map[t_id]} :
  356.       [t_id, tileset.flags[t_id]]
  357.     end
  358.   end
  359.   #--------------------------------------------------------------------------
  360.   # * Aliased Method : layered_tiles_flag?
  361.   #--------------------------------------------------------------------------
  362.   def layered_tiles_flag?(x, y, bit)
  363.     xp       = collect_flag_tiles_xp(x,y,:passages)
  364.     vxa      = collect_flag_tiles_vxa(x,y,:tileset)
  365.     original = collect_flag_tiles_original(x,y,@passages)
  366.     if @@rpgmakerxp
  367.       result = (xp + vxa + original).any? { |id,flag| flag & bit != 0 }
  368.     else
  369.       result   = layered_tiles_flag_vxlayer(x, y, bit)
  370.       result ||= (xp + vxa ).any? { |id,flag| flag & bit != 0 }
  371.     end
  372.     return result
  373.   end
  374.   #--------------------------------------------------------------------------
  375.   # * Overwriten Method : check_passage
  376.   #--------------------------------------------------------------------------
  377.   def check_passage(x, y, bit)
  378.     original = collect_flag_tiles_original(x,y,@passages)
  379.     xp       = collect_flag_tiles_xp(x,y,:passages)
  380.     vxa      = collect_flag_tiles_vxa(x,y,:tileset)
  381.     ( xp + vxa + original ).each do |t_id,flag,prio|
  382.       next if flag & 0x10 != 0            # [☆]: No effect on passage
  383.       #return true  if flag & bit == 0     # [○] : Passable
  384.       return false if flag & bit != 0     # [×] : Impassable
  385.       return false if flag & bit == bit   # [×] : Impassable
  386.       return true  if prio && prio == 0    # [○] : Passable
  387.     end
  388.     return true#false                          # Impassable
  389.   end
  390.   #--------------------------------------------------------------------------
  391.   # * Overwriten Method : terrain_tag
  392.   #--------------------------------------------------------------------------
  393.   def terrain_tag(x, y)
  394.     return 0 unless valid?(x, y)
  395.     original = collect_flag_tiles_original(x,y,@terrain_tags)
  396.     xp  = collect_flag_tiles_xp(x,y,:terrain_tags)
  397.     vxa = collect_flag_tiles_vxa(x,y,:tileset).map {|t| t >> 12}
  398.     (xp + vxa).each { |t_id,tag| return tag if tag > 0 }
  399.     (original).each do |t_id,flag|
  400.       tag = @@rpgmakerxp ? flag : flag >> 12
  401.       return tag if tag > 0
  402.     end
  403.     return 0
  404.   end
  405.   #--------------------------------------------------------------------------
  406.   # * Overwriten Method : passable?
  407.   #--------------------------------------------------------------------------
  408.   if @@rpgmakerxp
  409.     def passable?(x, y, d, s = nil)
  410.       original = (event_tiles(x, y, s) + layered_tiles(x, y)).map do |t_id|
  411.         [t_id, @passages[t_id], @priorities[t_id]]
  412.       end
  413.       xp    = collect_flag_tiles_xp(x,y,:passages,:priorities)
  414.       vxa   = collect_flag_tiles_vxa(x,y,:tileset)
  415.       bit   = (1 << (d / 2 - 1)) & 0x0f
  416.       (xp + vxa + original ).each do |t_id,flag,prio|
  417.         next if flag & 0x10 != 0             # [☆]: No effect on passage
  418.         return false if flag & bit != 0      # [×] : Impassable
  419.         return false if flag & 0x0f == 0x0f  # [×] : Impassable
  420.         return true  if prio && prio == 0    # [○] : Passable
  421.       end
  422.       return true                            # [○] : Passable
  423.     end
  424.     #--------------------------------------------------------------------------
  425.     # * Overwriten Method : bush?
  426.     #--------------------------------------------------------------------------
  427.     def bush?(x, y)
  428.       valid?(x, y) && layered_tiles_flag?(x, y, 0x40)
  429.     end
  430.     #--------------------------------------------------------------------------
  431.     # * Overwriten Method : counter?
  432.     #--------------------------------------------------------------------------
  433.     def counter?(x, y)
  434.       valid?(x, y) && layered_tiles_flag?(x, y, 0x80)
  435.     end
  436.   end
  437.   #--------------------------------------------------------------------------
  438.   # * New Method : event_tiles
  439.   #--------------------------------------------------------------------------
  440.   def event_tiles(x, y, s = nil)
  441.     e = events_xy(x,y).select {|e| e.tile_id > 0 && e != s && !e.through}
  442.     e.collect {|event| event.tile_id }
  443.   end
  444.   #--------------------------------------------------------------------------
  445.   # * Replicated Method : layered_tiles
  446.   #--------------------------------------------------------------------------
  447.   unless method_defined?(:layered_tiles)
  448.     def layered_tiles(x, y)
  449.       [2, 1, 0].collect {|z| tile_id_obj(@map, x, y, z) }
  450.     end
  451.   end
  452.   #--------------------------------------------------------------------------
  453.   # * Replicated Method : all_tiles_rep
  454.   #--------------------------------------------------------------------------
  455.   unless method_defined?(:all_tiles_rep)
  456.     def all_tiles_rep(x, y)
  457.       event_tiles(x, y) + layered_tiles(x,y)
  458.     end
  459.   end
  460.   #--------------------------------------------------------------------------
  461.   # * Replicated Method : events_xy
  462.   #--------------------------------------------------------------------------
  463.   unless method_defined?(:events_xy)
  464.     def events_xy(x, y)
  465.       @events.values.select {|event| event.x == x && event.y == y }
  466.     end
  467.   end
  468. end
  469.  
  470. #==============================================================================
  471. # ** RPG
  472. #------------------------------------------------------------------------------
  473. #
  474. #==============================================================================
  475. module RPG
  476.   #============================================================================
  477.   # ** Map
  478.   #----------------------------------------------------------------------------
  479.   #
  480.   #============================================================================
  481.   class Map
  482.     attr_accessor     :tileset_id
  483.     attr_sec_accessor :reverse_data, 'data.reverse(true,false,false)'
  484.   end
  485.   #============================================================================
  486.   # ** Tileset
  487.   #----------------------------------------------------------------------------
  488.   #
  489.   #============================================================================
  490.   class Tileset
  491.     #--------------------------------------------------------------------------
  492.     # * Public Instance Variables
  493.     #--------------------------------------------------------------------------
  494.     attr_sec_accessor :tileset_name,  :panorama_name, :fog_name,
  495.                       :battleback_name,                      'String.new'
  496.     attr_sec_accessor :autotile_names,                       '[String.new]*7'
  497.     attr_sec_accessor :panorama_hue, :fog_hue, :fog_blend_type,
  498.                       :fog_sx, :fog_sy,                      0
  499.     attr_sec_accessor :passages, :priorities, :terrain_tags, 'Table.new(384)'
  500.     attr_sec_accessor :fog_zoom,                             200
  501.     attr_sec_accessor :fog_opacity,                          64
  502.   end
  503. end
  504.  
  505. #==============================================================================
  506. # ** Spriteset_Map
  507. #------------------------------------------------------------------------------
  508. #  This class brings together map screen sprites, tilemaps, etc. It's used
  509. # within the Scene_Map class.
  510. #==============================================================================
  511. class Spriteset_Map
  512.   #--------------------------------------------------------------------------
  513.   # * Public Instance Variables
  514.   #--------------------------------------------------------------------------
  515.   attr_sec_reader :tilemap_layer, 'Array.new'
  516.   #--------------------------------------------------------------------------
  517.   # * Class Variable
  518.   #--------------------------------------------------------------------------
  519.   @@rpgmakerxp = LiTTleDRAgo::XP
  520.   @@fog_opacity = @@panorama_opacity = 0
  521.   #--------------------------------------------------------------------------
  522.   # * Alias Listing
  523.   #--------------------------------------------------------------------------
  524.   alias_sec_method :update_multi_layer_cr,         :update
  525.   alias_sec_method :dispose_multi_layer_cr,        :dispose
  526.   alias_sec_method :reload_tilemap_multi_layer_cr, :reload_tilemap
  527.   alias_method     :fog_fix_initialize,            :initialize
  528.   #--------------------------------------------------------------------------
  529.   # * Aliased method: initialize
  530.   #--------------------------------------------------------------------------
  531.   def initialize(*args)
  532.     fog_fix_initialize
  533.     @fog.opacity = @@fog_opacity || 0 if @fog
  534.     @panorama.opacity = @@panorama_opacity || 0 if @panorama
  535.   end
  536.   #--------------------------------------------------------------------------
  537.   # * New Method : create_multi_layer
  538.   #--------------------------------------------------------------------------
  539.   def create_multi_layer
  540.     dispose_multi_layer
  541.     @xpmap_size  = $game_map.xpmap.size
  542.     @vxamap_size = $game_map.vxamap.size
  543.     $game_map.vxamap.compact.each do |data|
  544.       next if @@rpgmakerxp
  545.       tilemap_layer[(i  = tilemap_layer.size)] = Tilemap.new(@viewport1)
  546.       create_layer_tilemap(tilemap_layer[i],data)
  547.     end
  548.     $game_map.xpmap.compact.each do |data|
  549.       _data             = data.clone
  550.       _data[:tileset]   = LiTTleDRAgo.cache.tileset(data[:tileset_name])
  551.       _data[:autotiles] = []
  552.       if (tilemap = ([@tilemap]+tilemap_layer).detect {|t| obj_is_ztilemap?(t)})
  553.         data[:autotile_names].each_with_index do |name, i|
  554.           _data[:autotiles][i] = LiTTleDRAgo.cache.autotile_cr_tilemap(name)
  555.         end
  556.         [tilemap.extra_map_data.push(_data), tilemap.refresh] && next
  557.       end
  558.       unless @@rpgmakerxp
  559.         cr = "This script needs Drago - Custom Resolution ver 2.12 or above"
  560.         ($imported[:drg_custom_resolution] || 0) >= 2.12 || raise(cr)
  561.       end
  562.       klass             = @@rpgmakerxp ? @tilemap.class : ZTilemap
  563.       tilemap_layer[(i  = tilemap_layer.size)] = klass.new(@viewport1)
  564.       create_layer_tilemap(tilemap_layer[i], _data)
  565.     end    
  566.     @viewport_screen_width = 0
  567.   end
  568.   #--------------------------------------------------------------------------
  569.   # * New Method : create_layer_tilemap
  570.   #--------------------------------------------------------------------------
  571.   def create_layer_tilemap(tilemap,data)
  572.     if (@@rpgmakerxp && tilemap.is_a?(Tilemap)) || obj_is_ztilemap?(tilemap)
  573.       if obj_is_ztilemap?(tilemap)
  574.         temp = tilemap.sprite_compact
  575.         tilemap.sprite_compact = false
  576.       end
  577.       (0..6).each do |i|
  578.         name = data[:autotile_names][i]
  579.         bitmap = LiTTleDRAgo.cache.autotile(name)
  580.         @force_tilemap_enabled = true if bitmap.height == 192
  581.         tilemap.autotiles[i] = obj_is_ztilemap?(tilemap) ?
  582.         LiTTleDRAgo.cache.autotile_cr_tilemap(name) : bitmap
  583.       end
  584.       tilemap.tileset     = data[:tileset]
  585.       tilemap.priorities  = data[:priorities]
  586.       tilemap.map_data    = data[:map].data
  587.       update_layer_tilemap(tilemap)
  588.       tilemap.update
  589.       tilemap.sprite_compact = temp  if obj_is_ztilemap?(tilemap)
  590.     else
  591.       tilemap.map_data = data[:map].data
  592.       data[:tileset].tileset_names.each_with_index do |name, i|
  593.         tilemap.bitmaps[i] = LiTTleDRAgo.cache.tileset(name)
  594.       end
  595.       tilemap.flags = data[:tileset].flags
  596.       update_layer_tilemap(tilemap)
  597.       tilemap.update
  598.     end
  599.   end
  600.   #--------------------------------------------------------------------------
  601.   # * Aliased Method : update
  602.   #--------------------------------------------------------------------------
  603.   def update
  604.     unless @@rpgmakerxp                  
  605.       update_panorama
  606.       update_fog
  607.       update_panorama_plane
  608.       update_fog_plane
  609.     end        
  610.     update_multi_layer_cr
  611.     if @xpmap_size != $game_map.xpmap.size ||
  612.       @vxamap_size != $game_map.vxamap.size
  613.       create_multi_layer  
  614.     end
  615.     update_multi_layer
  616.   end
  617.   #--------------------------------------------------------------------------
  618.   # * New Method : dispose_multi_layer
  619.   #--------------------------------------------------------------------------
  620.   def dispose_multi_layer
  621.     tilemap_layer.dispose
  622.     tilemap_layer.clear
  623.   end
  624.   #--------------------------------------------------------------------------
  625.   # * New Method : update_multi_layer
  626.   #--------------------------------------------------------------------------
  627.   def update_multi_layer
  628.     tilemap_layer.each { |t| update_layer_tilemap(t) }
  629.   end
  630.   #--------------------------------------------------------------------------
  631.   # * New Method : update_layer_tilemap
  632.   #--------------------------------------------------------------------------
  633.   def update_layer_tilemap(tilemap)
  634.     if obj_is_ztilemap?(tilemap)
  635.       if @@rpgmakerxp
  636.         tilemap.ox      = @tilemap.ox
  637.         tilemap.oy      = @tilemap.oy
  638.         tilemap.zoom_x  = $game_map.zoom_x
  639.         tilemap.zoom_y  = $game_map.zoom_y
  640.         tilemap.opacity = $game_map.tilemap_opacity
  641.         tilemap.hue     = $game_map.tilemap_hue
  642.         tilemap.tone    = $game_map.tilemap_tone
  643.       else
  644.         tilemap.ox = $game_map.display_x * tilemap_move_multiplier
  645.         tilemap.oy = $game_map.display_y * tilemap_move_multiplier
  646.       end
  647.     else
  648.       tilemap.ox = @tilemap.ox rescue $game_map.display_x * tilemap_move_multiplier
  649.       tilemap.oy = @tilemap.oy rescue $game_map.display_y * tilemap_move_multiplier
  650.     end
  651.     tilemap.update
  652.   end
  653.   #--------------------------------------------------------------------------
  654.   # * New Method : obj_is_ztilemap?
  655.   #--------------------------------------------------------------------------
  656.   def obj_is_ztilemap?(obj)
  657.     defined?(ZTilemap) && obj.is_a?(ZTilemap)
  658.   end
  659.   #--------------------------------------------------------------------------
  660.   # * Aliased Method : dispose
  661.   #--------------------------------------------------------------------------
  662.   def dispose
  663.     dispose_multi_layer
  664.     dispose_multi_layer_cr
  665.     [dispose_fog, dispose_panorama] rescue nil unless @@rpgmakerxp
  666.   end
  667.   #--------------------------------------------------------------------------
  668.   # * Aliased Method : reload_tilemap
  669.   #--------------------------------------------------------------------------
  670.   def reload_tilemap
  671.     reload_tilemap_multi_layer_cr      
  672.     create_multi_layer
  673.   end
  674.   #--------------------------------------------------------------------------
  675.   # * New Method : tilemap_move_multiplier
  676.   #--------------------------------------------------------------------------
  677.   def tilemap_move_multiplier
  678.     n = 1.00 / 4
  679.     n = 1.00 / 8  if LiTTleDRAgo::VX
  680.     n = 1.00 * 32 if LiTTleDRAgo::VXA
  681.     return n
  682.   end  
  683.   #--------------------------------------------------------------------------
  684.   # * New Method : update_panorama
  685.   #--------------------------------------------------------------------------
  686.   unless method_defined?(:update_panorama)
  687.     def update_panorama
  688.       if @panorama.nil?
  689.         @panorama = Plane.new(@viewport1)
  690.         @panorama.opacity = (@@panorama_opacity ||= 0)
  691.         @panorama.z = -1000
  692.       end
  693.       if @panorama_name != $game_map.panorama_name or
  694.           @panorama_hue != $game_map.panorama_hue
  695.         @panorama_name = $game_map.panorama_name
  696.         @panorama_hue = $game_map.panorama_hue
  697.         if @panorama.bitmap.respond_to?(:dispose) &&
  698.           @panorama.bitmap.not.disposed?
  699.           @panorama.bitmap.dispose
  700.           @panorama.bitmap = nil
  701.         end
  702.         if @panorama_name != ''
  703.           @panorama.bitmap =
  704.                 LiTTleDRAgo.cache.panorama(@panorama_name, @panorama_hue)
  705.         end
  706.         Graphics.frame_reset
  707.       end
  708.     end
  709.   end
  710.   #--------------------------------------------------------------------------
  711.   # * New Method : update_fog
  712.   #--------------------------------------------------------------------------  
  713.   unless method_defined?(:update_fog)
  714.     def update_fog
  715.       if @fog.nil?
  716.         @fog = Plane.new(@viewport1)
  717.         @fog.opacity = (@@fog_opacity ||= 0)
  718.         @fog.z = 3000
  719.       end
  720.       if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  721.         @fog_name = $game_map.fog_name
  722.         @fog_hue  = $game_map.fog_hue
  723.         if @fog.bitmap.respond_to?(:dispose) && @fog.bitmap.not.disposed?
  724.           @fog.bitmap.dispose
  725.           @fog.bitmap = nil
  726.         end
  727.         if @fog_name != ''
  728.           @fog.bitmap = LiTTleDRAgo.cache.fog(@fog_name, @fog_hue)
  729.         end
  730.         Graphics.frame_reset
  731.       end
  732.     end
  733.   end
  734.   #--------------------------------------------------------------------------
  735.   # * New Method : update_panorama_plane
  736.   #--------------------------------------------------------------------------
  737.   unless method_defined?(:update_panorama_plane)
  738.     def update_panorama_plane
  739.       @panorama.ox = $game_map.display_x / 8
  740.       @panorama.oy = $game_map.display_y / 8
  741.     end
  742.   end
  743.   #--------------------------------------------------------------------------
  744.   # * New Method : update_fog_plane
  745.   #--------------------------------------------------------------------------
  746.   unless method_defined?(:update_fog_plane)
  747.     def update_fog_plane
  748.       @fog.zoom_x = $game_map.fog_zoom / 100.0
  749.       @fog.zoom_y = $game_map.fog_zoom / 100.0
  750.       @fog.opacity = $game_map.fog_opacity
  751.       @fog.blend_type = $game_map.fog_blend_type
  752.       @fog.ox = $game_map.display_x*tilemap_move_multiplier + $game_map.fog_ox
  753.       @fog.oy = $game_map.display_y*tilemap_move_multiplier + $game_map.fog_oy
  754.       @fog.tone = $game_map.fog_tone
  755.     end
  756.   end
  757.   #--------------------------------------------------------------------------
  758.   # * New Method : dispose_fog
  759.   #--------------------------------------------------------------------------
  760.   unless method_defined?(:dispose_fog)
  761.     def dispose_fog
  762.       unless @fog.nil? || @fog.disposed?
  763.         @@fog_opacity = @fog.opacity
  764.         @fog.dispose
  765.       end
  766.     end
  767.   end
  768.   #--------------------------------------------------------------------------
  769.   # * New Method : dispose_panorama
  770.   #--------------------------------------------------------------------------
  771.   unless method_defined?(:dispose_panorama)
  772.     def dispose_panorama
  773.       unless @panorama.nil? || @panorama.disposed?
  774.         @@panorama_opacity = @panorama.opacity
  775.         @panorama.dispose
  776.       end
  777.     end
  778.   end
  779. end
  780. #==============================================================================
  781. # ** RPG::Cache
  782. #==============================================================================
  783. ModCache = LiTTleDRAgo.cache
  784. module ModCache
  785.   #----------------------------------------------------------------------------
  786.   # * Self
  787.   #----------------------------------------------------------------------------
  788.   class << self
  789.     #--------------------------------------------------------------------------
  790.     # * Get Autotile Graphic
  791.     #--------------------------------------------------------------------------
  792.     unless method_defined?(:autotile)
  793.       def autotile(filename)
  794.         load_bitmap("Graphics/Autotiles/", filename)
  795.       end
  796.     end
  797.     #--------------------------------------------------------------------------
  798.     # * Get Panorama Graphic
  799.     #--------------------------------------------------------------------------
  800.     unless method_defined?(:panorama)
  801.       def panorama(filename, hue = 0)
  802.         load_bitmap("Graphics/Panoramas/", filename, hue)
  803.       end
  804.     end
  805.     #--------------------------------------------------------------------------
  806.     # * Get Fog Graphic
  807.     #--------------------------------------------------------------------------
  808.     unless method_defined?(:fog)
  809.       def fog(filename, hue = 0)
  810.         load_bitmap("Graphics/Fogs/", filename, hue)
  811.       end
  812.     end
  813.   end
  814. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement