SHOW:
|
|
- or go back to the newest paste.
| 1 | ||
| 2 | #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ | |
| 3 | # ** Reproduce Events | |
| 4 | # Author: Eshra | |
| 5 | # First Version: 21 Sept. 2012 | |
| 6 | #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ | |
| 7 | # | |
| 8 | # Allows events to be loaded from other maps in your project and placed on | |
| 9 | # the current map. Also adds functionality for persistent events which will | |
| 10 | # stay on the map even if it is reloaded (switching maps or loading save | |
| 11 | # files). | |
| 12 | #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~ | |
| 13 | # | |
| 14 | #------------------------------------------------------------------------------ | |
| 15 | # * How to Use | |
| 16 | #------------------------------------------------------------------------------ | |
| 17 | # Use the EventSpawn.spawn_event(...) to place an event on the map, see source | |
| 18 | # the parameters it takes are: | |
| 19 | # | |
| 20 | # spawn_from_map_id - the id of the map the event will be spawned from | |
| 21 | # event_id - the id of the event to spawn | |
| 22 | # x - the x coordinate to place the event | |
| 23 | # y - the y coordinate to place the event | |
| 24 | # persistent - if the event is persistant | |
| 25 | # init_dir - currently not used | |
| 26 | - | # Original Release Date: 7 Nov. 2012 |
| 26 | + | # opts = {} - an optional hash representing the self switches that will be on when
|
| 27 | # the event is spawned | |
| 28 | # | |
| 29 | # Example: EventSpawn.spawn_event(2,15,$game_player.x+1, $game_player.y, false,2) | |
| 30 | # | |
| 31 | # Heavily modified aliases: | |
| 32 | # straighten inside Game_CharacterBase | |
| 33 | # events are now "straightened" to correspond to their original pattern, not 1 | |
| 34 | # | |
| 35 | # tileset_bitmap inside Sprite_Character | |
| 36 | # now checks if the character has a specific map which the bitmap should be | |
| 37 | # loaded from. | |
| 38 | - | ($imported ||= {})["(~^_^)~Event Eng"] = 0.1
|
| 38 | + | |
| 39 | ||
| 40 | # Original Release Date: 7 Nov.2012 | |
| 41 | # | |
| 42 | # Update Log | |
| 43 | # Novemeber 18, 2012: v0.2, Events can now be spawned by name. | |
| 44 | # October 28, 2012: Can now remove spawned events. | |
| 45 | # October 27, 2012: Finished adding support for persistent events, made code | |
| 46 | # more extendible. Added code to allow use of tile graphics. | |
| 47 | # | |
| 48 | # Sepetember 21, 2012: Code reorganized made into it's own script for portability. | |
| 49 | # | |
| 50 | # August 2012: Version 0.0 completed | |
| 51 | ||
| 52 | ($imported ||= {})["Ra Event Spawn"] = 0.2
| |
| 53 | ||
| 54 | - | def self.spawn_event(spawn_from_map_id, _event_id, _x, _y, persistent, init_dir, opts = {})
|
| 54 | + | |
| 55 | # * EventSpawn | |
| 56 | #============================================================================== | |
| 57 | module EventSpawn | |
| 58 | #---------------------------------------------------------------------------- | |
| 59 | # * Constants | |
| 60 | #---------------------------------------------------------------------------- | |
| 61 | module Constants | |
| 62 | SS = ['A','B','C','D'] | |
| 63 | Tiles_On = true # can use tilesets from offscreen maps as event graphics | |
| 64 | end | |
| 65 | #---------------------------------------------------------------------------- | |
| 66 | # * Spawn Event | |
| 67 | #---------------------------------------------------------------------------- | |
| 68 | def self.spawn_event(spawn_from_map_id, _event_id, _x, _y, persistent, init_dir, opts = {}, name = nil)
| |
| 69 | return unless SceneManager.scene_is?(Scene_Map) | |
| 70 | return if _event_id.nil? || spawn_from_map_id.nil? | |
| 71 | ||
| 72 | options = { :A => false, :B => false, :C => false, :D => false}.merge(opts)
| |
| 73 | map = load_data(sprintf("Data/Map%03d.rvdata2", spawn_from_map_id))
| |
| 74 | event_id = next_id | |
| 75 | ||
| 76 | _event_id = name.nil? ? _event_id : map.event_from_name(name).id # get from name if passed | |
| 77 | ||
| 78 | preprocessed_event = map.events[_event_id] | |
| 79 | preprocessed_event.id = event_id | |
| 80 | event = create_event(preprocessed_event, event_id) | |
| 81 | ||
| 82 | event.gen_from_map_id = spawn_from_map_id | |
| 83 | event.moveto(_x, _y) | |
| 84 | add_to_spmap(event) | |
| 85 | ||
| 86 | event.persistent = persistent | |
| 87 | persistent ? store_pev(event) : $game_map.spawned_event_ids.push(event_id) | |
| 88 | $game_map.need_refresh = true | |
| 89 | ||
| 90 | EventSpawn::Constants::SS.each{|letter|
| |
| 91 | is_on = options[letter.to_sym] | |
| 92 | $game_self_switches[[$game_map.map_id, event_id, letter]] = is_on | |
| 93 | } | |
| 94 | return event | |
| 95 | end # End - spawn_event | |
| 96 | ||
| 97 | def self.next_id | |
| 98 | max_id = $game_system.max_evn_id | |
| 99 | keys = $game_map.events.keys | |
| 100 | id = keys==[] ? 1 : keys.max + 1 | |
| 101 | max_id = id > max_id ? max_id = id : max_id+1 | |
| 102 | ||
| 103 | $game_system.max_evn_id = max_id # store the largest event id used so far | |
| 104 | return max_id | |
| 105 | end | |
| 106 | #---------------------------------------------------------------------------- | |
| 107 | # * Helper method | |
| 108 | #---------------------------------------------------------------------------- | |
| 109 | def self.add_to_spmap(ev) | |
| 110 | spm = SceneManager.scene.instance_eval('@spriteset')
| |
| 111 | sp_map_sps = spm.instance_eval('@character_sprites')
| |
| 112 | sp_map_sps.push(Sprite_Character.new(spm.instance_eval('@viewport1'), ev))
| |
| 113 | end | |
| 114 | #---------------------------------------------------------------------------- | |
| 115 | # * Create Event | |
| 116 | #---------------------------------------------------------------------------- | |
| 117 | def self.create_event(preprocessed_event, event_id) | |
| 118 | $game_map.events[event_id] = Game_Event.new($game_map.map_id, preprocessed_event) | |
| 119 | end | |
| 120 | #---------------------------------------------------------------------------- | |
| 121 | # * Process Persistent Events | |
| 122 | #---------------------------------------------------------------------------- | |
| 123 | def self.store_pev(event) | |
| 124 | sys = $game_system | |
| 125 | $game_map.spawned_event_ids.push(event.id) # note: ** 1 | |
| 126 | (sys.persistent_events[$game_map.map_id] ||= []).push(event) # Set persistance data | |
| 127 | ||
| 128 | # Update the wrapped event's coordinates for reloading | |
| 129 | event.event.x = event.x | |
| 130 | event.event.y = event.y | |
| 131 | end # store_pev | |
| 132 | #---------------------------------------------------------------------------- | |
| 133 | # * Set all selfswitches to false for the event on the current map | |
| 134 | #---------------------------------------------------------------------------- | |
| 135 | def self.clean_self_switches(event_id) | |
| 136 | map_id = $game_map.map_id | |
| 137 | EventSpawn::Constants::SS.each{ |ch|
| |
| 138 | $game_self_switches[[map_id,event_id,ch]] = false | |
| 139 | } | |
| 140 | end | |
| 141 | end # EventSpawn | |
| 142 | ||
| 143 | #============================================================================== | |
| 144 | # * Game_System | |
| 145 | #============================================================================== | |
| 146 | class Game_System | |
| 147 | ||
| 148 | attr_accessor :persistent_events #stores persistent events information | |
| 149 | attr_accessor :max_evn_id # save the largest id used so far to prevent using | |
| 150 | # the save id twice. | |
| 151 | #---------------------------------------------------------------------------- | |
| 152 | # * Alias initialize | |
| 153 | #---------------------------------------------------------------------------- | |
| 154 | alias reprod_evs_initialize_event_hash initialize | |
| 155 | def initialize | |
| 156 | reprod_evs_initialize_event_hash | |
| 157 | @persistent_events = {}
| |
| 158 | @max_evn_id = 0 | |
| 159 | end # End - initialize | |
| 160 | #---------------------------------------------------------------------------- | |
| 161 | # * Alias on_after_load | |
| 162 | #---------------------------------------------------------------------------- | |
| 163 | alias rep_evs_on_after_load on_after_load | |
| 164 | def on_after_load | |
| 165 | $game_map.remove_temporary_spawned_events #remove previously spawned events | |
| 166 | rep_evs_on_after_load | |
| 167 | end # on_after_load | |
| 168 | ||
| 169 | end # Game_System | |
| 170 | ||
| 171 | #============================================================================== | |
| 172 | # * Game_Map | |
| 173 | #============================================================================== | |
| 174 | class Game_Map | |
| 175 | attr_reader :spawned_event_ids | |
| 176 | attr_accessor :spawned_event_ids | |
| 177 | attr_accessor :events | |
| 178 | #---------------------------------------------------------------------------- | |
| 179 | # * Alias setup | |
| 180 | #---------------------------------------------------------------------------- | |
| 181 | alias reprod_evs_game_map_setup setup | |
| 182 | def setup(map_id) | |
| 183 | $game_map.clean_self_switches | |
| 184 | @spawned_event_ids = Array.new #the ids of the events that have been spawned | |
| 185 | reprod_evs_game_map_setup(map_id) | |
| 186 | end # End - setup | |
| 187 | #---------------------------------------------------------------------------- | |
| 188 | # * Alias setup_events | |
| 189 | #---------------------------------------------------------------------------- | |
| 190 | alias ra_dep_setup_evs_al_meth setup_events | |
| 191 | def setup_events | |
| 192 | ra_dep_setup_evs_al_meth | |
| 193 | ||
| 194 | # Correct the self switches if there are persistent events on the map | |
| 195 | correct_self_switches if $game_system.persistent_events[@map_id] != nil | |
| 196 | end # End - setup_events | |
| 197 | #---------------------------------------------------------------------------- | |
| 198 | # * Correct Self Switches | |
| 199 | # Corrects $selfswitches hash so that they correctly correlate to the events' | |
| 200 | # ids upon reloading the map (The ids may change b/c of removed events). | |
| 201 | #---------------------------------------------------------------------------- | |
| 202 | def correct_self_switches | |
| 203 | p_events = $game_system.persistent_events[@map_id] | |
| 204 | new_self_switches = {} # the new global self switch hash
| |
| 205 | loaded_events = [] | |
| 206 | @spawned_event_ids = [] # reset spawned events | |
| 207 | p_events.each{ |ev|
| |
| 208 | ||
| 209 | #initialize new id and self_switches | |
| 210 | new_event_id = @events.keys.max + 1 | |
| 211 | new_self_switches[new_event_id] = get_self_switches(ev.id) | |
| 212 | ||
| 213 | ev.event.id = new_event_id # update interior events id | |
| 214 | ||
| 215 | loaded_event = Game_Event.new(@map_id, ev.event) | |
| 216 | ||
| 217 | #update extra unhandled information for the new event | |
| 218 | loaded_event.persistent = true | |
| 219 | ||
| 220 | #place the new event in the map's event hash | |
| 221 | @events[loaded_event.id] = loaded_event | |
| 222 | ||
| 223 | loaded_events.push(loaded_event) | |
| 224 | @spawned_event_ids.push(loaded_event.id) #update spawned events | |
| 225 | } # End - p_events.each | |
| 226 | ||
| 227 | #update the persistent_events hash with the new information | |
| 228 | $game_system.persistent_events[@map_id] = loaded_events | |
| 229 | ||
| 230 | local_ss = $game_self_switches | |
| 231 | new_self_switches.keys.each{|id|
| |
| 232 | count = 0 | |
| 233 | EventSpawn::Constants::SS.each{ |letter|
| |
| 234 | $game_self_switches[[@map_id,id,letter]] = new_self_switches[id][count] | |
| 235 | count += 1 | |
| 236 | } | |
| 237 | } | |
| 238 | ||
| 239 | # Refresh the events so they are placed on the map on the correct page | |
| 240 | # also reset the ids of the events inside @spawned_event_ids | |
| 241 | @events.keys.each{ |id|
| |
| 242 | @events[id].refresh | |
| 243 | } | |
| 244 | refresh_tile_events | |
| 245 | end # End - correct_self_switches | |
| 246 | #---------------------------------------------------------------------------- | |
| 247 | # * Get Self Switches | |
| 248 | # returns an array of the selfswitches for the given event id and then | |
| 249 | # deletes those values from $game_self_switches. | |
| 250 | #---------------------------------------------------------------------------- | |
| 251 | def get_self_switches(event_id) | |
| 252 | local_ss = $game_self_switches | |
| 253 | vals = [] | |
| 254 | EventSpawn::Constants::SS.each{ |letter|
| |
| 255 | vals.push(local_ss[[@map_id, event_id, letter]]) | |
| 256 | local_ss[[@map_id, event_id, letter]] = false | |
| 257 | } | |
| 258 | vals | |
| 259 | end # End - get_self_switches | |
| 260 | #---------------------------------------------------------------------------- | |
| 261 | # * Clean Self Switches | |
| 262 | # self-switches are handled globally, not on an event by event basis | |
| 263 | # so the global hash needs to be cleaned out of all the temporarily | |
| 264 | # spawned events when changing maps/loading the game, etc. | |
| 265 | #---------------------------------------------------------------------------- | |
| 266 | def clean_self_switches | |
| 267 | local_ss = $game_self_switches | |
| 268 | ||
| 269 | return if @spawned_event_ids == nil | |
| 270 | @spawned_event_ids.each{ |id|
| |
| 271 | if !@events[id].persistent #don't clean up persistant event self switches | |
| 272 | EventSpawn::Constants::SS.each{ |letter|
| |
| 273 | local_ss[[@map_id, id, letter]] = false #reset self_switches of temp events | |
| 274 | } | |
| 275 | end # End if | |
| 276 | } | |
| 277 | end # End - clean_self_switches | |
| 278 | #---------------------------------------------------------------------------- | |
| 279 | # Removes all of the nonpersistent spawned events from the current map | |
| 280 | #---------------------------------------------------------------------------- | |
| 281 | def remove_temporary_spawned_events | |
| 282 | return if @spawned_event_ids.nil? | |
| 283 | clean_self_switches | |
| 284 | clean_temp_evs_helper | |
| 285 | need_refresh = true | |
| 286 | end # End - remove_temporary_spawned_events | |
| 287 | #---------------------------------------------------------------------------- | |
| 288 | # * Cleans out temporary events | |
| 289 | #---------------------------------------------------------------------------- | |
| 290 | def clean_temp_evs_helper | |
| 291 | @spawned_event_ids.each{|id| @events.delete(id) unless @events[id].persistent}
| |
| 292 | @spawned_event_ids = [] | |
| 293 | end # End - clean_temp_evs_helper | |
| 294 | ||
| 295 | #---------------------------------------------------------------------------- | |
| 296 | # * Removes an event from the current map, including persistant events | |
| 297 | #---------------------------------------------------------------------------- | |
| 298 | def destroy_event_any(id) | |
| 299 | return unless !(ev = @events[id]).nil? | |
| 300 | EventSpawn.clean_self_switches(id) | |
| 301 | ev.set_intp_repr_ev(0) | |
| 302 | ||
| 303 | ev.erase # to hide the graphic | |
| 304 | ||
| 305 | if persistants = $game_system.persistent_events[@map_id] | |
| 306 | persistants.each_with_index{ |ev, i|
| |
| 307 | if ev.id == id | |
| 308 | persistants.delete_at(i) | |
| 309 | break | |
| 310 | end | |
| 311 | } | |
| 312 | end | |
| 313 | ||
| 314 | @spawned_event_ids.delete(id) # delete from array | |
| 315 | @events.delete(id) # " " hash | |
| 316 | ||
| 317 | refresh | |
| 318 | end | |
| 319 | end # End - Game_Map | |
| 320 | ||
| 321 | #============================================================================== | |
| 322 | # * Game_Character | |
| 323 | #============================================================================== | |
| 324 | class Game_Character < Game_CharacterBase | |
| 325 | attr_accessor :gen_from_map_id # map the event was generated from | |
| 326 | end | |
| 327 | ||
| 328 | #============================================================================== | |
| 329 | # * Game_Event | |
| 330 | #============================================================================== | |
| 331 | class Game_Event < Game_Character | |
| 332 | attr_accessor :event # wrapped event | |
| 333 | attr_accessor :id # id of this event | |
| 334 | attr_accessor :persistent # does event stay after switching maps | |
| 335 | ||
| 336 | #attr_accessor :init_dir # used to specify direction with throw! | |
| 337 | #---------------------------------------------------------------------------- | |
| 338 | # * Alias method initialize | |
| 339 | #---------------------------------------------------------------------------- | |
| 340 | alias ra_extra_fields_dep_init initialize | |
| 341 | def initialize(map_id, event) | |
| 342 | ra_extra_fields_dep_init(map_id,event) | |
| 343 | @persistent = false | |
| 344 | #@init_dir = -1 | |
| 345 | end # End - initialize | |
| 346 | ||
| 347 | #-------------------------------------------------------------------------- | |
| 348 | # * Alias straighten - sets pattern to orig_pattern | |
| 349 | #-------------------------------------------------------------------------- | |
| 350 | alias straight_ev_sp_ed_st_orig straighten | |
| 351 | def straighten | |
| 352 | straight_ev_sp_ed_st_orig | |
| 353 | @pattern = @original_pattern ? @original_pattern : 1 if @walk_anime || @step_anime | |
| 354 | end | |
| 355 | ||
| 356 | #-------------------------------------------------------------------------- | |
| 357 | # * Alias move_straight - Store updated postion for persistent events | |
| 358 | #-------------------------------------------------------------------------- | |
| 359 | alias move_str_ed_fr_persis_support move_straight | |
| 360 | def move_straight(dir) | |
| 361 | move_str_ed_fr_persis_support(dir) | |
| 362 | @event.x, @event.y = @x, @y if @persistent | |
| 363 | end | |
| 364 | ||
| 365 | #-------------------------------------------------------------------------- | |
| 366 | # * Alias move_diagonal- Store updated postion for persistent events | |
| 367 | #-------------------------------------------------------------------------- | |
| 368 | alias move_diag_ed_fr_pesis_support move_diagonal | |
| 369 | def move_diagonal(horz, vert) | |
| 370 | move_diag_ed_fr_pesis_support(horz, vert) | |
| 371 | @event.x, @event.y = @x, @y if @persistent | |
| 372 | end | |
| 373 | ||
| 374 | def set_intp_repr_ev(id) | |
| 375 | @interpreter.set_ev_id_repr_ev(id) unless @interpreter.nil? | |
| 376 | end | |
| 377 | end # Game_Event | |
| 378 | ||
| 379 | #============================================================================== | |
| 380 | # * Sprite_Character | |
| 381 | #============================================================================== | |
| 382 | class Sprite_Character < Sprite_Base | |
| 383 | ||
| 384 | #-------------------------------------------------------------------------- | |
| 385 | # * Alias tileset_bitmap - load tiles from offscreen maps | |
| 386 | #-------------------------------------------------------------------------- | |
| 387 | alias ts_bm_sprt_fr_offscr_maps tileset_bitmap | |
| 388 | def tileset_bitmap(tile_id) | |
| 389 | ||
| 390 | if (id = @character.gen_from_map_id) && id > 0 | |
| 391 | map = load_data(sprintf("Data/Map%03d.rvdata2", id))
| |
| 392 | return Cache.tileset($data_tilesets[map.tileset_id].tileset_names[5 + tile_id / 256]) | |
| 393 | else | |
| 394 | - | #EOF |
| 394 | + | |
| 395 | end | |
| 396 | ||
| 397 | end # tileset_bitmap | |
| 398 | ||
| 399 | end # Sprite_Character | |
| 400 | #============================================================================== | |
| 401 | # ** Game_Interpreter | |
| 402 | #============================================================================== | |
| 403 | class Game_Interpreter | |
| 404 | def set_ev_id_repr_ev(id) | |
| 405 | @event_id = id | |
| 406 | end # set_ev_id_repr_ev | |
| 407 | end # Game_Interpreter | |
| 408 | #============================================================================== | |
| 409 | # ** RPG::Map | |
| 410 | #============================================================================== | |
| 411 | class RPG::Map | |
| 412 | #---------------------------------------------------------------------------- | |
| 413 | # * Get Event From Name | |
| 414 | #---------------------------------------------------------------------------- | |
| 415 | def event_from_name(name) | |
| 416 | @events.values.each{|ev| return ev if ev.name.eql?(name)}
| |
| 417 | return nil | |
| 418 | end | |
| 419 | end # RPG::Map | |
| 420 | #End of File |