Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module MapUtility
- def self.copy_map(copy_mid, terrain_tag, ox = 0, oy = 0)
- data = $game_map.data
- last_id = $game_map.events.values.max {|e1, e2| e1.id <=> e2.id}.id
- last_id += 1
- map = load_data(sprintf("Data/Map%03d.rvdata2", copy_mid))
- map_modified = false
- # Load map events
- event_map = {}
- for event in map.events.values
- key = [event.x, event.y]
- event_map[key] = [] unless event_map.include?(key)
- event_map[key] << event
- end
- # Load map data
- mapdata = map.data
- for copy_mx in 0...mapdata.xsize
- for copy_my in 0...mapdata.ysize
- game_mx = copy_mx + ox
- game_my = copy_my + oy
- if mapdata[copy_mx, copy_my, 3] >> 8 == terrain_tag &&
- 0 <= game_mx && game_mx < data.xsize &&
- 0 <= game_my && game_my < data.ysize
- # Register that we will copy over data
- map_modified = true
- # Verbatim copy of first three layers
- for layer in 0..2 do
- data[game_mx, game_my, layer] = mapdata[copy_mx, copy_my, layer]
- end
- # Merge region id from current map with shadow data from copy map
- tag = data[game_mx, game_my, 3] - (data[game_mx, game_my, 3] % 256)
- data[game_mx, game_my, 3] = mapdata[copy_mx, copy_my, 3] % 256 + tag
- # Copy event
- event_key = [copy_mx, copy_my]
- if event_map.include?(event_key)
- for event in event_map[event_key]
- event.id = last_id + event.id
- event.x += ox
- event.y += oy
- $game_map.create_game_event(event)
- end
- end
- end
- end
- end
- if map_modified
- # This map is no longer safe to reload when loading
- $game_map.data_modifications = true
- # Refresh sprites
- SceneManager.scene.instance_eval("@spriteset.reload_tilemap")
- end
- end
- end
- ##
- # Integration
- #
- class Spriteset_Map
- def reload_tilemap
- @tilemap.map_data = $game_map.data
- load_tileset
- create_new_characters
- refresh_characters
- end
- def create_new_characters
- return unless $game_map && $game_map.new_events
- for event in $game_map.new_events
- @character_sprites.push(Sprite_Character.new(@viewport1, event))
- end
- $game_map.new_events.clear
- end
- end
- class Game_Map
- attr_accessor :data_modifications
- def new_events
- @new_events ||= []
- @new_events
- end
- ##
- # Create a new game event based on an RPG::Event instance
- #
- def create_game_event(event)
- game_event = Game_Event.new(map_id, event)
- new_events << game_event
- events[event.id] = game_event
- end
- end
- ##
- # Change reload mechanism
- #
- module DataManager
- class << self
- unless self.method_defined?(:zeriab_copy_reload_map_if_updated)
- alias_method(:zeriab_copy_reload_map_if_updated, :reload_map_if_updated)
- end
- ##
- # Reload must not occur when we have made any runtime data changes.
- # Otherwise we may throw our changes away
- #
- def reload_map_if_updated
- if !$game_map.data_modifications
- # No copy changes so we are save to use the normal reload code
- zeriab_copy_reload_map_if_updated
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement