From bbf5b706f0a066042a500e30ad9a2b2344157487 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Fri, 26 Jun 2026 10:24:39 -0500 Subject: [PATCH] Cutscene combined --- src/dusk/CMakeLists.txt | 1 - src/dusk/cutscene/CMakeLists.txt | 9 -- src/dusk/cutscene/cutscene.c | 96 ------------------- src/dusk/cutscene/cutscene.h | 85 ---------------- src/dusk/engine/engine.c | 4 - src/dusk/rpg/cutscene/cutscenesystem.c | 6 ++ src/dusk/rpg/cutscene/cutscenesystem.h | 9 +- src/dusk/rpg/cutscene/item/CMakeLists.txt | 1 + .../rpg/cutscene/item/cutsceneentitymove.c | 39 ++++++++ .../rpg/cutscene/item/cutsceneentitymove.h | 24 +++++ src/dusk/rpg/cutscene/item/cutsceneitem.c | 9 ++ src/dusk/rpg/cutscene/item/cutsceneitem.h | 9 +- src/dusk/rpg/rpg.c | 1 + 13 files changed, 95 insertions(+), 198 deletions(-) delete mode 100644 src/dusk/cutscene/CMakeLists.txt delete mode 100644 src/dusk/cutscene/cutscene.c delete mode 100644 src/dusk/cutscene/cutscene.h create mode 100644 src/dusk/rpg/cutscene/item/cutsceneentitymove.c create mode 100644 src/dusk/rpg/cutscene/item/cutsceneentitymove.h diff --git a/src/dusk/CMakeLists.txt b/src/dusk/CMakeLists.txt index a39c2f48..d99f093c 100644 --- a/src/dusk/CMakeLists.txt +++ b/src/dusk/CMakeLists.txt @@ -56,7 +56,6 @@ add_subdirectory(animation) add_subdirectory(event) add_subdirectory(assert) add_subdirectory(asset) -add_subdirectory(cutscene) add_subdirectory(console) add_subdirectory(display) add_subdirectory(log) diff --git a/src/dusk/cutscene/CMakeLists.txt b/src/dusk/cutscene/CMakeLists.txt deleted file mode 100644 index cf650948..00000000 --- a/src/dusk/cutscene/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2026 Dominic Masters -# -# This software is released under the MIT License. -# https://opensource.org/licenses/MIT - -target_sources(${DUSK_LIBRARY_TARGET_NAME} - PUBLIC - cutscene.c -) diff --git a/src/dusk/cutscene/cutscene.c b/src/dusk/cutscene/cutscene.c deleted file mode 100644 index 33ff6af2..00000000 --- a/src/dusk/cutscene/cutscene.c +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2026 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#include "cutscene.h" -#include "assert/assert.h" -#include "util/memory.h" -#include "console/console.h" -#include "time/time.h" - -cutscene_t CUTSCENE; - -errorret_t cutsceneInit(void) { - memoryZero(&CUTSCENE, sizeof(cutscene_t)); - errorOk(); -} - -errorret_t cutsceneUpdate(void) { - #ifdef DUSK_TIME_DYNAMIC - if(TIME.dynamicUpdate) { - errorOk(); - } - #endif - - if(!CUTSCENE.active) errorOk(); - - cutsceneevent_t *event = &CUTSCENE.events[CUTSCENE.eventCurrent]; - if(event->onUpdate) errorChain(event->onUpdate()); - errorOk(); -} - -errorret_t cutscenePlay( - const cutsceneevent_t *events, - const uint8_t eventCount -) { - assertNotNull(events, "Events cannot be null"); - assertTrue(eventCount > 0, "Event count must be greater than zero"); - assertTrue( - eventCount <= CUTSCENE_EVENT_COUNT_MAX, - "Event count exceeds CUTSCENE_EVENT_COUNT_MAX" - ); - - if(CUTSCENE.active) { - errorChain(cutsceneStop()); - } - - memoryCopy(CUTSCENE.events, events, sizeof(cutsceneevent_t) * eventCount); - CUTSCENE.eventCount = eventCount; - CUTSCENE.eventCurrent = 0; - CUTSCENE.active = true; - - cutsceneevent_t *firstEvent = &CUTSCENE.events[0]; - if(firstEvent->onStart) errorChain(firstEvent->onStart()); - errorOk(); -} - -errorret_t cutsceneAdvance(void) { - if(!CUTSCENE.active) errorOk(); - - cutsceneevent_t *currentEvent = &CUTSCENE.events[CUTSCENE.eventCurrent]; - if(currentEvent->onEnd) errorChain(currentEvent->onEnd()); - CUTSCENE.eventCurrent++; - - if(CUTSCENE.eventCurrent >= CUTSCENE.eventCount) { - if(CUTSCENE.onStop) errorChain(CUTSCENE.onStop()); - CUTSCENE.active = false; - errorOk(); - } - - cutsceneevent_t *nextEvent = &CUTSCENE.events[CUTSCENE.eventCurrent]; - if(nextEvent->onStart) errorChain(nextEvent->onStart()); - consolePrint("Cutscene advance"); - errorOk(); -} - -errorret_t cutsceneStop(void) { - if(!CUTSCENE.active) errorOk(); - - cutsceneevent_t *currentEvent = &CUTSCENE.events[CUTSCENE.eventCurrent]; - if(currentEvent->onEnd) errorChain(currentEvent->onEnd()); - - if(CUTSCENE.onStop) errorChain(CUTSCENE.onStop()); - - CUTSCENE.active = false; - errorOk(); -} - -errorret_t cutsceneDispose(void) { - errorChain(cutsceneStop()); - errorOk(); -} - -bool_t cutsceneIsActive(void) { - return CUTSCENE.active; -} \ No newline at end of file diff --git a/src/dusk/cutscene/cutscene.h b/src/dusk/cutscene/cutscene.h deleted file mode 100644 index 1a294eed..00000000 --- a/src/dusk/cutscene/cutscene.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2026 Dominic Masters -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT - -#pragma once -#include "error/error.h" - -#define CUTSCENE_EVENT_COUNT_MAX 16 - -typedef struct { - errorret_t (*onStart)(void); - errorret_t (*onEnd)(void); - errorret_t (*onUpdate)(void); -} cutsceneevent_t; - -typedef struct { - cutsceneevent_t events[CUTSCENE_EVENT_COUNT_MAX]; - uint8_t eventCount; - uint8_t eventCurrent; - errorret_t (*onStop)(void); - bool_t active; -} cutscene_t; - -extern cutscene_t CUTSCENE; - -/** - * Initializes the cutscene manager. - * - * @return Any error state that happened. - */ -errorret_t cutsceneInit(void); - -/** - * Ticks the active cutscene event, calling its onUpdate callback. - * Does nothing when no cutscene is playing. - * - * @return Any error state that happened. - */ -errorret_t cutsceneUpdate(void); - -/** - * Copies the given event array and begins playing from the first - * event. If a cutscene is already playing it is stopped first. - * - * @param events Array of events to copy. - * @param eventCount Number of events. Must be > 0 and - * <= CUTSCENE_EVENT_COUNT_MAX. - * @return Any error state that happened. - */ -errorret_t cutscenePlay( - const cutsceneevent_t *events, - const uint8_t eventCount -); - -/** - * Ends the current event and starts the next one. - * Marks the cutscene as inactive after the last event ends. - * Does nothing when no cutscene is playing. - * - * @return Any error state that happened. - */ -errorret_t cutsceneAdvance(void); - -/** - * Ends the current event and stops the cutscene immediately. - * Does nothing when no cutscene is playing. - * - * @return Any error state that happened. - */ -errorret_t cutsceneStop(void); - -/** - * Disposes of the cutscene manager, stopping any active cutscene. - * - * @return Any error state that happened. - */ -errorret_t cutsceneDispose(void); - -/** - * Returns whether a cutscene is currently playing. - * - * @return true if a cutscene is active. - */ -bool_t cutsceneIsActive(void); diff --git a/src/dusk/engine/engine.c b/src/dusk/engine/engine.c index 54c59f3e..ce198c57 100644 --- a/src/dusk/engine/engine.c +++ b/src/dusk/engine/engine.c @@ -13,7 +13,6 @@ #include "rpg/rpg.h" #include "display/display.h" #include "scene/scene.h" -#include "cutscene/cutscene.h" #include "asset/asset.h" #include "ui/ui.h" #include "assert/assert.h" @@ -42,7 +41,6 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) { errorChain(localeManagerInit()); errorChain(displayInit()); errorChain(uiInit()); - errorChain(cutsceneInit()); errorChain(rpgInit()); errorChain(networkInit()); errorChain(sceneInit()); @@ -61,7 +59,6 @@ errorret_t engineUpdate(void) { inputUpdate(); consoleUpdate(); errorChain(rpgUpdate()); - errorChain(cutsceneUpdate()); errorChain(sceneUpdate()); errorChain(assetUpdate()); errorChain(uiUpdate()); @@ -77,7 +74,6 @@ void engineExit(void) { } errorret_t engineDispose(void) { - cutsceneDispose(); errorChain(sceneDispose()); errorChain(networkDispose()); errorChain(rpgDispose()); diff --git a/src/dusk/rpg/cutscene/cutscenesystem.c b/src/dusk/rpg/cutscene/cutscenesystem.c index d803e05d..8017f80f 100644 --- a/src/dusk/rpg/cutscene/cutscenesystem.c +++ b/src/dusk/rpg/cutscene/cutscenesystem.c @@ -53,4 +53,10 @@ const cutsceneitem_t * cutsceneSystemGetCurrentItem() { if(CUTSCENE_SYSTEM.scene == NULL) return NULL; return &CUTSCENE_SYSTEM.scene->items[CUTSCENE_SYSTEM.currentItem]; +} + +void cutsceneSystemDispose() { + CUTSCENE_SYSTEM.scene = NULL; + CUTSCENE_SYSTEM.currentItem = 0xFF; + CUTSCENE_SYSTEM.mode = CUTSCENE_MODE_NONE; } \ No newline at end of file diff --git a/src/dusk/rpg/cutscene/cutscenesystem.h b/src/dusk/rpg/cutscene/cutscenesystem.h index 7c3242a9..63051aea 100644 --- a/src/dusk/rpg/cutscene/cutscenesystem.h +++ b/src/dusk/rpg/cutscene/cutscenesystem.h @@ -44,7 +44,12 @@ void cutsceneSystemUpdate(); /** * Get the current cutscene item. - * + * * @return Pointer to the current cutscene item. */ -const cutsceneitem_t * cutsceneSystemGetCurrentItem(); \ No newline at end of file +const cutsceneitem_t * cutsceneSystemGetCurrentItem(); + +/** + * Disposes of the cutscene system, stopping any active cutscene. + */ +void cutsceneSystemDispose(); \ No newline at end of file diff --git a/src/dusk/rpg/cutscene/item/CMakeLists.txt b/src/dusk/rpg/cutscene/item/CMakeLists.txt index 6b3e271a..f30d8b58 100755 --- a/src/dusk/rpg/cutscene/item/CMakeLists.txt +++ b/src/dusk/rpg/cutscene/item/CMakeLists.txt @@ -7,4 +7,5 @@ target_sources(${DUSK_LIBRARY_TARGET_NAME} PUBLIC cutsceneitem.c + cutsceneentitymove.c ) \ No newline at end of file diff --git a/src/dusk/rpg/cutscene/item/cutsceneentitymove.c b/src/dusk/rpg/cutscene/item/cutsceneentitymove.c new file mode 100644 index 00000000..39be9996 --- /dev/null +++ b/src/dusk/rpg/cutscene/item/cutsceneentitymove.c @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "cutsceneentitymove.h" +#include "rpg/cutscene/cutscenesystem.h" +#include "rpg/entity/entity.h" + +void cutsceneEntityMoveStart(const cutsceneitem_t *item) { +} + +void cutsceneEntityMoveUpdate(const cutsceneitem_t *item) { + entity_t *entity = &ENTITIES[item->entityMove.entityIndex]; + + if(worldPosIsEqual(entity->position, item->entityMove.target)) { + cutsceneSystemNext(); + return; + } + + entitydir_t dir; + if(entity->position.x != item->entityMove.target.x) { + dir = entity->position.x < item->entityMove.target.x + ? ENTITY_DIR_EAST : ENTITY_DIR_WEST; + } else { + dir = entity->position.y < item->entityMove.target.y + ? ENTITY_DIR_SOUTH : ENTITY_DIR_NORTH; + } + + if(entityCanTurn(entity)) entityTurn(entity, dir); + + if(item->entityMove.run) { + if(entityCanRun(entity)) entityRun(entity, dir); + } else { + if(entityCanWalk(entity)) entityWalk(entity, dir); + } +} diff --git a/src/dusk/rpg/cutscene/item/cutsceneentitymove.h b/src/dusk/rpg/cutscene/item/cutsceneentitymove.h new file mode 100644 index 00000000..cefa06ad --- /dev/null +++ b/src/dusk/rpg/cutscene/item/cutsceneentitymove.h @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2026 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "cutsceneitem.h" + +/** + * Handles the start of an entity move cutscene item. + * + * @param item The cutscene item. + */ +void cutsceneEntityMoveStart(const cutsceneitem_t *item); + +/** + * Updates an entity move cutscene item, steering the entity one step + * per frame toward the target and advancing the cutscene on arrival. + * + * @param item The cutscene item. + */ +void cutsceneEntityMoveUpdate(const cutsceneitem_t *item); diff --git a/src/dusk/rpg/cutscene/item/cutsceneitem.c b/src/dusk/rpg/cutscene/item/cutsceneitem.c index 18a8b582..8c41a4f3 100644 --- a/src/dusk/rpg/cutscene/item/cutsceneitem.c +++ b/src/dusk/rpg/cutscene/item/cutsceneitem.c @@ -6,6 +6,7 @@ */ #include "rpg/cutscene/cutscenesystem.h" +#include "cutsceneentitymove.h" #include "input/input.h" #include "time/time.h" @@ -31,6 +32,10 @@ void cutsceneItemStart(const cutsceneitem_t *item, cutsceneitemdata_t *data) { if(item->cutscene != NULL) cutsceneSystemStartCutscene(item->cutscene); break; + case CUTSCENE_ITEM_TYPE_ENTITY_MOVE: + cutsceneEntityMoveStart(item); + break; + default: break; } @@ -48,6 +53,10 @@ void cutsceneItemUpdate(const cutsceneitem_t *item, cutsceneitemdata_t *data) { if(data->wait <= 0) cutsceneSystemNext(); break; + case CUTSCENE_ITEM_TYPE_ENTITY_MOVE: + cutsceneEntityMoveUpdate(item); + break; + default: break; } diff --git a/src/dusk/rpg/cutscene/item/cutsceneitem.h b/src/dusk/rpg/cutscene/item/cutsceneitem.h index f632518d..422c710d 100644 --- a/src/dusk/rpg/cutscene/item/cutsceneitem.h +++ b/src/dusk/rpg/cutscene/item/cutsceneitem.h @@ -9,6 +9,7 @@ #include "cutscenewait.h" #include "cutscenecallback.h" #include "cutscenetext.h" +#include "rpg/overworld/worldpos.h" typedef struct cutscene_s cutscene_t; @@ -17,7 +18,8 @@ typedef enum { CUTSCENE_ITEM_TYPE_TEXT, CUTSCENE_ITEM_TYPE_CALLBACK, CUTSCENE_ITEM_TYPE_WAIT, - CUTSCENE_ITEM_TYPE_CUTSCENE + CUTSCENE_ITEM_TYPE_CUTSCENE, + CUTSCENE_ITEM_TYPE_ENTITY_MOVE } cutsceneitemtype_t; typedef struct cutsceneitem_s { @@ -29,6 +31,11 @@ typedef struct cutsceneitem_s { cutscenecallback_t callback; cutscenewait_t wait; const cutscene_t *cutscene; + struct { + uint8_t entityIndex; + worldpos_t target; + bool_t run; + } entityMove; }; } cutsceneitem_t; diff --git a/src/dusk/rpg/rpg.c b/src/dusk/rpg/rpg.c index 4fd6162b..c2e7446d 100644 --- a/src/dusk/rpg/rpg.c +++ b/src/dusk/rpg/rpg.c @@ -72,6 +72,7 @@ errorret_t rpgUpdate(void) { } errorret_t rpgDispose(void) { + cutsceneSystemDispose(); errorChain(mapDispose()); errorOk();