Un modo relativamente semplicistico di fare questo è di disegnare un raggio dal centro dell'esplosione al centro di ogni entità in cui DISTANCE(explosion,entity) < exlosion.max_radius
(pseudo-codice).
Per ogni entità, segui questo raggio, diminuendo il danno base mentre procedi. Ogni volta che si colpisce un oggetto sottrarre il suo valore di copertura dal danno (essenzialmente accorciando il raggio).
Quando il raggio colpisce l'entità, qualunque danno rimanga è il danno da esplosione.
Per questo approccio, probabilmente vuoi un danno base piuttosto alto che diminuisca rapidamente con la distanza (inversamente proporzionale al quadrato della distanza dovrebbe fare bene).
Un altro approccio è quello di disegnare un settore che contenga pienamente l'entità; ma non più ampio; e fino in fondo .max_radius
. Sottrai dall'area di questo settore l'area coperta da qualsiasi copertura tra l'esplosione e l'entità, moltiplicata per il suo valore di copertura. L'area rimanente è il danno da esplosione.
Un chiaro effetto collaterale di ciò è che più l'entità è vicina all'esplosione, più ampio è il settore e maggiore è il danno che subisci (mentre conti tutta l'area del settore e sottrae l'area di copertura tra il entità ed esplosione.
Potrebbe anche essere utile trattare la copertura come entità; e sottrarre semplicemente i danni subiti da entità più vicine da quelle più lontane, ma ciò potrebbe diventare nodoso.
Esiste indubbiamente un approccio ancora più elegante e intelligente, ma probabilmente richiede qualche calcolo piuttosto brutto. Lo fa sempre.