From 3007b614ed8c739e32987f1fdf2a2d9bb079ebf0 Mon Sep 17 00:00:00 2001 From: Luis Michaelis Date: Sat, 2 Nov 2024 09:16:29 +0100 Subject: [PATCH] feat: improve SaveGame compatibility by properly parsing `EventManagers` --- include/zenkit-capi/CutsceneLibrary.h | 78 +++- include/zenkit-capi/World.h | 3 +- include/zenkit-capi/vobs/VirtualObject.h | 6 + src/CutsceneLibrary.cc | 539 ++++++++++++++++++++++- src/World.cc | 17 +- src/vobs/VirtualObject.cc | 24 + vendor/ZenKit | 2 +- 7 files changed, 641 insertions(+), 28 deletions(-) diff --git a/include/zenkit-capi/CutsceneLibrary.h b/include/zenkit-capi/CutsceneLibrary.h index a5dcbca..86a3e1e 100644 --- a/include/zenkit-capi/CutsceneLibrary.h +++ b/include/zenkit-capi/CutsceneLibrary.h @@ -3,18 +3,26 @@ #pragma once #include "Archive.h" #include "Library.h" +#include "Object.h" #include "Stream.h" #include "Vfs.h" +#include "vobs/Misc.h" #ifdef __cplusplus #include -using ZkCutsceneLibrary = zenkit::CutsceneLibrary; -using ZkCutsceneBlock = zenkit::CutsceneBlock; -using ZkCutsceneMessage = zenkit::CutsceneMessage; +using ZkCutsceneLibrary = ZkSharedHandle; +using ZkCutsceneBlock = ZkSharedHandle; +using ZkCutsceneMessage = ZkSharedHandle; +using ZkCutscene = ZkSharedHandle; +using ZkCutsceneProps = ZkSharedHandle; +using ZkCutsceneContext = ZkSharedHandle; #else typedef struct ZkInternal_CutsceneLibrary ZkCutsceneLibrary; typedef struct ZkInternal_CutsceneBlock ZkCutsceneBlock; typedef struct ZkInternal_CutsceneMessage ZkCutsceneMessage; +typedef struct ZkInternal_Cutscene ZkCutscene; +typedef struct ZkInternal_CutsceneProps ZkCutsceneProps; +typedef struct ZkInternal_CutsceneContext ZkCutsceneContext; #endif typedef ZkBool (*ZkCutsceneBlockEnumerator)(void* ctx, ZkCutsceneBlock const* block); @@ -35,7 +43,71 @@ ZKC_API void ZkCutsceneLibrary_enumerateBlocks(ZkCutsceneLibrary const* slf, ZkC ZKC_API ZkString ZkCutsceneBlock_getName(ZkCutsceneBlock const* slf); ZKC_API ZkCutsceneMessage const* ZkCutsceneBlock_getMessage(ZkCutsceneBlock const* slf); +ZKC_API void ZkCutsceneBlock_setMessage(ZkCutsceneBlock const* slf, ZkCutsceneMessage* msg); +ZKC_API void ZkCutsceneBlock_release(ZkCutsceneBlock const* slf); ZKC_API uint32_t ZkCutsceneMessage_getType(ZkCutsceneMessage const* slf); ZKC_API ZkString ZkCutsceneMessage_getText(ZkCutsceneMessage const* slf); ZKC_API ZkString ZkCutsceneMessage_getName(ZkCutsceneMessage const* slf); +ZKC_API ZkBool ZkCutsceneMessage_getIsHighPriority(ZkCutsceneMessage const* slf); +ZKC_API ZkBool ZkCutsceneMessage_getIsUsed(ZkCutsceneMessage const* slf); +ZKC_API ZkBool ZkCutsceneMessage_getIsDeleted(ZkCutsceneMessage const* slf); + +ZKC_API void ZkCutsceneMessage_setType(ZkCutsceneMessage* slf, uint32_t value); +ZKC_API void ZkCutsceneMessage_setText(ZkCutsceneMessage* slf, ZkString value); +ZKC_API void ZkCutsceneMessage_setName(ZkCutsceneMessage* slf, ZkString value); +ZKC_API void ZkCutsceneMessage_setIsHighPriority(ZkCutsceneMessage* slf, ZkBool value); +ZKC_API void ZkCutsceneMessage_setIsUsed(ZkCutsceneMessage* slf, ZkBool value); +ZKC_API void ZkCutsceneMessage_setIsDeleted(ZkCutsceneMessage* slf, ZkBool value); + +ZKC_API void ZkCutsceneMessage_release(ZkCutsceneMessage const* slf); + +ZKC_API ZkCutsceneProps* ZkCutsceneProps_new(void); +ZKC_API void ZkCutsceneProps_release(ZkCutsceneProps* slf); + +ZKC_API ZkString ZkCutsceneProps_getName(ZkCutsceneProps const* slf); +ZKC_API ZkBool ZkCutsceneProps_getIsGlobal(ZkCutsceneProps const* slf); +ZKC_API ZkBool ZkCutsceneProps_getIsLoop(ZkCutsceneProps const* slf); +ZKC_API ZkBool ZkCutsceneProps_getHasToBeTriggered(ZkCutsceneProps const* slf); +ZKC_API float ZkCutsceneProps_getDistance(ZkCutsceneProps const* slf); +ZKC_API float ZkCutsceneProps_getRange(ZkCutsceneProps const* slf); +ZKC_API int32_t ZkCutsceneProps_getLockedBlockCount(ZkCutsceneProps const* slf); +ZKC_API uint32_t ZkCutsceneProps_getRunBehaviour(ZkCutsceneProps const* slf); +ZKC_API int ZkCutsceneProps_getRunBehaviourValue(ZkCutsceneProps const* slf); +ZKC_API ZkString ZkCutsceneProps_getStageName(ZkCutsceneProps const* slf); +ZKC_API ZkString ZkCutsceneProps_getScriptFunctionOnStop(ZkCutsceneProps const* slf); + +ZKC_API void ZkCutsceneProps_setName(ZkCutsceneProps* slf, ZkString value); +ZKC_API void ZkCutsceneProps_setIsGlobal(ZkCutsceneProps* slf, ZkBool value); +ZKC_API void ZkCutsceneProps_setIsLoop(ZkCutsceneProps* slf, ZkBool value); +ZKC_API void ZkCutsceneProps_setHasToBeTriggered(ZkCutsceneProps* slf, ZkBool value); +ZKC_API void ZkCutsceneProps_setDistance(ZkCutsceneProps* slf, float value); +ZKC_API void ZkCutsceneProps_setRange(ZkCutsceneProps* slf, float value); +ZKC_API void ZkCutsceneProps_setLockedBlockCount(ZkCutsceneProps* slf, int32_t value); +ZKC_API void ZkCutsceneProps_setRunBehaviour(ZkCutsceneProps* slf, uint32_t value); +ZKC_API void ZkCutsceneProps_setRunBehaviourValue(ZkCutsceneProps* slf, int value); +ZKC_API void ZkCutsceneProps_setStageName(ZkCutsceneProps* slf, ZkString value); +ZKC_API void ZkCutsceneProps_setScriptFunctionOnStop(ZkCutsceneProps* slf, ZkString value); + +ZKC_API ZkCutsceneContext* ZkCutsceneContext_new(void); +ZKC_API void ZkCutsceneContext_release(ZkCutsceneContext* slf); + +ZKC_API ZkCutsceneProps* ZkCutsceneContext_getProps(ZkCutsceneContext const* slf); +ZKC_API int32_t ZkCutsceneContext_getRoleCount(ZkCutsceneContext const* slf); +ZKC_API int32_t ZkCutsceneContext_getRoleVobCount(ZkCutsceneContext const* slf); +ZKC_API ZkNpc* ZkCutsceneContext_getNpc(ZkCutsceneContext const* slf); +ZKC_API ZkNpc* ZkCutsceneContext_getMainRole(ZkCutsceneContext const* slf); +ZKC_API ZkBool ZkCutsceneContext_getIsCutscene(ZkCutsceneContext const* slf); +ZKC_API int ZkCutsceneContext_getReference(ZkCutsceneContext const* slf); +ZKC_API int ZkCutsceneContext_getActualBlock(ZkCutsceneContext const* slf); +ZKC_API ZkBool ZkCutsceneContext_getWasTriggered(ZkCutsceneContext const* slf); + +ZKC_API void ZkCutsceneContext_setProps(ZkCutsceneContext const* slf, ZkCutsceneProps* value); +ZKC_API void ZkCutsceneContext_setRoleCount(ZkCutsceneContext const* slf, int32_t value); +ZKC_API void ZkCutsceneContext_setRoleVobCount(ZkCutsceneContext const* slf, int32_t value); +ZKC_API void ZkCutsceneContext_setNpc(ZkCutsceneContext const* slf, ZkNpc* value); +ZKC_API void ZkCutsceneContext_setMainRole(ZkCutsceneContext const* slf, ZkNpc* value); +ZKC_API void ZkCutsceneContext_setIsCutscene(ZkCutsceneContext const* slf, ZkBool value); +ZKC_API void ZkCutsceneContext_setReference(ZkCutsceneContext const* slf, int value); +ZKC_API void ZkCutsceneContext_setActualBlock(ZkCutsceneContext const* slf, int value); +ZKC_API void ZkCutsceneContext_setWasTriggered(ZkCutsceneContext const* slf, ZkBool value); diff --git a/include/zenkit-capi/World.h b/include/zenkit-capi/World.h index faa2e68..292e3f8 100644 --- a/include/zenkit-capi/World.h +++ b/include/zenkit-capi/World.h @@ -1,6 +1,7 @@ // Copyright © 2023. GothicKit Contributors // SPDX-License-Identifier: MIT #pragma once +#include "CutsceneLibrary.h" #include "Library.h" #include "Mesh.h" #include "Object.h" @@ -75,9 +76,9 @@ ZKC_API void ZkCutscenePlayer_del(ZkCutscenePlayer* slf); ZKC_API int32_t ZkCutscenePlayer_getLastProcessDay(ZkCutscenePlayer const* slf); ZKC_API int32_t ZkCutscenePlayer_getLastProcessHour(ZkCutscenePlayer const* slf); ZKC_API int32_t ZkCutscenePlayer_getPlayListCount(ZkCutscenePlayer const* slf); +ZKC_API ZkCutsceneContext* ZkCutscenePlayer_getPlayListItem(ZkCutscenePlayer const* slf, uint32_t index); ZKC_API void ZkCutscenePlayer_setLastProcessDay(ZkCutscenePlayer* slf, int32_t val); ZKC_API void ZkCutscenePlayer_setLastProcessHour(ZkCutscenePlayer* slf, int32_t val); -ZKC_API void ZkCutscenePlayer_setPlayListCount(ZkCutscenePlayer* slf, int32_t val); ZKC_API ZkSkyController* ZkSkyContoller_new(void); ZKC_API void ZkSkyContoller_del(ZkSkyController* slf); diff --git a/include/zenkit-capi/vobs/VirtualObject.h b/include/zenkit-capi/vobs/VirtualObject.h index e2b535b..2229a5e 100644 --- a/include/zenkit-capi/vobs/VirtualObject.h +++ b/include/zenkit-capi/vobs/VirtualObject.h @@ -10,6 +10,8 @@ #ifdef __cplusplus #include + #include + using ZkVirtualObject = ZkSharedHandle; using ZkVisual = ZkSharedHandle; using ZkVisualDecal = ZkSharedHandle; @@ -20,6 +22,7 @@ using ZkAiMove = ZkSharedHandle; using ZkEventManager = ZkSharedHandle; using ZkNpc = ZkSharedHandle; +using ZkCutsceneContextFwd = ZkSharedHandle; #else typedef struct ZkInternal_VirtualObject ZkVirtualObject; typedef struct ZkInternal_Visual ZkVisual; @@ -29,6 +32,7 @@ typedef struct ZkInternal_AiHuman ZkAiHuman; typedef struct ZkInternal_AiMove ZkAiMove; typedef struct ZkInternal_EventManager ZkEventManager; typedef struct ZkInternal_Npc ZkNpc; +typedef struct ZkInternal_CutsceneContext ZkCutsceneContextFwd; #endif typedef ZkBool (*ZkVirtualObjectEnumerator)(void* ctx, ZkVirtualObject const* vob); @@ -244,3 +248,5 @@ ZKC_API ZkBool ZkEventManager_getCleared(ZkEventManager const* slf); ZKC_API void ZkEventManager_setCleared(ZkEventManager* slf, ZkBool cleared); ZKC_API ZkBool ZkEventManager_getActive(ZkEventManager const* slf); ZKC_API void ZkEventManager_setActive(ZkEventManager* slf, ZkBool active); +ZKC_API ZkCutsceneContextFwd* ZkEventManager_getCutscene(ZkEventManager const* slf); +ZKC_API void ZkEventManager_setCutscene(ZkEventManager* slf, ZkCutsceneContextFwd* cutscene); diff --git a/src/CutsceneLibrary.cc b/src/CutsceneLibrary.cc index 8a835db..79cdce4 100644 --- a/src/CutsceneLibrary.cc +++ b/src/CutsceneLibrary.cc @@ -4,37 +4,121 @@ #include "Internal.hh" -ZKC_LOADER(ZkCutsceneLibrary); -ZKC_PATH_LOADER(ZkCutsceneLibrary); -ZKC_VFS_LOADER(ZkCutsceneLibrary); -ZKC_SAVER(ZkCutsceneLibrary); -ZKC_PATH_SAVER(ZkCutsceneLibrary); -ZKC_DELETER(ZkCutsceneLibrary); +ZkCutsceneLibrary* ZkCutsceneLibrary_load(ZkRead* buf) { + if (buf == nullptr) { + ZKC_LOG_WARN_NULL("ZkCutsceneLibrary_load"); + return nullptr; + } + + try { + auto ar = zenkit::ReadArchive::from(buf); + auto obj = new ZkCutsceneLibrary(new zenkit::CutsceneLibrary()); + (*obj)->load(*ar, zenkit::GameVersion::GOTHIC_1); + return obj; + } catch (std::exception const& exc) { + ZKC_LOG_ERROR("ZkCutsceneLibrary_load() failed: %s", exc.what()); + return nullptr; + } +} + +ZkCutsceneLibrary* ZkCutsceneLibrary_loadPath(ZkString path) { + if (path == nullptr) { + ZKC_LOG_WARN_NULL("ZkCutsceneLibrary_loadPath"); + return nullptr; + } + try { + auto buf = zenkit::Read::from(path); + return ZkCutsceneLibrary_load(buf.get()); + } catch (std::exception const& exc) { + ZKC_LOG_ERROR("ZkCutsceneLibrary_loadPath() failed: %s", exc.what()); + return nullptr; + } +} + +ZkCutsceneLibrary* ZkCutsceneLibrary_loadVfs(ZkVfs* vfs, ZkString name) { + if (vfs == nullptr || name == nullptr) { + ZKC_LOG_WARN_NULL("ZkCutsceneLibrary_loadVfs"); + return nullptr; + } + + auto node = vfs->find(name); + if (node == nullptr) return nullptr; + auto rd = node->open_read(); + return ZkCutsceneLibrary_load(rd.get()); +} + +void ZkCutsceneLibrary_save(ZkCutsceneLibrary* slf, ZkWrite* buf, ZkArchiveFormat fmt) { + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (buf == nullptr) { + ZKC_LOG_WARN_NULL("ZkCutsceneLibrary_save"); + return; + } + + try { + auto ar = zenkit::WriteArchive::to(buf, static_cast(fmt)); + SLF->save(*ar, zenkit::GameVersion::GOTHIC_1); + } catch (std::exception const& exc) { + ZKC_LOG_ERROR("ZkCutsceneLibrary_save() failed: %s", exc.what()); + } +} + +void ZkCutsceneLibrary_savePath(ZkCutsceneLibrary* slf, ZkString path, ZkArchiveFormat fmt) { + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (path == nullptr) { + ZKC_LOG_WARN_NULL("ZkCutsceneLibrary_savePath"); + return; + } + + try { + auto buf = zenkit::Write::to(path); + auto ar = zenkit::WriteArchive::to(buf.get(), static_cast(fmt)); + SLF->save(*ar, zenkit::GameVersion::GOTHIC_1); + } catch (std::exception const& exc) { + ZKC_LOG_ERROR("ZkCutsceneLibrary_savePath() failed: %s", exc.what()); + } +} + +void ZkCutsceneLibrary_del(ZkCutsceneLibrary* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + delete slf; +} ZkSize ZkCutsceneLibrary_getBlockCount(ZkCutsceneLibrary const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->blocks.size(); + ZKC_CHECK_NULL(slf->get()); + return SLF->blocks.size(); } ZkCutsceneBlock const* ZkCutsceneLibrary_getBlockByIndex(ZkCutsceneLibrary const* slf, ZkSize i) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - ZKC_CHECK_LEN(slf->blocks, i); - return &slf->blocks[i]; + ZKC_CHECK_NULL(slf->get()); + ZKC_CHECK_LEN(SLF->blocks, i); + return new ZkCutsceneBlock {SLF->blocks[i]}; } ZkCutsceneBlock const* ZkCutsceneLibrary_getBlock(ZkCutsceneLibrary const* slf, ZkString name) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->block_by_name(name); + ZKC_CHECK_NULL(slf->get()); + + auto block = SLF->block_by_name(name); + if (block == nullptr) return nullptr; + return ZKC_WRAP_NEW(block); } void ZkCutsceneLibrary_enumerateBlocks(ZkCutsceneLibrary const* slf, ZkCutsceneBlockEnumerator cb, void* ctx) { ZKC_TRACE_FN(); ZKC_CHECK_NULLV(slf, cb); + ZKC_CHECK_NULLV(slf->get()); - for (auto& block : slf->blocks) { + for (auto& block : SLF->blocks) { if (cb(ctx, &block)) break; } } @@ -42,29 +126,452 @@ void ZkCutsceneLibrary_enumerateBlocks(ZkCutsceneLibrary const* slf, ZkCutsceneB ZkString ZkCutsceneBlock_getName(ZkCutsceneBlock const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->name.c_str(); + ZKC_CHECK_NULL(slf->get()); + return SLF->name.c_str(); } ZkCutsceneMessage const* ZkCutsceneBlock_getMessage(ZkCutsceneBlock const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return &slf->message; + ZKC_CHECK_NULL(slf->get()); + + auto msg = SLF->get_message(); + if (msg == nullptr) return nullptr; + return ZKC_WRAP_NEW(msg); +} + +void ZkCutsceneBlock_setMessage(ZkCutsceneBlock const* slf, ZkCutsceneMessage* msg) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (msg == nullptr) { + SLF->set_message(nullptr); + return; + } + + SLF->set_message(*msg); +} + +void ZkCutsceneBlock_release(ZkCutsceneBlock const* slf) { + delete slf; } uint32_t ZkCutsceneMessage_getType(ZkCutsceneMessage const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->type; + ZKC_CHECK_NULL(slf->get()); + return SLF->type; } ZkString ZkCutsceneMessage_getText(ZkCutsceneMessage const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->text.c_str(); + ZKC_CHECK_NULL(slf->get()); + return SLF->text.c_str(); } ZkString ZkCutsceneMessage_getName(ZkCutsceneMessage const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return slf->name.c_str(); + ZKC_CHECK_NULL(slf->get()); + return SLF->name.c_str(); +} + +ZkBool ZkCutsceneMessage_getIsHighPriority(ZkCutsceneMessage const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->high_priority; +} + +ZkBool ZkCutsceneMessage_getIsUsed(ZkCutsceneMessage const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->used; +} + +ZkBool ZkCutsceneMessage_getIsDeleted(ZkCutsceneMessage const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->deleted; +} + +void ZkCutsceneMessage_setType(ZkCutsceneMessage* slf, uint32_t value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->type = value; +} + +void ZkCutsceneMessage_setText(ZkCutsceneMessage* slf, ZkString value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->text = value; +} + +void ZkCutsceneMessage_setName(ZkCutsceneMessage* slf, ZkString value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->name = value; +} + +void ZkCutsceneMessage_setIsHighPriority(ZkCutsceneMessage* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->high_priority = value; +} + +void ZkCutsceneMessage_setIsUsed(ZkCutsceneMessage* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->used = value; +} + +void ZkCutsceneMessage_setIsDeleted(ZkCutsceneMessage* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->deleted = value; +} + +void ZkCutsceneMessage_release(ZkCutsceneMessage const* slf) { + delete slf; +} + +ZkCutsceneProps* ZkCutsceneProps_new() { + ZKC_TRACE_FN(); + return new ZkCutsceneProps {new zenkit::CutsceneProps}; +} + +void ZkCutsceneProps_release(ZkCutsceneProps* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + delete slf; +} + +ZkString ZkCutsceneProps_getName(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->name.c_str(); +} + +ZkBool ZkCutsceneProps_getIsGlobal(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->global; +} + +ZkBool ZkCutsceneProps_getIsLoop(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->loop; +} + +ZkBool ZkCutsceneProps_getHasToBeTriggered(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->has_to_be_triggered; +} + +float ZkCutsceneProps_getDistance(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->distance; +} + +float ZkCutsceneProps_getRange(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->range; +} + +int32_t ZkCutsceneProps_getLockedBlockCount(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->locked_block_count; +} + +uint32_t ZkCutsceneProps_getRunBehaviour(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->run_behaviour; +} + +int ZkCutsceneProps_getRunBehaviourValue(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->run_behaviour_value; +} + +ZkString ZkCutsceneProps_getStageName(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->stage_name.c_str(); +} + +ZkString ZkCutsceneProps_getScriptFunctionOnStop(ZkCutsceneProps const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->script_function_on_stop.c_str(); +} + +void ZkCutsceneProps_setName(ZkCutsceneProps* slf, ZkString value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->name = value; +} + +void ZkCutsceneProps_setIsGlobal(ZkCutsceneProps* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->global = value; +} + +void ZkCutsceneProps_setIsLoop(ZkCutsceneProps* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->loop = value; +} + +void ZkCutsceneProps_setHasToBeTriggered(ZkCutsceneProps* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->has_to_be_triggered = value; +} + +void ZkCutsceneProps_setDistance(ZkCutsceneProps* slf, float value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->distance = value; +} + +void ZkCutsceneProps_setRange(ZkCutsceneProps* slf, float value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->range = value; +} + +void ZkCutsceneProps_setLockedBlockCount(ZkCutsceneProps* slf, int32_t value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->locked_block_count = value; +} + +void ZkCutsceneProps_setRunBehaviour(ZkCutsceneProps* slf, uint32_t value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->run_behaviour = value; +} + +void ZkCutsceneProps_setRunBehaviourValue(ZkCutsceneProps* slf, int value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->run_behaviour_value = value; +} + +void ZkCutsceneProps_setStageName(ZkCutsceneProps* slf, ZkString value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->stage_name = value; +} + +void ZkCutsceneProps_setScriptFunctionOnStop(ZkCutsceneProps* slf, ZkString value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->script_function_on_stop = value; +} + +ZkCutsceneContext* ZkCutsceneContext_new() { + ZKC_TRACE_FN(); + return new ZkCutsceneContext {new zenkit::CutsceneContext}; +} + +void ZkCutsceneContext_release(ZkCutsceneContext* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + delete slf; +} + +ZkCutsceneProps* ZkCutsceneContext_getProps(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + + auto props = SLF->props; + if (props == nullptr) return nullptr; + return ZKC_WRAP_NEW(props); +} + +int32_t ZkCutsceneContext_getRoleCount(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->role_count; +} + +int32_t ZkCutsceneContext_getRoleVobCount(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->role_vob_count; +} + +ZkNpc* ZkCutsceneContext_getNpc(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + + auto npc = SLF->npc.lock(); + if (npc == nullptr) return nullptr; + return ZKC_WRAP_NEW(npc); +} + +ZkNpc* ZkCutsceneContext_getMainRole(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + + auto npc = SLF->main_role.lock(); + if (npc == nullptr) return nullptr; + return ZKC_WRAP_NEW(npc); +} + +ZkBool ZkCutsceneContext_getIsCutscene(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->is_cutscene; +} + +int ZkCutsceneContext_getReference(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->reference; +} + +int ZkCutsceneContext_getActualBlock(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->actual_block; +} + +ZkBool ZkCutsceneContext_getWasTriggered(ZkCutsceneContext const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + return SLF->was_triggered; +} + +void ZkCutsceneContext_setProps(ZkCutsceneContext const* slf, ZkCutsceneProps* value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (value == nullptr) { + SLF->props = nullptr; + return; + } + + SLF->props = *value; +} + +void ZkCutsceneContext_setRoleCount(ZkCutsceneContext const* slf, int32_t value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->role_count = value; +} + +void ZkCutsceneContext_setRoleVobCount(ZkCutsceneContext const* slf, int32_t value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->role_vob_count = value; +} + +void ZkCutsceneContext_setNpc(ZkCutsceneContext const* slf, ZkNpc* value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (value == nullptr) { + SLF->npc.reset(); + return; + } + + SLF->npc = *value; +} + +void ZkCutsceneContext_setMainRole(ZkCutsceneContext const* slf, ZkNpc* value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (value == nullptr) { + SLF->main_role.reset(); + return; + } + + SLF->main_role = *value; +} + +void ZkCutsceneContext_setIsCutscene(ZkCutsceneContext const* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->is_cutscene = value; +} + +void ZkCutsceneContext_setReference(ZkCutsceneContext const* slf, int value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->reference = value; +} + +void ZkCutsceneContext_setActualBlock(ZkCutsceneContext const* slf, int value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->actual_block = value; +} + +void ZkCutsceneContext_setWasTriggered(ZkCutsceneContext const* slf, ZkBool value) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + SLF->was_triggered = value; } diff --git a/src/World.cc b/src/World.cc index 71cca04..96d9387 100644 --- a/src/World.cc +++ b/src/World.cc @@ -299,7 +299,16 @@ int32_t ZkCutscenePlayer_getLastProcessHour(ZkCutscenePlayer const* slf) { int32_t ZkCutscenePlayer_getPlayListCount(ZkCutscenePlayer const* slf) { ZKC_TRACE_FN(); ZKC_CHECK_NULL(slf); - return SLF->play_list_count; + ZKC_CHECK_NULL(slf->get()); + return SLF->playlists.size(); +} + +ZkCutsceneContext* ZkCutscenePlayer_getPlayListItem(ZkCutscenePlayer const* slf, uint32_t index) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + ZKC_CHECK_LEN(SLF->playlists, index); + return new ZkCutsceneContext {SLF->playlists[index].lock()}; } void ZkCutscenePlayer_setLastProcessDay(ZkCutscenePlayer* slf, int32_t val) { @@ -314,12 +323,6 @@ void ZkCutscenePlayer_setLastProcessHour(ZkCutscenePlayer* slf, int32_t val) { SLF->last_process_hour = val; } -void ZkCutscenePlayer_setPlayListCount(ZkCutscenePlayer* slf, int32_t val) { - ZKC_TRACE_FN(); - ZKC_CHECK_NULLV(slf); - SLF->play_list_count = val; -} - ZkSkyController* ZkSkyContoller_new(void) { ZKC_TRACE_FN(); return new ZkSkyController {std::make_shared()}; diff --git a/src/vobs/VirtualObject.cc b/src/vobs/VirtualObject.cc index a15ec8d..1312331 100644 --- a/src/vobs/VirtualObject.cc +++ b/src/vobs/VirtualObject.cc @@ -896,3 +896,27 @@ void ZkEventManager_setActive(ZkEventManager* slf, ZkBool active) { ZKC_CHECK_NULLV(slf); SLF->active = active; } + +ZkCutsceneContextFwd* ZkEventManager_getCutscene(ZkEventManager const* slf) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULL(slf); + ZKC_CHECK_NULL(slf->get()); + + auto handle = SLF->cutscene.lock(); + if (handle == nullptr) return nullptr; + + return ZKC_WRAP_NEW(handle); +} + +void ZkEventManager_setCutscene(ZkEventManager* slf, ZkCutsceneContextFwd* cutscene) { + ZKC_TRACE_FN(); + ZKC_CHECK_NULLV(slf); + ZKC_CHECK_NULLV(slf->get()); + + if (cutscene == nullptr) { + SLF->cutscene.reset(); + return; + } + + SLF->cutscene = *cutscene; +} diff --git a/vendor/ZenKit b/vendor/ZenKit index a5f647b..2cdc8e3 160000 --- a/vendor/ZenKit +++ b/vendor/ZenKit @@ -1 +1 @@ -Subproject commit a5f647bda00ede4a0517a31bfa884bcac2780360 +Subproject commit 2cdc8e3f2dc2178cc77077a705e87c56497105df