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

Entradas más populares de este blog

Introducción a Ren'Py - Tu primer paso para crear novelas visuales

Importar un segundo personaje y hacer que interactúen en Ren'Py

Crear rutas alternas con el comando `if` en Ren'Py