Start of V1 combat system where you get locked into combat when in range and have to work the turn system to get out.
This commit is contained in:
parent
d2700d2928
commit
8a6b38c1a4
5 changed files with 51 additions and 18 deletions
|
@ -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 {
|
||||||
|
|
44
gui.cpp
44
gui.cpp
|
@ -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 {}.",
|
||||||
|
|
5
gui.hpp
5
gui.hpp
|
@ -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
main.cpp
8
main.cpp
|
@ -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…
Add table
Add a link
Reference in a new issue