Sistemas de guardado personalizados y puntos de afecto en Ren'Py
¡Hola, creadores de novelas visuales! En nuestra [entrada anterior], exploramos cómo insertar y controlar videos cortos. Hoy seguimos con temas avanzados: **crear sistemas de guardado personalizados**, desactivar el menú de guardado predeterminado de Ren'Py, y añadir un sistema de puntos de afecto para nuevos personajes. Además, te mostraré cómo reiniciar este sistema o expandirlo con mecánicas como una tienda o un sistema monetario. ¡Empecemos!
1. ¿Por qué un sistema de guardado personalizado?
El sistema de guardado de Ren'Py es práctico, pero a veces necesitas más control. Un sistema personalizado permite:
- Guardar y cargar puntos de afecto específicos para personajes.
- Desactivar el menú predeterminado para un diseño único.
- Reiniciar o expandir el sistema con nuevas mecánicas, como trabajos o compras.
2. Preparativos
Usaremos un nuevo elenco de personajes para diversificar la narrativa. Definamos:
- **Luna**: Una exploradora curiosa con un afecto inicial de 0.
- **Riku**: Un inventor ingenioso con un afecto inicial de 0.
Necesitarás:
- El proyecto básico de Ren'Py (puedes usar el de Perrito y Gatita como base).
- Un archivo `.rpy` nuevo para el sistema de guardado.
3. Crear un archivo para el sistema de guardado
Crea un archivo `custom_save_system.rpy` en la carpeta `game` con este código:
```
# Definir variables
default save_data = {}
default luna_afecto = 0
default riku_afecto = 0
default dinero = 0
# Desactivar el menú de guardado predeterminado
define config.has_autosave = False
define config.has_quicksave = False
define config.menu_include_disabled = False
init python:
def save_game():
global save_data
save_data = {
"luna_afecto": luna_afecto,
"riku_afecto": riku_afecto,
"dinero": dinero
}
renpy.notify("Juego guardado con éxito.")
def load_game():
global luna_afecto, riku_afecto, dinero
if save_data:
luna_afecto = save_data.get("luna_afecto", 0)
riku_afecto = save_data.get("riku_afecto", 0)
dinero = save_data.get("dinero", 0)
renpy.notify("Juego cargado desde el último guardado.")
else:
renpy.notify("No hay datos guardados.")
def reset_progress():
global luna_afecto, riku_afecto, dinero, save_data
luna_afecto = 0
riku_afecto = 0
dinero = 0
save_data = {}
renpy.notify("Progreso reiniciado.")
# Pantalla para el menú personalizado
screen custom_save_menu():
frame:
xalign 0.5
yalign 0.5
vbox:
text "Menú de Guardado"
textbutton "Guardar" action Function(save_game)
textbutton "Cargar" action Function(load_game)
textbutton "Reiniciar" action Function(reset_progress)
textbutton "Salir" action Hide("custom_save_menu")
# Label para mostrar el menú
label custom_save:
show screen custom_save_menu
$ renpy.pause()
hide screen custom_save_menu
return
```
4. Integrar el sistema en tu novela visual
Modifica `script.rpy` y `rutas.rpy` para incluir a Luna y Riku, y gestionar el afecto y el dinero.
1. **Definir personajes y variables**:
- En `definiciones.rpy`, añade:
```
define l = Character("Luna", color="#ff9999")
define r = Character("Riku", color="#99ccff")
default luna_afecto = 0
default riku_afecto = 0
default dinero = 0
```
2. **Añadir interacciones en rutas**:
- En `rutas.rpy`, reemplaza la escena inicial con:
```
label rutas:
scene bg bosque with dissolve
show screen day_meter
show screen custom_save_menu
l "¡Hola! Soy Luna, ¿quieres explorar conmigo?"
r "O puedes ayudarme con mis inventos, soy Riku."
menu:
"Explorar con Luna":
$ luna_afecto += 10
$ spend_action(1)
scene bg cueva with dissolve
l "¡Mira este tesoro! Gracias por venir."
$ dinero += 50
"Ayudar a Riku":
$ riku_afecto += 10
$ spend_action(1)
scene bg taller with dissolve
r "¡Funciona! Tu ayuda valió oro."
$ dinero += 30
"Guardar y salir":
call custom_save
return
```
3. **Opcional: Reinicio con decisión**:
- Añade una decisión para reiniciar:
```
menu:
"Seguir explorando":
pass
"Reiniciar aventura":
call custom_save
$ reset_progress()
jump rutas
```
5. Explicar la desactivación del menú predeterminado
- Las líneas `define config.has_autosave = False` y `define config.has_quicksave = False` desactivan el guardado automático y rápido de Ren'Py.
- Esto obliga a los jugadores a usar tu menú personalizado, dándote control total sobre el sistema de guardado.
- **Precaución**: Asegúrate de que el menú personalizado sea accesible (por ejemplo, en `rutas.rpy`) para evitar que los jugadores queden atrapados.
6. Expandir con una tienda o sistema monetario
- **Idea futura**: Usa `dinero` para una tienda. Por ejemplo, en una próxima entrada, podrías añadir:
```
screen shop_menu():
frame:
xalign 0.5
yalign 0.5
vbox:
text "Tienda - Dinero: [dinero]"
textbutton "Comprar objeto (50)" action If(dinero >= 50, [SetVariable("dinero", dinero - 50), SetVariable("luna_afecto", luna_afecto + 20)], renpy.notify("Dinero insuficiente"))
textbutton "Salir" action Hide("shop_menu")
label open_shop:
show screen shop_menu
$ renpy.pause()
hide screen shop_menu
return
```
- Integra esto con trabajos: Gana dinero con acciones (por ejemplo, `dinero += 20` por explorar).
7. Probar el sistema
1. Crea `custom_save_system.rpy` con el código.
2. Modifica `definiciones.rpy` y `rutas.rpy` como se mostró.
3. Ejecuta el juego y verifica:
- El menú personalizado aparece y guarda/carga afecto y dinero.
- El reinicio funciona sin errores.
- El menú predeterminado de Ren'Py está desactivado.
8. Ejercicio
Personaliza el sistema:
- Añade un tercer personaje con su propio afecto.
- Crea una condición para reiniciar solo si `dinero >= 100`.
- Diseña una mini-tienda con dos ítems que aumenten el afecto.
9. ¡Tu turno!
Prueba este código y comparte tus resultados. ¿Funciona el guardado personalizado? ¿Lograste reiniciar o usar el dinero? Próxima entrada: más ideas avanzadas. ¡Nos leemos!
Comentarios
Publicar un comentario