parent
1aba26831b
commit
d4355a608d
@ -0,0 +1,112 @@ |
||||
#include "autowalker.hpp" |
||||
|
||||
|
||||
void Autowalker::autowalk() { |
||||
fmt::println("I'M WALKIN' HEAR!"); |
||||
|
||||
fsm.$window.handleEvents( |
||||
[&](const sf::Event::KeyPressed &) { |
||||
fsm.autowalking = false; |
||||
fmt::println("ABORT AUTOWALK"); |
||||
}, |
||||
[&](const sf::Event::MouseButtonPressed &) { |
||||
fsm.autowalking = false; |
||||
fmt::println("ABORT AUTOWALK"); |
||||
} |
||||
); |
||||
|
||||
if(!fsm.autowalking) return; |
||||
|
||||
while(fsm.in_state(gui::State::IN_COMBAT) || fsm.in_state(gui::State::ATTACKING)) { |
||||
if(fsm.in_state(gui::State::ATTACKING)) { |
||||
fsm.event(gui::Event::TICK); |
||||
} else { |
||||
fsm.event(gui::Event::ATTACK); |
||||
} |
||||
|
||||
fsm.handle_world_events(); |
||||
} |
||||
|
||||
auto& player_position = fsm.$level.world->get<components::Position>(fsm.$level.player); |
||||
auto current = player_position.location; |
||||
Point target = current; |
||||
bool found = fsm.$level.map->neighbors(target, false, -1); |
||||
if(!found) { |
||||
dbc::log("no neighbor found, aborting autowalk"); |
||||
fsm.autowalking = false; |
||||
return; |
||||
} |
||||
|
||||
if(!fsm.$level.map->can_move(target)) { |
||||
dbc::log("neighbors is telling me to go to a bad spot."); |
||||
fsm.autowalking = false; |
||||
return; |
||||
} |
||||
|
||||
int delta_x = int(target.x) - int(current.x); |
||||
int delta_y = int(target.y) - int(current.y); |
||||
|
||||
int facing = fsm.$main_ui.$compass_dir; |
||||
int target_facing = 0; |
||||
|
||||
if(delta_x == -1 && delta_y == 0) { |
||||
// west
|
||||
fmt::println("WEST: {}, {}", target.x, target.y); |
||||
target_facing = 4; |
||||
} else if(delta_x == 1 && delta_y == 0) { |
||||
// east
|
||||
fmt::println("EAST: {}, {}", target.x, target.y); |
||||
target_facing = 0; |
||||
} else if(delta_x == 0 && delta_y == 1) { |
||||
fmt::println("SOUTH: {}, {}", target.x, target.y); |
||||
// south
|
||||
target_facing = 2; |
||||
} else if(delta_x == 0 && delta_y == -1) { |
||||
fmt::println("NORTH: {}, {}", target.x, target.y); |
||||
// north
|
||||
target_facing = 6; |
||||
} else { |
||||
dbc::sentinel( |
||||
fmt::format("got more than 4 direction result: " |
||||
"current={},{} " |
||||
"target={},{} " |
||||
"delta={},{} ", |
||||
current.x, current.y, |
||||
target.x, target.y, |
||||
delta_x, delta_y)); |
||||
} |
||||
|
||||
auto dir = facing < target_facing ? gui::Event::ROTATE_LEFT : gui::Event::ROTATE_RIGHT; |
||||
|
||||
while(facing != target_facing) { |
||||
fsm.event(dir); |
||||
fsm.render(); |
||||
fsm.handle_world_events(); |
||||
facing = fsm.$main_ui.$compass_dir; |
||||
} |
||||
|
||||
dbc::check(fsm.$main_ui.$compass_dir == target_facing, |
||||
"player isn't facing the correct direction"); |
||||
|
||||
if(!fsm.in_state(gui::State::IN_COMBAT)) { |
||||
if(fsm.in_state(gui::State::ATTACKING)) { |
||||
fsm.event(gui::Event::TICK); |
||||
} else { |
||||
fsm.event(gui::Event::MOVE_FORWARD); |
||||
} |
||||
|
||||
fsm.handle_world_events(); |
||||
|
||||
do { |
||||
fmt::println("IN WHILE MOVING"); |
||||
fsm.event(gui::Event::TICK); |
||||
fsm.event(gui::Event::ATTACK); |
||||
fsm.render(); |
||||
fsm.handle_world_events(); |
||||
} while(fsm.in_state(gui::State::MOVING)); |
||||
} |
||||
} |
||||
|
||||
void Autowalker::start_autowalk() { |
||||
fsm.autowalking = true; |
||||
} |
@ -0,0 +1,13 @@ |
||||
#pragma once |
||||
|
||||
#include "gui_fsm.hpp" |
||||
|
||||
struct Autowalker { |
||||
gui::FSM& fsm; |
||||
|
||||
Autowalker(gui::FSM& fsm) |
||||
: fsm(fsm) {} |
||||
|
||||
void autowalk(); |
||||
void start_autowalk(); |
||||
}; |
Loading…
Reference in new issue