From f39b2060a8eb899f2217c90193885fcc568a7131 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Wed, 24 Dec 2025 10:44:53 +1000 Subject: [PATCH] iuno just screwing around tbh --- assets/script/CMakeLists.txt | 3 ++- assets/script/init.lua | 5 ++++ assets/script/scene/CMakeLists.txt | 4 +++ assets/script/test.lua | 5 ---- assets/script/test2.lua | 1 - src/duskdefs.env | 2 +- src/engine/engine.c | 9 +++---- src/engine/engine.h | 2 ++ src/rpg/world/map.c | 5 ++-- src/scene/scenemanager.c | 6 ----- src/scene/scenemanager.h | 2 +- src/script/func/scriptfunccamera.h | 2 -- src/script/func/scriptfuncscene.h | 39 ++++++++++++++++++++++++++++++ src/script/func/scriptfuncsystem.h | 13 +++++----- src/script/scriptcontext.c | 6 +++++ 15 files changed, 72 insertions(+), 32 deletions(-) create mode 100644 assets/script/init.lua create mode 100644 assets/script/scene/CMakeLists.txt delete mode 100644 assets/script/test.lua delete mode 100644 assets/script/test2.lua create mode 100644 src/script/func/scriptfuncscene.h diff --git a/assets/script/CMakeLists.txt b/assets/script/CMakeLists.txt index a7a0c66..bfdf852 100644 --- a/assets/script/CMakeLists.txt +++ b/assets/script/CMakeLists.txt @@ -4,4 +4,5 @@ # https://opensource.org/licenses/MIT add_asset(SCRIPT test.lua) -add_asset(SCRIPT test2.lua) \ No newline at end of file + +add_subdirectory(scene) \ No newline at end of file diff --git a/assets/script/init.lua b/assets/script/init.lua new file mode 100644 index 0000000..85f42b3 --- /dev/null +++ b/assets/script/init.lua @@ -0,0 +1,5 @@ +print('Init') + +-- Load map scene +setScene('map') +setMap() \ No newline at end of file diff --git a/assets/script/scene/CMakeLists.txt b/assets/script/scene/CMakeLists.txt new file mode 100644 index 0000000..e681ce4 --- /dev/null +++ b/assets/script/scene/CMakeLists.txt @@ -0,0 +1,4 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT \ No newline at end of file diff --git a/assets/script/test.lua b/assets/script/test.lua deleted file mode 100644 index e82c1d3..0000000 --- a/assets/script/test.lua +++ /dev/null @@ -1,5 +0,0 @@ -include('script/test2') - -player = entityAdd(ENTITY_TYPE_PLAYER, 3, 6, 1) - -print("Player entity ID: " .. player) \ No newline at end of file diff --git a/assets/script/test2.lua b/assets/script/test2.lua deleted file mode 100644 index 240fc45..0000000 --- a/assets/script/test2.lua +++ /dev/null @@ -1 +0,0 @@ -print("This is test2.lua") diff --git a/src/duskdefs.env b/src/duskdefs.env index b523bc5..1629af9 100644 --- a/src/duskdefs.env +++ b/src/duskdefs.env @@ -8,7 +8,7 @@ ENTITY_DIR_WEST = 1 ENTITY_DIR_EAST = 2 ENTITY_DIR_NORTH = 3 -ENTITY_COUNT = 256 +ENTITY_COUNT = 128 ENTITY_TYPE_NULL = 0 ENTITY_TYPE_PLAYER = 1 diff --git a/src/engine/engine.c b/src/engine/engine.c index 8fb8b2a..aaba748 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -18,8 +18,6 @@ #include "script/scriptmanager.h" #include "debug/debug.h" -#include "script/scriptcontext.h" - engine_t ENGINE; errorret_t engineInit(const int32_t argc, const char_t **argv) { @@ -41,10 +39,9 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) { errorChain(sceneManagerInit()); // Run the initial script. - scriptcontext_t testCtx; - errorChain(scriptContextInit(&testCtx)); - errorChain(scriptContextExecFile(&testCtx, "script/test.dsf")); - scriptContextDispose(&testCtx); + errorChain(scriptContextInit(&ENGINE.mainScriptContext)); + errorChain(scriptContextExecFile(&ENGINE.mainScriptContext, "script/test.dsf")); + scriptContextDispose(&ENGINE.mainScriptContext); errorOk(); } diff --git a/src/engine/engine.h b/src/engine/engine.h index b75d350..4acf63e 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -8,11 +8,13 @@ #pragma once #include "display/display.h"// Important to be included first. #include "error/error.h" +#include "script/scriptcontext.h" typedef struct { bool_t running; int32_t argc; const char_t **argv; + scriptcontext_t mainScriptContext; } engine_t; extern engine_t ENGINE; diff --git a/src/rpg/world/map.c b/src/rpg/world/map.c index afe66e5..d0e4a99 100644 --- a/src/rpg/world/map.c +++ b/src/rpg/world/map.c @@ -15,9 +15,8 @@ map_t MAP; errorret_t mapInit() { memoryZero(&MAP, sizeof(map_t)); - - // Init the default chunks. In future I'll probably make this based on where - // the player spawns in to save an initial mapSet. + + // Init the first chunks. chunkindex_t index = 0; for(chunkunit_t z = 0; z < MAP_CHUNK_DEPTH; z++) { for(chunkunit_t y = 0; y < MAP_CHUNK_HEIGHT; y++) { diff --git a/src/scene/scenemanager.c b/src/scene/scenemanager.c index 972dd03..584860c 100644 --- a/src/scene/scenemanager.c +++ b/src/scene/scenemanager.c @@ -18,12 +18,6 @@ errorret_t sceneManagerInit(void) { sceneManagerRegisterScene(&SCENE_TEST); sceneManagerRegisterScene(&SCENE_MAP); - - // Initial scene - scene_t *initial = sceneManagerGetSceneByName("map"); - sceneManagerSetScene(initial); - if(initial->init) errorChain(initial->init(&SCENE_MANAGER.sceneData)); - initial->flags |= SCENE_FLAG_INITIALIZED; errorOk(); } diff --git a/src/scene/scenemanager.h b/src/scene/scenemanager.h index 0b6c765..1edf04f 100644 --- a/src/scene/scenemanager.h +++ b/src/scene/scenemanager.h @@ -9,7 +9,7 @@ #include "scene.h" #include "scenedata.h" -#define SCENE_MANAGER_SCENE_COUNT_MAX 32 +#define SCENE_MANAGER_SCENE_COUNT_MAX 16 typedef struct { scene_t *current; diff --git a/src/script/func/scriptfunccamera.h b/src/script/func/scriptfunccamera.h index de86975..021d01b 100644 --- a/src/script/func/scriptfunccamera.h +++ b/src/script/func/scriptfunccamera.h @@ -9,8 +9,6 @@ #include "script/scriptcontext.h" #include "assert/assert.h" - - void scriptFuncCamera(scriptcontext_t *context) { assertNotNull(context, "Script context cannot be NULL"); } \ No newline at end of file diff --git a/src/script/func/scriptfuncscene.h b/src/script/func/scriptfuncscene.h new file mode 100644 index 0000000..185e50c --- /dev/null +++ b/src/script/func/scriptfuncscene.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "script/scriptcontext.h" +#include "scene/scenemanager.h" +#include "debug/debug.h" +#include "assert/assert.h" +#include "error/error.h" + +int32_t scriptFuncSetScene(lua_State *L) { + assertNotNull(L, "Lua state cannot be NULL"); + assertTrue(lua_isstring(L, 1), "First argument must be a string"); + + const char_t *sceneName = lua_tostring(L, 1); + scene_t *scene = sceneManagerGetSceneByName(sceneName); + assertNotNull(scene, "Scene with given name does not exist"); + + sceneManagerSetScene(scene); + + if(scene->init) { + errorret_t err = scene->init(&SCENE_MANAGER.sceneData); + assertTrue(err.code == ERROR_OK, "Scene initialization failed"); + } + scene->flags |= SCENE_FLAG_INITIALIZED; + + return 0; +} + + +void scriptFuncScene(scriptcontext_t *context) { + assertNotNull(context, "Script context cannot be NULL"); + + scriptContextRegFunc(context, "setScene", scriptFuncSetScene); +} \ No newline at end of file diff --git a/src/script/func/scriptfuncsystem.h b/src/script/func/scriptfuncsystem.h index a9b309e..59fe7d8 100644 --- a/src/script/func/scriptfuncsystem.h +++ b/src/script/func/scriptfuncsystem.h @@ -34,19 +34,19 @@ int32_t scriptFuncPrint(lua_State *L) { int32_t scriptFuncInclude(lua_State *L) { assertNotNull(L, "Lua state cannot be NULL"); + assertTrue(lua_isstring(L, 1), "Expected string filename"); scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L); - if (!ctx) return luaL_error(L, "Lua extraspace ctx not set"); + assertNotNull(ctx, "Script context cannot be NULL"); const char_t *filename = luaL_checkstring(L, 1); - if(filename == NULL || filename[0] == '\0') { - luaL_error(L, "Filename cannot be NULL or empty"); - return 0; - } + assertNotNull(filename, "Filename cannot be NULL"); + assertStrLenMin(filename, 1, "Filename cannot be empty"); - // + // Copy out filename to mutable buffer char_t buffer[1024]; stringCopy(buffer, filename, 1024); + // Ensure it has .dsf extension size_t len = strlen(buffer); if(len < 4 || strcmp(&buffer[len - 4], ".dsf") != 0) { @@ -58,6 +58,7 @@ int32_t scriptFuncInclude(lua_State *L) { stringCopy(&buffer[len], ".dsf", 5); } + // Execute the script file errorret_t err = scriptContextExecFile( ctx, buffer diff --git a/src/script/scriptcontext.c b/src/script/scriptcontext.c index a5b1363..3d160d3 100644 --- a/src/script/scriptcontext.c +++ b/src/script/scriptcontext.c @@ -14,6 +14,7 @@ #include "script/func/scriptfunccamera.h" #include "script/func/scriptfuncentity.h" #include "script/func/scriptfuncsystem.h" +#include "script/func/scriptfuncscene.h" errorret_t scriptContextInit(scriptcontext_t *context) { assertNotNull(context, "Script context cannot be NULL"); @@ -30,9 +31,14 @@ errorret_t scriptContextInit(scriptcontext_t *context) { // Store context in Lua extraspace *(scriptcontext_t**)lua_getextraspace(context->luaState) = context; + // Register variables + // scriptContextExec(context, "PLATFORM = 'DESKTOP'"); + // Register functions scriptFuncSystem(context); scriptFuncEntity(context); + scriptFuncCamera(context); + scriptFuncScene(context); errorOk(); }