#pragma once // ----------------------------------------------------------------------------- // Поведение тварей. Отдельный файл, потому что здесь единственное место, где // противник ЧИТАЕТ бойцов: sim/target.h про Agent не знает и знать не должен. // // Правила простые и намеренно читаемые с экрана: // 1. заметил — идёт; // 2. дошёл — замахивается, и замах ВИДНО (windupTimer); // 3. довёл замах — бьёт по геометрии СВОЕЙ атаки (AttackKind). // Между 2 и 3 у игрока есть время отойти или убить. Без телеграфа удар твари // неотличим от случайной потери здоровья, и бой перестаёт быть боем. // // Пункт 3 — это пять разных задач для игрока, а не один урон: // SWIPE — сектор перед тварью: уводи бойца вбок; // LUNGE — рывок по прямой: освободи ОСЬ, а не точку; // SPIT — снаряд: единственное, что перекрывается стеной; // SLAM — круг вокруг твари: не толпитесь возле неё вдвоём; // GRAB — захват: боец встал намертво, вытаскивать его придётся огнём. // Числа этих форм — в EnemyDef (sim/target.cpp), общие множители — в tuning.h. // // ИИ не решает, кого атаковать, «по-умному»: ближайший живой боец в радиусе. // Прототип проверяет отряд, а не противника, — и цена ошибки здесь должна быть // в геометрии, а не в чужой хитрости. // ----------------------------------------------------------------------------- #include #include "ecs/ecs.h" #include "sim/agent.h" #include "sim/events.h" #include "sim/target.h" #include "engine/tilemap.h" // Шевелит всех, у кого kind != DUMMY. Мишени приёмки не трогает вообще: // --accept обязан считать ровно то же, что считал. // aggroMul — во сколько раз дальше твари замечают отряд прямо сейчас. Больше // единицы бывает ровно в одном случае: у отряда сел фонарь (sim/items.h). // Радиус ЗАМЕТИЛ — единственное, что темнота меняет на стороне тварей: бьют они // так же и ходят так же, просто находят раньше. void UpdateEnemies(ecs::World& world, const Tilemap& map, Agent* agents, int agentCount, std::vector& targets, float dt, CombatEventLog* events, float aggroMul = 1.0f); // Сколько тварей сейчас идёт к отряду. Для напряжения и HUD. int CountAggroEnemies(const std::vector& targets);