One relatively simplistic way of doing this is to draw a ray from the center of the explosion to the center of every entity where DISTANCE(explosion,entity) < exlosion.max_radius
(pseudo-code).
For each entity, follow this ray, decreasing base damage as you go. Whenever you hit an object subtract it's cover value from the damage (essentially shortening the ray).
When the ray hits the entity, whatever damage is left is your explosion damage.
For this approach, you probably want a pretty high base damage that decreases rapidly with distance (inversely proportional to the square of the distance should do nicely).
Another approach is to draw a sector fully containing the entity; but no wider; and all the way out to .max_radius
. Subtract from the area of this sector the area covered by any cover between the explosion and the entity, multiplied by its cover value. The remaining area is your blast damage.
One neat side effect of this is that the closer the entity is to the explosion, the wider the sector gets, and the more damage you take (as you count all of the area of the sector, and just subtract the area of cover between the entity and explosion.
It could also be useful to treat cover as entities; and simply subtract damage taken by closer entities from those further out, but that might get gnarly.
There undoubtedly exists an even more elegant and clever approach, but it probably requires some pretty nasty calculus. It always does.