2021-08-29 16:34:42 +02:00
# ifndef _EVT_H_
# define _EVT_H_
2020-08-15 07:55:16 +02:00
2020-08-19 02:21:04 +02:00
# include "ultra64.h"
2021-08-22 23:50:10 +02:00
// Should be at least the width of a pointer i.e. intptr_t
2020-10-20 08:33:40 +02:00
typedef s32 Bytecode ;
2021-08-22 23:50:10 +02:00
enum {
EVT_OP_INTERNAL_FETCH ,
EVT_OP_END ,
EVT_OP_RETURN ,
EVT_OP_LABEL , ///< Args: index
EVT_OP_GOTO , ///< Args: index
EVT_OP_LOOP , ///< Args: number of repeats (0 = infinite)
EVT_OP_END_LOOP ,
EVT_OP_BREAK_LOOP ,
2021-10-25 13:44:55 +02:00
EVT_OP_WAIT_FRAMES ,
EVT_OP_WAIT_SECS ,
2021-08-22 23:50:10 +02:00
EVT_OP_IF_EQ , ///< Args: a, b
EVT_OP_IF_NE , ///< Args: a, b
EVT_OP_IF_LT , ///< Args: a, b
EVT_OP_IF_GT , ///< Args: a, b
EVT_OP_IF_LE , ///< Args: a, b
EVT_OP_IF_GE , ///< Args: a, b
EVT_OP_IF_FLAG , ///< Args: a, b
EVT_OP_IF_NOT_FLAG , ///< Args: a, b
EVT_OP_ELSE ,
EVT_OP_END_IF ,
2021-10-25 13:44:55 +02:00
EVT_OP_SWITCH , ///< Args: expression to test against
EVT_OP_SWITCH_CONST , ///< Args: value to test against
2021-08-22 23:50:10 +02:00
EVT_OP_CASE_EQ , ///< Args: expression to test for
EVT_OP_CASE_NE , ///< Args: expression to test for
EVT_OP_CASE_LT , ///< Args: expression to test for
EVT_OP_CASE_GT , ///< Args: expression to test for
EVT_OP_CASE_LE , ///< Args: expression to test for
EVT_OP_CASE_GE , ///< Args: expression to test for
2021-10-25 13:44:55 +02:00
EVT_OP_CASE_DEFAULT ,
EVT_OP_CASE_OR_EQ , ///< Args: expression to test for
EVT_OP_CASE_AND_EQ , ///< Args: expression to test for
2021-08-22 23:50:10 +02:00
EVT_OP_CASE_FLAG , ///< Args: expression to test for
2021-10-25 13:44:55 +02:00
EVT_OP_END_CASE_GROUP , ///< Ends the case block of EVT_OP_CASE_OR_EQ condition(s).
2021-08-22 23:50:10 +02:00
EVT_OP_CASE_RANGE , ///< Args: from, to
2021-10-25 13:44:55 +02:00
EVT_OP_BREAK_SWITCH ,
EVT_OP_END_SWITCH ,
2021-08-22 23:50:10 +02:00
EVT_OP_SET , ///< Args: container, expression
EVT_OP_SET_CONST , ///< Args: container, value
2021-10-25 13:44:55 +02:00
EVT_OP_SETF , ///< Args: container, expression
2021-08-22 23:50:10 +02:00
EVT_OP_ADD , ///< Args: container, expression to increment by
EVT_OP_SUB , ///< Args: container, expression to decrement by
EVT_OP_MUL , ///< Args: container, expression to multiply by
EVT_OP_DIV , ///< Integer division. Args: container, expression to divide by
EVT_OP_MOD , ///< Args: container, expression to divide by
2021-10-25 13:44:55 +02:00
EVT_OP_ADDF , ///< Args: container, expression to increment by
EVT_OP_SUBF , ///< Args: container, expression to decrement by
EVT_OP_MULF , ///< Args: container, expression to multiply by
EVT_OP_DIVF , ///< Args: container, expression to divide by
EVT_OP_USE_BUF , ///< Args: s32*
EVT_OP_BUF_READ1 , /// Args: container
EVT_OP_BUF_READ2 , /// Args: container, container
EVT_OP_BUF_READ3 , /// Args: container, container, container
EVT_OP_BUF_READ4 , /// Args: container, container, container, container
EVT_OP_BUF_PEEK , ///< Args: index, container
EVT_OP_USE_FBUF , ///< Identical to USE_BUFFER. Args: f32*
EVT_OP_FBUF_READ1 , /// Args: container
EVT_OP_FBUF_READ2 , /// Args: container, container
EVT_OP_FBUF_READ3 , /// Args: container, container, container
EVT_OP_FBUF_READ4 , /// Args: container, container, container, container
EVT_OP_FBUF_PEEK , ///< Args: index, container
2021-08-22 23:50:10 +02:00
EVT_OP_USE_ARRAY , ///< Args: *s32
EVT_OP_USE_FLAGS , ///< Args: *s32
2021-12-24 18:09:06 +01:00
EVT_OP_MALLOC_ARRAY , ///< Allocates a new array. Args: length, s32*
2021-10-25 13:44:55 +02:00
EVT_OP_BITWISE_AND , ///< Args: container, expression to bitwise AND with
EVT_OP_BITWISE_AND_CONST , ///< Args: container, value to bitwise AND with
EVT_OP_BITWISE_OR , ///< Args: container, expression to bitwise OR with
EVT_OP_BITWISE_OR_CONST , ///< Args: container, value to bitwise OR with
2021-08-22 23:50:10 +02:00
EVT_OP_CALL , ///< Args: *function, ...
2022-01-16 14:28:09 +01:00
EVT_OP_EXEC , ///< Args: EvtScript*
EVT_OP_EXEC_GET_TID , ///< Args: EvtScript*, container
EVT_OP_EXEC_WAIT , ///< Spawns a script and waits for it to return before continuing. Args: EvtScript*
EVT_OP_BIND_TRIGGER , ///< Args: EvtScript*, trigger flags, s32 target, 1, Trigger*
2021-08-22 23:50:10 +02:00
EVT_OP_UNBIND , ///< Unbinds any triggers bound to this script.
2021-10-25 13:44:55 +02:00
EVT_OP_KILL_THREAD , ///< Args: ScriptID
2022-01-16 14:28:09 +01:00
EVT_OP_JUMP , ///< Args: EvtScript*
2021-08-22 23:50:10 +02:00
EVT_OP_SET_PRIORITY , ///< Args: priority
EVT_OP_SET_TIMESCALE , ///< Args: timescale
EVT_OP_SET_GROUP , ///< Args: group
2022-01-16 14:28:09 +01:00
EVT_OP_BIND_PADLOCK , ///< Args: EvtScript*, trigger flags, s32 target, ItemList*, 0, 1
2021-08-22 23:50:10 +02:00
EVT_OP_SUSPEND_GROUP , ///< Args: group
EVT_OP_RESUME_GROUP , ///< Args: group
EVT_OP_SUSPEND_OTHERS , ///< Args: group
EVT_OP_RESUME_OTHERS , ///< Args: group
2021-10-25 13:44:55 +02:00
EVT_OP_SUSPEND_THREAD , ///< Args: ScriptID
EVT_OP_RESUME_THREAD , ///< Args: ScriptID
EVT_OP_IS_THREAD_RUNNING , ///< Args: ScriptID, container
EVT_OP_THREAD ,
EVT_OP_END_THREAD ,
EVT_OP_CHILD_THREAD , ///< Parallel threads are killed as soon as the parent script returns.
EVT_OP_END_CHILD_THREAD ,
2022-11-26 14:14:03 +01:00
EVT_OP_DEBUG_LOG ,
EVT_OP_DEBUG_PRINT_VAR , ///< Args: expression
2021-08-22 23:50:10 +02:00
EVT_OP_92 ,
EVT_OP_93 ,
EVT_OP_94 ,
} ;
2020-11-08 20:07:10 +01:00
2021-10-25 13:44:55 +02:00
# define MAKE_ENTITY_END 0x80000000
2021-09-02 13:17:40 +02:00
2021-08-29 16:34:42 +02:00
/* Return type of evt_execute_next_command */
# define EVT_CONTINUE 0 /* Continue to next command */
# define EVT_ABORT 1 /* Quit execution */
# define EVT_FINISH 255 /* Return from script */
2020-08-16 08:55:51 +02:00
/* Return type of script API functions */
typedef s32 ApiStatus ;
# define ApiStatus_BLOCK 0 /* Call again next frame */
# define ApiStatus_DONE1 1 /* Unconditional. Probably only exists to return a bool from functions */
2021-08-22 23:50:10 +02:00
# define ApiStatus_DONE2 2 /* Conditional on Evt->disableScripts */
2020-08-16 08:55:51 +02:00
# define ApiStatus_REPEAT 3 /* Call again immediately */
2021-08-29 16:34:42 +02:00
# define ApiStatus_FINISH 255 /* Corresponds to EVT_FINISH */
2020-08-16 08:55:51 +02:00
2023-02-01 03:31:09 +01:00
enum EventCommandResults {
EVT_CMD_RESULT_YIELD = - 1 ,
EVT_CMD_RESULT_CONTINUE = 0 ,
EVT_CMD_RESULT_ERROR = 1 ,
} ;
2024-10-08 05:15:38 +02:00
// EventGroupFlags determine when scripts are paused and resumed.
// Each flag corresponds to a set of circumstances which may pause scripts independently of the others.
// These group flags are inherited when one script launches another.
2022-04-17 17:36:37 +02:00
enum EventGroupFlags {
2024-10-08 05:15:38 +02:00
// Each flag represents a distinct condition for suspending or resuming script execution.
// These flags are named based on the scenarios that trigger suspension.
EVT_GROUP_FLAG_INTERACT = 0x01 , // Suspended during certain scenes, interactions, and NPC dialogue.
EVT_GROUP_FLAG_MENUS = 0x02 , // Suspended when menus are open, during pause, item pickups, or "got item" scenes.
EVT_GROUP_FLAG_CAM = 0x04 , // Never suspended; used exclusively with camera shake (ShakeCam) scripts.
EVT_GROUP_FLAG_UNUSED = 0x08 , // Unused flag; its original purpose is unknown.
EVT_GROUP_FLAG_BATTLE = 0x10 , // Suspended during battle entry and exit transitions.
// Combinations of flags used to assign specific behaviors to scripts.
// These groups are named after their most common script use-cases.
EVT_GROUP_NEVER_PAUSE = 0x00 , // Never paused; default for map scripts derived from the main script, which always uses this group.
EVT_GROUP_PASSIVE_NPC = EVT_GROUP_FLAG_MENUS | EVT_GROUP_FLAG_UNUSED , // 0xA -- Pauses similar to passive NPC scripts.
EVT_GROUP_HOSTILE_NPC = EVT_GROUP_FLAG_INTERACT | EVT_GROUP_FLAG_MENUS | EVT_GROUP_FLAG_UNUSED , // 0xB -- Pauses similar to hostile NPC scripts; used for platforms, machinery, etc.
EVT_GROUP_EXIT_MAP = EVT_GROUP_FLAG_INTERACT | EVT_GROUP_FLAG_MENUS | EVT_GROUP_FLAG_UNUSED | EVT_GROUP_FLAG_BATTLE , // 0x1B -- Used for exit map scripts.
EVT_GROUP_SHAKE_CAM = EVT_GROUP_FLAG_CAM , // Only used by ShakeCam scripts.
EVT_GROUP_NOT_BATTLE = 0xFF & ~ EVT_GROUP_FLAG_BATTLE , // 0xEF -- Pauses from anything except battles; default for scripts started via start_script, common in many battle scripts.
2022-04-17 17:36:37 +02:00
} ;
enum EventPriority {
2024-10-08 05:15:38 +02:00
EVT_PRIORITY_0 = 0x00 , // map main script
EVT_PRIORITY_1 = 0x01 ,
EVT_PRIORITY_A = 0x0A ,
EVT_PRIORITY_14 = 0x14 ,
2022-04-17 17:36:37 +02:00
} ;
enum EventStateFlags {
2022-11-01 13:27:10 +01:00
EVT_FLAG_ACTIVE = 0x01 ,
2024-10-08 05:15:38 +02:00
EVT_FLAG_PAUSED = 0x02 , ///< paused through suspend_group_script / resume_group_script
2022-11-01 13:27:10 +01:00
EVT_FLAG_BLOCKED_BY_CHILD = 0x10 ,
EVT_FLAG_RUN_IMMEDIATELY = 0x20 , ///< don't wait for next `update_scripts` call
EVT_FLAG_THREAD = 0x40 ,
EVT_FLAG_SUSPENDED = 0x80 , ///< doesn't affect child
2022-04-17 17:36:37 +02:00
} ;
2022-04-08 21:10:12 +02:00
2020-08-15 18:36:00 +02:00
# endif