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; }
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); }
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; }