Moving some stuff around before writing a test to confirm the EntityAI.

This commit is contained in:
Zed A. Shaw 2025-03-14 22:39:08 -04:00
parent f3e157a0f7
commit db5a371766
6 changed files with 49 additions and 38 deletions

View file

@ -18,32 +18,6 @@ using namespace components;
using lighting::LightSource;
using ftxui::Color;
struct EntityAI {
std::string script;
ai::State start;
ai::State goal;
ai::ActionPlan plan;
EntityAI(std::string script, ai::State start, ai::State goal) :
script(script), start(start), goal(goal)
{
}
EntityAI() {};
bool wants_to(std::string name) {
return plan.script[0].name == name;
}
void set_state(std::string name, bool setting) {
ai::set(start, name, setting);
}
void update() {
plan = ai::plan(script, start, goal);
}
};
void System::lighting(GameLevel &level) {
auto &light = *level.lights;
auto &world = *level.world;
@ -70,25 +44,25 @@ void System::generate_paths(GameLevel &level) {
level.map->make_paths();
}
void System::enemy_ai(GameLevel &level) {
void System::enemy_ai_initialize(GameLevel &level) {
auto &world = *level.world;
auto &map = *level.map;
world.query<Position, EnemyConfig>([&](const auto ent, auto& pos, auto& config) {
if(world.has<EntityAI>(ent)) {
auto&enemy = world.get<EntityAI>(ent);
if(world.has<ai::EntityAI>(ent)) {
auto&enemy = world.get<ai::EntityAI>(ent);
enemy.set_state("detect_enemy", map.distance(pos.location) < config.hearing_distance);
enemy.update();
} else {
auto ai_start = ai::load_state(config.ai_start_name);
auto ai_goal = ai::load_state(config.ai_goal_name);
EntityAI enemy(config.ai_script, ai_start, ai_goal);
ai::EntityAI enemy(config.ai_script, ai_start, ai_goal);
enemy.set_state("detect_enemy", map.distance(pos.location) < config.hearing_distance);
enemy.update();
ai::dump_script("\n\n\n-----ENEMY SCRIPT", enemy.start, enemy.plan.script);
world.set<EntityAI>(ent, enemy);
world.set<ai::EntityAI>(ent, enemy);
}
});
}
@ -102,9 +76,9 @@ void System::enemy_pathing(GameLevel &level) {
world.query<Position, Motion>([&](auto ent, auto &position, auto &motion) {
if(ent != player.entity) {
auto& action = world.get<EntityAI>(ent);
auto& enemy_ai = world.get<ai::EntityAI>(ent);
if(action.wants_to("find_enemy")) {
if(enemy_ai.wants_to("find_enemy")) {
Point out = position.location; // copy
map.neighbors(out, motion.random);
motion = { int(out.x - position.location.x), int(out.y - position.location.y)};
@ -187,7 +161,7 @@ void System::death(GameLevel &level, components::ComponentMap& components) {
world.remove<Motion>(ent);
world.remove<Combat>(ent);
world.remove<EnemyConfig>(ent);
world.remove<EntityAI>(ent);
world.remove<ai::EntityAI>(ent);
world.remove<Animation>(ent);
if(auto snd = world.get_if<Sound>(ent)) {
@ -217,8 +191,8 @@ void System::combat(GameLevel &level) {
if(found) {
for(auto entity : nearby) {
if(world.has<EntityAI>(entity)) {
auto& enemy_ai = world.get<EntityAI>(entity);
if(world.has<ai::EntityAI>(entity)) {
auto& enemy_ai = world.get<ai::EntityAI>(entity);
enemy_ai.set_state("enemy_found", true);
enemy_ai.update();