Registrarse

[RPGXP] Ir a cualquier momento de la historia – guardado de partida mejorado

Pableroski

Novato - Rpg en desarrollo
Versión RPG Maker XP – Essentials v16.2

Más de una vez he querido volver a un momento concreto de la historia. Sea para corregir algún bug, sea para modificarlo, sea para ver cómo reacciona al haber añadido alguna variable nueva. Para lograrlo, hice este pequeño script.

Guarda el valor de las Variables, Interruptores e interruptores Locales (VIL) en un archivo .txt que creará el script.
Cada momento de la historia que quieras guardar tendrá su propio trío de .txt, tal que así:
- LISTA_VIL_V_0 --> Para variables (V)
- LISTA_VIL_I_0 --> Para interruptores no locales (I)
- LISTA_VIL_L_0 --> Para interruptores locales (L)
El número representa el momento de la historia que quieras guardar. Recomiendo apuntarlos en algún lado. Yo tengo 5 momentos guardados:
Momentos guardados.PNG

En la carpeta raíz del Essentials, donde está la carpeta del audio, de los gráficos, PBS, etc… creáis una carpeta que ponga VIL. Ahí el programa irá guardando los archivos que vaya creando el script.
RAIZ.PNG

El script consta de cuatro funciones:

-Listar: comprueba si ya existe el archivo donde quieres guardar los datos. Esto es opcional pero en caso de no comprobarlo podrías sobrescribir uno que ya tuvieras, perdiendo los datos de ese momento.

-Exportar: guardar todas las variables e interruptores (locales incluidos) en un .txt

-Importar: según el momento que quieras reproducir, leer un archivo u otro y volcar esa información en tu juego.

-Manual de interruptores locales: Estos me dieron muchos problemas y no encontré un método de recogerlos automáticamente. Así que como no son muchos, decidí introducirlos yo a mano. Lo explicaré luego.


El código es el que sigue. Dejo enlace para descarga (enlace)
Código:
################################################################################
#  IMPORTAR/EXPORTAR VIL                                                       #                
#  Creador: Pableroski                                                         #  
#  No necesita dar créditos. Se agradecería pero no obligo a nadie             #
#  No necesita ninguna variable.                                               #
#  En Importar_VIL, modificar num_variables según la cantidad que se tenga.    #
#  Ej: Si tengo 152 variables, cuando tipo==0, num_variables=152. Si tengo 34  #
#  interruptores (no locales), cuando tipo==1, num_variables=34. Si tengo 5    #
#  interruptores locales, cuando tipo==2, num_variables=5                      #
#  La función MII_Loc necesita que la vayamos completando con nuestros         #
#  interruptores locales. Dejo una plantilla. La primera tendrá "numero=0",    #
#  la segunda  "numero=1"... Abajo está explicado qué poner en cada sitio.     #
################################################################################

#Comprobamos si el archivo existe o no

def Listar(numero,tipo)
  numero=numero.to_s
  iteracion=0
  array=[]
  maximo=50 #Si superas los 50 .txt, aumentar.

  if tipo==0
    array_comprobante=['LISTA_VIL_V_' + numero + '.txt']
  end

  if tipo==1
    array_comprobante=['LISTA_VIL_I_' + numero + '.txt']
  end

  if tipo==2
    array_comprobante=['LISTA_VIL_L_' + numero + '.txt']
  end

  resultado=true #No existe
  array= Dir.entries("\VIL")

      while (iteracion<maximo && array[iteracion]!=nil)
        if array[iteracion]==array_comprobante[0]
              resultado=false #Existe
        end
        iteracion+=1
      end

  return resultado
end


#Guardamos variables en archivo seleccionado

def Exportar_VIL(numero,tipo)
  clase=[]
  if tipo==0
  num_variables=650 #Num variables que tenemos
  clase=['V_']
  end

  if tipo==1
  num_variables=153 #Num interruptores generales
  clase=['I_']
  end

  if tipo==2
  num_variables=25 #Num interruptores locales
  clase=['L_']
  end

  numero=numero.to_s
  iteracion=1 #Las variables que se pueden comprobar empiezan en 1

  File.open('VIL\LISTA_VIL_'+clase[0] + numero +'.txt',"w") do|line| #Abre archivo, recorre con var line
   
      while iteracion <=num_variables #Itera variables mientras escribe.
        if tipo==0
        line.puts $game_variables[iteracion]
        end
        if tipo==1
        line.puts $game_switches[iteracion]
        end
        if tipo==2
        line.puts $game_self_switches[[MII_Loc(iteracion,1),MII_Loc(iteracion,2),MII_Loc(iteracion,3)]]        
        end
          iteracion +=1
      end
  end
end


#Copiamos en juego conjunto de variables seleccionadas

def Importar_VIL(numero,tipo)

  mapa=0
  id=0
  interruptor=0

  clase=[]
  if tipo==0
  num_variables=650 #Num variables || #Num interruptores (según 'tipo')
  clase=['V_']
  end

  if tipo==1
  num_variables=153 #Num variables || #Num interruptores (según 'tipo')
  clase=['I_']
  end

  if tipo==2
  num_variables=25 #Num variables || #Num interruptores (según 'tipo')
  clase=['L_']
  end

  numero=numero.to_s
  iteracion=1 #Las variables que se pueden comprobar empiezan en 1
  array=[]
  copia=0
  archivo=File.open('VIL\LISTA_VIL_' + clase[0] + numero + '.txt')
  array=archivo.readlines
    while iteracion<=num_variables
      if tipo==0
        copia=array[iteracion-1] #El array cuenta la pos 0
        copia=copia.to_i
        if iteracion!=12  #Quitar el \n a las variables con texto
        $game_variables[iteracion]=copia
        else
        $game_variables[iteracion]='Rafael'
        end
      end
          ##################################################      
      if tipo==1
        if array[iteracion-1]== "false\n"
          $game_switches[iteracion]=false
        end
        if array[iteracion-1]== "true\n"
          $game_switches[iteracion]=true
        end
      end
          ##################################################
      if tipo==2
        if array[iteracion-1]== "false\n"
          $game_self_switches[[MII_Loc(iteracion,1),MII_Loc(iteracion,2),MII_Loc(iteracion,3)]]=false
        end
        if array[iteracion-1]== "true\n"
          $game_self_switches[[MII_Loc(iteracion,1),MII_Loc(iteracion,2),MII_Loc(iteracion,3)]]=true
        end
      end
          ##################################################
      iteracion+=1
    end
   
  archivo.close

end
################################################################################


def MII_Loc(numero,tipo)

resultado=0
numero-=1

  #Plantilla
  #Aquí podéis poner el nombre del mapa
  if numero==0   #Cada plantilla tiene su número. Empezar en 0, siguiente 1...
    if tipo==1
      resultado= #Id del mapa
    end
    if tipo==2
      resultado= #Id del evento
    end
    if tipo==3
      resultado="" #Interruptor local a modificar
    end            #MAYÚSCULA y entre ""
  end
  #Fin plantilla

end

Para usarlo únicamente habría que cambiar dos cosas:

-En “Exportar_VIL”, “num_variables”:
num_variables.PNG

-En “tipo=0” --> cambiar 650 por el número de variables totales que tengamos. 650 es el número con el que hice las pruebas.

-En “tipo=1 --> cambiar 153 por el número de interruptores que tengamos (NO LOCALES).

-En “tipo=2” --> cambiar 25 por el número de interruptores locales que tengamos.

(Recomiendo, dentro de vuestro juego, tener un cierto margen de variables e interruptores (no locales) libres. Así os evitaréis tener que estar tocando la función. Ej: uso hasta la variable 67 pero tengo hasta la 75. Pero en cualquier caso siempre poned el número máximo que tengáis, da igual que las estéis usando o no.)
Variables libres VIL.PNG

-En MII_Loc hay que añadir manualmente los interruptores locales que quieras importar/exportar. Dejo la plantilla, que es sencilla de rellenar:
MII_Loc.PNG


En la primera plantilla, “numero” será igual a 0, en la siguiente a 1…


DENTRO DEL JUEGO

Exportar
un momento (guardarlo), aconsejo hacerlo así:
VIL_EVENTO.PNG

Usé una variable auxiliar (636), que no me importara modificar su valor, para comprobar si el archivo donde quiero guardar existe o no. Para ello pido un número y lo guardo en esa variable. Llamo a Listar en un condicional “Listar(pbGet(636),0)”. El primer parámetro es el número que quiero comprobar (Si quiero guardarlos en el archivo LISTA_VIL_V_15, introduciré un 15 en la entrada numérica). El segundo aconsejo dejarlo en 0, aunque funcionaría con 1 y 2 también. Recordad que trabajamos con tríos de archivos .txt, así que si hay uno (por ejemplo el de las variables), presupondré que están los otros 2 para agilizar el evento. Si quisiera más seguridad podría repetir ese condicional con “Listar(pbGet(636),1)” y “Listar(pbGet(636),2)”. Con 1 comprobará si está el archivo de los interruptores (no locales) y con 2 si está el de los interruptores locales.

En mi evento tengo puesto que si existe te pregunte si lo quieres sobrescribir o no. En caso de que no quieras hacerlo, volver a pedir el número. Si eliges sobrescribirlo, se borrarán los valores que tuvieras en ese archivo.

Cuando ya tengas el número del archivo que quieras usar (ej: 15), llamas a “Exportar_VIL(pbGet(636),0)”, “Exportar_VIL(pbGet(636),1)” y “Exportar_VIL(pbGet(636),2)” y se creará LISTA_VIL_V_15.txt, LISTA_VIL_I_15.txt, LISTA_VIL_L_15.txt en tu carpeta VIL



Importar (cargar un momento de la historia):

En mi caso, lo tengo puesto dentro del inicio rápido de “Partida Nueva” si el modo DEBUG está activado. Pero podéis ponerlo en cualquier sitio. Solo vigilad que quien vaya a jugar no pueda acceder a él. El mío está así:
IMPORTAR_EVENTO.PNG

Si quiero importar el momento 3, le doy a la variable que esté usando ese valor (636 en mi caso) y llamo a las funciones:

“Importar_VIL(pbGet(636),0)”, “Importar_VIL(pbGet(636),1)”, “Importar_VIL(pbGet(636),2)”.

NOTA IMPORTANTE: Desconozco el motivo pero el juego os devolverá un error si ponéis las llamadas del script seguidas. Por eso me vi obligado a darle valor a la variable después de cada llamada (siempre el mismo, para que el momento que vayas a importar sea el mismo). No debería dar ese problema pero lo da. Por suerte se puede sortear. Si hacéis esto os va a dar error:
ERROR.PNG

Ya lo que quedaría es elección vuestra. En mi caso como lo tengo puesto cuando accedo desde “Partida Nueva”, aparecería sin pkm así que le añado uno al equipo y me teletransporto donde debería estar en ese momento. Ya depende de cada uno. Recomiendo ponerlo en "Partida Nueva" para no tener problemas en el mapa en el que estés en ese momento. Piensa que vas a modificar variables e interruptores de golpe.

Y para finalizar, como siempre, pegáis el script encima del main.
Eso es todo, espero que a alguien le sirva. Si tenéis alguna duda escribidme y la resolveré.
Fiel a mis principios no exijo créditos. Se agradecería la mención pero no iré detrás vuestra si no lo hacéis.

PD: Un último consejo. Yo de ustedes, a la hora de poner el juego de cara al público, borraría la carpeta VIL, o al menos los archivos. Pero eso ya es elección vuestra.
 

Adjuntos

Arriba