From 06f60982819e2e7d1168f145a47a46d6dcb6026c Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 25 Sep 2025 11:40:09 -0400 Subject: [PATCH] Create the systems.cpp for the boss fight mini game. --- boss/system.cpp | 29 +++++++++++++++++++++++++++++ boss/system.hpp | 11 +++++++++++ boss/ui.cpp | 14 ++++++++++---- game_level.cpp | 44 +++++++++++++------------------------------- game_level.hpp | 3 +-- gui/fsm.cpp | 3 ++- meson.build | 1 + 7 files changed, 67 insertions(+), 38 deletions(-) create mode 100644 boss/system.cpp create mode 100644 boss/system.hpp diff --git a/boss/system.cpp b/boss/system.cpp new file mode 100644 index 0000000..718bf72 --- /dev/null +++ b/boss/system.cpp @@ -0,0 +1,29 @@ +#include "boss/system.hpp" +#include +#include "components.hpp" +#include "game_level.hpp" + +namespace boss { + using namespace components; + + void System::load_config() { + fmt::println("load it"); + } + + shared_ptr System::create_bossfight() { + auto& level = GameDB::current_level(); + auto prev_world = GameDB::current_world(); + dbc::check(prev_world != nullptr, "Starter world for boss fights can't be null."); + auto world = GameDB::clone_load_world(prev_world); + auto& config = prev_world->get_the(); + + auto boss_names = config.bosses.keys(); + auto& level_name = boss_names[level.index % boss_names.size()]; + auto& boss_data = config.bosses[level_name]; + + auto boss_id = world->entity(); + components::configure_entity(*world, boss_id, boss_data["components"]); + + return make_shared(world, boss_id); + } +} diff --git a/boss/system.hpp b/boss/system.hpp new file mode 100644 index 0000000..d829057 --- /dev/null +++ b/boss/system.hpp @@ -0,0 +1,11 @@ +#pragma once +#include "dinkyecs.hpp" +#include +#include "boss/ui.hpp" + +namespace boss { + namespace System { + void load_config(); + std::shared_ptr create_bossfight(); + } +} diff --git a/boss/ui.cpp b/boss/ui.cpp index c4e4543..66a0e90 100644 --- a/boss/ui.cpp +++ b/boss/ui.cpp @@ -1,5 +1,6 @@ #include "boss/ui.hpp" #include "constants.hpp" +#include "components.hpp" namespace boss { using namespace guecs; @@ -7,11 +8,16 @@ namespace boss { UI::UI(shared_ptr world, Entity boss_id) : $world(world), $boss_id(boss_id), - $combat_ui(true), - $boss_sprite(textures::get_sprite("test_boss")), - $player_sprite(textures::get_sprite("test_player")), - $floor_sprite(textures::get_sprite("test_floor")) + $combat_ui(true) { + auto& sprite = world->get($boss_id); + $boss_sprite = textures::get_sprite(sprite.name); + + auto& boss_conf = world->get($boss_id); + // floor is std::optional + $floor_sprite = textures::get_sprite(*boss_conf.floor); + + $player_sprite = textures::get_sprite("test_player"); } void UI::init() { diff --git a/game_level.cpp b/game_level.cpp index aead2a5..1157660 100644 --- a/game_level.cpp +++ b/game_level.cpp @@ -16,19 +16,6 @@ struct LevelScaling { int map_height=20; }; -inline shared_ptr clone_load_world(shared_ptr prev_world) -{ - auto world = make_shared(); - - if(prev_world == nullptr) { - GameDB::load_configs(*world); - } else { - prev_world->clone_into(*world); - } - - return world; -} - namespace GameDB { using std::shared_ptr, std::string, std::make_shared; @@ -48,6 +35,19 @@ namespace GameDB { }; } + shared_ptr clone_load_world(shared_ptr prev_world) { + auto world = make_shared(); + + if(prev_world == nullptr) { + GameDB::load_configs(*world); + } else { + prev_world->clone_into(*world); + } + + return world; + } + + size_t new_level(std::shared_ptr prev_world) { dbc::check(initialized, "Forgot to call GameDB::init()"); auto world = clone_load_world(prev_world); @@ -88,24 +88,6 @@ namespace GameDB { return current_level().world; } - shared_ptr create_bossfight() { - dbc::check(initialized, "Forgot to call GameDB::init()"); - auto prev_world = current_world(); - dbc::check(prev_world != nullptr, "Starter world for boss fights can't be null."); - auto world = clone_load_world(prev_world); - auto& config = prev_world->get_the(); - - // BUG: the jank is too strong here - auto boss_names = config.bosses.keys(); - auto& level_name = boss_names[LDB->current_level % boss_names.size()]; - auto& boss_data = config.bosses[level_name]; - - auto boss_id = world->entity(); - components::configure_entity(*world, boss_id, boss_data["components"]); - - return make_shared(world, boss_id); - } - Level& create_level() { dbc::check(initialized, "Forgot to call GameDB::init()"); dbc::check(LDB->current_level < LDB->levels.size(), "attempt to get next level when at end"); diff --git a/game_level.hpp b/game_level.hpp index 595846b..1c1609b 100644 --- a/game_level.hpp +++ b/game_level.hpp @@ -2,7 +2,6 @@ #include "dinkyecs.hpp" #include "boss/ui.hpp" -#include "dinkyecs.hpp" #include "lights.hpp" #include "map.hpp" #include @@ -22,7 +21,6 @@ namespace GameDB { std::shared_ptr collision = nullptr; }; - std::shared_ptr create_bossfight(); Level& create_level(); void init(); @@ -31,5 +29,6 @@ namespace GameDB { components::Position& player_position(); DinkyECS::Entity the_player(); + std::shared_ptr clone_load_world(std::shared_ptr prev_world); void load_configs(DinkyECS::World &world); } diff --git a/gui/fsm.cpp b/gui/fsm.cpp index 2bee864..0900018 100644 --- a/gui/fsm.cpp +++ b/gui/fsm.cpp @@ -13,6 +13,7 @@ #include #include "gui/guecstra.hpp" #include "game_level.hpp" +#include "boss/system.hpp" namespace gui { using namespace components; @@ -544,7 +545,7 @@ namespace gui { void FSM::next_level(bool bossfight) { if(bossfight) { - $boss_fight_ui = GameDB::create_bossfight(); + $boss_fight_ui = boss::System::create_bossfight(); $boss_fight_ui->init(); } else { GameDB::create_level(); diff --git a/meson.build b/meson.build index 873a2dd..0def83f 100644 --- a/meson.build +++ b/meson.build @@ -86,6 +86,7 @@ sources = [ 'autowalker.cpp', 'backend.cpp', 'battle.cpp', + 'boss/system.cpp', 'boss/ui.cpp', 'combat.cpp', 'components.cpp',