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 3 weeks 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);

Loading…
Cancel
Save