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 { 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);

Loading…
Cancel
Save