Start of V1 combat system where you get locked into combat when in range and have to work the turn system to get out.

master
Zed A. Shaw 10 months ago
parent d2700d2928
commit 8a6b38c1a4
  1. 3
      events.hpp
  2. 44
      gui.cpp
  3. 5
      gui.hpp
  4. 8
      main.cpp
  5. 9
      systems.cpp

@ -2,7 +2,8 @@
namespace Events { namespace Events {
enum GUI { enum GUI {
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP,
COMBAT_START
}; };
struct Combat { struct Combat {

@ -8,7 +8,6 @@
#include "systems.hpp" #include "systems.hpp"
#include "events.hpp" #include "events.hpp"
namespace gui { namespace gui {
using namespace components; using namespace components;
@ -39,6 +38,8 @@ namespace gui {
FSM_STATE(State, MAPPING, ev); FSM_STATE(State, MAPPING, ev);
FSM_STATE(State, ROTATING, ev); FSM_STATE(State, ROTATING, ev);
FSM_STATE(State, IDLE, ev); FSM_STATE(State, IDLE, ev);
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, END, ev); FSM_STATE(State, END, ev);
} }
} }
@ -101,7 +102,7 @@ namespace gui {
} }
break; break;
default: default:
state(State::IDLE); dbc::log(fmt::format("In ATTACKING state, unhandled event {}", (int)ev));
} }
} }
@ -111,6 +112,12 @@ namespace gui {
} }
} }
void FSM::COMBAT_ROTATE(Event ) {
if($camera.play_rotate($rayview)) {
state(State::IN_COMBAT);
}
}
void FSM::IDLE(Event ev) { void FSM::IDLE(Event ev) {
using enum Event; using enum Event;
@ -145,9 +152,10 @@ namespace gui {
state(State::MAPPING); state(State::MAPPING);
break; break;
case ATTACK: case ATTACK:
$status_view.log("You attack!"); fmt::println("ATTACK IGNORED");
$rotation = -30.0f; break;
state(State::ATTACKING); case START_COMBAT:
state(State::IN_COMBAT);
break; break;
case CLOSE: case CLOSE:
dbc::log("Nothing to close."); dbc::log("Nothing to close.");
@ -157,6 +165,28 @@ namespace gui {
} }
} }
void FSM::IN_COMBAT(Event ev) {
using enum Event;
switch(ev) {
case ATTACK:
$status_view.log("You attack!");
$rotation = -30.0f;
state(State::ATTACKING);
break;
case ROTATE_LEFT:
$camera.plan_rotate($rayview, 1);
state(State::COMBAT_ROTATE);
break;
case ROTATE_RIGHT:
$camera.plan_rotate($rayview, -1);
state(State::COMBAT_ROTATE);
break;
default:
break;
}
}
void FSM::try_move(int dir, bool strafe) { void FSM::try_move(int dir, bool strafe) {
using enum State; using enum State;
// prevent moving into occupied space // prevent moving into occupied space
@ -333,7 +363,6 @@ namespace gui {
System::motion($level); System::motion($level);
System::lighting($level); System::lighting($level);
System::death($level); System::death($level);
handle_world_events();
} }
bool FSM::active() { bool FSM::active() {
@ -366,6 +395,9 @@ namespace gui {
} }
} }
break; break;
case eGUI::COMBAT_START: {
event(Event::START_COMBAT);
} break;
case eGUI::LOOT: { case eGUI::LOOT: {
// auto &item = std::any_cast<InventoryItem&>(data); // auto &item = std::any_cast<InventoryItem&>(data);
// $status_view.log(fmt::format("You picked up a {}.", // $status_view.log(fmt::format("You picked up a {}.",

@ -14,6 +14,8 @@ namespace gui {
enum class State { enum class State {
START, START,
MOVING, MOVING,
IN_COMBAT,
COMBAT_ROTATE,
ATTACKING, ATTACKING,
MAPPING, MAPPING,
ROTATING, ROTATING,
@ -33,6 +35,7 @@ namespace gui {
ROTATE_LEFT, ROTATE_LEFT,
ROTATE_RIGHT, ROTATE_RIGHT,
ATTACK, ATTACK,
START_COMBAT,
QUIT QUIT
}; };
@ -67,6 +70,8 @@ namespace gui {
void MAPPING(Event); void MAPPING(Event);
void ROTATING(Event ); void ROTATING(Event );
void IDLE(Event ev); void IDLE(Event ev);
void IN_COMBAT(Event ev);
void COMBAT_ROTATE(Event ev);
void END(Event ev); void END(Event ev);
void try_move(int dir, bool strafe); void try_move(int dir, bool strafe);

@ -8,14 +8,16 @@ int main() {
main.render(); main.render();
// ZED: need to sort out how to deal with this in the FSM // ZED: need to sort out how to deal with this in the FSM
if(main.in_state(gui::State::IDLE)) { if(main.in_state(gui::State::IDLE)
main.keyboard(); || main.in_state(gui::State::MAPPING)
} else if(main.in_state(gui::State::MAPPING)) { || main.in_state(gui::State::IN_COMBAT))
{
main.keyboard(); main.keyboard();
} else{ } else{
main.event(gui::Event::TICK); main.event(gui::Event::TICK);
} }
main.handle_world_events();
main.mouse(); main.mouse();
} }

@ -144,14 +144,7 @@ void System::collision(GameLevel &level) {
if(found) { if(found) {
for(auto entity : nearby) { for(auto entity : nearby) {
if(world.has<Combat>(entity)) { if(world.has<Combat>(entity)) {
auto& enemy_combat = world.get<Combat>(entity); world.send<Events::GUI>(Events::GUI::COMBAT_START, entity, entity);
Events::Combat result {
player_combat.attack(enemy_combat),
enemy_combat.attack(player_combat)
};
world.send<Events::GUI>(Events::GUI::COMBAT, entity, result);
} else if(world.has<InventoryItem>(entity)) { } else if(world.has<InventoryItem>(entity)) {
auto item = world.get<InventoryItem>(entity); auto item = world.get<InventoryItem>(entity);
auto& item_pos = world.get<Position>(entity); auto& item_pos = world.get<Position>(entity);