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 {
|
||||
enum GUI {
|
||||
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP
|
||||
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP,
|
||||
COMBAT_START
|
||||
};
|
||||
|
||||
struct Combat {
|
||||
|
|
44
gui.cpp
44
gui.cpp
|
@ -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 {}.",
|
||||
|
|
5
gui.hpp
5
gui.hpp
|
@ -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
main.cpp
8
main.cpp
|
@ -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…
Add table
Add a link
Reference in a new issue