From 14128ab10fc96cc832e503e58b70c002638b7422 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 5 Feb 2025 14:16:31 -0500 Subject: [PATCH] Now have enemies chasing us around and implemented diagonal movement as a test but I kind of like it. --- assets/config.json | 6 +++--- camera.cpp | 2 +- gui.cpp | 27 ++++++++++++++++++++++++--- gui.hpp | 2 ++ raycaster.cpp | 14 +++++++------- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/assets/config.json b/assets/config.json index 6615929..a99e293 100644 --- a/assets/config.json +++ b/assets/config.json @@ -9,13 +9,13 @@ "ceiling": "assets/ceiling_test-256.png" }, "enemy": { - "HEARING_DISTANCE": 8 + "HEARING_DISTANCE": 20 }, "player": { }, "worldgen": { "enemy_probability": 20, - "empty_room_probability": 10, - "device_probability": 30 + "empty_room_probability": 50, + "device_probability": 0 } } diff --git a/camera.cpp b/camera.cpp index 290bbf2..089c477 100644 --- a/camera.cpp +++ b/camera.cpp @@ -16,7 +16,7 @@ void CameraLOL::plan_strafe(Raycaster &rayview, int dir) { void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { t = 0.0; - double angle_dir = std::numbers::pi * 0.5 * dir; + double angle_dir = std::numbers::pi * 0.25 * dir; targetDirX = rayview.$dirX * cos(angle_dir) - rayview.$dirY * sin(angle_dir); targetDirY = rayview.$dirX * sin(angle_dir) + rayview.$dirY * cos(angle_dir); diff --git a/gui.cpp b/gui.cpp index d61f7ac..739a8f8 100644 --- a/gui.cpp +++ b/gui.cpp @@ -5,6 +5,7 @@ #include #include "components.hpp" #include +#include "systems.hpp" using namespace components; @@ -43,6 +44,15 @@ namespace gui { void FSM::MOVING(Event ) { if($camera.play_move($rayview)) { + + auto &level = $levels.current(); + auto player = level.world->get_the(); + auto& player_position = level.world->get(player.entity); + player_position.location.x = size_t($camera.targetX); + player_position.location.y = size_t($camera.targetY); + + run_systems(); + state(State::IDLE); } } @@ -54,8 +64,6 @@ namespace gui { } void FSM::IDLE(Event ev) { - auto& level = $levels.current(); - using FU = Event; switch(ev) { @@ -91,12 +99,17 @@ namespace gui { dbc::sentinel("unhandled event in IDLE"); } - if(!level.map->can_move({size_t($camera.targetX), size_t($camera.targetY)})) { + if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) { state(State::IDLE); $camera.abort_plan($rayview); } } + bool FSM::can_move(Point move_to) { + auto& level = $levels.current(); + return level.map->can_move(move_to) && !level.collision->occupied(move_to); + } + void FSM::END(Event ev) { fmt::println("END: received event after done: {}", int(ev)); } @@ -200,6 +213,14 @@ namespace gui { $rayview.set_level(level); } + void FSM::run_systems() { + auto& level = $levels.current(); + System::motion(level); + System::enemy_pathing(level); + System::collision(level); + System::death(level); + } + bool FSM::active() { return !in_state(State::END); } diff --git a/gui.hpp b/gui.hpp index f7c13c6..679bc12 100644 --- a/gui.hpp +++ b/gui.hpp @@ -50,6 +50,7 @@ namespace gui { void IDLE(Event ev); void END(Event ev); + bool can_move(Point move_to); void keyboard(); void draw_weapon(); void draw_gui(); @@ -57,5 +58,6 @@ namespace gui { void mouse(); void generate_map(); bool active(); + void run_systems(); }; } diff --git a/raycaster.cpp b/raycaster.cpp index 6409ce9..89a03ae 100644 --- a/raycaster.cpp +++ b/raycaster.cpp @@ -67,16 +67,15 @@ void Raycaster::sprite_casting(sf::RenderTarget &target) { // sort sprites from far to close auto sprite_order = $level.collision->distance_sorted({(size_t)$posX, (size_t)$posY}); - // after sorting the sprites, do the projection for(auto& rec : sprite_order) { + if(!$sprites.contains(rec.second)) continue; // BUG: eventually this needs to go away too auto& sf_sprite = $sprites.at(rec.second).sprite; auto sprite_pos = $level.world->get(rec.second); double spriteX = double(sprite_pos.location.x) - $posX + 0.5; double spriteY = double(sprite_pos.location.y) - $posY + 0.5; - //transform sprite with the inverse camera matrix // [ $planeX $dirX ] -1 [ $dirY -$dirX ] // [ ] = 1/($planeX*$dirY-$dirX*$planeY) * [ ] @@ -333,9 +332,10 @@ void Raycaster::set_level(GameLevel level) { auto& tiles = $level.map->tiles(); $map = $textures.convert_char_to_texture(tiles.$tile_ids); - // this will need to go away too but for now everything is evil eye - for(auto &thing : $level.collision->table) { - auto sprite_txt = $textures.sprite_textures.at("evil_eye"); - $sprites.try_emplace(thing.second, sprite_txt); - } + $level.world->query([&](const auto ent, auto& combat, auto &pos) { + fmt::println("entity: {}, hp: {}, pos={},{}", ent, combat.hp, pos.location.x, pos.location.y); + + auto sprite_txt = $textures.sprite_textures.at("evil_eye"); + $sprites.try_emplace(ent, sprite_txt); + }); }