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 {
enum GUI {
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP,
COMBAT_START
};
struct Combat {

@ -8,7 +8,6 @@
#include "systems.hpp"
#include "events.hpp"
namespace gui {
using namespace components;
@ -39,6 +38,8 @@ namespace gui {
FSM_STATE(State, MAPPING, ev);
FSM_STATE(State, ROTATING, ev);
FSM_STATE(State, IDLE, ev);
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, END, ev);
}
}
@ -101,7 +102,7 @@ namespace gui {
}
break;
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) {
using enum Event;
@ -145,9 +152,10 @@ namespace gui {
state(State::MAPPING);
break;
case ATTACK:
$status_view.log("You attack!");
$rotation = -30.0f;
state(State::ATTACKING);
fmt::println("ATTACK IGNORED");
break;
case START_COMBAT:
state(State::IN_COMBAT);
break;
case 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) {
using enum State;
// prevent moving into occupied space
@ -333,7 +363,6 @@ namespace gui {
System::motion($level);
System::lighting($level);
System::death($level);
handle_world_events();
}
bool FSM::active() {
@ -366,6 +395,9 @@ namespace gui {
}
}
break;
case eGUI::COMBAT_START: {
event(Event::START_COMBAT);
} break;
case eGUI::LOOT: {
// auto &item = std::any_cast<InventoryItem&>(data);
// $status_view.log(fmt::format("You picked up a {}.",

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

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

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