Eine relativ vereinfachte Methode besteht darin, einen Strahl vom Zentrum der Explosion zum Zentrum jeder Entität zu ziehen, in der DISTANCE(explosion,entity) < exlosion.max_radius
(Pseudocode).
Folgen Sie für jede Entität diesem Strahl und verringern Sie dabei den Grundschaden. Wenn Sie ein Objekt treffen, subtrahieren Sie dessen Deckungswert vom Schaden (was den Strahl wesentlich verkürzt).
Wenn der Strahl auf die Entität trifft, ist der verbleibende Schaden Ihr Explosionsschaden.
Für diesen Ansatz möchten Sie wahrscheinlich einen ziemlich hohen Grundschaden, der mit der Entfernung schnell abnimmt (umgekehrt proportional zum Quadrat der Entfernung sollte gut funktionieren).
Ein anderer Ansatz besteht darin, einen Sektor zu zeichnen, der das Unternehmen vollständig enthält. aber nicht weiter; und den ganzen Weg raus nach.max_radius
. Subtrahieren Sie von der Fläche dieses Sektors die Fläche, die von einer Deckung zwischen der Explosion und dem Unternehmen abgedeckt wird, multipliziert mit seinem Deckungswert. Der verbleibende Bereich ist Ihr Explosionsschaden.
Ein netter Nebeneffekt davon ist, dass je näher das Objekt an der Explosion ist, desto breiter der Sektor wird und desto mehr Schaden Sie erleiden (wenn Sie den gesamten Bereich des Sektors zählen und nur den Deckungsbereich zwischen den Sektoren abziehen Entität und Explosion.
Es könnte auch nützlich sein, die Deckung als Einheiten zu behandeln. und subtrahiere einfach den Schaden, den nähere Wesen von denen weiter draußen erleiden, aber das könnte knorrig werden.
Es gibt zweifellos einen noch eleganteren und klügeren Ansatz, aber er erfordert wahrscheinlich einen ziemlich bösen Kalkül. Das tut es immer.