Exemple #1
0
 public UnitAttackArgs(BattleSideType attackerSideType, int attackerUnit, int attackerUnitId, int targetUnit, int damage, int unitHealth)
 {
     m_attackerSideType = attackerSideType;
     m_damage           = damage;
     m_targetUnit       = targetUnit;
     m_attackerUnit     = attackerUnit;
     m_attackerUnitId   = attackerUnitId;
     m_unitHealth       = unitHealth;
 }
Exemple #2
0
        protected override int[] GetUnitsDamage(BattleSideType battleSideTime, Unit unit, int unitCount, Random random)
        {
            int[] result = new int[unitCount];

            DamageGenerator damageGenerator = GetDamageGenerator(battleSideTime, unit);

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = damageGenerator.Generate();
            }

            return(result);
        }
        internal BattleSideStep(Battle battle, BattleSideType sideType)
        {
            BattleSide battleSide = battle.Sides[(int)sideType];

            m_counts = new short[battleSide.Counts.Length];
            Array.Copy(battleSide.Counts, m_counts, m_counts.Length);
            m_healts = new int[battleSide.Units.Length];
            for (int i = 0; i < battleSide.Units.Length; i++)
            {
                m_healts[i] = battleSide.Units[i].Health;
            }
            m_general = battleSide.General;
        }
        private int AttackUnits2(
            int unitIndex,
            int unitCount,
            int targetIndex,
            Battle battle,
            BattleStep newStep,
            BattleSideType attackerSide,
            Random random,
            UnitAttackHandler unitAttackHandler)
        {
            Unit unit = battle.Sides[(int)attackerSide].Units[unitIndex];

            return(AttackUnits2(unit, unitIndex, unitCount, targetIndex, battle, newStep, attackerSide, random, unitAttackHandler));
        }
        private static BattleSideType GetEnemySide(BattleSideType side)
        {
            switch (side)
            {
            case BattleSideType.Player:
                return(BattleSideType.Enemy);

            case BattleSideType.Enemy:
                return(BattleSideType.Player);

            default:
                throw new ArgumentOutOfRangeException("side");
            }
        }
Exemple #6
0
        internal Step(Battle battle, List <UnitAttackArgs> attacks)
        {
            AddAttacks(battle, attacks);

            List <UnitAttackArgs> temp = new List <UnitAttackArgs>();
            BattleSideType        side = BattleSideType.Player;
            int attacker = int.MinValue;

            foreach (UnitAttackArgs arg in attacks)
            {
                if (side != arg.AttackerSide || arg.AttackerUnit != attacker)
                {
                    if (temp.Count > 0)
                    {
                        SquadAttack attack = new SquadAttack(battle, temp);
                        if (side == BattleSideType.Player)
                        {
                            PlayerSqadsAttacks.Add(attack);
                        }
                        else
                        {
                            EnemySqadsAttacks.Add(attack);
                        }
                        temp.Clear();
                    }

                    side     = arg.AttackerSide;
                    attacker = arg.AttackerUnit;
                }

                temp.Add(arg);
            }

            if (temp.Count > 0)
            {
                SquadAttack attack = new SquadAttack(battle, temp);
                if (side == BattleSideType.Player)
                {
                    PlayerSqadsAttacks.Add(attack);
                }
                else
                {
                    EnemySqadsAttacks.Add(attack);
                }
            }
        }
        protected override int[] GetUnitsDamage(BattleSideType battleSideTime, Unit unit, int unitCount, Random random)
        {
            int[] originalDamages = new int[unitCount];
            for (int i = 0; i < originalDamages.Length; i++)
            {
                originalDamages[i] = random.Next(1, 101) > unit.Accuracy
                                                        ? unit.MinDamage
                                                        : unit.MaxDamage;
            }
            Shuffle(originalDamages, random);

            /*byte[] temp = new byte[unitCount];
             * byte bound = (byte)Math.Round((double)255 * unit.Accuracy / 100);
             * random.NextBytes(temp);
             * for(int i = 0; i < temp.Length; i++)
             * {
             *      originalDamages[i] = temp[i] > bound
             *                      ? unit.MinDamage
             *                      : unit.MaxDamage;
             * }*/
            return(originalDamages);
        }
Exemple #8
0
        private DamageGenerator GetDamageGenerator(BattleSideType battleSideTime, Unit unit)
        {
            DamageGenerator result;

            if (battleSideTime == BattleSideType.Player)
            {
                if (m_attackerChances.TryGetValue(unit.Id, out result))
                {
                    return(result);
                }
            }
            else
            {
                if (m_defenderChances.TryGetValue(unit.Id, out result))
                {
                    return(result);
                }
            }

            if (result == null)
            {
                result = new DamageGenerator(unit,
                                             battleSideTime == BattleSideType.Player
                                                                ? m_targetAttackerChance
                                                                : m_targetDefenderChance);

                if (battleSideTime == BattleSideType.Player)
                {
                    m_attackerChances[unit.Id] = result;
                }
                else
                {
                    m_defenderChances[unit.Id] = result;
                }
            }

            return(result);
        }
 protected abstract int[] GetUnitsDamage(BattleSideType battleSideTime, Unit unit, int unitCount, Random random);
        private int AttackUnits2(
            Unit unit,
            int unitIndex,
            int unitCount,
            int targetIndex,
            Battle battle,
            BattleStep newStep,
            BattleSideType attackerSide,
            Random random,
            UnitAttackHandler unitAttackHandler)
        {
            BattleSideType defenderSideType = GetEnemySide(attackerSide);
            BattleSideStep defenderSideStep = newStep.Sides[(int)defenderSideType];

            int[] originalDamages = GetUnitsDamage(attackerSide, unit, unitCount, random);

            int[] reducedDamages = originalDamages;

            double towerBonus = battle.Sides[(int)defenderSideType].TowerBonus;

            if (towerBonus > 0 && unit.IgnoreTowerBonus != 100)
            {
                towerBonus = towerBonus * (1 - unit.IgnoreTowerBonus / 100);

                reducedDamages = new int[originalDamages.Length];
                for (int i = 0; i < originalDamages.Length; i++)
                {
                    reducedDamages[i] = (int)Math.Truncate(originalDamages[i] * towerBonus);
                }
            }

            if (targetIndex < 0)
            {
                targetIndex = GetTargetIndex(unit, defenderSideStep.Counts, defenderSideStep.Healts);
            }

            if (targetIndex < 0)
            {
                // no more targets
                return(-1);
            }

            int[] damages = GetDamageWithTargetUnitReduction(
                battle.Sides[(int)defenderSideType].Units[targetIndex],
                originalDamages,
                reducedDamages);

            int unitId = 0;

            foreach (int temp in damages)
            {
                int damage = temp;
                unitId++;
                if (unitAttackHandler != null)
                {
                    if (unit.AttackOnArea)
                    {
                        unitAttackHandler(null, new UnitAttackArgs(
                                              attackerSide,
                                              unitIndex,
                                              unitId,
                                              targetIndex,
                                              Math.Min(damage, defenderSideStep.Healts[targetIndex]),
                                              defenderSideStep.Healts[targetIndex]));
                    }
                    else
                    {
                        unitAttackHandler(null, new UnitAttackArgs(
                                              attackerSide,
                                              unitIndex,
                                              unitId,
                                              targetIndex,
                                              damage,
                                              defenderSideStep.Healts[targetIndex]));
                    }
                }
                defenderSideStep.Healts[targetIndex] -= damage;

                if (defenderSideStep.Healts[targetIndex] <= 0)
                {
                    defenderSideStep.Counts[targetIndex]--;
                    damage = -defenderSideStep.Healts[targetIndex];
                    int targetUnitHealth = battle.Sides[(int)defenderSideType].Units[targetIndex].Health;
                    defenderSideStep.Healts[targetIndex] = targetUnitHealth;

                    if (unit.AttackOnArea)
                    {
                        while (damage > 0)
                        {
                            targetUnitHealth = battle.Sides[(int)defenderSideType].Units[targetIndex].Health;
                            int remDamage;
                            int killedUnits = Math.DivRem(
                                damage,
                                targetUnitHealth,
                                out remDamage);

                            if (killedUnits < defenderSideStep.Counts[targetIndex])
                            {
                                defenderSideStep.Counts[targetIndex] -= (short)killedUnits;
                                defenderSideStep.Healts[targetIndex] -= (short)remDamage;
                                int prevDamage = 0;
                                if (defenderSideStep.Healts[targetIndex] <= 0)
                                {
                                    prevDamage = remDamage + defenderSideStep.Healts[targetIndex];
                                    remDamage  = remDamage - prevDamage;
                                    defenderSideStep.Counts[targetIndex]--;
                                    defenderSideStep.Healts[targetIndex] = targetUnitHealth;
                                }

                                damage = 0;
                                if (unitAttackHandler != null)
                                {
                                    if (prevDamage > 0)
                                    {
                                        unitAttackHandler(null, new UnitAttackArgs(
                                                              attackerSide,
                                                              unitIndex,
                                                              unitId,
                                                              targetIndex,
                                                              prevDamage,
                                                              battle.Sides[(int)defenderSideType].Units[targetIndex].Health));
                                    }

                                    for (int i = 0; i < killedUnits; i++)
                                    {
                                        unitAttackHandler(null, new UnitAttackArgs(
                                                              attackerSide,
                                                              unitIndex,
                                                              unitId,
                                                              targetIndex,
                                                              targetUnitHealth,
                                                              battle.Sides[(int)defenderSideType].Units[targetIndex].Health));
                                    }

                                    if (remDamage > 0)
                                    {
                                        unitAttackHandler(null, new UnitAttackArgs(
                                                              attackerSide,
                                                              unitIndex,
                                                              unitId,
                                                              targetIndex,
                                                              remDamage,
                                                              battle.Sides[(int)defenderSideType].Units[targetIndex].Health));
                                    }
                                }
                            }
                            else
                            {
                                // squad killed
                                damage -= defenderSideStep.Counts[targetIndex] * targetUnitHealth;
                                if (unitAttackHandler != null)
                                {
                                    for (int i = 0; i < defenderSideStep.Counts[targetIndex]; i++)
                                    {
                                        unitAttackHandler(null, new UnitAttackArgs(
                                                              attackerSide,
                                                              unitIndex,
                                                              unitId,
                                                              targetIndex,
                                                              targetUnitHealth,
                                                              targetUnitHealth));
                                    }
                                }
                                defenderSideStep.Counts[targetIndex] = 0;

                                targetIndex = GetTargetIndex(unit, defenderSideStep.Counts, defenderSideStep.Healts);

                                if (targetIndex < 0)
                                {
                                    // no more targets
                                    return(-1);
                                }
                                damages = GetDamageWithTargetUnitReduction(
                                    battle.Sides[(int)defenderSideType].Units[targetIndex],
                                    originalDamages,
                                    reducedDamages);
                            }
                        }
                    }

                    if (unit.AttackWeaknessTarget || defenderSideStep.Counts[targetIndex] == 0)
                    {
                        targetIndex = GetTargetIndex(unit, defenderSideStep.Counts, defenderSideStep.Healts);

                        if (targetIndex < 0)
                        {
                            return(targetIndex);
                        }

                        damages = GetDamageWithTargetUnitReduction(
                            battle.Sides[(int)defenderSideType].Units[targetIndex],
                            originalDamages,
                            reducedDamages);
                    }
                }
            }

            return(targetIndex);
        }