Skip to content

Sistema de reglas

Slytharbez edited this page Jul 23, 2026 · 1 revision

⚙️ Sistema de reglas de eventos

🧭 Introducción

A partir de la versión 0.7.4, se introdujo un sistema basado en reglas (rule-based system) para la clase Event. Este sistema permite que la disponibilidad y selección de un evento se determinen analizando una serie de reglas dinámicas asociadas al objeto.

Actualmente, las reglas incluyen repeticiones basadas en el tiempo de calendario, rangos de afecto del jugador y probabilidades de selección aleatoria para saludos y despedidas. 📅

🔁 Reglas de repetición

Estas reglas analizan intervalos de tiempo de calendario para determinar si un evento se puede repetir o no.

📅 MASNumericalRepeatRule

Esta regla se define mediante la propiedad repeat (que especifica el intervalo de tiempo para la repetición) y advance_by (que define cuántos intervalos avanzar para la próxima ejecución). Está pensada para interactuar directamente con las propiedades start_date y end_date del evento.

📌 Ejemplo de funcionamiento:

Si tenemos un evento programado para el 1 de enero de 2018 y queremos que se repita anualmente cada 1 de enero, añadimos esta regla especificando repeat="year" y advance_by=1. Si quisiéramos que se repita cada dos meses, especificaríamos repeat="month" y advance_by=2.

Note

  • La propiedad repeat solo acepta los valores: "day", "week", "month" y "year".
  • La propiedad advance_by acepta cualquier número entero mayor que 0.
💻 Ejemplo de código:
init 5 python:
    rules = dict()
    rules.update(MASNumericalRepeatRule.create_rule(repeat=EV_NUM_RULE_YEAR))
    addEvent(
        Event(
            persistent.greeting_database,
            eventlabel="greeting_example", 
            start_date=datetime.datetime(2018, 2, 1),
            end_date=datetime.datetime(2018, 2, 2),
            unlocked=True, 
            rules=rules
        ),
        eventdb=evhand.greeting_database
    )
    del rules

label greeting_example:
    m "¡Oh, hola [player]!"
    m "Este es solo un tema de ejemplo."
    return

⏱️ MASSelectiveRepeatRule

Esta regla se define mediante un conjunto de rangos: seconds, minutes, hours, days, weekdays, months, years. Estos parámetros determinan los intervalos específicos del reloj en los cuales se puede ejecutar el evento.

📌 Ejemplo de funcionamiento:

Si queremos que un evento solo ocurra de 9:00 AM a 4:59 PM, añadimos la propiedad hours con una lista [9, 10, 11, 12, 13, 14, 15, 16] (que en Python se puede abreviar como range(9, 17)). Si quisiéramos que un evento solo ocurra los viernes 13 de cualquier mes, definiríamos days=[13] y weekdays=[4] (los días de la semana van de Lunes = 0 a Domingo = 6).

💻 Ejemplo de código en una despedida:
init 5 python:
    rules = dict()
    rules.update(MASSelectiveRepeatRule.create_rule(days=[13], weekdays=[4]))
    addEvent(
        Event(
            persistent.farewell_database,
            eventlabel="bye_special_friday",
            unlocked=True,
            rules=rules
        ),
        eventdb=evhand.farewell_database
    )
    del rules

label bye_special_friday:
    m "¡Adiós [player]!"
    m "Esta es una despedida especial de viernes 13."
    return 'quit'

📥 Reglas para saludos (Greetings)

👋 MASGreetingRule

Esta regla se utiliza exclusivamente para los saludos de Monika al iniciar el juego y define dos cosas:

  1. skip_visual: Si el saludo debe omitir la secuencia visual de inicio (salón en negro y desvanecimiento).
  2. random_chance: La probabilidad aleatoria (en porcentaje de 1 a 100) de que aparezca este saludo especial.
💻 Ejemplo de código:
define opendoor.chance = 20

init 5 python:
    rules = dict()
    rules.update(
        MASGreetingRule.create_rule(
            skip_visual=True,
            random_chance=opendoor.chance
        )
    )
    addEvent(
        Event(
            persistent.greeting_database,
            eventlabel="i_greeting_monikaroom",
            unlocked=True,
            rules=rules
        ),
        eventdb=evhand.greeting_database
    )
    del rules

label i_greeting_monikaroom:
    # Código para este saludo interactivo
    return

📤 Reglas para despedidas (Farewells)

🚪 MASFarewellRule

Define una probabilidad aleatoria de que esta opción de despedida aparezca en el menú del juego mediante la propiedad random_chance.

💻 Ejemplo de código:
init 5 python:
    rules = dict()
    rules.update(MASFarewellRule.create_rule(random_chance=10))
    addEvent(
        Event(
            persistent.farewell_database,
            eventlabel="bye_example",
            unlocked=True,
            rules=rules
        ),
        eventdb=evhand.farewell_database
    )
    del rules

label bye_example:
    m "¡Adiós, [player]!"
    return 'quit'

💖 Reglas basadas en afecto

A partir de la versión 0.8.4 con la introducción del sistema de afecto, es posible filtrar la disponibilidad de los eventos mediante umbrales numéricos de afecto.

💞 MASAffectionRule

Se define mediante las propiedades min y max (ambas inclusive), que determinan el rango de afecto dentro del cual el evento se considerará disponible.

  • Para establecer un límite de "mayor o igual que (>=)": Define min con tu valor deseado y max=None.
  • Para establecer un límite de "menor o igual que (<=)": Define min=None y max con tu valor deseado.

Warning

No definas ambas propiedades como None al mismo tiempo. Al no tener límites de afecto, la regla se volverá inútil pues siempre se considerará disponible.

Note

Actualmente, esta regla solo se evalúa para filtrar saludos especiales del juego; determina su disponibilidad, pero no obliga al motor a seleccionarlo obligatoriamente.

💻 Ejemplo de código:
init 5 python:
    rules = dict()
    rules.update(MASAffectionRule.create_rule(min=160, max=None))
    addEvent(
        Event(
            persistent.greeting_database,
            eventlabel="greeting_high_affection",
            unlocked=True,
            rules=rules
        ),
        eventdb=evhand.greeting_database
    )
    del rules

label greeting_high_affection:
    m "¡Qué bueno verte de nuevo, mi amor!"
    return

Clone this wiki locally