From 07e281d987ef440d6fb17480eb97e69f884fe11c Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 22 Sep 2025 13:43:36 -0400 Subject: [PATCH] Have a basic understanding of what to do for the boss fight arena, but now want to start over fresh. --- animation.cpp | 2 +- assets/animations.json | 10 +++ assets/config.json | 7 +- assets/hands/male_hand.png | Bin 17744 -> 10660 bytes boss/ui.cpp | 27 +++++++ boss/ui.hpp | 20 +++++ game_level.cpp | 7 +- game_level.hpp | 4 +- gui/boss_fight_ui.cpp | 156 ------------------------------------- gui/boss_fight_ui.hpp | 48 ------------ gui/fsm.hpp | 4 +- meson.build | 6 +- tests/map.cpp | 1 + tests/matrix.cpp | 1 + 14 files changed, 76 insertions(+), 217 deletions(-) create mode 100644 boss/ui.cpp create mode 100644 boss/ui.hpp delete mode 100644 gui/boss_fight_ui.cpp delete mode 100644 gui/boss_fight_ui.hpp diff --git a/animation.cpp b/animation.cpp index 7075ba8..c901119 100644 --- a/animation.cpp +++ b/animation.cpp @@ -72,7 +72,7 @@ namespace animation { bool apply(Animation& anim, sf::Sprite& sprite) { sf::IntRect rect{{0,0}, {anim.frame_width, anim.frame_height}}; - sf::Vector2f scale{1.0, 1.0}; + sf::Vector2f scale{anim.scale, anim.scale}; sf::Vector2f pos{0, 0}; anim.step(scale, pos, rect); diff --git a/assets/animations.json b/assets/animations.json index 2ba620e..16725d3 100644 --- a/assets/animations.json +++ b/assets/animations.json @@ -49,6 +49,16 @@ "speed": 0.2, "stationary": true }, + "peasant_girl_rear_view": { + "_type": "Animation", + "easing": 3, + "ease_rate": 0.2, + "scale": 0.5, + "simple": true, + "frames": 1, + "speed": 0.03, + "stationary": true + }, "gold_savior": { "_type": "Animation", "easing": 1, diff --git a/assets/config.json b/assets/config.json index 1ebfcc2..b2da914 100644 --- a/assets/config.json +++ b/assets/config.json @@ -239,6 +239,11 @@ {"path": "assets/hands/female_hand.png", "frame_width": 900, "frame_height": 600 + }, + "peasant_girl_rear_view": + {"path": "assets/sprites/peasant_girl_rear_view_01.png", + "frame_width": 400, + "frame_height": 543 } }, "worldgen": { @@ -267,6 +272,6 @@ "font_file_name": "assets/text.otf" }, "player": { - "hands": "male_hand" + "hands": "female_hand" } } diff --git a/assets/hands/male_hand.png b/assets/hands/male_hand.png index 76c5906763febfacb6ec62e45d48957b753a0803..41b2ba3fe6697cbcb8dc8a5b82c2b36b16e53bac 100644 GIT binary patch literal 10660 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 literal 17744 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 diff --git a/boss/ui.cpp b/boss/ui.cpp new file mode 100644 index 0000000..588c8d7 --- /dev/null +++ b/boss/ui.cpp @@ -0,0 +1,27 @@ +#include "boss/ui.hpp" + +namespace boss { + UI::UI(shared_ptr world, Entity boss_id) { + (void)world; + (void)boss_id; + } + + void UI::init() { + + } + + void UI::render(sf::RenderWindow& window) { + (void)window; + } + + bool UI::mouse(float x, float y, guecs::Modifiers mods) { + (void)x; + (void)y; + (void)mods; + return false; + } + + bool UI::boss_dead() { + return true; + } +} diff --git a/boss/ui.hpp b/boss/ui.hpp new file mode 100644 index 0000000..86f2ac7 --- /dev/null +++ b/boss/ui.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "dinkyecs.hpp" +#include +#include +#include + +namespace boss { + using std::shared_ptr; + using namespace DinkyECS; + + struct UI { + + UI(shared_ptr world, Entity boss_id); + + void init(); + void render(sf::RenderWindow& window); + bool mouse(float x, float y, guecs::Modifiers mods); + bool boss_dead(); + }; +} diff --git a/game_level.cpp b/game_level.cpp index 243a16f..aead2a5 100644 --- a/game_level.cpp +++ b/game_level.cpp @@ -5,6 +5,7 @@ #include "systems.hpp" #include "components.hpp" #include "rituals.hpp" +#include "textures.hpp" using lighting::LightRender; using std::shared_ptr, std::make_shared; @@ -47,7 +48,6 @@ namespace GameDB { }; } - 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,7 +88,7 @@ namespace GameDB { return current_level().world; } - shared_ptr create_bossfight() { + 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."); @@ -103,10 +103,9 @@ namespace GameDB { auto boss_id = world->entity(); components::configure_entity(*world, boss_id, boss_data["components"]); - return make_shared(world, boss_id); + 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 3cc50e7..595846b 100644 --- a/game_level.hpp +++ b/game_level.hpp @@ -1,7 +1,7 @@ #pragma once #include "dinkyecs.hpp" -#include "gui/boss_fight_ui.hpp" +#include "boss/ui.hpp" #include "dinkyecs.hpp" #include "lights.hpp" #include "map.hpp" @@ -22,7 +22,7 @@ namespace GameDB { std::shared_ptr collision = nullptr; }; - std::shared_ptr create_bossfight(); + std::shared_ptr create_bossfight(); Level& create_level(); void init(); diff --git a/gui/boss_fight_ui.cpp b/gui/boss_fight_ui.cpp deleted file mode 100644 index c749651..0000000 --- a/gui/boss_fight_ui.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include "gui/boss_fight_ui.hpp" -#include "easings.hpp" -#include "sound.hpp" -#include - -namespace gui { - using namespace guecs; - - BossFightUI::BossFightUI(shared_ptr world, DinkyECS::Entity boss_id) - : $world(world), - $boss_id(boss_id), - $config(world->get_the()) - { - $status.position(0, 0, BOSS_VIEW_X, SCREEN_HEIGHT); - $status.layout( - "[main_status]" - "[=status_3|=status_4]" - "[=status_5|=status_6]" - "[=status_7|=status_8]"); - - $overlay.position(BOSS_VIEW_X, BOSS_VIEW_Y, - BOSS_VIEW_WIDTH, BOSS_VIEW_HEIGHT); - - $overlay.layout("[=overlay_1|=overlay_2|=overlay_4]" - "[=overlay_5|=overlay_6|=overlay_8]" - "[=overlay_9|=overlay_10|=overlay_12]" - "[=overlay_13|=overlay_14|=overlay_16]"); - - $sounds = $world->get($boss_id); - $combat = $world->get($boss_id); - } - - void BossFightUI::configure_sprite() { - $sprite_config = $world->get($boss_id); - $animation = $world->get($boss_id); - $animation.frame_width = $sprite_config.width; - - $boss_image = textures::get_sprite($sprite_config.name); - sf::IntRect frame_rect{{0,0},{$sprite_config.width,$sprite_config.height}}; - $boss_image.sprite->setTextureRect(frame_rect); - $boss_image.sprite->setScale({$sprite_config.scale, $sprite_config.scale}); - - auto bounds = $boss_image.sprite->getLocalBounds(); - auto bg_bounds = $boss_background.sprite->getLocalBounds(); - float x_diff = bg_bounds.size.x / 2; - - $boss_pos = {float(BOSS_VIEW_X) + x_diff, bounds.size.y / 2}; - $boss_image.sprite->setOrigin({bounds.size.x / 2, bounds.size.y / 2}); - $boss_image.sprite->setPosition($boss_pos); - } - - void BossFightUI::configure_background() { - auto& boss = $world->get($boss_id); - - $boss_background = textures::get_sprite(boss.background); - $boss_background.sprite->setPosition({BOSS_VIEW_X, BOSS_VIEW_Y}); - $status.set($status.MAIN, {$status.$parser}); - - if(boss.stage) { - $boss_has_stage = true; - $boss_stage = textures::get_sprite(*boss.stage); - $boss_stage.sprite->setPosition({BOSS_VIEW_X, BOSS_VIEW_Y}); - } - } - - void BossFightUI::configure_gui() { - for(auto& [name, cell] : $status.cells()) { - auto button = $status.entity(name); - $status.set(button, {}); - $status.set(button, { - [this, name](auto){ - dbc::log(fmt::format("STATUS: {}", name)); - } - }); - if(name == "main_status") { - $status.set(button, {fmt::format(L"HP: {}", $combat.hp)}); - } else { - $status.set(button, {L"Attack"}); - } - } - $status.init(); - - for(auto& [name, cell] : $overlay.cells()) { - auto region = $overlay.entity(name); - $overlay.set(region, { - [this, name](auto){ - dbc::log(fmt::format("OVERLAY: {}", name)); - } - }); - } - - $overlay.init(); - } - - void BossFightUI::init() { - // background must come first - configure_background(); - configure_sprite(); - configure_gui(); - } - - void BossFightUI::bounce_boss(sf::RenderWindow& window) { - sf::IntRect frame_rect{{0,0},{$sprite_config.width,$sprite_config.height}}; - sf::Vector2f scale{$sprite_config.scale, $sprite_config.scale}; - sf::Vector2f pos{$boss_pos.x, $boss_pos.y}; - - $animation.step(scale, pos, frame_rect); - $boss_image.sprite->setScale(scale); - - if($animation.stationary) $boss_image.sprite->setPosition(pos); - - if(!sound::playing($sounds.attack) && $animation.current == 1) { - sound::play($sounds.attack); - } - - $boss_image.sprite->setTextureRect(frame_rect); - window.draw(*$boss_image.sprite); - } - - void BossFightUI::render(sf::RenderWindow& window) { - window.draw(*$boss_background.sprite); - - if($boss_hit) { - bounce_boss(window); - } else { - window.draw(*$boss_image.sprite); - } - - if($boss_has_stage) { - window.draw(*$boss_stage.sprite); - } - - if($combat.hp == 0) { - $overlay.show_text("overlay_1", L"YOU WON!"); - $overlay.show_text("overlay_4", L"CLICK TO CONTINUE..."); - } - - $status.render(window); - $overlay.render(window); - } - - bool BossFightUI::mouse(float x, float y, guecs::Modifiers mods) { - if($status.mouse(x, y, mods)) { - dbc::log("STATUS button pressed"); - } - - if($overlay.mouse(x, y, mods)) { - $animation.play(); - sound::play("Sword_Hit_1"); - $boss_hit = !$boss_hit; - $combat.hp--; - } - - return false; - } -} diff --git a/gui/boss_fight_ui.hpp b/gui/boss_fight_ui.hpp deleted file mode 100644 index 614f6de..0000000 --- a/gui/boss_fight_ui.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include -#include -#include -#include "textures.hpp" -#include "components.hpp" -#include - -// aspect ratio of art is 3/2 so 1.5 -// possible sizes: 900/600; 1620/1080; 1800/1200 -// To calculate it do short side * 1.5 so 1080 * 1.5 == 1620 -// -// Side panel = 300/1080 - -namespace gui { - using std::string; - - class BossFightUI { - public: - sf::Clock $clock; - bool $boss_hit = false; - sf::Vector2f $boss_pos; - components::Combat $combat; - components::Sprite $sprite_config; - components::Sound $sounds; - components::Animation $animation; - guecs::UI $status; - guecs::UI $overlay; - textures::SpriteTexture $boss_image; - textures::SpriteTexture $boss_background; - bool $boss_has_stage = false; - textures::SpriteTexture $boss_stage; - std::shared_ptr $world = nullptr; - DinkyECS::Entity $boss_id; - components::GameConfig& $config; - - BossFightUI(std::shared_ptr world, DinkyECS::Entity boss_id); - - void init(); - void render(sf::RenderWindow& window); - bool mouse(float x, float y, guecs::Modifiers mods); - void bounce_boss(sf::RenderWindow& window); - bool boss_dead() { return $combat.hp < 0; } - void configure_sprite(); - void configure_background(); - void configure_gui(); - }; -} diff --git a/gui/fsm.hpp b/gui/fsm.hpp index 93efaa6..bba7002 100644 --- a/gui/fsm.hpp +++ b/gui/fsm.hpp @@ -7,7 +7,7 @@ #include "gui/combat_ui.hpp" #include "gui/status_ui.hpp" #include "gui/loot_ui.hpp" -#include "gui/boss_fight_ui.hpp" +#include "boss/ui.hpp" #include "gui/map_view.hpp" #include "events.hpp" #include "gui/event_router.hpp" @@ -36,7 +36,7 @@ namespace gui { int $temp_attack_id = 0; DebugUI $debug_ui; MainUI $main_ui; - std::shared_ptr $boss_fight_ui = nullptr; + std::shared_ptr $boss_fight_ui = nullptr; CombatUI $combat_ui; StatusUI $status_ui; MapViewUI $map_ui; diff --git a/meson.build b/meson.build index d4edac4..873a2dd 100644 --- a/meson.build +++ b/meson.build @@ -86,13 +86,13 @@ sources = [ 'autowalker.cpp', 'backend.cpp', 'battle.cpp', - 'palette.cpp', + 'boss/ui.cpp', 'combat.cpp', 'components.cpp', 'config.cpp', 'dbc.cpp', + 'game_level.cpp', 'goap.cpp', - 'gui/boss_fight_ui.cpp', 'gui/combat_ui.cpp', 'gui/debug_ui.cpp', 'gui/dnd_loot.cpp', @@ -111,6 +111,7 @@ sources = [ 'map.cpp', 'matrix.cpp', 'maze.cpp', + 'palette.cpp', 'pathing.cpp', 'rand.cpp', 'raycaster.cpp', @@ -123,7 +124,6 @@ sources = [ 'systems.cpp', 'textures.cpp', 'worldbuilder.cpp', - 'game_level.cpp', ] executable('runtests', sources + [ diff --git a/tests/map.cpp b/tests/map.cpp index ab1fa94..b3364b9 100644 --- a/tests/map.cpp +++ b/tests/map.cpp @@ -6,6 +6,7 @@ #include "game_level.hpp" #include "systems.hpp" #include +#include "textures.hpp" using namespace fmt; using namespace nlohmann; diff --git a/tests/matrix.cpp b/tests/matrix.cpp index ff6e9eb..fc19e53 100644 --- a/tests/matrix.cpp +++ b/tests/matrix.cpp @@ -9,6 +9,7 @@ #include #include "map.hpp" #include +#include "textures.hpp" using namespace nlohmann; using namespace fmt;