Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Weird File System

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Weird File System

Mensaje por Wecoc el 2017-01-23, 20:58

Éste script viene de una idea muy rara que me dijo Eron hace ya un tiempo (de ahí el nombre xD). Eron no te ofendas pero tu idea es rara de narices xD

Con éste script los personajes guardados en otras partidas salen en la posición donde guardaste, como si fueran un NPC de ésta partida.
Al activarlos se llama un Evento Común, y ahí pones que hagan lo que quieran (decir un mensaje genérico, apartarse...). También hay un nuevo método para que desde el Evento Común se pueda obtener el índice de la partida a la que corresponden y cargar lo que se quiera de esa (por ejemplo el nombre del personaje).

Pongo un ejemplo de cómo se haría eso:
data = get_file_data
name = data["$game_actors"][1].name


Es un script que queda bien si se crean personajes customizados cada partida, si no queda raro que haya más de un chara igual.

Modifica las partidas así que puede que no funcione con partidas guardadas antes de insertar el script.
Por suerte hice un script que arregla esa incompatibilidad con partidas viejas: Wecoc's Script Savefiles Updater

Sin más preámbulos, pongo aquí el script. No requiere créditos.

Código:
#==============================================================================
# ** [XP] Weird File System
#------------------------------------------------------------------------------
#  Los charas guardados en otras partidas salen en la posición donde guardaste
#  de la partida actual, y puedes interactuar con ellos para que ocurra algo
#  (Por ejemplo para que digan una frase)
#------------------------------------------------------------------------------
# Autor: Wecoc. No pido créditos
#==============================================================================

#==============================================================================
# ** WeirdFile
#------------------------------------------------------------------------------
#  Configuración del script
#==============================================================================

module WeirdFile
  
  # Evento Común que se llama cuando te topas con el evento
  CommonEvent  = 1
  
  # Trigger del Evento (0: Enter, 1: Toparse con Héroe ...)
  EventTrigger = 1
  
  # Permitir que varios eventos se guarden en la misma coordenada
  OverEventMode = false
  
end

#==============================================================================
# ** Game_System
#==============================================================================

class Game_System
  attr_accessor :last_file_index
  alias last_file_ini initialize unless $@
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    last_file_ini
    @last_file_index = -1
  end
  #--------------------------------------------------------------------------
  # * Save Disabled
  #--------------------------------------------------------------------------
  def save_disabled
    return true if @save_disabled == true
    return true if ($game_map.check_event($game_player.x, $game_player.y) > 0)
    current = [$game_map.map_id, $game_player.x, $game_player.y]
    start_x = $data_system.start_x
    start_y = $data_system.start_y
    start = [$data_system.start_map_id, start_x, start_y]
    return true if current == start
    if WeirdFile::OverEventMode == false
      for i in 0..3
        filename = "Save#{i+1}.rxdata"
        if FileTest.exist?(filename)
          file = File.open(filename, "rb")
          characters = Marshal.load(file)
          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_player        = Marshal.load(file)
          file.close
          if game_map.map_id == $game_map.map_id
            if $game_player.x == game_player.x &&
               $game_player.y == game_player.y
              return true
            end
          end
        end
      end
    end
    return false
  end
end

#==============================================================================
# ** Game_Map
#==============================================================================

class Game_Map
  alias load_files_setup setup unless $@
  #--------------------------------------------------------------------------
  # * Setup
  #--------------------------------------------------------------------------
  def setup(map_id)
    load_files_setup(map_id)
    for i in 0..3
      filename = "Save#{i+1}.rxdata"
      if FileTest.exist?(filename)
        next if i == $game_system.last_file_index
        file = File.open(filename, "rb")
        characters = Marshal.load(file)
        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_player        = Marshal.load(file)
        file.close
        if game_map.map_id == map_id
          event = RPG::Event.new(game_player.x, game_player.y)
          graphic = RPG::Event::Page::Graphic.new
          graphic.character_name = game_player.character_name
          graphic.character_hue  = game_player.character_hue
          graphic.direction = game_player.direction
          event_id = @events.keys.size + 1
          event.id = event_id
          event.pages[0].graphic = graphic
          event.pages[0].trigger = WeirdFile::EventTrigger
          common_id = WeirdFile::CommonEvent
          event.pages[0].list.push RPG::EventCommand.new(117, 0, [common_id])
          event.pages[0].list.push RPG::EventCommand.new(0)
          event = Game_Event.new(map_id, event)
          event.from_file_index = i
          @events[event_id] = event.clone
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Check Event [BUGFIX]
  #--------------------------------------------------------------------------
  def check_event(x, y)
    for event in $game_map.events.values
      return event.id if (event.x == x and event.y == y)
    end
    return 0
  end
end

#==============================================================================
# ** Game_Event
#==============================================================================

class Game_Event < Game_Character
  attr_accessor :from_file_index
  alias from_file_ini initialize unless $@
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize(map_id, event)
    from_file_ini(map_id, event)
    @from_file_index = -1
  end
end

#==============================================================================
# ** Scene_Save
#==============================================================================

class Scene_Save < Scene_File
  alias last_file_write write_save_data unless $@
  #--------------------------------------------------------------------------
  # * Write Save Data
  #--------------------------------------------------------------------------
  def write_save_data(file)
    $game_system.last_file_index = @file_index
    last_file_write(file)
  end
end

#==============================================================================
# ** Interpreter
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Get File Data
  #--------------------------------------------------------------------------
  def get_file_data
    i = $game_map.events[@event_id].from_file_index
    hash = {}
    hash.default = nil
    return hash if i == -1
    filename = "Save#{i+1}.rxdata"
    file = File.open(filename, "rb")
    characters = Marshal.load(file)
    frame_count = Marshal.load(file)
    hash["$game_system"]        = Marshal.load(file)
    hash["$game_switches"]      = Marshal.load(file)
    hash["$game_variables"]     = Marshal.load(file)
    hash["$game_self_switches"] = Marshal.load(file)
    hash["$game_screen"]        = Marshal.load(file)
    hash["$game_actors"]        = Marshal.load(file)
    hash["$game_party"]         = Marshal.load(file)
    hash["$game_troop"]         = Marshal.load(file)
    hash["$game_map"]           = Marshal.load(file)
    hash["$game_player"]        = Marshal.load(file)
    file.close
    return hash
  end
end

PD. En realidad la idea de Eron era que el personaje salía durmiendo, pero decidí ampliarla un poco, ponerlo como NPC normal y descartar eso porque implicaría un chara especial dormido, y como precisamente es un script para personajes con charas únicos sería bastante tedioso de realizar los gráficos.

Arrivederci! O algo xD
avatar
Wecoc
Administrador
Administrador



Créditos 12308

Gracias : 653

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Weird File System

Mensaje por Eron el 2017-01-30, 10:43

Vaya, no había visto eso. Menudo nombre x'DD
Pues te quedó bien, yo creo que es interesante precisamente por ser raro, o sea distinto a lo que se suele ver en un RPG, pero es algo que tampoco desentonaría e incluso tiene cierto sentido en según qué juegos. Gracias, ya puedes marcar como realizada mi idea del topic de ideas, creo que la puse ahí, ¿no? O igual lo hablamos por chat, no me acuerdo.
avatar
Eron
Principiante
Principiante

0/3

Créditos 3599

Gracias : 60

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.