From abd843d5ecb0274cc40781816164d22ab01625e5 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 10 Feb 2025 14:06:38 -0500 Subject: [PATCH] Very basic attack system. --- assets/enemies.json | 4 ++-- gui.cpp | 36 +++++++++++++++++++++++++++++------- gui.hpp | 5 ++++- systems.cpp | 1 + worldbuilder.cpp | 5 ++++- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/assets/enemies.json b/assets/enemies.json index 2f0f995..c3d69f9 100644 --- a/assets/enemies.json +++ b/assets/enemies.json @@ -17,7 +17,7 @@ "foreground": [131, 213, 238], "background": [30, 20, 75] }, - {"_type": "Combat", "hp": 200, "damage": 15, "dead": false}, + {"_type": "Combat", "hp": 20, "damage": 1, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, {"_type": "LightSource", "strength": 70, "radius": 2}, {"_type": "EnemyConfig", "hearing_distance": 5}, @@ -30,7 +30,7 @@ "foreground": [205, 164, 246], "background": [30, 20, 75] }, - {"_type": "Combat", "hp": 100, "damage": 50, "dead": false}, + {"_type": "Combat", "hp": 50, "damage": 10, "dead": false}, {"_type": "Motion", "dx": 0, "dy": 0, "random": false}, {"_type": "EnemyConfig", "hearing_distance": 10}, {"_type": "Sprite", "name": "evil_eye"} diff --git a/gui.cpp b/gui.cpp index bcd383b..3f7df2b 100644 --- a/gui.cpp +++ b/gui.cpp @@ -94,6 +94,7 @@ namespace gui { switch($state) { FSM_STATE(State, START, ev); FSM_STATE(State, MOVING, ev); + FSM_STATE(State, ATTACKING, ev); FSM_STATE(State, MAPPING, ev); FSM_STATE(State, ROTATING, ev); FSM_STATE(State, IDLE, ev); @@ -141,6 +142,18 @@ namespace gui { } } + void FSM::ATTACKING(Event ev) { + fmt::println("ATTACKING! {}", $rotation); + switch(ev) { + case Event::ATTACK: + run_systems(); + $rotation = $rotation < 0.0f ? 0.0f : -33.0f; + break; + default: + state(State::IDLE); + } + } + void FSM::ROTATING(Event ) { if($camera.play_rotate($rayview)) { state(State::IDLE); @@ -149,6 +162,7 @@ namespace gui { void FSM::IDLE(Event ev) { using FU = Event; + $rotation = -10.0f; switch(ev) { case FU::QUIT: @@ -178,6 +192,11 @@ namespace gui { case FU::MAP_OPEN: state(State::MAPPING); break; + case FU::ATTACK: + fmt::println("ATTACK IN IDLE!"); + draw_weapon(); + state(State::ATTACKING); + break; case FU::CLOSE: dbc::log("Nothing to close."); break; @@ -229,6 +248,10 @@ namespace gui { case KEY::A: event(Event::MOVE_LEFT); break; + case KEY::Space: + $rotation = 0; + event(Event::ATTACK); + break; case KEY::R: $stats.reset(); break; @@ -258,8 +281,12 @@ namespace gui { rect.setFillColor({50, 50, 50}); $window.draw(rect); + auto player = $level.world->get_the(); + auto player_combat = $level.world->get(player.entity); + $text.setString( fmt::format("FPS\n" + "HP: {}\n" "mean:{:>8.5}\n" "sdev: {:>8.5}\n" "min: {:>8.5}\n" @@ -270,7 +297,7 @@ namespace gui { "Debug? {}\n\n" "dir: {:>2.02},{:>2.02}\n" "pos: {:>2.02},{:>2.02}\n\n", - $stats.mean(), $stats.stddev(), $stats.min, + player_combat.hp, $stats.mean(), $stats.stddev(), $stats.min, $stats.max, $stats.n, VSYNC, FRAME_LIMIT, DEBUG_BUILD, $rayview.$dir_x, $rayview.$dir_y, $rayview.$pos_x, $rayview.$pos_y)); @@ -294,16 +321,11 @@ namespace gui { $stats.sample(1/elapsed.count()); draw_gui(); - // draw_weapon(); + draw_weapon(); $window.display(); } void FSM::mouse() { - if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) { - $rotation = -30.0f; - } else { - $rotation = -10.0f; - } } void FSM::generate_map() { diff --git a/gui.hpp b/gui.hpp index 2644b58..95b60b2 100644 --- a/gui.hpp +++ b/gui.hpp @@ -28,6 +28,7 @@ namespace gui { enum class State { START, MOVING, + ATTACKING, MAPPING, ROTATING, IDLE, @@ -45,12 +46,13 @@ namespace gui { CLOSE, ROTATE_LEFT, ROTATE_RIGHT, + ATTACK, QUIT }; class FSM : public DeadSimpleFSM { public: - float $rotation = -30.0f; + float $rotation = -10.0f; Point $player{0,0}; LevelManager $levels; sf::RenderWindow $window; @@ -70,6 +72,7 @@ namespace gui { void START(Event ); void MOVING(Event ); + void ATTACKING(Event ); void MAPPING(Event); void ROTATING(Event ); void IDLE(Event ev); diff --git a/systems.cpp b/systems.cpp index b31c847..a16e20d 100644 --- a/systems.cpp +++ b/systems.cpp @@ -115,6 +115,7 @@ void System::death(GameLevel &level) { world.query([&](const auto &ent, auto &position, auto &combat) { // bring out yer dead if(combat.hp <= 0 && !combat.dead) { + fmt::println("DIE! entity {} died", ent); combat.dead = true; // take them out of collision map collider.remove(position.location); diff --git a/worldbuilder.cpp b/worldbuilder.cpp index 9cca7c7..62eeeb3 100644 --- a/worldbuilder.cpp +++ b/worldbuilder.cpp @@ -235,7 +235,10 @@ void WorldBuilder::randomize_entities(DinkyECS::World &world, GameConfig &config int rand_entity = Random::uniform(0, keys.size() - 1); std::string key = keys[rand_entity]; // BUG: this may crash if PLAYER_TILE isn't first - if(key == "PLAYER_TITLE") key = keys[rand_entity + 1]; + if(key == "PLAYER_TITLE") { + key = keys[rand_entity + 1]; + fmt::println("SKIPPING PLAYER and using {} instead", key); + } auto entity_data = entity_db[key]; // pass that to the config as it'll be a generic json