¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 1.]

#1 Save para cada Juego (RMXP) el Dom Ene 03, 2016 1:49 pm

Reputación del mensaje :100% (1 voto)

Super_SaiyanDios

avatar

SAVE PARA CADA JUEGO
RPG Maker (XP)
Parece difícil de explicar pero lo diré de la forma más completa posible.
Sobre el Script:
Les ha pasado que al tener más de un proyecto hecho, juegan uno de sus dichos proyectos y al momento de crear un archivo save, este archivo lo pasan a otro de sus proyectos y resulta que su otro proyecto lo detecta y ademas les suele cargar un nivel y mapa totalmente efectivo para el usuario.
En lo personal ésto es una falla Fatal del maker. ya que los saves no tienen una identidad o código propio en si, que se
pueda solo cargar para cada proyecto...
Para ciertos usuarios que se las quieran pasar de listos... moviendo partidas guardadas de un proyecto a otro y hacer trampas, les traigo su peor pesadilla y la solución perfecta para los que creamos juegos con el Rpg maker.

Primero que todo aclarar que usaremos principalmente una variable que guardará supuesta mente el valor de nuestra
versión del juego, está variable se filtrará en 3 script:  Save, Load y Ventana de Save.

El script de Save permitirá Guardar una partida de forma normal, pero su principal trabajo será guardar siempre
el mismo valor en una variable (Recordemos que ese valor será supuesta mente la versión de nuestro juego).

El script de Load permitirá Cargar Nuestros archivos que tenemos en el directorio de forma normal, pero
su principal y especial trabajo, será cargar solamente los saves que tengan la variable que se definió en save
con el mismo valor que la versión del juego, de lo contrarío mostrará un mensaje diciendo algo referente
a que es de otro juego y no permitirá cargar esa partida.

Finalmente el script de Ventana de Save permitirá la edición de el menú de datos guardados, su principal
trabajo será la edición de su apariencia, al momento de detectar los saves que tengan en su interior una
variable con otro valor, mostrará un mensaje de incompatibilidad.
(En resumen un save de otra versión u otro juego)

Estos 3 script deberán ir obligatoria mente en todos sus proyectos. La Variable ID que usarás debe de ser la misma
para todos tus proyecto y nunca debe ser usada por ningún otro evento o comandos operacionales.
De lo contrario el valor que se detectará en la variable, es el que no debe de ser el mismo y deberá su valor ser cambiado
para cada uno de los proyectos, para así definir una identidad única y a su vez diferente para cada juego.
Imágenes:
-
Instrucciones:
Paso 1: Simplemente copiar el contenido de cada script
y pegarlos arriba de main según su numeración:

Script01
Script02
Script03
main

Usted también puede reemplazarlos por los script que ya vienen por defecto en el maker, ya que los
cambios hechos en cada uno de estos script, no son de un grado que pueda alterar el recurso de script futuros.

Script01 ==> Reemplazarlo por el contenido del script ==> Scene_Save
Script02 ==> Reemplazarlo por el contenido del script ==> Scene_Load
Script03 ==> Reemplazarlo por el contenido del script ==> Window_SaveFile

Paso 2: Para la Configuración, dirígete a cada uno de los 3 script y configurar lo siguiente:

$game_variables[50] = 2

Script01: Linea 23
Script02: Linea 49
Script03: Linea 54

En donde:
50 será la variable que guardará el valor de la versión del juego.
2 será la versión del juego que se guardará y también se detectará.

Recuerda muy bien, Estos valores (50 y 2) tienen que ser iguales para
los 3 script, pero el valor de versión (2) debe de ser diferente para
cada juego o proyecto.

Paso 3: Usted también puede ajustar los términos que se aplicarán al momento de mostrar el mensaje.

Script02: Linea 64 :
Mensaje que se muestra al seleccionar una partida de otro proyecto

Script03: Linea 80 :
Mensaje que se muestra para entender que una partida es de otro proyecto

Código:


Código:
#==============================================================================
# ** Scene_Save
#------------------------------------------------------------------------------
#  This class performs save screen processing.
#==============================================================================

class Scene_Save < Scene_File
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super("Selecciona donde Guardar la Partida")
  end
  #--------------------------------------------------------------------------
  # * Decision Processing
  #--------------------------------------------------------------------------
  def on_decision(filename)
    # Play save SE
    $game_system.se_play($data_system.save_se)
    
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AÑADIDO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# La variable 50 guardará el valor 2 (Versión 2) del juego.
    $game_variables[50] = 2
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ------- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    # Write save data
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    # If called from event
    if $game_temp.save_calling
      # Clear save call flag
      $game_temp.save_calling = false
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # Switch to menu screen
    $scene = Scene_Menu.new(4)
  end
  #--------------------------------------------------------------------------
  # * Cancel Processing
  #--------------------------------------------------------------------------
  def on_cancel
    # Play cancel SE
    $game_system.se_play($data_system.cancel_se)
    # If called from event
    if $game_temp.save_calling
      # Clear save call flag
      $game_temp.save_calling = false
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # Switch to menu screen
    $scene = Scene_Menu.new(4)
  end
  #--------------------------------------------------------------------------
  # * Write Save Data
  #     file : write file object (opened)
  #--------------------------------------------------------------------------
  def write_save_data(file)
    # Make character data for drawing save file
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      characters.push([actor.character_name, actor.character_hue])
    end
    # Write character data for drawing save file
    Marshal.dump(characters, file)
    # Wrire frame count for measuring play time
    Marshal.dump(Graphics.frame_count, file)
    # Increase save count by 1
    $game_system.save_count += 1
    # Save magic number
    # (A random value will be written each time saving with editor)
    $game_system.magic_number = $data_system.magic_number
    # Write each type of game object
    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_player, file)
  end
end

Código:
#==============================================================================
# ** Scene_Load
#------------------------------------------------------------------------------
#  This class performs load screen processing.
#==============================================================================

class Scene_Load < Scene_File
 #--------------------------------------------------------------------------
 # * Object Initialization
 #--------------------------------------------------------------------------
 def initialize
   # Remake temporary object
   $game_temp = Game_Temp.new
   # Timestamp selects new file
   $game_temp.last_file_index = 0
   latest_time = Time.at(0)
   for i in 0..3
     filename = make_filename(i)
     if FileTest.exist?(filename)
       file = File.open(filename, "r")
       if file.mtime > latest_time
         latest_time = file.mtime
         $game_temp.last_file_index = i
       end
       file.close
     end
   end
   super("Selecciona la Partida que deseas Cargar para continuar")
 end
 #--------------------------------------------------------------------------
 # * Decision Processing
 #--------------------------------------------------------------------------
 def on_decision(filename)
   # If file doesn't exist
   unless FileTest.exist?(filename)
     # Play buzzer SE
     $game_system.se_play($data_system.buzzer_se)
     return
   end
   # Play load SE
   $game_system.se_play($data_system.load_se)
   # Read save data
   file = File.open(filename, "rb")
   read_save_data(file)
   file.close
   
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AÑADIDO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# Siempre la variable 50 Cargará solamente el valor 2 (Versión 2) del juego.
   if $game_variables[50] == 2
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ------- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

   # Restore BGM and BGS
   $game_system.bgm_play($game_system.playing_bgm)
   $game_system.bgs_play($game_system.playing_bgs)
   # Update map (run parallel process event)
   $game_map.update
   # Switch to map screen
   $scene = Scene_Map.new
   
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AÑADIDO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   else
     $game_system.se_stop
     $game_system.se_play($data_system.buzzer_se)
    p "Está partida es de otra versión, retírela de los datos de este juego"
   end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ------- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 end
 #--------------------------------------------------------------------------
 # * Cancel Processing
 #--------------------------------------------------------------------------
 def on_cancel
   # Play cancel SE
   $game_system.se_play($data_system.cancel_se)
   # Switch to title screen
   $scene = Scene_Title.new
 end
 #--------------------------------------------------------------------------
 # * Read Save Data
 #     file : file object for reading (opened)
 #--------------------------------------------------------------------------
 def read_save_data(file)
   # Read character data for drawing save file
   characters = Marshal.load(file)
   # Read frame count for measuring play time
   Graphics.frame_count = Marshal.load(file)
   # Read each type of game object
   $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)
   # If magic number is different from when saving
   # (if editing was added with editor)
   if $game_system.magic_number != $data_system.magic_number
     # Load map
     $game_map.setup($game_map.map_id)
     $game_player.center($game_player.x, $game_player.y)
   end
   # Refresh party members
   $game_party.refresh
 end
end

Código:
#==============================================================================
# ** Window_SaveFile
#------------------------------------------------------------------------------
#  This window displays save files on the save and load screens.
#==============================================================================

class Window_SaveFile < Window_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader   :filename                 # file name
  attr_reader   :selected                 # selected
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     file_index : save file index (0-3)
  #     filename   : file name
  #--------------------------------------------------------------------------
  def initialize(file_index, filename)
    super(0, 64 + file_index % 4 * 104, 640, 104)
    self.contents = Bitmap.new(width - 32, height - 32)
    @file_index = file_index
    @filename = "Save#{@file_index + 1}.rxdata"
    @time_stamp = Time.at(0)
    @file_exist = FileTest.exist?(@filename)
    if @file_exist
      file = File.open(@filename, "r")
      @time_stamp = file.mtime
      @characters = Marshal.load(file)
      @frame_count = Marshal.load(file)
      @game_system = Marshal.load(file)
      @game_switches = Marshal.load(file)
      @game_variables = Marshal.load(file)
      @total_sec = @frame_count / Graphics.frame_rate
      file.close
    end
    refresh
    @selected = false
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    # Draw file number
    self.contents.font.color = normal_color
    name = "Archivo#{@file_index + 1}"
    self.contents.draw_text(4, 0, 600, 32, name)
    @name_width = contents.text_size(name).width
    # If save file exists
      if @file_exist
        
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AÑADIDO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# Variable 50 permitirá solamente cargar información de el valor 2 (versión 2)
       if @game_variables[50] == 2
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ------- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

      # Draw character
      for i in 0...@characters.size
      bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
      cw = bitmap.rect.width / 4
      ch = bitmap.rect.height / 4
      src_rect = Rect.new(0, 0, cw, ch)
      x = 300 - @characters.size * 32 + i * 64 - cw / 2
      self.contents.blt(x, 68 - ch, bitmap, src_rect)
      end
      # Draw play time
      hour = @total_sec / 60 / 60
      min = @total_sec / 60 % 60
      sec = @total_sec % 60
      time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
      self.contents.font.color = normal_color
      self.contents.draw_text(4, 8, 600, 32, time_string, 2)
      # Draw timestamp
      self.contents.font.color = normal_color
      time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
      self.contents.draw_text(4, 40, 600, 32, time_string, 2)
      
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AÑADIDO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    else
      text = "[Datos Incompatibles]"
      self.contents.font.size = 25
      self.contents.font.color = disabled_color
      self.contents.draw_text(190, 18, 350, 32, text)
    end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ------- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  end
 end

  #--------------------------------------------------------------------------
  # * Set Selected
  #     selected : new selected (true = selected, false = unselected)
  #--------------------------------------------------------------------------
  def selected=(selected)
    @selected = selected
    update_cursor_rect
  end
  #--------------------------------------------------------------------------
  # * Cursor Rectangle Update
  #--------------------------------------------------------------------------
  def update_cursor_rect
    if @selected
      self.cursor_rect.set(0, 0, @name_width + 8, 32)
    else
      self.cursor_rect.empty
    end
  end
end
Créditos:
No pido creditos... usar con libertad (ademas es muy sencillo)
Si alguien que entienda de script lo pueda configurar para que en vez de usar una variable se use un código
   más extenso y se guarde en la partida... estaría mucho mejor.

#2 Re: Save para cada Juego (RMXP) el Dom Ene 03, 2016 8:15 pm

Tomate

avatar
¡Qué prolijidad! ¡Te felicito! Esto esta muy presentable, ordenado y bien explicado.

¡Gracias por al aporte!

Ópalo Reputación

Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

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