public void HandleExplosion(GameContext context, GameObjectBase executor, Pos2D epicenter, int strength, int radius, DamageType damageType) { foreach (var cell in context.GetCellsVisibleFromPoint(epicenter, radius).ToList()) { // Spread corruption as needed if (damageType.IsCorruptionDamageType() && context.Randomizer.GetDouble() > 0.3) { cell.Corruption++; } foreach (var obj in cell.Objects.Where(o => o.IsTargetable && !o.IsDead).ToList()) { int resistance = CalculateDamageResistance(obj, damageType, context.Randomizer); int damage = Math.Max(0, strength - resistance); if (obj.IsInvulnerable) { damage = 0; } if (damage <= 0) { AddNoExplosionDamageEffects(context, executor, strength, obj, resistance); } else { ApplyExplosionDamageAndAddEffects(context, executor, damageType, obj, damage); } } } }