From 91b93b5b1eec753ae6fcb47daa238b8784a54970 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sun, 17 Aug 2025 12:55:08 -0500 Subject: [PATCH] add quit command --- src/dusk/console/CMakeLists.txt | 5 +- src/dusk/console/cmd/CMakeLists.txt | 9 +++ src/dusk/console/cmd/cmdecho.h | 18 +++++ src/dusk/console/cmd/cmdget.h | 25 +++++++ src/dusk/console/cmd/cmdquit.h | 15 ++++ src/dusk/console/cmd/cmdset.h | 27 +++++++ src/dusk/console/console.c | 75 ++----------------- src/dusk/console/console.h | 3 +- src/dusk/game.c | 4 + src/dusk/game.h | 6 ++ src/dusk/input.h | 3 +- src/dusksdl2/display/CMakeLists.txt | 1 + src/dusksdl2/display/overworld/CMakeLists.txt | 10 +++ .../display/overworld/renderoverworld.c | 16 ++++ .../display/overworld/renderoverworld.h | 34 +++++++++ src/dusksdl2/display/scene/renderscene.c | 5 +- src/dusksdl2/dusksdl2input.h | 1 + src/dusksdl2/main.c | 8 +- 18 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 src/dusk/console/cmd/CMakeLists.txt create mode 100644 src/dusk/console/cmd/cmdecho.h create mode 100644 src/dusk/console/cmd/cmdget.h create mode 100644 src/dusk/console/cmd/cmdquit.h create mode 100644 src/dusk/console/cmd/cmdset.h create mode 100644 src/dusksdl2/display/overworld/CMakeLists.txt create mode 100644 src/dusksdl2/display/overworld/renderoverworld.c create mode 100644 src/dusksdl2/display/overworld/renderoverworld.h diff --git a/src/dusk/console/CMakeLists.txt b/src/dusk/console/CMakeLists.txt index c4da6c5..a82d2f4 100644 --- a/src/dusk/console/CMakeLists.txt +++ b/src/dusk/console/CMakeLists.txt @@ -9,4 +9,7 @@ target_sources(${DUSK_TARGET_NAME} console.c consolecmd.c consolevar.c -) \ No newline at end of file +) + +# Subdirectories +add_subdirectory(cmd) \ No newline at end of file diff --git a/src/dusk/console/cmd/CMakeLists.txt b/src/dusk/console/cmd/CMakeLists.txt new file mode 100644 index 0000000..fb0e252 --- /dev/null +++ b/src/dusk/console/cmd/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Sources +target_sources(${DUSK_TARGET_NAME} + PRIVATE +) \ No newline at end of file diff --git a/src/dusk/console/cmd/cmdecho.h b/src/dusk/console/cmd/cmdecho.h new file mode 100644 index 0000000..d9cc4a0 --- /dev/null +++ b/src/dusk/console/cmd/cmdecho.h @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "console/console.h" + +void cmdEcho(const consolecmdexec_t *exec) { + assertTrue( + exec->argc >= 1, + "echo command requires 1 argument." + ); + + consolePrint("%s", exec->argv[0]); +} \ No newline at end of file diff --git a/src/dusk/console/cmd/cmdget.h b/src/dusk/console/cmd/cmdget.h new file mode 100644 index 0000000..6b6cb13 --- /dev/null +++ b/src/dusk/console/cmd/cmdget.h @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "console/console.h" + +void cmdGet(const consolecmdexec_t *exec) { + assertTrue( + exec->argc >= 1, + "Get command requires 1 argument." + ); + + for(uint32_t i = 0; i < CONSOLE.variableCount; i++) { + consolevar_t *var = &CONSOLE.variables[i]; + if(stringCompare(var->name, exec->argv[0]) != 0) continue; + consolePrint("%s", var->value); + return; + } + + consolePrint("Error: Variable '%s' not found.", exec->argv[0]); +} \ No newline at end of file diff --git a/src/dusk/console/cmd/cmdquit.h b/src/dusk/console/cmd/cmdquit.h new file mode 100644 index 0000000..05ed62c --- /dev/null +++ b/src/dusk/console/cmd/cmdquit.h @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "console/console.h" +#include "game.h" + +void cmdQuit(const consolecmdexec_t *exec) { + consolePrint("Quitting application..."); + GAME.running = false; +} \ No newline at end of file diff --git a/src/dusk/console/cmd/cmdset.h b/src/dusk/console/cmd/cmdset.h new file mode 100644 index 0000000..e468ea2 --- /dev/null +++ b/src/dusk/console/cmd/cmdset.h @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "console/console.h" + +void cmdSet(const consolecmdexec_t *exec) { + assertTrue(exec->argc >= 2, "set command requires 2 arguments."); + + for(uint32_t i = 0; i < CONSOLE.variableCount; i++) { + consolevar_t *var = &CONSOLE.variables[i]; + if(stringCompare(var->name, exec->argv[0]) != 0) continue; + consoleVarSetValue(var, exec->argv[1]); + consolePrint("%s %s", var->name, var->value); + for(i = 0; i < var->eventCount; i++) { + assertNotNull(var->events[i], "Event is NULL"); + var->events[i](var); + } + return; + } + + consolePrint("Error: Variable '%s' not found.", exec->argv[0]); +} \ No newline at end of file diff --git a/src/dusk/console/console.c b/src/dusk/console/console.c index defbe55..e412d76 100644 --- a/src/dusk/console/console.c +++ b/src/dusk/console/console.c @@ -9,6 +9,11 @@ #include "assert/assert.h" #include "util/memory.h" #include "util/string.h" +#include "console/cmd/cmdquit.h" +#include "console/cmd/cmdecho.h" +#include "console/cmd/cmdset.h" +#include "console/cmd/cmdget.h" + #include "input.h" console_t CONSOLE; @@ -19,6 +24,7 @@ void consoleInit() { // Register the get and set command. CONSOLE.cmdGet = consoleRegCmd("get", cmdGet); CONSOLE.cmdSet = consoleRegCmd("set", cmdSet); + consoleRegCmd("quit", cmdQuit); consoleRegCmd("echo", cmdEcho); consolePrint(" = Dawn Console = "); @@ -266,49 +272,6 @@ void consoleExec(const char_t *line) { } } -void cmdGet(const consolecmdexec_t *exec) { - assertTrue( - exec->argc >= 1, - "Get command requires 1 argument." - ); - - for(uint32_t i = 0; i < CONSOLE.variableCount; i++) { - consolevar_t *var = &CONSOLE.variables[i]; - if(stringCompare(var->name, exec->argv[0]) != 0) continue; - consolePrint("%s", var->value); - return; - } - - consolePrint("Error: Variable '%s' not found.", exec->argv[0]); -} - -void cmdSet(const consolecmdexec_t *exec) { - assertTrue(exec->argc >= 2, "set command requires 2 arguments."); - - for(uint32_t i = 0; i < CONSOLE.variableCount; i++) { - consolevar_t *var = &CONSOLE.variables[i]; - if(stringCompare(var->name, exec->argv[0]) != 0) continue; - consoleVarSetValue(var, exec->argv[1]); - consolePrint("%s %s", var->name, var->value); - for(i = 0; i < var->eventCount; i++) { - assertNotNull(var->events[i], "Event is NULL"); - var->events[i](var); - } - return; - } - - consolePrint("Error: Variable '%s' not found.", exec->argv[0]); -} - -void cmdEcho(const consolecmdexec_t *exec) { - assertTrue( - exec->argc >= 1, - "echo command requires 1 argument." - ); - - consolePrint("%s", exec->argv[0]); -} - // May move these later void consoleUpdate() { if(inputPressed(INPUT_BIND_CONSOLE)) { @@ -363,28 +326,4 @@ void consoleUpdate() { // Clear the exec buffer CONSOLE.execBufferCount = 0; -} - -// void consoleDraw() { -// if(!CONSOLE.open) return; - -// size_t i = 0; -// char_t *line; -// int32_t fontSize = 10; -// do { -// line = CONSOLE.line[i]; -// if(line[0] == '\0') { -// i++; -// continue; -// } -// DrawText(line, 0, i*fontSize, fontSize, YELLOW); -// i++; -// } while(i < CONSOLE_HISTORY_MAX); - -// DrawText( -// CONSOLE.inputBuffer, 0, -// (CONSOLE_HISTORY_MAX + 1) * fontSize, -// fontSize, -// PINK -// ); -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/dusk/console/console.h b/src/dusk/console/console.h index b09b248..a4ec9e9 100644 --- a/src/dusk/console/console.h +++ b/src/dusk/console/console.h @@ -102,4 +102,5 @@ void consoleUpdate(); void cmdGet(const consolecmdexec_t *exec); void cmdSet(const consolecmdexec_t *exec); -void cmdEcho(const consolecmdexec_t *exec); \ No newline at end of file +void cmdEcho(const consolecmdexec_t *exec); +void cmdQuit(const consolecmdexec_t *exec); \ No newline at end of file diff --git a/src/dusk/game.c b/src/dusk/game.c index 6f5849c..91a17b1 100644 --- a/src/dusk/game.c +++ b/src/dusk/game.c @@ -15,7 +15,11 @@ #include "ui/uitextbox.h" #include "console/console.h" +game_t GAME; + void gameInit(void) { + GAME.running = true; + consoleInit(); inputInit(); eventInit(); diff --git a/src/dusk/game.h b/src/dusk/game.h index cff44a6..566be6f 100644 --- a/src/dusk/game.h +++ b/src/dusk/game.h @@ -8,6 +8,12 @@ #pragma once #include "dusk.h" +typedef struct { + bool_t running; +} game_t; + +extern game_t GAME; + /** * Initializes the game, this should be called before any other game functions. * This should be called by the parent platform at a time that it deems diff --git a/src/dusk/input.h b/src/dusk/input.h index f9d5a3e..5dc43ba 100644 --- a/src/dusk/input.h +++ b/src/dusk/input.h @@ -18,8 +18,9 @@ typedef inputbind_t inputstate_t; #define INPUT_BIND_ACTION (1 << 4) #define INPUT_BIND_CANCEL (1 << 5) #define INPUT_BIND_CONSOLE (1 << 6) +#define INPUT_BIND_QUIT (1 << 7) -#define INPUT_BIND_COUNT (INPUT_BIND_CONSOLE + 1) +#define INPUT_BIND_COUNT (INPUT_BIND_QUIT + 1) typedef struct { uint8_t current; diff --git a/src/dusksdl2/display/CMakeLists.txt b/src/dusksdl2/display/CMakeLists.txt index 4101afc..765f28c 100644 --- a/src/dusksdl2/display/CMakeLists.txt +++ b/src/dusksdl2/display/CMakeLists.txt @@ -16,6 +16,7 @@ target_sources(${DUSK_TARGET_NAME} add_subdirectory(camera) add_subdirectory(framebuffer) add_subdirectory(mesh) +add_subdirectory(overworld) add_subdirectory(texture) add_subdirectory(spritebatch) add_subdirectory(scene) \ No newline at end of file diff --git a/src/dusksdl2/display/overworld/CMakeLists.txt b/src/dusksdl2/display/overworld/CMakeLists.txt new file mode 100644 index 0000000..2802ef1 --- /dev/null +++ b/src/dusksdl2/display/overworld/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +# Sources +target_sources(${DUSK_TARGET_NAME} + PRIVATE + renderoverworld.c +) \ No newline at end of file diff --git a/src/dusksdl2/display/overworld/renderoverworld.c b/src/dusksdl2/display/overworld/renderoverworld.c new file mode 100644 index 0000000..4962e33 --- /dev/null +++ b/src/dusksdl2/display/overworld/renderoverworld.c @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "renderoverworld.h" + +void renderOverworldInit(void) { + // Initialize overworld rendering resources here +} + +void renderOverworldDispose(void) { + // Clean up overworld rendering resources here +} \ No newline at end of file diff --git a/src/dusksdl2/display/overworld/renderoverworld.h b/src/dusksdl2/display/overworld/renderoverworld.h new file mode 100644 index 0000000..77bd2f3 --- /dev/null +++ b/src/dusksdl2/display/overworld/renderoverworld.h @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "world/chunk.h" +#include "display/mesh/mesh.h" + +typedef struct { + mesh_t meshBase; + meshvertex_t verticesBase[CHUNK_TILE_COUNT]; + + mesh_t meshBaseOverlay; + meshvertex_t verticesBaseOverlay[CHUNK_TILE_COUNT]; +} renderchunk_t; + +typedef struct { + renderchunk_t chunks[CHUNK_MAP_COUNT]; +} renderoverworld_t; + +extern renderoverworld_t RENDER_OVERWORLD; + +/** + * Initializes the render overworld. + */ +void renderOverworldInit(void); + +/** + * Disposes of the render overworld. + */ +void renderOverworldDispose(void); \ No newline at end of file diff --git a/src/dusksdl2/display/scene/renderscene.c b/src/dusksdl2/display/scene/renderscene.c index cdc0ec2..c8f8d07 100644 --- a/src/dusksdl2/display/scene/renderscene.c +++ b/src/dusksdl2/display/scene/renderscene.c @@ -6,6 +6,7 @@ */ #include "renderscene.h" +#include "display/overworld/renderoverworld.h" renderscenecallback_t RENDER_SCENE_CALLBACKS[SCENE_COUNT] = { [SCENE_INITIAL] = { @@ -15,9 +16,9 @@ renderscenecallback_t RENDER_SCENE_CALLBACKS[SCENE_COUNT] = { }, [SCENE_OVERWORLD] = { - .init = NULL, + .init = renderOverworldInit, .draw = NULL, - .dispose = NULL + .dispose = renderOverworldDispose }, }; diff --git a/src/dusksdl2/dusksdl2input.h b/src/dusksdl2/dusksdl2input.h index 51b3fb0..8eb6d90 100644 --- a/src/dusksdl2/dusksdl2input.h +++ b/src/dusksdl2/dusksdl2input.h @@ -49,6 +49,7 @@ { SDL_SCANCODE_SPACE, INPUT_BIND_ACTION }, { SDL_SCANCODE_ESCAPE, INPUT_BIND_CANCEL }, { SDL_SCANCODE_GRAVE, INPUT_BIND_CONSOLE }, + { SDL_SCANCODE_Q, INPUT_BIND_QUIT }, { 0, 0 } }; #endif \ No newline at end of file diff --git a/src/dusksdl2/main.c b/src/dusksdl2/main.c index f46368b..91a3e23 100644 --- a/src/dusksdl2/main.c +++ b/src/dusksdl2/main.c @@ -26,12 +26,8 @@ int main(int argc, char *argv[]) { gameUpdate(); mainError(renderDraw()); - if(inputPressed(INPUT_BIND_UP)) consolePrint("Up pressed"); - if(inputPressed(INPUT_BIND_DOWN)) consolePrint("Down pressed"); - if(inputPressed(INPUT_BIND_LEFT)) consolePrint("Left pressed"); - if(inputPressed(INPUT_BIND_RIGHT)) consolePrint("Right pressed"); - if(inputPressed(INPUT_BIND_ACTION)) consolePrint("Action pressed"); - if(inputPressed(INPUT_BIND_CANCEL)) consolePrint("Cancel pressed"); + if(inputPressed(INPUT_BIND_QUIT)) consoleExec("quit"); + if(!GAME.running) break; } gameDispose();