From bd7fa154b4abada9140f7cff66899112f9ccf731 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sat, 4 Jul 2026 09:13:37 -0500 Subject: [PATCH] Add user data to callbacks --- src/dusk/rpg/cutscene/cutscene.h | 9 +++++++-- src/dusk/rpg/cutscene/cutscenesystem.c | 5 +++++ src/dusk/rpg/cutscene/cutscenesystem.h | 8 ++++++++ src/dusk/rpg/cutscene/item/cutscenecallback.c | 3 ++- src/dusk/rpg/cutscene/item/cutscenecallback.h | 2 +- src/dusk/rpg/cutscene/scene/testcutscene.h | 4 ++-- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/dusk/rpg/cutscene/cutscene.h b/src/dusk/rpg/cutscene/cutscene.h index e070b1bc..4c1f1889 100644 --- a/src/dusk/rpg/cutscene/cutscene.h +++ b/src/dusk/rpg/cutscene/cutscene.h @@ -13,14 +13,19 @@ typedef struct cutscene_s { const cutsceneitem_t *items; uint8_t itemCount; cutscenepause_t pause; + + // Size in bytes of this cutscene's custom user data, carved out of + // CUTSCENE_SYSTEM.data while the cutscene is running. + size_t dataSize; } cutscene_t; -#define CUTSCENE(NAME, PAUSE_TYPE, ...) \ +#define CUTSCENE(NAME, SIZE, PAUSE_TYPE, ...) \ static const cutsceneitem_t CUTSCENE_##NAME##_ITEMS[] = { __VA_ARGS__ }; \ static const cutscene_t CUTSCENE_##NAME = { \ .items = CUTSCENE_##NAME##_ITEMS, \ .itemCount = sizeof(CUTSCENE_##NAME##_ITEMS) / sizeof(cutsceneitem_t), \ - .pause = CUTSCENE_PAUSE_##PAUSE_TYPE \ + .pause = CUTSCENE_PAUSE_##PAUSE_TYPE, \ + .dataSize = SIZE \ }; #define CUTSCENE_REFERENCE(CUTSCENE) \ diff --git a/src/dusk/rpg/cutscene/cutscenesystem.c b/src/dusk/rpg/cutscene/cutscenesystem.c index dc550e3d..219b442e 100644 --- a/src/dusk/rpg/cutscene/cutscenesystem.c +++ b/src/dusk/rpg/cutscene/cutscenesystem.c @@ -25,6 +25,11 @@ void cutsceneSystemStartCutsceneWith( entity_t *interact, entity_t *interacted ) { + assertTrue( + cutscene->dataSize < CUTSCENE_SYSTEM_SIZE_MAX, + "Cutscene data size exceeds CUTSCENE_SYSTEM_SIZE_MAX" + ); + CUTSCENE_SYSTEM.scene = cutscene; CUTSCENE_SYSTEM.pause = cutscene->pause; CUTSCENE_SYSTEM.entityInteract = interact; diff --git a/src/dusk/rpg/cutscene/cutscenesystem.h b/src/dusk/rpg/cutscene/cutscenesystem.h index 43223971..d805553b 100644 --- a/src/dusk/rpg/cutscene/cutscenesystem.h +++ b/src/dusk/rpg/cutscene/cutscenesystem.h @@ -15,6 +15,10 @@ typedef struct entity_s entity_t; #define CUTSCENE_ENTITY_LAST_CREATED ((uint8_t)0xFC) #define CUTSCENE_ENTITY_LAST_REF ((uint8_t)0xFB) +// Maximum number of bytes a running cutscene may request via +// cutscene_t.dataSize. +#define CUTSCENE_SYSTEM_SIZE_MAX 8192 + typedef struct { const cutscene_t *scene; uint8_t currentItem; @@ -26,6 +30,10 @@ typedef struct { // Data (used by the current item). cutsceneitemdata_t data; + + // Custom user data for the running cutscene, sized per-scene by + // cutscene_t.dataSize. + uint8_t userData[CUTSCENE_SYSTEM_SIZE_MAX]; } cutscenesystem_t; extern cutscenesystem_t CUTSCENE_SYSTEM; diff --git a/src/dusk/rpg/cutscene/item/cutscenecallback.c b/src/dusk/rpg/cutscene/item/cutscenecallback.c index 1cfe5526..29ee598f 100644 --- a/src/dusk/rpg/cutscene/item/cutscenecallback.c +++ b/src/dusk/rpg/cutscene/item/cutscenecallback.c @@ -6,12 +6,13 @@ */ #include "cutsceneitem.h" +#include "rpg/cutscene/cutscenesystem.h" void cutsceneCallbackStart( const cutsceneitem_t *item, cutsceneitemdata_t *data ) { - if(item->callback != NULL) item->callback(); + if(item->callback != NULL) item->callback(CUTSCENE_SYSTEM.userData); } bool_t cutsceneCallbackUpdate( diff --git a/src/dusk/rpg/cutscene/item/cutscenecallback.h b/src/dusk/rpg/cutscene/item/cutscenecallback.h index b8dcf194..ab65d68a 100644 --- a/src/dusk/rpg/cutscene/item/cutscenecallback.h +++ b/src/dusk/rpg/cutscene/item/cutscenecallback.h @@ -11,7 +11,7 @@ typedef struct cutsceneitem_s cutsceneitem_t; typedef union cutsceneitemdata_u cutsceneitemdata_t; -typedef void (*cutscenecallback_t)(void); +typedef void (*cutscenecallback_t)(void *userData); /** * Starts a callback item (invokes the callback immediately). diff --git a/src/dusk/rpg/cutscene/scene/testcutscene.h b/src/dusk/rpg/cutscene/scene/testcutscene.h index 50bda860..d95a2d71 100755 --- a/src/dusk/rpg/cutscene/scene/testcutscene.h +++ b/src/dusk/rpg/cutscene/scene/testcutscene.h @@ -9,11 +9,11 @@ #include "rpg/cutscene/cutscene.h" #include "rpg/cutscene/cutscenesystem.h" -CUTSCENE(TEST_ONE, DEFAULT, +CUTSCENE(TEST_ONE, 0, DEFAULT, CUTSCENE_TEXT("Test One."), ); -CUTSCENE(TEST_TWO, DEFAULT, +CUTSCENE(TEST_TWO, 0, DEFAULT, CUTSCENE_TEXT("Test Two."), CUTSCENE_ENTITY_ADD(ENTITY_TYPE_NPC, 4, 4, 0), CUTSCENE_ENTITY_WALK_TO(CUTSCENE_ENTITY_LAST_CREATED, 8, 2, 0),