DEV Community

Cover image for Rompiendo la cuarta pared en Ren'Py: El "Efecto Monika" y la Esfera Matemática (Parte 1)
Lily
Lily

Posted on

Rompiendo la cuarta pared en Ren'Py: El "Efecto Monika" y la Esfera Matemática (Parte 1)

¿Te acuerdas de la primera vez que jugaste Doki Doki Literature Club y Monika te llamó por tu nombre real? Ese escalofrío es el resultado de un truco de ingeniería genial. En esta primera entrega de nuestro Desafío de Construcción Extrema: Edición Ren'Py, vamos a crear una carpa mística donde nuestra adivina, Madame Zora, usará Python para calcular días de la semana y "hackear" el nombre del sistema operativo del jugador.

El Poder Matemático: Adivinar el Día de la Semana 🔮

Detrás de la magia del calendario hay un algoritmo clásico de la matemática (como el de Doomsday). En lugar de calcularlo a mano, usaremos la librería nativa datetime de Python dentro de Ren'Py para procesar cualquier fecha que el usuario ingrese por teclado.

El Truco de Monika: Leyendo el Sistema 🖥️

Los videojuegos corren sobre un sistema operativo que sabe exactamente quién inició sesión. Con las librerías os y getpass, podemos preguntarle a la computadora el nombre del usuario y guardarlo en una variable secreta.

El Código Base (Script.rpy) 📜

Copia y pega este código en tu proyecto de Ren'Py para ver la magia en acción:

init python:
    import datetime
    import getpass
    import os

    # Función para descifrar el día de la semana
    def calcular_dia(fecha_texto):
        try:
            fecha_objeto = datetime.datetime.strptime(fecha_texto, "%d/%m/%Y")
            numero_dia = fecha_objeto.weekday()
            dias_semana = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
            return dias_semana[numero_dia]
        except:
            return None # Si el usuario escribe texto inválido, no se rompe el juego

    # Función para obtener el usuario real de la PC
    def obtener_nombre_sistema():
        try:
            return getpass.getuser()
        except:
            return os.environ.get("USERNAME", "Viajero")

define adivina = Character("Madame Zora", color="#993399")

label start:
    scene bg_tienda_mistica
    $ nombre_real = obtener_nombre_sistema()

    adivina "Dime, alma viajera... ¿cómo te llamas en este plano?"
    $ nombre_juego = renpy.input("Introduce tu nombre:").strip()

    if not nombre_juego:
        $ nombre_juego = "Forastero"

    adivina "Bien, [nombre_juego]. Ahora dime una fecha importante en formato DD/MM/AAAA."

label pedir_fecha:
    $ fecha_ingresada = renpy.input("Fecha (ejemplo: 20/05/1995):").strip()
    $ resultado_dia = calcular_dia(fecha_ingresada)

    if resultado_dia is None:
        adivina "Las brumas están densas... Esa fecha no es válida. Inténtalo de nuevo."
        jump pedir_fecha

    adivina "¡La esfera brilla! El día [fecha_ingresada] fue un majestuoso **[resultado_dia]**."
    adivina "Pero mi esfera ve mucho más allá..."

    # Confrontando al jugador con el truco de Monika
    if nombre_juego.lower() == nombre_real.lower():
        adivina "Veo que eres honesto. Tu espíritu coincide con el nombre de tu máquina: **[nombre_real]**."
    else:
        adivina "Has intentado ocultarte bajo el nombre de '[nombre_juego]'..."
        adivina "¡Pero a la esfera no se le miente! Tu verdadero nombre en el mundo de metal es... **[nombre_real]**."

    return
Enter fullscreen mode Exit fullscreen mode

Visita mi canal de Youtube para más explicación:

Top comments (0)