Repository navigation
Sistema de reglas
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. 📅
Estas reglas analizan intervalos de tiempo de calendario para determinar si un evento se puede repetir o no.
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.
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
repeatsolo acepta los valores:"day","week","month"y"year". - La propiedad
advance_byacepta cualquier número entero mayor que 0.
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."
returnEsta 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.
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).
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'Esta regla se utiliza exclusivamente para los saludos de Monika al iniciar el juego y define dos cosas:
-
skip_visual: Si el saludo debe omitir la secuencia visual de inicio (salón en negro y desvanecimiento). -
random_chance: La probabilidad aleatoria (en porcentaje de 1 a 100) de que aparezca este saludo especial.
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
returnDefine una probabilidad aleatoria de que esta opción de despedida aparezca en el menú del juego mediante la propiedad random_chance.
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'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.
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
mincon tu valor deseado ymax=None. -
Para establecer un límite de "menor o igual que (<=)": Define
min=Noneymaxcon 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.
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