Один із досить спрощених способів зробити це - провести промінь від центру вибуху до центру кожної сутності, де DISTANCE(explosion,entity) < exlosion.max_radius
(псевдокод).
Для кожного суб'єкта слідкуйте за цим промінням, зменшуючи базовий збиток під час руху. Кожного разу, коли ви потрапляєте на об'єкт, віднімайте його покриття від пошкодження (істотно скорочуючи промінь).
Коли промінь потрапить на сутність, будь-який збиток не залишиться - це ваш вибуховий збиток.
При такому підході ви, мабуть, хочете досить високої базової шкоди, яка швидко зменшується з відстанню (навпаки, пропорційна квадрату відстані повинна добре робити).
Інший підхід полягає у створенні сектора, що повністю містить організацію; але не ширше; і весь шлях до .max_radius
. Відняти з району цього сектора площу, охоплену будь-яким покриттям між вибухом та об'єктом, помножене на його приховану вартість. Залишилася область - це ваша шкода від вибуху.
Один з акуратних побічних ефектів цього полягає в тому, що чим ближче до вибуху суб'єкт господарювання, тим ширше отримує сектор і тим більше шкоди ви отримуєте (як ви рахуєте всю площу сектора, і просто віднімаєте область прикриття між сутність та вибух.
Це також може бути корисно розглядати покриття як сутність; і просто відняти збитки, нанесені більш близькими суб'єктами, від тих, що надалі, але це може отримати загальний характер.
Безперечно, існує ще більш елегантний і розумний підхід, але для цього, мабуть, потрібні досить неприємні обчислення. Це завжди робиться.