|
|
|
@ -5,6 +5,7 @@ |
|
|
|
|
#include <functional> |
|
|
|
|
#include "components.hpp" |
|
|
|
|
#include <numbers> |
|
|
|
|
#include "systems.hpp" |
|
|
|
|
|
|
|
|
|
using namespace components; |
|
|
|
|
|
|
|
|
@ -43,6 +44,15 @@ namespace gui { |
|
|
|
|
|
|
|
|
|
void FSM::MOVING(Event ) { |
|
|
|
|
if($camera.play_move($rayview)) { |
|
|
|
|
|
|
|
|
|
auto &level = $levels.current(); |
|
|
|
|
auto player = level.world->get_the<Player>(); |
|
|
|
|
auto& player_position = level.world->get<Position>(player.entity); |
|
|
|
|
player_position.location.x = size_t($camera.targetX); |
|
|
|
|
player_position.location.y = size_t($camera.targetY); |
|
|
|
|
|
|
|
|
|
run_systems(); |
|
|
|
|
|
|
|
|
|
state(State::IDLE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -54,8 +64,6 @@ namespace gui { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FSM::IDLE(Event ev) { |
|
|
|
|
auto& level = $levels.current(); |
|
|
|
|
|
|
|
|
|
using FU = Event; |
|
|
|
|
|
|
|
|
|
switch(ev) { |
|
|
|
@ -91,12 +99,17 @@ namespace gui { |
|
|
|
|
dbc::sentinel("unhandled event in IDLE"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(!level.map->can_move({size_t($camera.targetX), size_t($camera.targetY)})) { |
|
|
|
|
if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) { |
|
|
|
|
state(State::IDLE); |
|
|
|
|
$camera.abort_plan($rayview); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FSM::can_move(Point move_to) { |
|
|
|
|
auto& level = $levels.current(); |
|
|
|
|
return level.map->can_move(move_to) && !level.collision->occupied(move_to); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FSM::END(Event ev) { |
|
|
|
|
fmt::println("END: received event after done: {}", int(ev)); |
|
|
|
|
} |
|
|
|
@ -200,6 +213,14 @@ namespace gui { |
|
|
|
|
$rayview.set_level(level); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FSM::run_systems() { |
|
|
|
|
auto& level = $levels.current(); |
|
|
|
|
System::motion(level); |
|
|
|
|
System::enemy_pathing(level); |
|
|
|
|
System::collision(level); |
|
|
|
|
System::death(level); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FSM::active() { |
|
|
|
|
return !in_state(State::END); |
|
|
|
|
} |
|
|
|
|