Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[RMXP] Game Map Event Position

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Game Map Event Position

Mensaje por Wecoc el 2014-05-11, 00:19

Éste script me costó más de hacer de lo que quisiera reconocer xDD
Es la tercera vez que escribo éste post porque en mi ciudad está saltado la luz cada dos por tres, así que iré al grano.

Éste script hace que al volver a un mapa los eventos estén donde se hubieran quedado en vez de volver a su posición inicial.

Código:
#==============================================================================
# ** Game Map Save Features v1.3
#------------------------------------------------------------------------------
#  Autor: Wecoc
#==============================================================================

class Game_Maps
  EVENT_MAPS = [1, 2]
  PANORAMA_MAPS = [1, 2]
  FOG_MAPS = [1, 2]
 
  attr_accessor :data
  def initialize
    @data = []
  end
 
  def [](map_id)
    return @data[map_id]
  end
 
  def []=(map_id, value)
    @data[map_id] = value
  end
 
  def reset(map_id)
    @data[map_id] = nil
  end
end

class Game_Map
  attr_reader :fog_tone_target
  attr_reader :fog_tone_duration
  attr_reader :fog_opacity_target
  attr_reader :fog_opacity_duration
 
  def setup(map_id)
    @map_id = map_id
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
    tileset = $data_tilesets[@map.tileset_id]
    @tileset_name = tileset.tileset_name
    @autotile_names = tileset.autotile_names
    @panorama_name = tileset.panorama_name
    @panorama_hue = tileset.panorama_hue
    if Game_Maps::PANORAMA_MAPS.include?(map_id)
      if $game_maps.data[map_id] != nil
        @panorama_name = $game_maps.data[map_id].panorama_name
        @panorama_hue = $game_maps.data[map_id].panorama_hue
      end
    end
    @fog_name = tileset.fog_name
    @fog_hue = tileset.fog_hue
    @fog_opacity = tileset.fog_opacity
    @fog_blend_type = tileset.fog_blend_type
    @fog_zoom = tileset.fog_zoom
    @fog_sx = tileset.fog_sx
    @fog_sy = tileset.fog_sy
    if Game_Maps::FOG_MAPS.include?(map_id)
      if $game_maps.data[map_id] != nil
        @fog_name = $game_maps.data[map_id].fog_name
        @fog_hue = $game_maps.data[map_id].fog_hue
        @fog_opacity = $game_maps.data[map_id].fog_opacity
        @fog_blend_type = $game_maps.data[map_id].fog_blend_type
        @fog_zoom = $game_maps.data[map_id].fog_zoom
        @fog_sx = $game_maps.data[map_id].fog_sx
        @fog_sy = $game_maps.data[map_id].fog_sy
      end
    end
    @battleback_name = tileset.battleback_name
    @passages = tileset.passages
    @priorities = tileset.priorities
    @terrain_tags = tileset.terrain_tags
    @display_x = 0
    @display_y = 0
    @need_refresh = false
    @events = {}
    for i in @map.events.keys
      @events[i] = Game_Event.new(@map_id, @map.events[i])
    end
    if Game_Maps::EVENT_MAPS.include?(map_id)
      if $game_maps.data[map_id] != nil
        @events = $game_maps.data[map_id].events
      end
    end
    @common_events = {}
    for i in 1...$data_common_events.size
      @common_events[i] = Game_CommonEvent.new(i)
    end
    @fog_ox = 0
    @fog_oy = 0
    @fog_tone = Tone.new(0, 0, 0, 0)
    @fog_tone_target = Tone.new(0, 0, 0, 0)
    @fog_tone_duration = 0
    @fog_opacity_target = 0
    @fog_opacity_duration = 0
    if Game_Maps::FOG_MAPS.include?(map_id)
      if $game_maps.data[map_id] != nil
        @fog_ox = $game_maps.data[map_id].fog_ox
        @fog_oy = $game_maps.data[map_id].fog_oy
        @fog_tone = $game_maps.data[map_id].fog_tone
        @fog_tone_target = $game_maps.data[map_id].fog_tone_target
        @fog_tone_duration = $game_maps.data[map_id].fog_tone_duration
        @fog_opacity_target = $game_maps.data[map_id].fog_opacity_target
        @fog_opacity_duration = $game_maps.data[map_id].fog_opacity_duration
      end
    end
    @scroll_direction = 2
    @scroll_rest = 0
    @scroll_speed = 4
  end
 
  def each_event(&block)
    @events.values.each{|event| yield event}
  end
end

class Scene_Title
  def command_new_game
    $game_system.se_play($data_system.decision_se)
    Audio.bgm_stop
    Graphics.frame_count = 0
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables    = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party        = Game_Party.new
    $game_troop        = Game_Troop.new
    $game_map          = Game_Map.new
    $game_player        = Game_Player.new
    $game_maps          = Game_Maps.new ##
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    $game_map.autoplay
    $game_map.update
    $scene = Scene_Map.new
  end
end

class Scene_Load < Scene_File
  alias game_maps_read_save_data read_save_data unless $@
  def read_save_data(file)
    game_maps_read_save_data(file)
    $game_maps = Marshal.load(file)
  end
end

class Scene_Save < Scene_File
  alias game_maps_write_save_data write_save_data unless $@
  def write_save_data(file)
    game_maps_write_save_data(file)
    Marshal.dump($game_maps, file)
  end
end

class Game_Event < Game_Character
  attr_accessor :erased
end

class Interpreter
  alias game_maps_command_201 command_201 unless $@
  def command_201
    $game_map.each_event do |event|
      event.erased = false
      event.refresh
    end
    maps = Game_Maps::EVENT_MAPS + Game_Maps::PANORAMA_MAPS +
      Game_Maps::FOG_MAPS
     
    if maps.include?($game_map.map_id)
      $game_maps.data[$game_map.map_id] = $game_map.clone
    else
      $game_maps.data[$game_map.map_id] = nil
    end
    game_maps_command_201
  end
end


VERSIÓN ANTERIOR:

Código:
#==============================================================================
# ** Game Map Event Position v1.2B
#------------------------------------------------------------------------------
#  Autor: Wecoc
#==============================================================================

module Wecoc_Events
  MAPS = [1]
end
 
class Game_Event < Game_Character
  attr_accessor :erased
end


class Game_Map
  def setup(map_id)
    @map_id = map_id
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
    tileset = $data_tilesets[@map.tileset_id]
    @tileset_name = tileset.tileset_name
    @autotile_names = tileset.autotile_names
    @panorama_name = tileset.panorama_name
    @panorama_hue = tileset.panorama_hue
    @fog_name = tileset.fog_name
    @fog_hue = tileset.fog_hue
    @fog_opacity = tileset.fog_opacity
    @fog_blend_type = tileset.fog_blend_type
    @fog_zoom = tileset.fog_zoom
    @fog_sx = tileset.fog_sx
    @fog_sy = tileset.fog_sy
    @battleback_name = tileset.battleback_name
    @passages = tileset.passages
    @priorities = tileset.priorities
    @terrain_tags = tileset.terrain_tags
    @display_x = 0
    @display_y = 0
    @need_refresh = false
    if $game_maps.data[map_id] == nil
      # p "Creando mapa #{$game_map.map_id}"
      @events = {}
      for i in @map.events.keys
        @events[i] = Game_Event.new(@map_id, @map.events[i])
      end
      $game_maps.data[map_id] = $game_map.clone
    end
    # p "Cargando mapa #{$game_map.map_id}"
    if Wecoc_Events::MAPS.include?(map_id)
      @events = $game_maps.data[map_id].events
    end
    @common_events = {}
    for i in 1...$data_common_events.size
      @common_events[i] = Game_CommonEvent.new(i)
    end
    @fog_ox = 0
    @fog_oy = 0
    @fog_tone = Tone.new(0, 0, 0, 0)
    @fog_tone_target = Tone.new(0, 0, 0, 0)
    @fog_tone_duration = 0
    @fog_opacity_duration = 0
    @fog_opacity_target = 0
    @scroll_direction = 2
    @scroll_rest = 0
    @scroll_speed = 4
  end
 
  def each_event(&block)
    @events.values.each{|event| yield event}
  end
end

class Game_Maps
  attr_accessor :data
  def initialize
    @data = []
  end
 
  def [](map_id)
    return @data[map_id]
  end
 
  def []=(map_id, value)
    @data[map_id] = value
  end
 
  def reset(map_id)
    @data[map_id] = nil
  end
end

class Scene_Title
  def command_new_game
    $game_system.se_play($data_system.decision_se)
    Audio.bgm_stop
    Graphics.frame_count = 0
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables    = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party        = Game_Party.new
    $game_troop        = Game_Troop.new
    $game_map          = Game_Map.new
    $game_player        = Game_Player.new
    $game_maps          = Game_Maps.new ##
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    $game_map.autoplay
    $game_map.update
    $scene = Scene_Map.new
  end
end

class Scene_Load < Scene_File
  alias game_maps_read_save_data read_save_data unless $@
  def read_save_data(file)
    game_maps_read_save_data(file)
    $game_maps = Marshal.load(file)
  end
end

class Scene_Save < Scene_File
  alias game_maps_write_save_data write_save_data unless $@
  def write_save_data(file)
    game_maps_write_save_data(file)
    Marshal.dump($game_maps, file) ##
  end
end

class Interpreter
  alias game_maps_command_201 command_201 unless $@
  def command_201
    # p "Guardando mapa #{$game_map.map_id}"
    $game_map.each_event do |event|
      event.erased = false
      event.refresh
    end
    if Wecoc_Events::MAPS.include?($game_map.map_id)
      $game_maps.data[$game_map.map_id] = $game_map.clone
    else
      $game_maps.data[$game_map.map_id] = nil
    end
    game_maps_command_201
  end
end


El script tiene una serie de problemas que lo hacen "poco amigable", pero que no os asusten mucho.

- Si ya tenías partidas guardadas y pasas a usar éste script no se cargarán bien, tendrás que hacer borrón y cuenta nueva en ese sentido.
Si guardas usando éste script y luego lo borras igual. (Irremediable)

- Si usas un script de Título personalizado y éste usa def command_new_game, habrá que buscar en él la línea $game_player = Game_Player.new y debajo poner $game_maps = Game_Maps.new
Después de eso, habrá que borrar toda la class Scene_Title del script Game Map Event Position

- Si usas un script que modifica setup(map_id) del Game_Map, eso dejará de funcionar y/o dará error. En ese caso postea el problema y el otro código en éste topic e intentaré encontrarle una solución.

- Éste script es incompatible con Call External Event (el del primer post). Si quieres usar ambas funciones dilo en éste topic.

Saludos.


Última edición por Wecoc el 2014-05-11, 03:28, editado 4 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por orochii el 2014-05-11, 01:34

Pregunta, ¿esto guarda también el estado "borrado"? Digo, por si se hace "Eliminar evento temporalmente". Las soluciones que se me ocurren para eso ahora mismo son un poquito feas =D!, y queda mucho mejor si se puede escoger no guardar eso, o poder borrar/recargar un mapa entero específico.

=D. Pero ta guay.
avatar
orochii
Reportero

0/3

Créditos 7722

Gracias : 436

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por Wecoc el 2014-05-11, 02:16

Pregunta, ¿esto guarda también el estado "borrado"? Digo, por si se hace "Eliminar evento temporalmente".


Ahora ya no xD Era un detalle nada más, cuatro líneas en el def command_201 y solucionado.

(...) y queda mucho mejor si se puede escoger no guardar eso, o poder borrar/recargar un mapa entero específico.


Sacrébleu, he tenido que pelearme un poco pero vale, ya está. Usar Game_System era estúpido en éste caso, perdón xDD. Ahora usa un módulo con una array con las ids de los mapas en los que sí se guardará la info, y listo.

Para resetear un mapa solo hay que hacer

$game_maps.reset(id del mapa)

He puesto la versión 1.3, ahora ya empieza a ser un script con más bien montado xDDD



Última edición por Wecoc el 2014-05-16, 16:13, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por orochii el 2014-05-11, 05:09

Ese último script, dios mío. ¿Es aquel que estabas desarrollando que podía renderizar sprites en 3D, hacer realidad la paz mundial, dar de comer a tu perro, y hacerte campo para una cita más con el dentista?

===
Nvm. Mucho mejor el script del tema. Habrá que ver si no se podrá pelear un poco más entonces con esas limitantes, pero por mí creo que ya es bastante usable C:. Yo le encuentro interesante para ARPGs xd (habrá que ver eso sí, qué tal le va al zasjéro de moj y/o el blisábs).

El azul es sagrado (?). Y sensual, como diría comger xD.
avatar
orochii
Reportero

0/3

Créditos 7722

Gracias : 436

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por Noctámbulo el 2014-05-11, 14:35

Se me ocurren muchas aplicaciones para este script, como por ejemplo para usarlo en eventos de medios de transporte y similares. Te doy las gracias, me salvará de algún quebradero de cabeza.
avatar
Noctámbulo
Principiante
Principiante

1/3

Créditos 299

Gracias : 27

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por stiven202 el 2014-05-11, 21:17

Es más fácil con un mini engine que guarde las coordenadas X y Y de los eventos que se están moviendo una vez se salga de ese mapa, aunque si son muchos eventos que se mueven constantemente, si tardará mas en hacer el engine jeje.

Variable Posicion X = coordenada X evento
Variable Posicion Y = coordenada Y evento


y luego un evento que inicie en proceso paralelo en el mapa de esos eventos que diga:

Elegir posicion de evento > "Especificar por variable" y le lleva la variable Variable Posicion X y Variable Posicion Y y listo aparecerá en donde se supone debería estar.
avatar
stiven202
Principiante
Principiante

0/3

Créditos 331

Gracias : 14

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por Wecoc el 2014-05-11, 21:38

Noctámbulo: ¿Te refieres a usarlo para sistemas de vehículos? No sé muy bien como se usaría en esa situación xD Bueno, me alegra que te guste.

stiven202: ¿Eso es más fácil? Se necesitarían dos variables para cada evento móvil de cada mapa del juego y habría que hacer el engine de guardado de variables en cada teletransportador de cada mapa específico para los eventos de ese mapa así como el de reseteo de variables del proceso paralelo, también específico para cada mapa... Una locura de engine si se quiere la función a lo largo del juego.

No sé, yo creo que es más fácil copiar el script, ir a "EVENT_MAPS = [1, 2]" y poner las ids de los mapas ahí xD

======

Quería comentar que he estado buscando por ahí y hay scripts alternativos, hay uno un poco especial que tiene la particularidad de ser compatible con Pokessentials, que el mío lo dudo mucho:

http://forum.chaos-project.com/index.php/topic,14022.msg183990.html#msg183990

(Posteé el mío allí ya que estaba xD)
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Game Map Event Position

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.