40 lines
2.7 KiB
C
40 lines
2.7 KiB
C
|
|
#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 <vector>
|
|||
|
|
|
|||
|
|
#include "ecs/ecs.h"
|
|||
|
|
#include "sim/agent.h"
|
|||
|
|
#include "sim/events.h"
|
|||
|
|
#include "sim/target.h"
|
|||
|
|
#include "engine/tilemap.h"
|
|||
|
|
|
|||
|
|
// Шевелит всех, у кого kind != DUMMY. Мишени приёмки не трогает вообще:
|
|||
|
|
// --accept обязан считать ровно то же, что считал.
|
|||
|
|
void UpdateEnemies(ecs::World& world, const Tilemap& map, Agent* agents, int agentCount,
|
|||
|
|
std::vector<Target>& targets, float dt, CombatEventLog* events);
|
|||
|
|
|
|||
|
|
// Сколько тварей сейчас идёт к отряду. Для напряжения и HUD.
|
|||
|
|
int CountAggroEnemies(const std::vector<Target>& targets);
|