From 4b04fc65ad07d0d2ba6d43f402b5e86d4c177030 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Wed, 1 Oct 2025 19:21:20 -0500 Subject: [PATCH] scerne stuff --- assets/minesweeper/sweep/CMakeLists.txt | 6 +++ assets/minesweeper/sweep/backgrounds.png | Bin 0 -> 6773 bytes assets/minesweeper/sweep/borders.png | Bin 0 -> 3888 bytes assets/minesweeper/sweep/cells.png | Bin 0 -> 3673 bytes assets/minesweeper/sweep/grids.png | Bin 0 -> 4313 bytes assets/minesweeper/sweep/ui.png | Bin 0 -> 4681 bytes src/CMakeLists.txt | 1 + src/display/CMakeLists.txt | 1 - src/display/display.c | 6 +-- src/display/scene/scenemanager.c | 58 ----------------------- src/engine/engine.c | 3 ++ src/game/game.h | 5 -- src/game/minesweeper/game.c | 4 -- src/game/minesweeper/scene/scenesweep.c | 38 +++++++++++++++ src/game/minesweeper/scene/scenesweep.h | 36 ++++++++++++++ src/{display => }/scene/CMakeLists.txt | 0 src/{display => }/scene/scene.h | 4 +- src/scene/scenemanager.c | 54 +++++++++++++++++++++ src/{display => }/scene/scenemanager.h | 10 +++- 19 files changed, 150 insertions(+), 76 deletions(-) create mode 100644 assets/minesweeper/sweep/CMakeLists.txt create mode 100644 assets/minesweeper/sweep/backgrounds.png create mode 100644 assets/minesweeper/sweep/borders.png create mode 100644 assets/minesweeper/sweep/cells.png create mode 100644 assets/minesweeper/sweep/grids.png create mode 100644 assets/minesweeper/sweep/ui.png delete mode 100644 src/display/scene/scenemanager.c create mode 100644 src/game/minesweeper/scene/scenesweep.c create mode 100644 src/game/minesweeper/scene/scenesweep.h rename src/{display => }/scene/CMakeLists.txt (100%) rename src/{display => }/scene/scene.h (84%) create mode 100644 src/scene/scenemanager.c rename src/{display => }/scene/scenemanager.h (78%) diff --git a/assets/minesweeper/sweep/CMakeLists.txt b/assets/minesweeper/sweep/CMakeLists.txt new file mode 100644 index 0000000..d8eda53 --- /dev/null +++ b/assets/minesweeper/sweep/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright (c) 2025 Dominic Masters +# +# This software is released under the MIT License. +# https://opensource.org/licenses/MIT + +add_asset(PALETTE palette0.png) \ No newline at end of file diff --git a/assets/minesweeper/sweep/backgrounds.png b/assets/minesweeper/sweep/backgrounds.png new file mode 100644 index 0000000000000000000000000000000000000000..a27f452713ae64c02c78e770ec9e2c61081e757b GIT binary patch literal 6773 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 w$F=~t##W=Syu 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 literal 0 HcmV?d00001 diff --git a/assets/minesweeper/sweep/grids.png b/assets/minesweeper/sweep/grids.png new file mode 100644 index 0000000000000000000000000000000000000000..6c62ec603b1ac10b1952e4a284a72d48c42eae95 GIT binary patch literal 4313 zcmeHKeM}Q)9KOPUDKlkT!jfs)=``Yk!;cY+dbU#*s6=Q85DA9PxJp8nG#lfi7JJmW zIFn^eU=Wy42yRqxxIs1&C|u^|h!kkImJuZFNj8)srGUkQEAPF#>$MvRV)*>W*nism za((Z8ejm^C{4Pu5V>WGkeItS(nozRJ{yW2yISyTNce@2+vXkj_9TAC{{YdrcI|&@tNqJU{Me1Z zoIb!iv^C|rKRhy1b(=ig(`aiOp2|9vf4jq2#bXX%@PQG=1jvKHh~uK)VMwFBAD?yn zp_p)yq)|qnD-yYZmj2k%hPOi|)KELfucQrTS=*(Gfa6_$*_aX!sK-C#M+TRa1dP&C z>fj`7K#&<4wky~IhC!%~ZbB{L(!@}m+u+_U1#*=xwfb7Plq@6Dswu-`X|q_8T0I`& zY!OeFIcm;oikie$nGJ3a9Vx^%#6Q@*^G1_cQu%g)LUu$5=)YboaT~|6N$LbHRwQG` z%nDK(2MelbypX=jz6h{aNfHen>+$O|vZqfsFE^|Y8tqOvIgCmZ)34=XN?4qCg-)4{ zdI#jJHA;nMG=jb94!Nck*F#CTi9#h09&c!15>^*{Z?Mc5gX7Zy!*sJ-rdOLIOlf_D z$u)>t=Ay2+mW^wXKvWqqI0>)tjqO7@Xpd~`v9&7AL*Q>K!n-2p398P%f zjuy-o;)h19gbkzIaqyeiIymL(AFnB;c__g6;3t+rD3)V%>Yo`Fs@Jl#F`BX5Fxn+F z3FB_r^}`pFZT>s5DZ$^Jq@qxbJ#?nF!ZA8mctpuh!g>Um9V<9}kt-_smU8V6U8?G9 z@q|ALKqdY1O``b|H~{K!5#b@LeE*da*Mb3mB+%^_o&K6+2(+VfW)ck65(K3x9T&Ah z>!k#nf1j-RQiWnIlF7lf`DfqXd1FctcHK;h6ELg}`|TkaZpCt--D!;Sa5IN-!A)1k z({;|h>U{WkglwU!zGd}+94aQo)BR&L_cyPuN#>W46j#n}XwU~8A9bN7GeOvelN1_9 zYOPG4KHB8b91i0u^@mH2Q*-dqt0_u;iN&t^LP+2!1-{2K?2Hr;=V$&wr65wJn+;rP z^UufSnV|cqG(&ysEvKgF;Ca5wMdng5dbROSkU?r`nrlff#ue-8{GzL>d*@zw5;GKN zm1>GVGebMb&KcpY$aeRHeIzQ6a<{?Gf!f|&?0_nn01jqcaF@vb5fzbuIRu$@p~(zM zlgE{;K}zn{&hfyH+pqSf#d~}J(_bB}Dy7SvhIvwgwPO%>HwDw>XmpZ9Yj zVkWd4zpj&poXO87r~czTcn;os#+f0H!RtOV#~-Tbu!*+7z?vd@C(8UBncibyeRNZ| zm!FueBHX7ciJ@TzFZ(cCO4mLwK|k$rfm}nMe8snaFlYJL?`eNp<~um&EoWDrRG&~W zJC(fL>uK1y&)G05Q>mA(FFv~Q==&G`1*z|~0{{R3 literal 0 HcmV?d00001 diff --git a/assets/minesweeper/sweep/ui.png b/assets/minesweeper/sweep/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..28b2df5f1c1f31b028da22b378c3abdea01ad394 GIT binary patch literal 4681 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 literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd069dd..815168f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,7 @@ add_subdirectory(input) # add_subdirectory(locale) add_subdirectory(physics) # add_subdirectory(rpg) +add_subdirectory(scene) add_subdirectory(thread) add_subdirectory(time) add_subdirectory(ui) diff --git a/src/display/CMakeLists.txt b/src/display/CMakeLists.txt index 8384af4..3be4dcc 100644 --- a/src/display/CMakeLists.txt +++ b/src/display/CMakeLists.txt @@ -16,7 +16,6 @@ add_subdirectory(framebuffer) add_subdirectory(mesh) add_subdirectory(palette) add_subdirectory(texture) -add_subdirectory(scene) add_subdirectory(spritebatch) if(DUSK_TARGET_SYSTEM STREQUAL "linux") diff --git a/src/display/display.c b/src/display/display.c index d9e1166..4f41279 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -8,7 +8,7 @@ #include "display/display.h" #include "console/console.h" #include "display/framebuffer/framebuffer.h" -#include "display/scene/scenemanager.h" +#include "scene/scenemanager.h" #include "display/spritebatch/spritebatch.h" #include "display/mesh/quad.h" #include "game/game.h" @@ -71,7 +71,6 @@ errorret_t displayInit(void) { quadInit(); frameBufferInitBackbuffer(); spriteBatchInit(); - errorChain(sceneManagerInit()); errorOk(); } @@ -115,7 +114,7 @@ errorret_t displayUpdate(void) { COLOR_CORNFLOWER_BLUE ); - gameRender(); + sceneManagerRender(); spriteBatchFlush(); #if DISPLAY_SDL2 @@ -132,7 +131,6 @@ errorret_t displayUpdate(void) { } errorret_t displayDispose(void) { - sceneManagerDispose(); spriteBatchDispose(); #if DISPLAY_SDL2 diff --git a/src/display/scene/scenemanager.c b/src/display/scene/scenemanager.c deleted file mode 100644 index 146c63e..0000000 --- a/src/display/scene/scenemanager.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2025 Dominic Masters - * - * This software is released under the MIT License. - * https://opensource.org/licenses/MIT - */ - -#include "scenemanager.h" - -scenemanager_t SCENE_MANAGER; - -// scene_t SCENE_MANAGER_SCENES[SCENE_TYPE_COUNT] = { -// [SCENE_TYPE_LOGO] = { 0 }, - -// [SCENE_TYPE_TEST] = { -// .init = sceneTestInit, -// .update = sceneTestUpdate, -// .render = sceneTestRender, -// .dispose = sceneTestDispose -// }, - -// [SCENE_TYPE_OVERWORLD] = { -// .init = sceneOverworldInit, -// .update = sceneOverworldUpdate, -// .render = sceneOverworldRender, -// .dispose = sceneOverworldDispose -// } -// }; - -errorret_t sceneManagerInit(void) { - // scene_t *initial = &SCENE_MANAGER_SCENES[SCENE_TYPE_INITIAL]; - // if(initial->init != NULL) errorChain(initial->init()); - errorOk(); -} - -void sceneManagerUpdate(void) { - // For each scene. - // for(uint8_t i = 0; i < SCENE_TYPE_COUNT; i++) { - // scene_t *scene = &SCENE_MANAGER_SCENES[i]; - // if((scene->flags & SCENE_FLAG_ACTIVE) == 0) continue; - // if(scene->update != NULL) scene->update(); - // } -} - -void sceneManagerRender(void) { - // for(uint8_t i = 0; i < SCENE_TYPE_COUNT; i++) { - // scene_t *scene = &SCENE_MANAGER_SCENES[i]; - // if((scene->flags & SCENE_FLAG_VISIBLE) == 0) continue; - // if(scene->render != NULL) scene->render(); - // } -} - -void sceneManagerDispose(void) { - // for(uint8_t i = 0; i < SCENE_TYPE_COUNT; i++) { - // scene_t *scene = &SCENE_MANAGER_SCENES[i]; - // if(scene->dispose != NULL) scene->dispose(); - // } -} diff --git a/src/engine/engine.c b/src/engine/engine.c index 21c3c34..abad84d 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -11,6 +11,7 @@ #include "input/input.h" #include "console/console.h" #include "display/display.h" +#include "scene/scenemanager.h" #include "asset/assetmanager.h" #include "game/game.h" @@ -29,6 +30,7 @@ errorret_t engineInit(void) { inputInit(); errorChain(assetManagerInit()); errorChain(displayInit()); + errorChain(sceneManagerInit()); errorChain(gameInit()); // Init scripts @@ -48,6 +50,7 @@ errorret_t engineUpdate(void) { assetManagerUpdate(); gameUpdate(); + sceneManagerUpdate(); errorChain(displayUpdate()); errorOk(); diff --git a/src/game/game.h b/src/game/game.h index ba0f502..513877d 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -15,11 +15,6 @@ */ errorret_t gameInit(void); -/** - * Render the game. - */ -void gameRender(void); - /** * Update the game state. */ diff --git a/src/game/minesweeper/game.c b/src/game/minesweeper/game.c index 8b7bbcd..b030180 100644 --- a/src/game/minesweeper/game.c +++ b/src/game/minesweeper/game.c @@ -18,10 +18,6 @@ void gameUpdate(void) { } -void gameRender(void) { - uiRender(); -} - void gameDispose(void) { uiDispose(); } \ No newline at end of file diff --git a/src/game/minesweeper/scene/scenesweep.c b/src/game/minesweeper/scene/scenesweep.c new file mode 100644 index 0000000..bd92583 --- /dev/null +++ b/src/game/minesweeper/scene/scenesweep.c @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "scenesweep.h" + +scene_t SCENE_SWEEP = { + .init = sceneSweepInit, + .update = sceneSweepUpdate, + .render = sceneSweepRender, + .dispose = sceneSweepDispose, + .active = NULL, + .sleep = NULL, + .flags = 0 +}; + +scenesweep_t SCENE_SWEEP_DATA; + +errorret_t sceneSweepInit(void) { + // Initialize scene data here + + errorOk(); +} + +void sceneSweepUpdate(void) { + // Update scene logic here +} + +void sceneSweepRender(void) { + // Render scene here +} + +void sceneSweepDispose(void) { + // Clean up scene resources here +} \ No newline at end of file diff --git a/src/game/minesweeper/scene/scenesweep.h b/src/game/minesweeper/scene/scenesweep.h new file mode 100644 index 0000000..4285098 --- /dev/null +++ b/src/game/minesweeper/scene/scenesweep.h @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "scene/scene.h" + +typedef struct { + +} scenesweep_t; + +extern scene_t SCENE_SWEEP; +extern scenesweep_t SCENE_SWEEP_DATA; + +/** + * Initializes the scene. + */ +errorret_t sceneSweepInit(void); + +/** + * Updates the state of the scene. + */ +void sceneSweepUpdate(void); + +/** + * Renders the current state of the scene. + */ +void sceneSweepRender(void); + +/** + * Cleans up resources used by the scene. + */ +void sceneSweepDispose(void); \ No newline at end of file diff --git a/src/display/scene/CMakeLists.txt b/src/scene/CMakeLists.txt similarity index 100% rename from src/display/scene/CMakeLists.txt rename to src/scene/CMakeLists.txt diff --git a/src/display/scene/scene.h b/src/scene/scene.h similarity index 84% rename from src/display/scene/scene.h rename to src/scene/scene.h index 8c221cc..f17a7dd 100644 --- a/src/display/scene/scene.h +++ b/src/scene/scene.h @@ -9,14 +9,14 @@ #include "dusk.h" #include "error/error.h" -#define SCENE_FLAG_VISIBLE (1 << 0) -#define SCENE_FLAG_ACTIVE (1 << 1) +#define SCENE_FLAG_ACTIVE (1 << 0) typedef struct { errorret_t (*init)(void); void (*update)(void); void (*render)(void); void (*dispose)(void); + void (*active)(void); void (*sleep)(void); diff --git a/src/scene/scenemanager.c b/src/scene/scenemanager.c new file mode 100644 index 0000000..f486d52 --- /dev/null +++ b/src/scene/scenemanager.c @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2025 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "scenemanager.h" +#include "util/memory.h" +#include "assert/assert.h" + +scenemanager_t SCENE_MANAGER; + +errorret_t sceneManagerInit(void) { + memoryZero(&SCENE_MANAGER, sizeof(scenemanager_t)); + + errorOk(); +} + +void sceneManagerSetScene(scene_t *scene) { + if(SCENE_MANAGER.current) { + SCENE_MANAGER.current->sleep(); + SCENE_MANAGER.current->flags &= ~SCENE_FLAG_ACTIVE; + } + + SCENE_MANAGER.current = scene; + + if(SCENE_MANAGER.current) { + SCENE_MANAGER.current->active(); + SCENE_MANAGER.current->flags |= SCENE_FLAG_ACTIVE; + } +} + +void sceneManagerUpdate(void) { + if(!SCENE_MANAGER.current) return; + assertTrue( + SCENE_MANAGER.current->flags & SCENE_FLAG_ACTIVE, + "Current scene not active" + ); + SCENE_MANAGER.current->update(); +} + +void sceneManagerRender(void) { + if(!SCENE_MANAGER.current) return; + assertTrue( + SCENE_MANAGER.current->flags & SCENE_FLAG_ACTIVE, + "Current scene not active" + ); + SCENE_MANAGER.current->render(); +} + +void sceneManagerDispose(void) { + assertNull(SCENE_MANAGER.current, "Current scene not null"); +} diff --git a/src/display/scene/scenemanager.h b/src/scene/scenemanager.h similarity index 78% rename from src/display/scene/scenemanager.h rename to src/scene/scenemanager.h index c819861..138c977 100644 --- a/src/display/scene/scenemanager.h +++ b/src/scene/scenemanager.h @@ -9,17 +9,23 @@ #include "scene.h" typedef struct { - int nothing; + scene_t *current; } scenemanager_t; extern scenemanager_t SCENE_MANAGER; -// extern scene_t SCENE_MANAGER_SCENES[SCENE_TYPE_COUNT]; /** * Initializes the scene manager and the initial scene. */ errorret_t sceneManagerInit(void); +/** + * Sets the current active scene. + * + * @param scene The scene to set as current. + */ +void sceneManagerSetScene(scene_t *scene); + /** * Updates all active scenes. */