Exemple #1
0
        private void Shoot(Ship ship, CommandToApply commandToApply)
        {
            var shoot = (Shoot)commandToApply.Command;

            if (shoot.Power > ship.Matter.Lasers)
            {
                shoot.Power = ship.Matter.Lasers;
            }

            if (shoot.Power == 0)
            {
                commandToApply.FailureReason = $"Ship {ship.Uid} has no lasers left to shoot";
                return;
            }

            ship.AddTemperature(shoot.Power);

            shoot.Damage = GetLaserDamage(shoot.Target - ship.Position, shoot.Power);
            foreach (var targetShip in AliveShips)
            {
                var distanceToTarget = targetShip.Position.CDist(shoot.Target);
                var targetShipDamage = shoot.Damage;
                for (var i = 0; i < distanceToTarget; i++)
                {
                    targetShipDamage /= BalanceConstants.ShootDamageDecreaseFactor;
                }
                targetShip.AddTemperature(targetShipDamage);
            }

            commandToApply.IsApplied = true;
        }
Exemple #2
0
        private bool ValidateShipIsAlive(CommandToApply commandToApply, out Ship ship)
        {
            ship = GetShipById(commandToApply.Command.ShipUid);

            if (ship.IsDead)
            {
                commandToApply.FailureReason = $"Ship is dead: {commandToApply.Command.ShipUid}";
                return(false);
            }

            return(true);
        }
Exemple #3
0
        private void SplitShip(Ship ship, CommandToApply commandToApply)
        {
            var splitShip = (SplitShip)commandToApply.Command;

            var newShipId = ShipsByUid.Keys.Max() + 1;

            if (splitShip.NewShipMatter.Fuel > ship.Matter.Fuel)
            {
                splitShip.NewShipMatter.RemoveMatter(new ShipMatter(fuel: splitShip.NewShipMatter.Fuel - ship.Matter.Fuel));
            }

            var newShip = ship.Split(newShipId, splitShip.NewShipMatter);

            ShipsByUid.Add(newShipId, newShip);

            commandToApply.IsApplied = true;
        }