Autowalker now correctly faces enemies to fight them.

This commit is contained in:
Zed A. Shaw 2025-09-02 11:31:01 -04:00
parent 9faad5f263
commit 759f93cae0
3 changed files with 19 additions and 31 deletions

View file

@ -54,19 +54,6 @@
"enemy_dead": true "enemy_dead": true
} }
}, },
{
"name": "face_enemy",
"cost": 10,
"needs": {
"no_more_enemies": false,
"in_combat": false,
"enemy_found": true
},
"effects": {
"in_combat": true,
"enemy_dead": true
}
},
{ {
"name": "collect_items", "name": "collect_items",
"cost": 5, "cost": 5,
@ -132,7 +119,6 @@
"Host::actions": "Host::actions":
["find_enemy", ["find_enemy",
"kill_enemy", "kill_enemy",
"face_enemy",
"collect_items", "collect_items",
"use_healing"], "use_healing"],
"Enemy::actions": "Enemy::actions":

View file

@ -26,7 +26,6 @@ int number_left() {
return count; return count;
} }
template<typename Comp> template<typename Comp>
Pathing compute_paths() { Pathing compute_paths() {
auto& level = GameDB::current_level(); auto& level = GameDB::current_level();
@ -114,7 +113,6 @@ void Autowalker::path_fail(const std::string& msg, Matrix& bad_paths, Point pos)
bool Autowalker::path_player(Pathing& paths, Point& target_out) { bool Autowalker::path_player(Pathing& paths, Point& target_out) {
auto &level = GameDB::current_level(); auto &level = GameDB::current_level();
auto found = paths.find_path(target_out, PATHING_TOWARD, false); auto found = paths.find_path(target_out, PATHING_TOWARD, false);
if(found == PathingResult::FAIL) { if(found == PathingResult::FAIL) {
@ -192,8 +190,6 @@ void Autowalker::handle_player_walk(ai::State& start, ai::State& goal) {
auto paths = path_to_enemies(); auto paths = path_to_enemies();
process_move(paths); process_move(paths);
face_enemy(); face_enemy();
} else if(action.name == "face_enemy") {
face_enemy();
} else if(action.name == "kill_enemy") { } else if(action.name == "kill_enemy") {
status(L"KILLING ENEMY"); status(L"KILLING ENEMY");
@ -256,7 +252,6 @@ void Autowalker::open_map() {
} }
} }
void Autowalker::autowalk() { void Autowalker::autowalk() {
handle_window_events(); handle_window_events();
if(!fsm.autowalking) { if(!fsm.autowalking) {
@ -286,16 +281,16 @@ void Autowalker::autowalk() {
void Autowalker::process_move(Pathing& paths) { void Autowalker::process_move(Pathing& paths) {
auto world = GameDB::current_world(); auto world = GameDB::current_world();
// target has to start at the player location then... // target has to start at the player location then...
auto target = GameDB::player_position().location; auto target_out = GameDB::player_position().location;
// ... target gets modified as an out parameter to find the path // ... target gets modified as an out parameter to find the path
if(!path_player(paths, target)) { if(!path_player(paths, target_out)) {
close_status(); close_status();
log(L"No paths found, aborting autowalk."); log(L"No paths found, aborting autowalk.");
return; return;
} }
if(rayview->aiming_at != target) rotate_player(target); if(rayview->aiming_at != target_out) rotate_player(target_out);
send_event(gui::Event::MOVE_FORWARD); send_event(gui::Event::MOVE_FORWARD);
@ -303,9 +298,19 @@ void Autowalker::process_move(Pathing& paths) {
} }
bool Autowalker::found_enemy() { bool Autowalker::found_enemy() {
auto world = GameDB::current_world(); auto level = GameDB::current_level();
auto aimed_at = camera_aim(); auto player = GameDB::player_position();
return aimed_at != DinkyECS::NONE && world->has<components::Combat>(aimed_at);
for(matrix::compass it{level.map->$walls, player.location.x, player.location.y}; it.next();) {
Point aim{it.x, it.y};
if(aim != player.aiming_at ||
!level.collision->occupied(player.aiming_at)) continue;
auto ent = level.collision->get(player.aiming_at);
if(level.world->has<components::Combat>(ent)) return true;
}
return false;
} }
bool Autowalker::found_item() { bool Autowalker::found_item() {
@ -347,12 +352,6 @@ bool Autowalker::face_enemy() {
auto [found, neighbors] = level.collision->neighbors(player_at.location, true); auto [found, neighbors] = level.collision->neighbors(player_at.location, true);
if(found) { if(found) {
fmt::println("FOUND ENEMIES:");
for(auto& ent : neighbors) {
auto enemy_pos = level.world->get<components::Position>(ent);
fmt::println("\t{}={},{}", ent, enemy_pos.location.x, enemy_pos.location.y);
}
auto enemy_pos = level.world->get<components::Position>(neighbors[0]); auto enemy_pos = level.world->get<components::Position>(neighbors[0]);
if(rayview->aiming_at != enemy_pos.location) rotate_player(enemy_pos.location); if(rayview->aiming_at != enemy_pos.location) rotate_player(enemy_pos.location);
} else { } else {

View file

@ -92,12 +92,15 @@ PathingResult Pathing::find_path(Point &out, int direction, bool diag)
if(weight == direction) { if(weight == direction) {
out = {x, y}; out = {x, y};
found = true; found = true;
// only break if this is a lower path
return true; return true;
} else if(weight == 0) { } else if(weight == 0) {
out = {x, y}; out = {x, y};
found = true; found = true;
// only found an equal path, keep checking
} }
// this says keep going
return false; return false;
}; };