// makes a unit ranged attack a city private void RangedAttack(UnitInstance attacker, City defender) { if (attacker.PlayerID == defender.PlayerID) { return; } if (Board.HexDistance(attacker.Location, defender.Location) > attacker.BaseUnit.Range) { return; } attacker.Movement = 0; attacker.Actions = 0; Controllers.City.DamageCity(defender, UnitInstance.GetDamageDefenderSuffered(attacker.BaseUnit.CombatStrength, defender.Defense, attacker.HP, attacker.BaseUnit.MaxHP)); }
// makes a unit ranged attack another private void RangedAttack(UnitInstance attacker, UnitInstance defender) { if (attacker.PlayerID == defender.PlayerID) { return; } if (Board.HexDistance(attacker.Location, defender.Location) > attacker.BaseUnit.Range) { return; } attacker.Movement = 0; attacker.Actions = 0; defender.HP -= UnitInstance.GetDamageDefenderSuffered(attacker.BaseUnit.CombatStrength, defender.BaseUnit.CombatStrength, attacker.HP, attacker.BaseUnit.MaxHP); if (defender.HP <= 0) { RemoveUnit(defender); } }
// makes a unit melee attack a city private void MeleeAttack(UnitInstance attacker, City defender) { if (attacker.Actions <= 0) { return; } if (attacker.PlayerID == defender.PlayerID) { return; } if (!Controllers.Board.GetTile(attacker.Location).GetNeighbourTileLocations().Contains(defender.Location)) { return; } float attackerModifier = 1f; // +25% for hills if (Controllers.Board.GetTile(attacker.Location).TerrainFeature == TileTerrainFeature.HILL) { attackerModifier += 0.25f; } // +25% for forests if (Controllers.Board.GetTile(attacker.Location).Improvement == TileImprovment.FOREST) { attackerModifier += 0.25f; } // +25% for jungles if (Controllers.Board.GetTile(attacker.Location).Improvement == TileImprovment.JUNGLE) { attackerModifier += 0.25f; } attacker.Movement = 0; attacker.Actions = 0; int attackerTakes = UnitInstance.GetDamageAttackerSuffered(attacker.BaseUnit.CombatStrength * attackerModifier, defender.Defense * defender.DefenseModifier, attacker.HP, attacker.BaseUnit.MaxHP); int defenderTakes = UnitInstance.GetDamageDefenderSuffered(attacker.BaseUnit.CombatStrength * attackerModifier, defender.Defense * defender.DefenseModifier, attacker.HP, attacker.BaseUnit.MaxHP); attacker.HP -= attackerTakes; defender.HP -= defenderTakes; if (defender.HP <= 1) { Controllers.City.CaptureCity(defender, attacker.PlayerID); } if (attacker.HP <= 0) { RemoveUnit(attacker); } if (attacker.HP > 0 && defender.HP <= 1) { attacker.MovementQueue.Clear(); attacker.Location = defender.Location; } ConsoleManager.Instance.WriteLine($"{Controllers.Player.GetPlayer(attacker.PlayerID).Name}'s unit, {attacker.Name}, is melee attacking {Controllers.Player.GetPlayer(defender.PlayerID).Name}'s city, {defender.Name}", MsgType.ServerInfo); ConsoleManager.Instance.WriteLine($"attacker had combat strength {attacker.BaseUnit.CombatStrength} (+{(attackerModifier - 1) * 100}%) and suffered {attackerTakes}", MsgType.ServerInfo); ConsoleManager.Instance.WriteLine($"defender had modifier of {defender.Defense} (+{(defender.DefenseModifier - 1) * 100}%) and suffered {defenderTakes}", MsgType.ServerInfo); }