Repository navigation
DelayedAction
El framework DelayedAction (acción retrasada) es un sistema que permite encolar y ejecutar acciones basadas en eventos (así como acciones personalizadas) en un momento posterior si se cumple una condición.
Warning
Esto NO reemplaza la verificación condicional de eventos. Está más enfocado en ejecutar código que depende de variables del sistema o condiciones iniciales.
El framework DelayedAction consta de lo siguiente:
- La clase
MASDelayedAction - El store
mas_delact
Esta clase contiene varias propiedades, pero las principales son (todas requeridas en el constructor):
-
id: el identificador único para esteDelayedAction. -
ev: el evento (Event) con el cual está asociado esteDelayedAction. -
conditional: condición evaluada (medianteeval) que controla cuándo se ejecuta elDelayedAction. -
action: una constanteEV_ACTIONo un elemento ejecutable (callable) que realiza la acción. -
flowcheck: constanteMAS_FCque controla cuándo se verifica la condicional.
Esta clase también contiene el método estático makeWithLabel, el cual puede crear una instancia de DelayedAction usando un eventlabel en lugar del event real. Esto asume que mas_getEV está disponible, así que asegúrate de usar el nivel de init correcto.
Los DelayedActions están diseñados para actuar como envoltorios (wrappers) de acciones comunes que permiten ejecutarlas de forma perezosa (lazy), una vez que se cumple la conditional y en ciertos momentos durante el tiempo de init, de ejecución o incluso en sesiones posteriores.
Cuando se cumple la condicional de un DelayedAction, se ejecuta la acción. Si la acción se ejecuta con éxito, se elimina del mapa de DelayedAction y de la lista de acciones retrasadas en persistent.
Las acciones que sean ejecutables (callables) deben retornar True si tienen éxito y False en caso contrario para notificar el estado al framework. Las acciones ejecutables se invocan pasando el objeto Event mediante el argumento clave ev.
Flowcheck está diseñado para funcionar utilizando comprobaciones a nivel de bits (bitwise), por lo que un DelayedAction se puede verificar en múltiples ubicaciones realizando una operación OR a nivel de bits con las constantes MAS_FC.
Este store contiene las funciones de carga y guardado para el mapa de DelayedAction, así como el diccionario MAP que relaciona los IDs de DelayedAction con sus funciones constructoras.
Para configurar un DelayedAction, necesitarás lo siguiente:
- Una función constructora que pueda compilar un
DelayedActionen el nivel de init 994. - Un evento (
Event) sobre el cual realizar elDelayedAction.
-
Crear función constructora: Crea una función constructora para compilar el
DelayedAction. Esta función debe estar precedida por un solo guión bajo y definirse en el storemas_delact. Este store tendrá acceso a la importación destore, por lo que podrás recuperar todas las demás variables desde allí. Debes crear esta función en un nivel de init anterior a 994. Esta función no debe aceptar parámetros y debe retornar un objetoMASDelayedAction. -
Añadir al mapa: Añade esa función al diccionario
mas_delact.MAPubicado enevent-handler. Asegúrate de que tu ID sea único y coincida con el que utilizaste al crear el objetoMASDelayedAction. Se recomienda usar un número para el ID. -
Encolar: Llama a
mas_addDelayedActionpasando el ID de tuDelayedActioncuando necesites encolarlo.
Así es como funciona la ejecución de los DelayedActions:
- En el nivel de init 994, todos los IDs de
DelayedActionguardados enpersistent._mas_delayed_action_listse convierten en instancias deDelayedActiony se almacenan enmas_delayed_action_map. Ten en cuenta que esta variable de ejecución es un diccionario, mientras que la variable enpersistentes una lista. - En el nivel de init 995, todos los
DelayedActionscon unflowcheckque contengaMAS_FC_INITson verificados y ejecutados si la condicional se cumple. - Los
DelayedActionscon unflowcheckque contengaMAS_FC_STARTse verifican durante el tiempo de ejecución en la pantalla de carga (splash). - Los
DelayedActionscon unflowcheckque contengaMAS_FC_IDLE_ONCEse verifican durante el tiempo de ejecución ench30_preloop. - Los
DelayedActionscon unflowcheckque contengaMAS_FC_IDLE_ROUTINEse verifican aproximadamente una vez por minuto ench30_loop. - Los
DelayedActionscon unflowcheckque contengaMAS_FC_ENDse verifican durante el tiempo de ejecución al cerrar el juego (quit). - Los IDs de los
DelayedActionsque no se ejecutaron en esta sesión se guardan enpersistent._mas_delayed_action_list.
Note
Esta lista siempre se regenera (no se le añade información) al finalizar la sesión.
- Todo el código de
DelayedActionse encuentra enevent-handler. - El primer evento en usar
DelayedActionses el evento de las islas (islands event). Este se utilizó para manejar los casos en que las imágenes no se decodificaban correctamente, lo que significaba que el evento debía permanecer bloqueado hasta que las imágenes se analizaran con éxito.