Uma maneira relativamente simplista de fazer isso é desenhar um raio do centro da explosão para o centro de toda entidade onde DISTANCE(explosion,entity) < exlosion.max_radius
(pseudo-código).
Para cada entidade, siga este raio, diminuindo o dano base à medida que avança. Sempre que você acertar um objeto, subtraia o valor da cobertura do dano (diminuindo o raio).
Quando o raio atinge a entidade, qualquer dano que resta é o seu dano de explosão.
Para esta abordagem, você provavelmente deseja um dano de base bastante alto que diminua rapidamente com a distância (inversamente proporcional ao quadrado da distância deve ser bom).
Outra abordagem é desenhar um setor que contenha totalmente a entidade; mas não mais amplo; e todo o caminho até .max_radius
. Subtraia da área deste setor a área coberta por qualquer cobertura entre a explosão e a entidade, multiplicada pelo seu valor de cobertura. A área restante é o seu dano de explosão.
Um efeito colateral puro disso é que, quanto mais próxima a entidade estiver da explosão, mais amplo o setor fica e mais danos você sofrerá (contando toda a área do setor e subtraindo apenas a área de cobertura entre entidade e explosão.
Também poderia ser útil tratar a cobertura como entidades; e simplesmente subtrair os danos sofridos por entidades mais próximas daqueles mais distantes, mas isso pode ficar horrível.
Sem dúvida, existe uma abordagem ainda mais elegante e inteligente, mas provavelmente requer algum cálculo bastante desagradável. Sempre faz.