96 lines
2.3 KiB
C
96 lines
2.3 KiB
C
// 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;
|
|
} |