Exemplo n.º 1
0
        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);
                    }
                }
            }
        }