diff --git a/camera.cpp b/camera.cpp index 089c477..d107b93 100644 --- a/camera.cpp +++ b/camera.cpp @@ -2,16 +2,15 @@ #include #include -void CameraLOL::plan_run(Raycaster &rayview, int dir) { +void CameraLOL::plan_move(Raycaster &rayview, int dir, bool strafe) { t = 0.0; - targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir); - targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir); -} - -void CameraLOL::plan_strafe(Raycaster &rayview, int dir) { - t = 0.0; - targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir); - targetY = rayview.$posY + int(rayview.$dirX * 1.5 * dir); + if(strafe) { + targetX = rayview.$posX + int(-rayview.$dirY * 1.5 * dir); + targetY = rayview.$posY + int(rayview.$dirX * 1.5 * dir); + } else { + targetX = rayview.$posX + int(rayview.$dirX * 1.5 * dir); + targetY = rayview.$posY + int(rayview.$dirY * 1.5 * dir); + } } void CameraLOL::plan_rotate(Raycaster &rayview, int dir) { diff --git a/camera.hpp b/camera.hpp index 7e1c407..3e92def 100644 --- a/camera.hpp +++ b/camera.hpp @@ -12,11 +12,11 @@ struct CameraLOL { double targetPlaneX = 0.0; double targetPlaneY = 0.0; - void plan_run(Raycaster &rayview, int dir); - void plan_strafe(Raycaster &rayview, int dir); + void plan_move(Raycaster &rayview, int dir, bool strafe); void plan_rotate(Raycaster &rayview, int dir); bool play_rotate(Raycaster &rayview); bool play_move(Raycaster &rayview); + void abort_plan(Raycaster &rayview); }; diff --git a/gui.cpp b/gui.cpp index 030fff0..200c0a2 100644 --- a/gui.cpp +++ b/gui.cpp @@ -73,44 +73,44 @@ namespace gui { state(State::END); return; // done case FU::MOVE_FORWARD: - $camera.plan_run($rayview, 1); - state(State::MOVING); + try_move(1, false); break; case FU::MOVE_BACK: - $camera.plan_run($rayview, -1); - state(State::MOVING); + try_move(-1, false); break; case FU::MOVE_LEFT: - $camera.plan_strafe($rayview, 1); - state(State::MOVING); + try_move(1, true); break; case FU::MOVE_RIGHT: - $camera.plan_strafe($rayview, -1); - state(State::MOVING); + try_move(-1, true); break; case FU::ROTATE_LEFT: $camera.plan_rotate($rayview, 1); state(State::ROTATING); - return; // get out early since can always rotate + break; case FU::ROTATE_RIGHT: $camera.plan_rotate($rayview, -1); state(State::ROTATING); - return; // get out early since can always rotate + break; default: dbc::sentinel("unhandled event in IDLE"); } + } + void FSM::try_move(int dir, bool strafe) { // prevent moving into occupied space - if(!can_move({size_t($camera.targetX), size_t($camera.targetY)})) { + $camera.plan_move($rayview, dir, strafe); + + Point move_to{size_t($camera.targetX), size_t($camera.targetY)}; + + if(level.map->can_move(move_to) && !level.collision->occupied(move_to)) { + state(State::MOVING); + } else { state(State::IDLE); $camera.abort_plan($rayview); } } - bool FSM::can_move(Point move_to) { - 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)); } diff --git a/gui.hpp b/gui.hpp index a57a8bb..e9a118b 100644 --- a/gui.hpp +++ b/gui.hpp @@ -51,7 +51,7 @@ namespace gui { void IDLE(Event ev); void END(Event ev); - bool can_move(Point move_to); + void try_move(int dir, bool strafe); void keyboard(); void draw_weapon(); void draw_gui();