Względnie uproszczony sposób polega na narysowaniu promienia od środka wybuchu do środka każdej istoty, gdzie DISTANCE(explosion,entity) < exlosion.max_radius
(pseudo-kod).
Dla każdego bytu podążaj za tym promieniem, zmniejszając podstawowe obrażenia w miarę przemieszczania się. Ilekroć uderzasz w przedmiot, odejmuj jego wartość ochrony od obrażeń (zasadniczo skracając promień).
Kiedy promień uderza w istotę, wszelkie obrażenia, które pozostały, to obrażenia od wybuchu.
W tym podejściu prawdopodobnie potrzebujesz dość wysokich obrażeń podstawowych, które szybko zmniejszają się wraz z odległością (odwrotnie proporcjonalne do kwadratu odległości powinno zrobić dobrze).
Innym podejściem jest narysowanie sektora całkowicie zawierającego jednostkę; ale nie szerszy; i aż do .max_radius
. Odejmij od obszaru tego sektora obszar objęty dowolną osłoną między eksplozją a bytem, pomnożony przez jego wartość osłonową. Pozostały obszar to obrażenia od wybuchu.
Jednym fajnym efektem ubocznym jest to, że im bliżej eksplozji jest byt, tym szerszy sektor zyskuje i tym więcej otrzymujesz obrażeń (licząc cały obszar sektora i po prostu odejmując obszar osłony między byt i wybuch.
Przydatne może być również traktowanie ochrony ubezpieczeniowej jako podmiotów; i po prostu odejmij obrażenia otrzymane przez bliższe byty od tych znajdujących się dalej, ale mogą one ulec poważnemu uszkodzeniu.
Niewątpliwie istnieje jeszcze bardziej eleganckie i sprytne podejście, ale prawdopodobnie wymaga trochę nieprzyjemnego rachunku różniczkowego. Zawsze tak jest.