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:
Zed A. Shaw 2025-02-13 14:39:04 -05:00
parent d2700d2928
commit 8a6b38c1a4
5 changed files with 51 additions and 18 deletions

44
gui.cpp
View file

@ -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 {}.",