From c7c48658bda4d5d7db69f721431161c1bdf2dcc4 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 6 Apr 2025 15:32:19 -0400 Subject: [PATCH] Lots of dumb little edits to sort out what I'm aiming at. I'll next clean out most of this in a refactor. --- assets/enemies.json | 2 +- camera.cpp | 19 +++++++++++++------ camera.hpp | 15 ++++++++++----- gui_fsm.cpp | 5 +++-- main_ui.cpp | 21 +++++++++++++++------ map_view.cpp | 4 ++-- map_view.hpp | 2 +- mini_map.cpp | 4 ++-- mini_map.hpp | 2 +- raycaster.cpp | 2 +- raycaster.hpp | 1 + systems.cpp | 10 +++++++++- systems.hpp | 2 +- 13 files changed, 60 insertions(+), 29 deletions(-) diff --git a/assets/enemies.json b/assets/enemies.json index 6b1eb55..424edce 100644 --- a/assets/enemies.json +++ b/assets/enemies.json @@ -58,7 +58,7 @@ }, "SPIDER_GIANT_HAIRY": { "components": [ - {"_type": "Tile", "display": 2282, + {"_type": "Tile", "display": 1218, "foreground": [205, 164, 246], "background": [30, 20, 75] }, diff --git a/camera.cpp b/camera.cpp index d616351..2293cd6 100644 --- a/camera.cpp +++ b/camera.cpp @@ -2,7 +2,7 @@ #include #include -Point CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) { +Point CameraLOL::plan_move(int dir, bool strafe) { t = 0.0; if(strafe) { target_x = rayview.$pos_x + int(-rayview.$dir_y * 1.5 * dir); @@ -15,7 +15,7 @@ Point CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) { return {size_t(target_x), size_t(target_y)}; } -void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { +void CameraLOL::plan_rotate(int dir) { t = 0.0; double angle_dir = std::numbers::pi * 0.25 * dir; @@ -26,24 +26,31 @@ void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { target_plane_y = rayview.$plane_x * sin(angle_dir) + rayview.$plane_y * cos(angle_dir); } -bool CameraLOL::play_rotate(Raycaster &rayview) { +bool CameraLOL::play_rotate() { t += rot_speed; rayview.$dir_x = std::lerp(rayview.$dir_x, target_dir_x, t); rayview.$dir_y = std::lerp(rayview.$dir_y, target_dir_y, t); rayview.$plane_x = std::lerp(rayview.$plane_x, target_plane_x, t); rayview.$plane_y = std::lerp(rayview.$plane_y, target_plane_y, t); - return t > 1.0; + return t >= 1.0; } -bool CameraLOL::play_move(Raycaster &rayview) { +bool CameraLOL::play_move() { t += move_speed; rayview.$pos_x = std::lerp(rayview.$pos_x, target_x, t); rayview.$pos_y = std::lerp(rayview.$pos_y, target_y, t); return t >= 1.0; } -void CameraLOL::abort_plan(Raycaster& rayview) { +void CameraLOL::abort_plan() { target_x = rayview.$pos_x; target_y = rayview.$pos_y; } + +Point CameraLOL::aimed_at() { + return { + size_t(rayview.$pos_x + rayview.$dir_x), + size_t(rayview.$pos_y + rayview.$dir_y) + }; +} diff --git a/camera.hpp b/camera.hpp index 445324b..d403045 100644 --- a/camera.hpp +++ b/camera.hpp @@ -2,6 +2,7 @@ #include "raycaster.hpp" struct CameraLOL { + Raycaster& rayview; double t = 0.0; double move_speed = 0.1; double rot_speed = 0.06; @@ -12,11 +13,15 @@ struct CameraLOL { double target_plane_x = 0.0; double target_plane_y = 0.0; - Point plan_move(Raycaster &rayview, int dir, bool strafe); - void plan_rotate(Raycaster &rayview, int dir); + CameraLOL(Raycaster& rv) : + rayview(rv) {} - bool play_rotate(Raycaster &rayview); - bool play_move(Raycaster &rayview); + Point plan_move(int dir, bool strafe); + void plan_rotate(int dir); - void abort_plan(Raycaster& rayview); + bool play_rotate(); + bool play_move(); + + void abort_plan(); + Point aimed_at(); }; diff --git a/gui_fsm.cpp b/gui_fsm.cpp index 9c7d277..ac66adf 100644 --- a/gui_fsm.cpp +++ b/gui_fsm.cpp @@ -311,10 +311,11 @@ namespace gui { $debug_ui.render($window); $status_ui.render($window); $combat_ui.render($window); + if($map_open) { - $map_ui.render($window); + $map_ui.render($window, $main_ui.$camera.aimed_at()); } else { - $mini_map.render($window); + $mini_map.render($window, $main_ui.$camera.aimed_at()); } } } diff --git a/main_ui.cpp b/main_ui.cpp index db9fe80..3f093d4 100644 --- a/main_ui.cpp +++ b/main_ui.cpp @@ -8,7 +8,8 @@ namespace gui { MainUI::MainUI(sf::RenderWindow& window) : $window(window), - $rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) + $rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT), + $camera($rayview) { $window.setVerticalSyncEnabled(VSYNC); $window.setFramerateLimit(FRAME_LIMIT); @@ -42,6 +43,13 @@ namespace gui { } void MainUI::render() { + auto aimed_at = $camera.aimed_at(); + if($level.collision->occupied(aimed_at)) { + $rayview.aiming_at = $level.collision->get(aimed_at); + } else { + $rayview.aiming_at = 0; + } + if($show_level) { auto time = $clock.getElapsedTime(); auto st = textures::get("down_the_well"); @@ -64,14 +72,15 @@ namespace gui { } bool MainUI::play_rotate() { - bool done = $camera.play_rotate($rayview); + bool done = $camera.play_rotate(); $needs_render = !done; + return done; } // this could be an optional that returs a Point std::optional MainUI::play_move() { - if($camera.play_move($rayview)) { + if($camera.play_move()) { $needs_render = false; Point pos{ size_t($camera.target_x), @@ -88,15 +97,15 @@ namespace gui { // -1 is left, 1 is right $compass_dir = ($compass_dir + dir) % $compass.size(); $overlay_ui.show_text("left", $compass[$compass_dir]); - $camera.plan_rotate($rayview, dir); + $camera.plan_rotate(dir); } Point MainUI::plan_move(int dir, bool strafe) { - return $camera.plan_move($rayview, dir, strafe); + return $camera.plan_move(dir, strafe); } void MainUI::abort_plan() { - $camera.abort_plan($rayview); + $camera.abort_plan(); } void MainUI::dead_entity(DinkyECS::Entity entity) { diff --git a/map_view.cpp b/map_view.cpp index e226a27..83ee449 100644 --- a/map_view.cpp +++ b/map_view.cpp @@ -44,13 +44,13 @@ namespace gui { $gui.init(); } - void MapViewUI::render(sf::RenderWindow &window) { + void MapViewUI::render(sf::RenderWindow &window, Point aim) { window.draw(*$paper.sprite); auto grid = $gui.entity("map_grid"); auto status = $gui.entity("status"); - std::wstring map_out = System::draw_map($level, 23, 9); + std::wstring map_out = System::draw_map($level, 23, 9, aim); auto& map_text = $gui.get(grid); map_text.update(map_out); diff --git a/map_view.hpp b/map_view.hpp index 8a5d85a..984e5e6 100644 --- a/map_view.hpp +++ b/map_view.hpp @@ -13,7 +13,7 @@ namespace gui { MapViewUI(GameLevel &level); void init(); - void render(sf::RenderWindow &window); + void render(sf::RenderWindow &window, Point aim); void update_level(GameLevel &level); }; } diff --git a/mini_map.cpp b/mini_map.cpp index d0968b0..1812383 100644 --- a/mini_map.cpp +++ b/mini_map.cpp @@ -31,8 +31,8 @@ namespace gui { $map_grid.init(cell, $font); } - void MiniMapUI::render(sf::RenderWindow &window) { - std::wstring map_out = System::draw_map($level, 5, 3); + void MiniMapUI::render(sf::RenderWindow &window, Point aim) { + std::wstring map_out = System::draw_map($level, 5, 3, aim); $map_grid.update(map_out); window.draw(*$map_grid.text); } diff --git a/mini_map.hpp b/mini_map.hpp index 28140de..5fd2ede 100644 --- a/mini_map.hpp +++ b/mini_map.hpp @@ -14,7 +14,7 @@ namespace gui { MiniMapUI(GameLevel &level); void init(guecs::UI& overlay); - void render(sf::RenderWindow &window); + void render(sf::RenderWindow &window, Point aim); void update_level(GameLevel &level); }; } diff --git a/raycaster.cpp b/raycaster.cpp index 5130029..e96977f 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -165,13 +165,13 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { sf_sprite->setScale(scale); sf_sprite->setTextureRect(in_texture); sf_sprite->setPosition(position); - $brightness.setUniform("offsetFactor", sf::Glsl::Vec2{0.0f, 0.0f}); // the SpatialMap.distance_sorted only calculates the // (x1-x2)^2 + (y1-y2)^2 portion of distance, so to get // the actual distance we need to sqrt that. // float level = sqrt(rec.first); float level = lights[sprite_pos.location.y][sprite_pos.location.x] * PERCENT; + if(rec.second == aiming_at) level += 0.2; $brightness.setUniform("darkness", level); target.draw(*sf_sprite, &$brightness); } diff --git a/raycaster.hpp b/raycaster.hpp index e6572b5..2c24d1e 100644 --- a/raycaster.hpp +++ b/raycaster.hpp @@ -27,6 +27,7 @@ struct Raycaster { sf::Sprite $view_sprite; const uint32_t *$floor_texture = nullptr; const uint32_t *$ceiling_texture = nullptr; + DinkyECS::Entity aiming_at = 0; std::unique_ptr $pixels = nullptr; diff --git a/systems.cpp b/systems.cpp index 1044396..e34cc4b 100644 --- a/systems.cpp +++ b/systems.cpp @@ -337,7 +337,7 @@ void System::plan_motion(DinkyECS::World& world, Point move_to) { * This one is called inside the MapViewUI very often so * just avoid GameMap unlike the others. */ -std::wstring System::draw_map(GameLevel level, size_t view_x, size_t view_y) { +std::wstring System::draw_map(GameLevel level, size_t view_x, size_t view_y, Point aim) { DinkyECS::World &world = *level.world; Map &map = *level.map; @@ -360,6 +360,14 @@ std::wstring System::draw_map(GameLevel level, size_t view_x, size_t view_y) { } } + + if(aim.x >= cam_orig.x && aim.x <= cam_orig.x + view_x + && aim.y >= cam_orig.y && aim.y <= cam_orig.y + view_y) + { + Point aim_at = map.map_to_camera(aim, cam_orig); + grid[aim_at.y][aim_at.x] = '*'; + } + // then get the enemy/item/device tiles and fill those in world.query([&](auto, auto &pos, auto &entity_glyph) { if(pos.location.x >= cam_orig.x && pos.location.x <= cam_orig.x + view_x diff --git a/systems.hpp b/systems.hpp index 74225f6..c80d58c 100644 --- a/systems.hpp +++ b/systems.hpp @@ -17,7 +17,7 @@ namespace System { void init_positions(DinkyECS::World &world, SpatialMap &collider); void device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::Entity item); void plan_motion(DinkyECS::World& world, Point move_to); - std::wstring draw_map(GameLevel level, size_t view_x, size_t view_y); + std::wstring draw_map(GameLevel level, size_t view_x, size_t view_y, Point aim); void enemy_ai(GameLevel &level); void combat(GameLevel &level);