Esempio n. 1
0
        // 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));
        }
Esempio n. 2
0
        // 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);
            }
        }
Esempio n. 3
0
        // 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);
        }