public void Bombard(CombatPlanet planet)
        {
            foreach (var unit in this.game.Combatants)
            {
                var unitStats = this.mainGame.Derivates[unit.Owner].DesignStats[unit.Ships.Design];

                for (int i = 0; i < unit.AbilityCharges.Length; i++)
                {
                    var spent = attackPlanet(unitStats.Abilities[i], unit.AbilityCharges[i], planet);

                    unit.AbilityCharges[i] -= spent;
                    if (!double.IsInfinity(unit.AbilityAmmo[i]))
                    {
                        unit.AbilityAmmo[i] -= spent;
                    }
                }
            }

            this.game.PlayOrder.Dequeue();

            if (this.game.PlayOrder.Count == 0)
            {
                this.nextRound();
            }
        }
        public void UseAbility(int index, double quantity, CombatPlanet planet)
        {
            var unit         = this.game.PlayOrder.Peek();
            var abilityStats = this.mainGame.Derivates.Of(unit.Owner).DesignStats[unit.Ships.Design].Abilities[index];
            var chargesLeft  = quantity;
            var spent        = 0.0;

            if (!abilityStats.TargetColony || Methods.HexDistance(planet.Position, unit.Position) > abilityStats.Range)
            {
                return;
            }

            if (abilityStats.IsInstantDamage && planet.Colony != null)
            {
                var killsPerShot = abilityStats.FirePower / planet.PopulationHitPoints;
                var casualties   = Math.Min(quantity * killsPerShot, planet.Colony.Population);
                //TODO(later) factor in shields and armor
                //TODO(later) roll for target, building or population

                planet.Colony.Population -= casualties;
                spent = Math.Ceiling(casualties / killsPerShot);
            }

            unit.AbilityCharges[index] -= spent;
            if (!double.IsInfinity(unit.AbilityAmmo[index]))
            {
                unit.AbilityAmmo[index] -= spent;
            }
        }
        /*TODO(later) add methods for attacking other kind of targets,
         * extrude functionality form UseAbiliy methods in SpaceBattleProcessor */
        protected double attackPlanet(AbilityStats abilityStats, double quantity, CombatPlanet planet)
        {
            var spent = 0.0;

            if (abilityStats.IsInstantDamage && planet.Colony != null)
            {
                var killsPerShot = abilityStats.FirePower / planet.PopulationHitPoints;
                var casualties   = Math.Min(quantity * killsPerShot, planet.Colony.Population);
                //TODO(later) factor in shields and armor
                //TODO(later) roll for target, building or population

                planet.Colony.Population -= casualties;
                spent = Math.Ceiling(casualties / killsPerShot);
            }

            return(spent);
        }
        public void UseAbility(int index, double quantity, CombatPlanet planet)
        {
            var unit         = this.game.PlayOrder.Peek();
            var abilityStats = this.mainGame.Derivates[unit.Owner].DesignStats[unit.Ships.Design].Abilities[index];

            if (planet.Colony != null && !this.mainGame.Processor.IsAtWar(unit.Owner, planet.Colony.Owner) ||
                !abilityStats.TargetColony ||
                Methods.HexDistance(planet.Position, unit.Position) > abilityStats.Range)
            {
                return;
            }

            var spent = attackPlanet(abilityStats, quantity, planet);

            unit.AbilityCharges[index] -= spent;
            if (!double.IsInfinity(unit.AbilityAmmo[index]))
            {
                unit.AbilityAmmo[index] -= spent;
            }
        }
 internal CombatPlanetInfo(CombatPlanet data)
 {
     this.Data = data;
 }
Exemple #6
0
 internal CombatPlanetInfo(CombatPlanet data, MainGame mainGame)
 {
     this.Data     = data;
     this.mainGame = mainGame;
 }