Una forma relativamente simplista de hacer esto es dibujar un rayo desde el centro de la explosión hasta el centro de cada entidad donde DISTANCE(explosion,entity) < exlosion.max_radius
(pseudocódigo).
Para cada entidad, sigue este rayo, disminuyendo el daño base a medida que avanzas. Cada vez que golpeas un objeto, resta su valor de cobertura del daño (esencialmente acortando el rayo).
Cuando el rayo golpea a la entidad, cualquier daño que quede es tu daño de explosión.
Para este enfoque, es probable que desee un daño base bastante alto que disminuya rápidamente con la distancia (inversamente proporcional al cuadrado de la distancia debería funcionar bien).
Otro enfoque es dibujar un sector que contenga completamente la entidad; pero no más ancho; y todo el camino a cabo .max_radius
. Reste del área de este sector el área cubierta por cualquier cobertura entre la explosión y la entidad, multiplicada por su valor de cobertura. El área restante es el daño de tu explosión.
Un claro efecto secundario de esto es que cuanto más cerca está la entidad de la explosión, más amplio se vuelve el sector y más daño sufres (a medida que cuentas toda el área del sector y solo restas el área de cobertura entre entidad y explosión.
También podría ser útil tratar la cobertura como entidades; y simplemente resta el daño recibido por las entidades más cercanas de las que están más lejos, pero eso podría volverse retorcido.
Indudablemente existe un enfoque aún más elegante e inteligente, pero probablemente requiere un cálculo bastante desagradable. Siempre lo hace.