Now it will path to enemies, then devices, then items but it does get stuck on stuff like devices.

master
Zed A. Shaw 10 months ago
parent 87e1c25cd5
commit cdb930a7f2
  1. 35
      autowalker.cpp
  2. 6
      autowalker.hpp

@ -1,19 +1,19 @@
#include "autowalker.hpp"
#include "inventory.hpp"
Pathing Autowalker::compute_paths() {
template<typename Comp>
Pathing compute_paths(gui::FSM& fsm, int& count_out) {
Pathing paths{fsm.$level.map->width(), fsm.$level.map->height()};
enemy_count = 0;
count_out = 0;
fsm.$level.world->query<components::Position, components::Combat>(
fsm.$level.world->query<components::Position, Comp>(
[&](const auto ent, auto& position, auto&) {
if(ent != fsm.$level.player) {
paths.set_target(position.location);
enemy_count++;
count_out++;
}
});
fmt::println("PATHING to {} count enemies", enemy_count);
// BUG: using walls() will cause a map full of walls?
dbc::check(matrix::width(fsm.$level.map->$walls) == paths.$width, "WTF the maps's walls width changed?");
dbc::check(matrix::height(fsm.$level.map->$walls) == paths.$height, "WTF the maps's walls height changed?");
@ -23,6 +23,18 @@ Pathing Autowalker::compute_paths() {
return paths;
}
Pathing Autowalker::path_to_enemies() {
return compute_paths<components::Combat>(fsm, enemy_count);
}
Pathing Autowalker::path_to_items() {
return compute_paths<components::InventoryItem>(fsm, item_count);
}
Pathing Autowalker::path_to_devices() {
return compute_paths<components::Device>(fsm, device_count);
}
void Autowalker::window_events() {
fsm.$window.handleEvents(
[&](const sf::Event::KeyPressed &) {
@ -121,7 +133,10 @@ void Autowalker::autowalk() {
if(!fsm.autowalking) return;
process_combat();
auto paths = compute_paths();
auto paths = path_to_enemies();
if(enemy_count == 0) paths = path_to_items();
if(item_count == 0) paths = path_to_devices();
if(device_count == 0) dbc::log("no more enemies, items, or devices.");
Point current = get_current_position();
Point target = current;
@ -132,12 +147,6 @@ void Autowalker::autowalk() {
dbc::log("no paths found, aborting autowalk");
fsm.autowalking = false;
return;
} else if(enemy_count == 0) {
dbc::log("Nobody left to kill. You win.");
fsm.autowalking = false;
return;
} else {
dbc::log("Hunting down more enemies.");
}
rotate_player(current, target);

@ -4,6 +4,8 @@
struct Autowalker {
int enemy_count = 0;
int item_count = 0;
int device_count = 0;
gui::FSM& fsm;
Autowalker(gui::FSM& fsm)
@ -12,7 +14,6 @@ struct Autowalker {
void autowalk();
void start_autowalk();
void send_event(gui::Event ev);
Pathing compute_paths();
void window_events();
void process_combat();
bool path_player(Pathing& paths, Point &target_out);
@ -20,4 +21,7 @@ struct Autowalker {
void rotate_player(Point current, Point target);
bool player_has_moved(Point target);
void process_move();
Pathing path_to_enemies();
Pathing path_to_items();
Pathing path_to_devices();
};