From 6f9e8a3ed46071bbe1af53781c318192c4ab3235 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 27 May 2026 12:09:17 -0400 Subject: [PATCH] Refactor to allow for the new screen flow. --- src/constants.hpp | 4 +- src/graphics/raycaster.cpp | 11 ++- src/graphics/raycaster.hpp | 5 +- src/gui/fsm.cpp | 4 +- src/gui/fsm.hpp | 6 +- src/{storyboard/ui.cpp => gui/storyboard.cpp} | 6 +- src/{storyboard/ui.hpp => gui/storyboard.hpp} | 1 + src/main.cpp | 68 +++++++++++-------- src/meson.build | 4 +- tools/storyboard.cpp | 2 +- 10 files changed, 59 insertions(+), 52 deletions(-) rename src/{storyboard/ui.cpp => gui/storyboard.cpp} (97%) rename src/{storyboard/ui.hpp => gui/storyboard.hpp} (98%) diff --git a/src/constants.hpp b/src/constants.hpp index aaf480e..759f321 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -79,8 +79,8 @@ constexpr int SCENE_VIEW_Y=0; constexpr int INITIAL_MAP_W = 21; constexpr int INITIAL_MAP_H = 21; -constexpr float DEFAULT_ROTATE=0.25f; -constexpr float DEFAULT_ROTATE_SPEED=DEFAULT_ROTATE / 2.0f; +constexpr float DEFAULT_ROTATE=0.5f; +constexpr float DEFAULT_ROTATE_SPEED=DEFAULT_ROTATE / 5.0f; constexpr float DEFAULT_MOVE_SPEED=0.1f; // for the panels/renderer diff --git a/src/graphics/raycaster.cpp b/src/graphics/raycaster.cpp index 0956a09..a2803f2 100644 --- a/src/graphics/raycaster.cpp +++ b/src/graphics/raycaster.cpp @@ -121,11 +121,10 @@ inline void set_scale_position(sf::Sprite& sprite, sf::Vector2f& position, sf::V } -void Raycaster::sprite_casting() { +void Raycaster::sprite_casting(sf::RenderTarget& target) { auto& lights = $level.lights->lighting(); auto world = $level.world; $level.collision->distance_sorted($sprite_order, {(size_t)$pos_x, (size_t)$pos_y}, RENDER_DISTANCE); - $sprites_to_render.clear(); // BUG: shaders are shared between sprites // BUG: sprites seem to be shared too? Put a torch on the floor in a room then another to its left and only one is visible at a time. @@ -226,12 +225,13 @@ void Raycaster::sprite_casting() { auto anim = world->get_if(rec.entity); if(anim != nullptr && anim->playing) { + // BUG: why use refs for sf_sprite? Can it just be pointer? step_animation(*anim, *sf_sprite, position, scale, in_texture, origin); } else { set_scale_position(*sf_sprite, position, scale, in_texture, origin); } - $sprites_to_render.emplace_back(sf_sprite, effect); + target.draw(*sf_sprite, effect.get()); } } } @@ -438,16 +438,13 @@ void Raycaster::update() { draw_ceiling_floor(); cast_rays(); draw_pixel_buffer(); - sprite_casting(); } // BUG: if target is a rendertarget then I can say it has to be the viewport only, then I can get rid of $screen_pos_x/y void Raycaster::render(sf::RenderTarget& target) { target.draw($view_sprite); - for(auto [sprite, effect] : $sprites_to_render) { - target.draw(*sprite, effect.get()); - } + sprite_casting(target); } void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite) { diff --git a/src/graphics/raycaster.hpp b/src/graphics/raycaster.hpp index ad0c9a1..2fbb0fb 100644 --- a/src/graphics/raycaster.hpp +++ b/src/graphics/raycaster.hpp @@ -21,7 +21,7 @@ struct CameraLOL { double target_plane_y = 0.0; }; -using SpriteRender = std::pair, std::shared_ptr>; +using SpriteRender = std::pair>; struct Raycaster { sf::Texture $view_texture; @@ -52,7 +52,6 @@ struct Raycaster { std::unordered_map $sprites; // BUG: this can be way better I think - std::vector $sprites_to_render; SortedEntities $sprite_order; GameDB::Level $level; @@ -64,7 +63,7 @@ struct Raycaster { void cast_rays(); void draw_ceiling_floor(); void draw_pixel_buffer(); - void sprite_casting(); + void sprite_casting(sf::RenderTarget& target); void update(); void render(sf::RenderTarget& target); diff --git a/src/gui/fsm.cpp b/src/gui/fsm.cpp index 2e8b3ff..27b11aa 100644 --- a/src/gui/fsm.cpp +++ b/src/gui/fsm.cpp @@ -18,8 +18,8 @@ namespace gui { using namespace components; using game::Event; - FSM::FSM() : - $window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"), + FSM::FSM(sf::RenderWindow& window) : + $window(window), $main_ui($window), $combat_ui(false), $dnd_loot($status_ui, $loot_ui, $window, $router) diff --git a/src/gui/fsm.hpp b/src/gui/fsm.hpp index 3f29a95..3958176 100644 --- a/src/gui/fsm.hpp +++ b/src/gui/fsm.hpp @@ -12,7 +12,7 @@ #include "events.hpp" #include "gui/event_router.hpp" #include "gui/dnd_loot.hpp" -#include "storyboard/ui.hpp" +#include "storyboard.hpp" #include "events.hpp" #include "game/registry.hpp" @@ -31,7 +31,7 @@ namespace gui { class FSM : public DeadSimpleFSM { public: - sf::RenderWindow $window; + sf::RenderWindow& $window; bool $draw_stats = false; bool autowalking = false; bool $map_open = false; @@ -47,7 +47,7 @@ namespace gui { DNDLoot $dnd_loot; System::Registry $systems; - FSM(); + FSM(sf::RenderWindow& window); void event(game::Event ev, std::any data={}); void autowalk(); diff --git a/src/storyboard/ui.cpp b/src/gui/storyboard.cpp similarity index 97% rename from src/storyboard/ui.cpp rename to src/gui/storyboard.cpp index d0b3726..fc4923c 100644 --- a/src/storyboard/ui.cpp +++ b/src/gui/storyboard.cpp @@ -1,4 +1,4 @@ -#include "storyboard/ui.hpp" +#include "gui/storyboard.hpp" #include "game/components.hpp" #include "game/sound.hpp" #include "game/config.hpp" @@ -47,6 +47,10 @@ namespace storyboard { window.draw($view_sprite); } + void UI::stop() { + $audio->stop(); + } + bool UI::playing() { return $audio->getStatus() == sf::SoundSource::Status::Playing; } diff --git a/src/storyboard/ui.hpp b/src/gui/storyboard.hpp similarity index 98% rename from src/storyboard/ui.hpp rename to src/gui/storyboard.hpp index 4dfec3c..b744fc9 100644 --- a/src/storyboard/ui.hpp +++ b/src/gui/storyboard.hpp @@ -29,6 +29,7 @@ namespace storyboard { void reset(); void track_audio(); bool playing(); + void stop(); void config_camera(cinematic::Camera &camera); }; diff --git a/src/main.cpp b/src/main.cpp index 07da840..dbe9f10 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,34 @@ #include "game/level.hpp" #include "graphics/camera.hpp" +void play_game(std::shared_ptr main) { + sound::play("ambient_1", true); + sound::mute(false); + main->event(game::Event::START); + + while(main->active()) { + main->update(); + main->render(); + + if(main->in_state(gui::State::BOSS_FIGHT)) { + main->handle_boss_fight_events(); + } else { + // BUG: need to sort out how to deal with this in the FSM + if(main->in_state(gui::State::IDLE) + || main->in_state(gui::State::LOOTING) + || main->in_state(gui::State::CUT_SCENE_PLAYING)) + { + main->handle_keyboard_mouse(); + } else{ + main->event(game::Event::TICK); + } + + main->handle_world_events(); + } + } +} + + int main(int argc, char* argv[]) { try { gui::Backend backend; @@ -19,41 +47,21 @@ int main(int argc, char* argv[]) { ai::init("ai"); GameDB::init(); cinematic::init(); - sound::mute(true); - gui::FSM main; - main.event(game::Event::START); - Autowalker walker(main); + sf::RenderWindow window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"); + window.setVerticalSyncEnabled(VSYNC); + if(FRAME_LIMIT) window.setFramerateLimit(FRAME_LIMIT); + window.setPosition({0,0}); - sound::play("ambient_1", true); + auto main = std::make_shared(window); - if(argc > 1 && argv[1][0] == 't') { - walker.start_autowalk(); - } + while(true) { + play_game(main); - while(main.active()) { - main.update(); - main.render(); - - if(main.in_state(gui::State::BOSS_FIGHT)) { - main.handle_boss_fight_events(); - } else { - // BUG: need to sort out how to deal with this in the FSM - if(main.in_state(gui::State::IDLE) - || main.in_state(gui::State::LOOTING) - || main.in_state(gui::State::CUT_SCENE_PLAYING)) - { - if(main.autowalking) { - walker.autowalk(); - } else { - main.handle_keyboard_mouse(); - } - } else{ - main.event(game::Event::TICK); - } - - main.handle_world_events(); + if(!main->active()) { + // TODO: this is where we handle the restarts + break; } } diff --git a/src/meson.build b/src/meson.build index d59ec59..3a150a5 100644 --- a/src/meson.build +++ b/src/meson.build @@ -28,9 +28,7 @@ sources = files( 'gui/ritual_ui.cpp', 'gui/status_ui.cpp', 'gui/scene_ui.cpp', - - # storyboard - 'storyboard/ui.cpp', + 'gui/storyboard.cpp', # graphics 'graphics/animation.cpp', diff --git a/tools/storyboard.cpp b/tools/storyboard.cpp index b28b537..3d90289 100644 --- a/tools/storyboard.cpp +++ b/tools/storyboard.cpp @@ -7,7 +7,7 @@ #include "gui/backend.hpp" #include "gui/event_router.hpp" #include "graphics/camera.hpp" -#include "storyboard/ui.hpp" +#include "gui/storyboard.hpp" int main(int, char*[]) { components::init();