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 0000000..a27f452 Binary files /dev/null and b/assets/minesweeper/sweep/backgrounds.png differ diff --git a/assets/minesweeper/sweep/borders.png b/assets/minesweeper/sweep/borders.png new file mode 100644 index 0000000..a293a2e Binary files /dev/null and b/assets/minesweeper/sweep/borders.png differ diff --git a/assets/minesweeper/sweep/cells.png b/assets/minesweeper/sweep/cells.png new file mode 100644 index 0000000..df2edcf Binary files /dev/null and b/assets/minesweeper/sweep/cells.png differ diff --git a/assets/minesweeper/sweep/grids.png b/assets/minesweeper/sweep/grids.png new file mode 100644 index 0000000..6c62ec6 Binary files /dev/null and b/assets/minesweeper/sweep/grids.png differ diff --git a/assets/minesweeper/sweep/ui.png b/assets/minesweeper/sweep/ui.png new file mode 100644 index 0000000..28b2df5 Binary files /dev/null and b/assets/minesweeper/sweep/ui.png differ 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. */