Modules
This commit is contained in:
@@ -3,6 +3,4 @@
|
|||||||
# This software is released under the MIT License.
|
# This software is released under the MIT License.
|
||||||
# https://opensource.org/licenses/MIT
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
add_asset(SCRIPT test.lua)
|
add_asset(SCRIPT init.lua)
|
||||||
|
|
||||||
add_subdirectory(scene)
|
|
||||||
@@ -1,5 +1,40 @@
|
|||||||
print('Init')
|
module('platform')
|
||||||
|
module('input')
|
||||||
|
module('scene')
|
||||||
|
|
||||||
-- Load map scene
|
-- Default Input bindings.
|
||||||
setScene('map')
|
if PLATFORM == "psp" then
|
||||||
setMap()
|
inputBind("up", "up")
|
||||||
|
inputBind("down", "down")
|
||||||
|
inputBind("left", "left")
|
||||||
|
inputBind("right", "right")
|
||||||
|
inputBind("circle", "cancel")
|
||||||
|
inputBind("cross", "accept")
|
||||||
|
inputBind("select", "ragequit")
|
||||||
|
inputBind("lstick_up", "up")
|
||||||
|
inputBind("lstick_down", "down")
|
||||||
|
inputBind("lstick_left", "left")
|
||||||
|
inputBind("lstick_right", "right")
|
||||||
|
else
|
||||||
|
if INPUT_KEYBOARD then
|
||||||
|
inputBind("w", "up")
|
||||||
|
inputBind("s", "down")
|
||||||
|
inputBind("a", "left")
|
||||||
|
inputBind("d", "right")
|
||||||
|
|
||||||
|
inputBind("left", "left")
|
||||||
|
inputBind("right", "right")
|
||||||
|
inputBind("up", "up")
|
||||||
|
inputBind("down", "down")
|
||||||
|
|
||||||
|
inputBind("enter", "accept")
|
||||||
|
inputBind("e", "accept" )
|
||||||
|
|
||||||
|
inputBind("escape", "cancel")
|
||||||
|
inputBind("q", "cancel")
|
||||||
|
|
||||||
|
inputBind("z", "ragequit")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sceneSet('map')
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Copyright (c) 2025 Dominic Masters
|
|
||||||
#
|
|
||||||
# This software is released under the MIT License.
|
|
||||||
# https://opensource.org/licenses/MIT
|
|
||||||
@@ -41,6 +41,10 @@ target_sources(${DUSK_TARGET_NAME}
|
|||||||
|
|
||||||
# Defs
|
# Defs
|
||||||
add_defs(duskdefs.env duskdefs.h)
|
add_defs(duskdefs.env duskdefs.h)
|
||||||
|
target_compile_definitions(${DUSK_TARGET_NAME}
|
||||||
|
PRIVATE
|
||||||
|
DUSK_TARGET_SYSTEM="${DUSK_TARGET_SYSTEM}"
|
||||||
|
)
|
||||||
|
|
||||||
# Subdirs
|
# Subdirs
|
||||||
add_subdirectory(assert)
|
add_subdirectory(assert)
|
||||||
|
|||||||
@@ -39,9 +39,10 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) {
|
|||||||
errorChain(sceneManagerInit());
|
errorChain(sceneManagerInit());
|
||||||
|
|
||||||
// Run the initial script.
|
// Run the initial script.
|
||||||
errorChain(scriptContextInit(&ENGINE.mainScriptContext));
|
scriptcontext_t ctx;
|
||||||
errorChain(scriptContextExecFile(&ENGINE.mainScriptContext, "script/test.dsf"));
|
errorChain(scriptContextInit(&ctx));
|
||||||
scriptContextDispose(&ENGINE.mainScriptContext);
|
errorChain(scriptContextExecFile(&ctx, "script/init.dsf"));
|
||||||
|
scriptContextDispose(&ctx);
|
||||||
|
|
||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "display/display.h"// Important to be included first.
|
#include "display/display.h"// Important to be included first.
|
||||||
#include "error/error.h"
|
#include "error/error.h"
|
||||||
#include "script/scriptcontext.h"
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool_t running;
|
bool_t running;
|
||||||
int32_t argc;
|
int32_t argc;
|
||||||
const char_t **argv;
|
const char_t **argv;
|
||||||
scriptcontext_t mainScriptContext;
|
|
||||||
} engine_t;
|
} engine_t;
|
||||||
|
|
||||||
extern engine_t ENGINE;
|
extern engine_t ENGINE;
|
||||||
|
|||||||
@@ -26,42 +26,42 @@ void inputInit(void) {
|
|||||||
INPUT.deadzone = 0.2f;
|
INPUT.deadzone = 0.2f;
|
||||||
|
|
||||||
// Setup Default Binds
|
// Setup Default Binds
|
||||||
#if INPUT_SDL2 == 1
|
// #if INPUT_SDL2 == 1
|
||||||
#if INPUT_KEYBOARD == 1
|
// #if INPUT_KEYBOARD == 1
|
||||||
inputBind(inputButtonGetByName("up"), INPUT_ACTION_UP);
|
// inputBind(inputButtonGetByName("up"), INPUT_ACTION_UP);
|
||||||
inputBind(inputButtonGetByName("down"), INPUT_ACTION_DOWN);
|
// inputBind(inputButtonGetByName("down"), INPUT_ACTION_DOWN);
|
||||||
inputBind(inputButtonGetByName("left"), INPUT_ACTION_LEFT);
|
// inputBind(inputButtonGetByName("left"), INPUT_ACTION_LEFT);
|
||||||
inputBind(inputButtonGetByName("right"), INPUT_ACTION_RIGHT);
|
// inputBind(inputButtonGetByName("right"), INPUT_ACTION_RIGHT);
|
||||||
inputBind(inputButtonGetByName("w"), INPUT_ACTION_UP);
|
// inputBind(inputButtonGetByName("w"), INPUT_ACTION_UP);
|
||||||
inputBind(inputButtonGetByName("s"), INPUT_ACTION_DOWN);
|
// inputBind(inputButtonGetByName("s"), INPUT_ACTION_DOWN);
|
||||||
inputBind(inputButtonGetByName("a"), INPUT_ACTION_LEFT);
|
// inputBind(inputButtonGetByName("a"), INPUT_ACTION_LEFT);
|
||||||
inputBind(inputButtonGetByName("d"), INPUT_ACTION_RIGHT);
|
// inputBind(inputButtonGetByName("d"), INPUT_ACTION_RIGHT);
|
||||||
inputBind(inputButtonGetByName("enter"), INPUT_ACTION_ACCEPT);
|
// inputBind(inputButtonGetByName("enter"), INPUT_ACTION_ACCEPT);
|
||||||
inputBind(inputButtonGetByName("escape"), INPUT_ACTION_RAGEQUIT);
|
// inputBind(inputButtonGetByName("escape"), INPUT_ACTION_RAGEQUIT);
|
||||||
inputBind(inputButtonGetByName("space"), INPUT_ACTION_ACCEPT);
|
// inputBind(inputButtonGetByName("space"), INPUT_ACTION_ACCEPT);
|
||||||
inputBind(inputButtonGetByName("backspace"), INPUT_ACTION_CANCEL);
|
// inputBind(inputButtonGetByName("backspace"), INPUT_ACTION_CANCEL);
|
||||||
inputBind(inputButtonGetByName("e"), INPUT_ACTION_ACCEPT);
|
// inputBind(inputButtonGetByName("e"), INPUT_ACTION_ACCEPT);
|
||||||
inputBind(inputButtonGetByName("q"), INPUT_ACTION_CANCEL);
|
// inputBind(inputButtonGetByName("q"), INPUT_ACTION_CANCEL);
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
#if INPUT_GAMEPAD == 1
|
// #if INPUT_GAMEPAD == 1
|
||||||
#if PSP
|
// #if PSP
|
||||||
INPUT.deadzone = 0.2890625f;// Taken from the PSP firmware
|
// INPUT.deadzone = 0.2890625f;// Taken from the PSP firmware
|
||||||
|
|
||||||
inputBind(inputButtonGetByName("up"), INPUT_ACTION_UP);
|
// inputBind(inputButtonGetByName("up"), INPUT_ACTION_UP);
|
||||||
inputBind(inputButtonGetByName("down"), INPUT_ACTION_DOWN);
|
// inputBind(inputButtonGetByName("down"), INPUT_ACTION_DOWN);
|
||||||
inputBind(inputButtonGetByName("left"), INPUT_ACTION_LEFT);
|
// inputBind(inputButtonGetByName("left"), INPUT_ACTION_LEFT);
|
||||||
inputBind(inputButtonGetByName("right"), INPUT_ACTION_RIGHT);
|
// inputBind(inputButtonGetByName("right"), INPUT_ACTION_RIGHT);
|
||||||
inputBind(inputButtonGetByName("circle"), INPUT_ACTION_CANCEL);
|
// inputBind(inputButtonGetByName("circle"), INPUT_ACTION_CANCEL);
|
||||||
inputBind(inputButtonGetByName("cross"), INPUT_ACTION_ACCEPT);
|
// inputBind(inputButtonGetByName("cross"), INPUT_ACTION_ACCEPT);
|
||||||
inputBind(inputButtonGetByName("lstick_negative_y"), INPUT_ACTION_UP);
|
// inputBind(inputButtonGetByName("lstick_negative_y"), INPUT_ACTION_UP);
|
||||||
inputBind(inputButtonGetByName("lstick_positive_y"), INPUT_ACTION_DOWN);
|
// inputBind(inputButtonGetByName("lstick_positive_y"), INPUT_ACTION_DOWN);
|
||||||
inputBind(inputButtonGetByName("lstick_negative_x"), INPUT_ACTION_LEFT);
|
// inputBind(inputButtonGetByName("lstick_negative_x"), INPUT_ACTION_LEFT);
|
||||||
inputBind(inputButtonGetByName("lstick_positive_x"), INPUT_ACTION_RIGHT);
|
// inputBind(inputButtonGetByName("lstick_positive_x"), INPUT_ACTION_RIGHT);
|
||||||
inputBind(inputButtonGetByName("select"), INPUT_ACTION_RAGEQUIT);
|
// inputBind(inputButtonGetByName("select"), INPUT_ACTION_RAGEQUIT);
|
||||||
#endif
|
// #endif
|
||||||
#endif
|
// #endif
|
||||||
#endif
|
// #endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void inputUpdate(void) {
|
void inputUpdate(void) {
|
||||||
|
|||||||
@@ -9,13 +9,14 @@
|
|||||||
#include "assert/assert.h"
|
#include "assert/assert.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
|
||||||
// inputaction_t inputActionGetByName(const char_t *name) {
|
inputaction_t inputActionGetByName(const char_t *name) {
|
||||||
// assertNotNull(name, "name must not be NULL");
|
assertNotNull(name, "name must not be NULL");
|
||||||
|
|
||||||
// for(inputaction_t i = 0; i < INPUT_ACTION_COUNT; i++) {
|
for(inputaction_t i = 0; i < INPUT_ACTION_COUNT; i++) {
|
||||||
// if(stringCompareInsensitive(INPUT_ACTION_NAMES[i], name) != 0) continue;
|
if(INPUT_ACTION_NAMES[i] == NULL) continue;
|
||||||
// return i;
|
if(stringCompareInsensitive(INPUT_ACTION_NAMES[i], name) != 0) continue;
|
||||||
// }
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
// return INPUT_ACTION_COUNT;
|
return INPUT_ACTION_COUNT;
|
||||||
// }
|
}
|
||||||
@@ -32,15 +32,15 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
} inputactiondata_t;
|
} inputactiondata_t;
|
||||||
|
|
||||||
// static const char_t* INPUT_ACTION_NAMES[INPUT_ACTION_COUNT] = {
|
static const char_t* INPUT_ACTION_NAMES[INPUT_ACTION_COUNT] = {
|
||||||
// [INPUT_ACTION_UP] = "UP",
|
[INPUT_ACTION_UP] = "UP",
|
||||||
// [INPUT_ACTION_DOWN] = "DOWN",
|
[INPUT_ACTION_DOWN] = "DOWN",
|
||||||
// [INPUT_ACTION_LEFT] = "LEFT",
|
[INPUT_ACTION_LEFT] = "LEFT",
|
||||||
// [INPUT_ACTION_RIGHT] = "RIGHT",
|
[INPUT_ACTION_RIGHT] = "RIGHT",
|
||||||
// [INPUT_ACTION_ACCEPT] = "ACCEPT",
|
[INPUT_ACTION_ACCEPT] = "ACCEPT",
|
||||||
// [INPUT_ACTION_CANCEL] = "CANCEL",
|
[INPUT_ACTION_CANCEL] = "CANCEL",
|
||||||
// [INPUT_ACTION_RAGEQUIT] = "RAGEQUIT",
|
[INPUT_ACTION_RAGEQUIT] = "RAGEQUIT",
|
||||||
// };
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets an input action by its name.
|
* Gets an input action by its name.
|
||||||
@@ -48,4 +48,4 @@ typedef struct {
|
|||||||
* @param name The name of the input action.
|
* @param name The name of the input action.
|
||||||
* @return The input action, or INPUT_ACTION_COUNT if not found.
|
* @return The input action, or INPUT_ACTION_COUNT if not found.
|
||||||
*/
|
*/
|
||||||
// inputaction_t inputActionGetByName(const char_t *name);
|
inputaction_t inputActionGetByName(const char_t *name);
|
||||||
13
src/rpg/item/inventory.h
Normal file
13
src/rpg/item/inventory.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "dusk.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *nothing;
|
||||||
|
} inventory_t;
|
||||||
@@ -47,14 +47,11 @@ void sceneManagerRegisterScene(scene_t *scene) {
|
|||||||
SCENE_MANAGER.scenes[SCENE_MANAGER.sceneCount++] = scene;
|
SCENE_MANAGER.scenes[SCENE_MANAGER.sceneCount++] = scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sceneManagerSetScene(scene_t *scene) {
|
errorret_t sceneManagerSetScene(scene_t *scene) {
|
||||||
if(SCENE_MANAGER.current) {
|
if(
|
||||||
// TODO: Should dispose?
|
SCENE_MANAGER.current &&
|
||||||
assertTrue(
|
(SCENE_MANAGER.current->flags & SCENE_FLAG_INITIALIZED) != 0
|
||||||
SCENE_MANAGER.current->flags & SCENE_FLAG_INITIALIZED,
|
) {
|
||||||
"Current scene not initialized"
|
|
||||||
);
|
|
||||||
|
|
||||||
SCENE_MANAGER.current->flags &= ~SCENE_FLAG_INITIALIZED;
|
SCENE_MANAGER.current->flags &= ~SCENE_FLAG_INITIALIZED;
|
||||||
if(SCENE_MANAGER.current->dispose) {
|
if(SCENE_MANAGER.current->dispose) {
|
||||||
SCENE_MANAGER.current->dispose(&SCENE_MANAGER.sceneData);
|
SCENE_MANAGER.current->dispose(&SCENE_MANAGER.sceneData);
|
||||||
@@ -63,12 +60,12 @@ void sceneManagerSetScene(scene_t *scene) {
|
|||||||
|
|
||||||
SCENE_MANAGER.current = scene;
|
SCENE_MANAGER.current = scene;
|
||||||
|
|
||||||
if(scene) {
|
if(scene && scene->init) {
|
||||||
assertTrue(
|
scene->flags |= SCENE_FLAG_INITIALIZED;
|
||||||
(scene->flags & SCENE_FLAG_INITIALIZED) == 0,
|
errorChain(scene->init(&SCENE_MANAGER.sceneData));
|
||||||
"Scene should not yet be initialized"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sceneManagerUpdate(void) {
|
void sceneManagerUpdate(void) {
|
||||||
|
|||||||
@@ -44,8 +44,9 @@ void sceneManagerRegisterScene(scene_t *scene);
|
|||||||
* Sets the current active scene.
|
* Sets the current active scene.
|
||||||
*
|
*
|
||||||
* @param scene The scene to set as current.
|
* @param scene The scene to set as current.
|
||||||
|
* @return An error code indicating success or failure.
|
||||||
*/
|
*/
|
||||||
void sceneManagerSetScene(scene_t *scene);
|
errorret_t sceneManagerSetScene(scene_t *scene);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates all active scenes.
|
* Updates all active scenes.
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ target_sources(${DUSK_TARGET_NAME}
|
|||||||
PRIVATE
|
PRIVATE
|
||||||
scriptmanager.c
|
scriptmanager.c
|
||||||
scriptcontext.c
|
scriptcontext.c
|
||||||
|
scriptmodule.c
|
||||||
)
|
)
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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 "assert/assert.h"
|
|
||||||
|
|
||||||
void scriptFuncCamera(scriptcontext_t *context) {
|
|
||||||
assertNotNull(context, "Script context cannot be NULL");
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
65
src/script/module/moduleinput.h
Normal file
65
src/script/module/moduleinput.h
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* 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 "input/input.h"
|
||||||
|
|
||||||
|
int32_t moduleInputBind(lua_State *L) {
|
||||||
|
assertNotNull(L, "Lua state cannot be NULL");
|
||||||
|
|
||||||
|
// Requires action and button.
|
||||||
|
if(!lua_isstring(L, 1)) {
|
||||||
|
luaL_error(L, "inputBind: Expected button name as first argument");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!lua_isstring(L, 2)) {
|
||||||
|
luaL_error(L, "inputBind: Expected action name as second argument");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char_t *strBtn = lua_tostring(L, 1);
|
||||||
|
const char_t *strAct = lua_tostring(L, 2);
|
||||||
|
|
||||||
|
// Get button by name
|
||||||
|
inputbutton_t btn = inputButtonGetByName(strBtn);
|
||||||
|
if(btn.type == INPUT_BUTTON_TYPE_NONE) {
|
||||||
|
printf("inputBind: Unknown button name '%s'\n", strBtn);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get action by name
|
||||||
|
inputaction_t act = inputActionGetByName(strAct);
|
||||||
|
if(act == INPUT_ACTION_COUNT) {
|
||||||
|
printf("inputBind: Unknown action name '%s'\n", strAct);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputBind(btn, act);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void moduleInput(scriptcontext_t *context) {
|
||||||
|
assertNotNull(context, "Script context cannot be NULL");
|
||||||
|
|
||||||
|
// Input values.
|
||||||
|
scriptContextExec(context,
|
||||||
|
#if INPUT_KEYBOARD == 1
|
||||||
|
"INPUT_KEYBOARD = true\n"
|
||||||
|
#endif
|
||||||
|
#if INPUT_GAMEPAD == 1
|
||||||
|
"INPUT_GAMEPAD = true\n"
|
||||||
|
#endif
|
||||||
|
#if INPUT_SDL2 == 1
|
||||||
|
"INPUT_SDL2 = true\n"
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
|
// Bind methods
|
||||||
|
scriptContextRegFunc(context, "inputBind", moduleInputBind);
|
||||||
|
}
|
||||||
21
src/script/module/moduleplatform.h
Normal file
21
src/script/module/moduleplatform.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "script/scriptcontext.h"
|
||||||
|
|
||||||
|
#ifndef DUSK_TARGET_SYSTEM
|
||||||
|
#error "DUSK_TARGET_SYSTEM must be defined"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PLATFORM_VALUE "PLATFORM = '" DUSK_TARGET_SYSTEM "'"
|
||||||
|
|
||||||
|
void modulePlatform(scriptcontext_t *ctx) {
|
||||||
|
assertNotNull(ctx, "Script context cannot be NULL");
|
||||||
|
|
||||||
|
scriptContextExec(ctx, PLATFORM_VALUE);
|
||||||
|
}
|
||||||
42
src/script/module/modulescene.h
Normal file
42
src/script/module/modulescene.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
int32_t moduleSceneSetScene(lua_State *L) {
|
||||||
|
assertNotNull(L, "Lua state cannot be NULL");
|
||||||
|
|
||||||
|
assertTrue(lua_isstring(L, 1), "Expected string scene name");
|
||||||
|
|
||||||
|
const char *sceneName = luaL_checkstring(L, 1);
|
||||||
|
if(sceneName == NULL || sceneName[0] == '\0') {
|
||||||
|
luaL_error(L, "Scene name cannot be NULL");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scene_t *scene = sceneManagerGetSceneByName(sceneName);
|
||||||
|
if(scene == NULL) {
|
||||||
|
luaL_error(L, "Scene '%s' not found", sceneName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorret_t err = sceneManagerSetScene(scene);
|
||||||
|
if(err.code != ERROR_OK) {
|
||||||
|
|
||||||
|
luaL_error(L, "Failed to set scene '%s'", sceneName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void moduleScene(scriptcontext_t *ctx) {
|
||||||
|
assertNotNull(ctx, "Script context cannot be NULL");
|
||||||
|
|
||||||
|
scriptContextRegFunc(ctx, "sceneSet", moduleSceneSetScene);
|
||||||
|
}
|
||||||
@@ -10,8 +10,9 @@
|
|||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
#include "assert/assert.h"
|
#include "assert/assert.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
#include "script/scriptmodule.h"
|
||||||
|
|
||||||
int32_t scriptFuncPrint(lua_State *L) {
|
int32_t moduleSysPrint(lua_State *L) {
|
||||||
assertNotNull(L, "Lua state cannot be NULL");
|
assertNotNull(L, "Lua state cannot be NULL");
|
||||||
|
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
@@ -32,16 +33,25 @@ int32_t scriptFuncPrint(lua_State *L) {
|
|||||||
return 0; // no values returned to Lua
|
return 0; // no values returned to Lua
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scriptFuncInclude(lua_State *L) {
|
int32_t moduleSysInclude(lua_State *L) {
|
||||||
assertNotNull(L, "Lua state cannot be NULL");
|
assertNotNull(L, "Lua state cannot be NULL");
|
||||||
assertTrue(lua_isstring(L, 1), "Expected string filename");
|
|
||||||
|
if(!lua_isstring(L, 1)) {
|
||||||
|
luaL_error(L, "Expected string filename");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L);
|
scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L);
|
||||||
assertNotNull(ctx, "Script context cannot be NULL");
|
if(ctx == NULL) {
|
||||||
|
luaL_error(L, "Script context is NULL");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const char_t *filename = luaL_checkstring(L, 1);
|
const char_t *filename = luaL_checkstring(L, 1);
|
||||||
assertNotNull(filename, "Filename cannot be NULL");
|
if(filename == NULL || filename[0] == '\0') {
|
||||||
assertStrLenMin(filename, 1, "Filename cannot be empty");
|
luaL_error(L, "Filename cannot be NULL");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy out filename to mutable buffer
|
// Copy out filename to mutable buffer
|
||||||
char_t buffer[1024];
|
char_t buffer[1024];
|
||||||
@@ -72,9 +82,41 @@ int32_t scriptFuncInclude(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void scriptFuncSystem(scriptcontext_t *context) {
|
int32_t moduleSysModule(lua_State *L) {
|
||||||
|
assertNotNull(L, "Lua state cannot be NULL");
|
||||||
|
|
||||||
|
if(!lua_isstring(L, 1)) {
|
||||||
|
luaL_error(L, "Expected string module name");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char_t *moduleName = luaL_checkstring(L, 1);
|
||||||
|
if(moduleName == NULL) {
|
||||||
|
luaL_error(L, "Module name cannot be NULL");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const scriptmodule_t *module = scriptModuleGetByName(moduleName);
|
||||||
|
if(module == NULL) {
|
||||||
|
luaL_error(L, "Module '%s' not found", moduleName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L);
|
||||||
|
if(ctx == NULL) {
|
||||||
|
luaL_error(L, "Script context is NULL");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
module->callback(ctx);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void moduleSystem(scriptcontext_t *context) {
|
||||||
assertNotNull(context, "Script context cannot be NULL");
|
assertNotNull(context, "Script context cannot be NULL");
|
||||||
|
|
||||||
scriptContextRegFunc(context, "print", scriptFuncPrint);
|
scriptContextRegFunc(context, "print", moduleSysPrint);
|
||||||
scriptContextRegFunc(context, "include", scriptFuncInclude);
|
scriptContextRegFunc(context, "include", moduleSysInclude);
|
||||||
|
scriptContextRegFunc(context, "module", moduleSysModule);
|
||||||
}
|
}
|
||||||
@@ -10,11 +10,7 @@
|
|||||||
#include "asset/asset.h"
|
#include "asset/asset.h"
|
||||||
#include "util/memory.h"
|
#include "util/memory.h"
|
||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
|
#include "script/scriptmodule.h"
|
||||||
#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) {
|
errorret_t scriptContextInit(scriptcontext_t *context) {
|
||||||
assertNotNull(context, "Script context cannot be NULL");
|
assertNotNull(context, "Script context cannot be NULL");
|
||||||
@@ -30,15 +26,13 @@ errorret_t scriptContextInit(scriptcontext_t *context) {
|
|||||||
|
|
||||||
// Store context in Lua extraspace
|
// Store context in Lua extraspace
|
||||||
*(scriptcontext_t**)lua_getextraspace(context->luaState) = context;
|
*(scriptcontext_t**)lua_getextraspace(context->luaState) = context;
|
||||||
|
|
||||||
// Register variables
|
// All scripts get the system module
|
||||||
// scriptContextExec(context, "PLATFORM = 'DESKTOP'");
|
const scriptmodule_t *sysModule = scriptModuleGetByName("system");
|
||||||
|
if(sysModule == NULL) {
|
||||||
// Register functions
|
errorThrow("Failed to find system script module");
|
||||||
scriptFuncSystem(context);
|
}
|
||||||
scriptFuncEntity(context);
|
sysModule->callback(context);
|
||||||
scriptFuncCamera(context);
|
|
||||||
scriptFuncScene(context);
|
|
||||||
|
|
||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/script/scriptmodule.c
Normal file
32
src/script/scriptmodule.c
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "scriptmodule.h"
|
||||||
|
#include "script/module/modulesystem.h"
|
||||||
|
#include "script/module/moduleinput.h"
|
||||||
|
#include "script/module/moduleplatform.h"
|
||||||
|
#include "script/module/modulescene.h"
|
||||||
|
|
||||||
|
const scriptmodule_t SCRIPT_MODULE_LIST[] = {
|
||||||
|
{ .name = "system", .callback = moduleSystem },
|
||||||
|
{ .name = "input", .callback = moduleInput },
|
||||||
|
{ .name = "platform", .callback = modulePlatform },
|
||||||
|
{ .name = "scene", .callback = moduleScene },
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SCRIPT_MODULE_COUNT ( \
|
||||||
|
sizeof(SCRIPT_MODULE_LIST) / sizeof(scriptmodule_t) \
|
||||||
|
)
|
||||||
|
|
||||||
|
const scriptmodule_t * scriptModuleGetByName(const char_t *name) {
|
||||||
|
for(uint_fast8_t i = 0; i < SCRIPT_MODULE_COUNT; i++) {
|
||||||
|
if(stringCompare(SCRIPT_MODULE_LIST[i].name, name) != 0) continue;
|
||||||
|
return &SCRIPT_MODULE_LIST[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
24
src/script/scriptmodule.h
Normal file
24
src/script/scriptmodule.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2025 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "scriptcontext.h"
|
||||||
|
|
||||||
|
typedef struct scriptmodule_s {
|
||||||
|
const char_t *name;
|
||||||
|
void (*callback)(scriptcontext_t *ctx);
|
||||||
|
} scriptmodule_t;
|
||||||
|
|
||||||
|
extern const scriptmodule_t SCRIPT_MODULE_LIST[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a script module by its name.
|
||||||
|
*
|
||||||
|
* @param name The name of the script module.
|
||||||
|
* @return Pointer to the script module, or NULL if not found.
|
||||||
|
*/
|
||||||
|
const scriptmodule_t * scriptModuleGetByName(const char_t *name);
|
||||||
Reference in New Issue
Block a user