Now have enemies chasing us around and implemented diagonal movement as a test but I kind of like it.

This commit is contained in:
Zed A. Shaw 2025-02-05 14:16:31 -05:00
parent d5301acab5
commit 14128ab10f
5 changed files with 37 additions and 14 deletions

27
gui.cpp
View file

@ -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);
}