Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4150 miembros registrados.
El último usuario registrado es Nikerah.

Nuestros miembros han publicado un total de 84844 mensajes en 12081 argumentos.

[XP][Tutorial] Cómo hacer un mapa variable por partida

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Tutorial] Cómo hacer un mapa variable por partida

Mensaje por Wecoc el 2017-05-18, 00:17

En éste tutorial corto explicaré cómo hacer un mapa al estilo de la saga Diablo. Muy resumidamente, con éste sistema algunos mapas son creados de modo que en cada partida nueva tienen variaciones, por lo que la exploración en cada partida es distinta. Usando un script eso se puede lograr de modo relativamente fácil, pero luego hay que tener muchas cosas en cuenta a la hora de mapear, y las pondré aquí para que a quien le interese pueda usarlo.

Parte 1. Crear un mapa dinámico

Primero de todo creamos un mapa normal. Aquí he hecho un mapa de torre de lo más simplón.

Spoiler:

Hecho ésto, vamos a Herramientas -> Opciones y activamos la opción Cuadrícula para mapear.
En el ejemplo pondremos cuadrícula cada 8 tiles (hay que poner el mismo número en horizontal y vertical porque en el script que usaremos posteriormente solo se soporta eso, para otros casos será necesario ampliar el script)

Spoiler:

Seguro que hay quien no sabía que ésto existía xD

Nos saldrán en el editor unos cuadros que marcan el nuevo límite impuesto.
Luego copiamos el mapa y creamos una copia dentro de éste, y al principal le ponemos en el nombre [np] Nombre donde n es el tamaño que hemos asignado antes.



De ese modo todos los que queden dentro de éste se usarán para construirlo en el juego, siendo el resultado una combinación de todas las partes de ellos, seleccionadas al azar, como intenta mostrar el siguiente esquema:



Nota: Cada uno de esos mapas deberá tener el mismo ancho y alto. No hace falta que el ancho y el alto sean múltiples de n.

Parte 2. Crear los mapas con variaciones

Una vez copiado el mapa nos toca modificarle cada uno de los recuadros para que el resultado sea una mezcla de los recuadros de éstos mapas.
Como nota importante por lo tanto, no pueden quedar cortes raros en los límites de éstos mapas, es por ello que hemos activado la opción de marcarnos los límites.

Abrid ámbos links para comparar:
Mapa A
Mapa B

Nota: Para transportarse siempre hay que hacerlo al mapa principal (A).

¡Muy bien, ámbos mapas (o más) creados! ¿Pero qué ocurre con los eventos?

Pues bien, el script pilla los eventos de cada recuadro seleccionado del mismo modo que con los tiles, pero con un gran inconveniente, los eventos tienen ID propia y si cargara dos eventos con la misma ID cada uno de un mapa distinto habría problemas. Es por eso que a la hora de crear un evento en el mapa, también debe estar el evento con misma ID en el otro mapa y en el mismo recuadro, aunque en ese caso el evento esté vacío.

En el ejemplo hay un cuadro en el que hay una biblia, mientras que en la variación no.
En el que hay una biblia pondremos un evento para que se pueda leer, mientras que en el otro el evento no se usa pero sigue estando ahí.

Spoiler:

Del mismo modo, en uno hay una linterna mientras que en la variación hay una bola. Pese a que hacen cosas distintas usaremos el evento de misma ID en ámbos por estar en el mismo recuadro de distinto mapa. Poco más hay que tener en cuenta en ese sentido.

Lo único que me queda por pasar es el script requerido. Ponedlo encima de main.

Código:
#==============================================================================
# ** [XP] Diablo-Style Dynamic Maps
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
#==============================================================================

class Game_Maps
  def initialize
    @data = {}
    @mapinfos = load_data("Data/MapInfos.rxdata")
    for i in 1..@mapinfos.size
      @data[i] = load_data(sprintf("Data/Map%03d.rxdata", i))
      mapinfo = @mapinfos[i]
      if mapinfo.name.include?("[") && mapinfo.name.include?("p]")
        index = mapinfo.name.index("]")
        n = mapinfo.name[1...(index-1)].to_i
        map_array = [i]
        for j in 1..@mapinfos.size
          if @mapinfos[j].parent_id == i
            map_array << j
          end
        end
        next if n <= 1 or map_array.size == 0
        dw = @data[i].width  / n
        dh = @data[i].height / n
        maps = {}
        for m in map_array
          maps[m] = load_data(sprintf("Data/Map%03d.rxdata", m))
        end
        @data[i].events = {}
        for iy in 0...dh
          for ix in 0...dw
            r = rand(map_array.size)
            map = maps[map_array[r]]
            for ky in 0...n
              for kx in 0...n
                x = kx + ix * n
                y = ky + iy * n
                for l in 0...3
                  @data[i].data[x, y, l] = map.data[x, y, l]
                end
                for event in map.events.values
                  next if event.nil?
                  if event.x >= ix * n && event.x < (ix + 1) * n
                    if event.y >= iy * n && event.y < (iy + 1) * n
                      @data[i].events[event.id] = event
                    end
                  end
                end
              end
            end
          end
        end
      end
    end
  end
  
  def [](map_id)
    return @data[map_id]
  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_maps          = Game_Maps.new # New
    $game_player        = Game_Player.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_Save < Scene_File
  def write_save_data(file)
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      characters.push([actor.character_name, actor.character_hue])
    end
    Marshal.dump(characters, file)
    Marshal.dump(Graphics.frame_count, file)
    $game_system.save_count += 1
    $game_system.magic_number = $data_system.magic_number
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_maps, file) # New
    Marshal.dump($game_player, file)
  end
end

class Scene_Load < Scene_File
  def read_save_data(file)
    characters = Marshal.load(file)
    Graphics.frame_count = Marshal.load(file)
    $game_system        = Marshal.load(file)
    $game_switches      = Marshal.load(file)
    $game_variables     = Marshal.load(file)
    $game_self_switches = Marshal.load(file)
    $game_screen        = Marshal.load(file)
    $game_actors        = Marshal.load(file)
    $game_party         = Marshal.load(file)
    $game_troop         = Marshal.load(file)
    $game_map           = Marshal.load(file)
    $game_maps          = Marshal.load(file) # New
    $game_player        = Marshal.load(file)
    if $game_system.magic_number != $data_system.magic_number
      $game_map.setup($game_map.map_id)
      $game_player.center($game_player.x, $game_player.y)
    end
    $game_party.refresh
  end
end

class Game_Map
  def setup(map_id)
    @map_id = map_id
    @map = $game_maps[map_id] # New
    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
    @events = {}
    for i in @map.events.keys
      @events[i] = Game_Event.new(@map_id, @map.events[i])
    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
end

Nota: Tras poner el script las partidas guardadas de antes dejaran de funcionar bien.

El script no puede usar alias en ninguno de los métodos así que podría ser incompatible con algún script de mapa, título o cargar/guardar.
Pese a ello sus incompatibilidades son rápidas de solucionar, he marcado con # New las líneas que modifican esos métodos.

Cualquier duda me la decís. Como diría Orochii,
Salut!
avatar
Wecoc
Administrador
Administrador



Créditos 9223

Gracias : 495

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Cómo hacer un mapa variable por partida

Mensaje por orochii el 2017-05-18, 00:50

Está interesante la idea, es como hacer "chunks" y que se mezclen entre varios mapas. Supongo que uno puede luego hacer más de dos mapas, por ejemplo, y que se mezclen más. Lo cual agrega más dolor de cabeza pero eso siempre es bueno (???).

Y también pensando en el evento de la biblia. Supongo que si el evento Biblia existe en uno, y debe existir un evento con misma ID en otros, en esos se puede reusar, por ejemplo, para un cofre (¿qué prefieres? ¿una biblia que dice una línea o una poción xD? no es por ponerlos a decidir entre su religión y asdf eh, no me malinterpreten pls).

Y como diría Wecoc,
Salut!
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6389

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Cómo hacer un mapa variable por partida

Mensaje por RiKennedy-Maker el 2017-05-18, 13:08

Genial script Wecoc, Definitivamente me lo tendré que pillar para mi próximo proyecto!!!

Espero seguir viendo más scripts tuyos, cada que veo uno me da un "impacto artístico" xD jajaj okno

Gracias de nuevo por el script Wec, +1 y Bye Bye


RiK-M
avatar
RiKennedy-Maker
Principiante
Principiante

0/3

Créditos 331

Gracias : 50

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Tutorial] Cómo hacer un mapa variable por partida

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.