コード例 #1
0
        private void BattleActionAttacked(IBattleManager battle,
                                          BattleManager.BattleSide attackingside,
                                          ICombatGroup attackerGroup,
                                          ICombatObject attacker,
                                          ICombatGroup targetGroup,
                                          ICombatObject target,
                                          decimal damage,
                                          int attackerCount,
                                          int targetCount)
        {
            if (target.ClassType == BattleClass.Structure && attackingside == BattleManager.BattleSide.Attack && target.IsDead)
            {
                if (objectTypeFactory.IsObjectType("BattleNoStaminaReduction", target.Type))
                {
                    return;
                }

                if (objectTypeFactory.IsObjectType("BattleNoStaminaReductionEarlyLevels", target.Type) && target.Lvl < 5)
                {
                    return;
                }

                Stamina = BattleFormulas.GetStaminaStructureDestroyed(Stamina, target);
            }
        }
コード例 #2
0
        private void BattleActionAttacked(IBattleManager battle,
                                          BattleManager.BattleSide attackingside,
                                          ICombatGroup attackerGroup,
                                          ICombatObject attacker,
                                          ICombatGroup targetGroup,
                                          ICombatObject target,
                                          decimal damage,
                                          int attackerCount,
                                          int targetCount)
        {
            // Check if the unit being attacked belongs to us
            if (targetGroup.Id != combatGroup.Id)
            {
                return;
            }

            // Check to see if player should retreat
            var remainingUnitCount = troopStub.TotalCount;

            // Don't return if we haven't fulfilled the minimum rounds or not below the threshold
            if (target.RoundsParticipated < Config.battle_retreat_min_rounds || remainingUnitCount == 0 ||
                remainingUnitCount > troopStub.RetreatCount)
            {
                return;
            }

            battle.Remove(combatGroup,
                          attackingside == BattleManager.BattleSide.Attack
                                  ? BattleManager.BattleSide.Defense
                                  : BattleManager.BattleSide.Attack,
                          ReportState.Retreating);
        }
コード例 #3
0
        private void MainBattleOnUnitKilled(IBattleManager battle,
                                            BattleManager.BattleSide combatObjectSide,
                                            ICombatGroup combatGroup,
                                            ICombatObject combatObject,
                                            int count)
        {
            IStronghold stronghold;

            if (!gameObjectLocator.TryGetObjects(strongholdId, out stronghold))
            {
                throw new Exception("Stronghold not found");
            }

            var defensiveMeter = battle.GetProperty <decimal>("defense_stronghold_meter");
            var offensiveMeter = battle.GetProperty <decimal>("offense_stronghold_meter");

            if (combatObjectSide == BattleManager.BattleSide.Attack)
            {
                offensiveMeter -= combatObject.Stats.NormalizedCost * count;
            }
            else
            {
                defensiveMeter -= combatObject.Stats.NormalizedCost * count;
            }

            battle.SetProperty("defense_stronghold_meter", defensiveMeter);
            battle.SetProperty("offense_stronghold_meter", offensiveMeter);
        }
コード例 #4
0
 public void AddAccess(ICombatGroup group, BattleManager.BattleSide battleSide)
 {
     battleReportWriter.SnapBattleAccess(battle.BattleId,
                                         group.Owner,
                                         group.TroopId,
                                         group.Id,
                                         battleSide == BattleManager.BattleSide.Attack);
 }
コード例 #5
0
 public void AddAccess(BattleOwner owner, BattleManager.BattleSide battleSide)
 {
     battleReportWriter.SnapBattleAccess(battle.BattleId,
                                         owner,
                                         0,
                                         0,
                                         battleSide == BattleManager.BattleSide.Attack);
 }
コード例 #6
0
 private void BattleUnitKilled(IBattleManager battle,
                               BattleManager.BattleSide objSide,
                               ICombatGroup combatGroup,
                               ICombatObject obj)
 {
     Append("**************Removing****************");
     PrintCombatobject(obj);
 }
コード例 #7
0
 private void BattleSkippedAttacker(IBattleManager battle,
                                    BattleManager.BattleSide objSide,
                                    ICombatGroup combatGroup,
                                    ICombatObject obj)
 {
     Append("***************Skipping***************");
     PrintCombatobject(obj);
     Append("**************************************\n");
 }
コード例 #8
0
        private void BattleManagerOnGroupUnitRemoved(IBattleManager battle,
                                                     BattleManager.BattleSide combatObjectSide,
                                                     ICombatGroup combatGroup,
                                                     ICombatObject combatObject)
        {
            var packet = CreatePacket(battle, Command.BattleGroupUnitRemoved);

            packet.AddUInt32(combatGroup.Id);
            packet.AddUInt32(combatObject.Id);
            channel.Post(channelName, packet);
        }
コード例 #9
0
 private void BmUnitRemoved2(IBattleManager battle,
                             BattleManager.BattleSide objSide,
                             ICombatGroup group,
                             ICombatObject obj)
 {
     deadObject = obj;
     if (obj is AttackCombatUnit)
     {
         if (sw != null)
         {
             WriteResult(obj);
         }
     }
 }
コード例 #10
0
 private void BattleUnitKilled(IBattleManager battle,
                               BattleManager.BattleSide objSide,
                               ICombatGroup group,
                               ICombatObject obj)
 {
     deadObject = obj;
     if (obj is DefenseCombatUnit)
     {
         if (sw != null)
         {
             WriteResult(obj);
         }
     }
 }
コード例 #11
0
        /// <summary>
        ///     Gives alignment points when a structure is destroyed.
        /// </summary>
        private void BattleUnitKilled(IBattleManager battle,
                                      BattleManager.BattleSide objSide,
                                      ICombatGroup combatGroup,
                                      ICombatObject obj)
        {
            // Keep track of our buildings destroyed HP
            if (objSide != BattleManager.BattleSide.Defense || obj.ClassType != BattleClass.Structure)
            {
                return;
            }

            destroyedHp += (uint)obj.Stats.MaxHp;
            AddAlignmentPoint(battle.Attackers, battle.Defenders, Config.battle_stamina_destroyed_deduction);
        }
コード例 #12
0
 private void BattleActionAttacked(IBattleManager battle,
                                   BattleManager.BattleSide attackingSide,
                                   ICombatGroup attackerGroup,
                                   ICombatObject source,
                                   ICombatGroup defenderGroup,
                                   ICombatObject target,
                                   decimal damage,
                                   int attackerCount,
                                   int targetCount)
 {
     Append("*************Attacking****************");
     PrintCombatobject(source);
     PrintCombatobject(target);
     //Append("**************************************\n");
 }
コード例 #13
0
        private void BattleSkippedAttacker(IBattleManager battle,
                                           BattleManager.BattleSide objSide,
                                           ICombatGroup combatGroup,
                                           ICombatObject source)
        {
            // Don't inform client for objs that simply never attack
            if (source.Stats.Atk == 0)
            {
                return;
            }

            var packet = CreatePacket(battle, Command.BattleSkipped);

            packet.AddUInt32(combatGroup.Id);
            packet.AddUInt32(source.Id);
            channel.Post(channelName, packet);
        }
コード例 #14
0
        private void BattleActionAttacked(IBattleManager battleManager,
                                          BattleManager.BattleSide attackingSide,
                                          ICombatGroup attackerGroup,
                                          ICombatObject source,
                                          ICombatGroup targetGroup,
                                          ICombatObject target,
                                          decimal damage,
                                          int attackerCount,
                                          int targetCount)
        {
            ICity city;

            if (!gameObjectLocator.TryGetObjects(cityId, out city))
            {
                return;
            }

            var cityCombatTarget = target as CityCombatObject;

            // Check if we should retreat a unit
            if (cityCombatTarget == null || attackingSide == BattleManager.BattleSide.Defense ||
                cityCombatTarget.TroopStub.Station != city || cityCombatTarget.TroopStub.TotalCount <= 0 ||
                cityCombatTarget.TroopStub.TotalCount > cityCombatTarget.TroopStub.RetreatCount)
            {
                return;
            }

            ITroopStub stub = cityCombatTarget.TroopStub;

            // Remove the object from the battle
            city.Battle.Remove(targetGroup, BattleManager.BattleSide.Defense, ReportState.Retreating);
            stub.BeginUpdate();
            stub.State = TroopState.Stationed;
            stub.EndUpdate();

            // Send the defender back to their city
            var troopInitializer   = troopInitializerFactory.CreateStationedTroopObjectInitializer(stub);
            var retreatChainAction = actionFactory.CreateRetreatChainAction(stub.City.Id, troopInitializer);
            var result             = stub.City.Worker.DoPassive(stub.City, retreatChainAction, true);

            if (result != Error.Ok)
            {
                throw new Exception("Unexpected failure when retreating a unit from city");
            }
        }
コード例 #15
0
        public void TestReduceStaminaWhenStructureDestroyed(BattleManager.BattleSide attackingSide,
                                                            BattleClass targetClassType,
                                                            bool targetIsDead,
                                                            bool isNoReductionType,
                                                            int expectedStamina)
        {
            var fixture = new Fixture().Customize(new AutoNSubstituteCustomization());

            var target = Substitute.For <ICombatObject>();

            target.Type.Returns((ushort)100);
            target.ClassType.Returns(targetClassType);
            target.IsDead.Returns(targetIsDead);

            var objectTypeFactory = Substitute.For <IObjectTypeFactory>();

            objectTypeFactory.IsObjectType("BattleNoStaminaReduction", 100).Returns(isNoReductionType);
            fixture.Register(() => objectTypeFactory);

            var battleFormulas = Substitute.For <IBattleFormulas>();

            battleFormulas.GetStaminaStructureDestroyed(10, target).Returns((short)7);
            fixture.Register(() => battleFormulas);

            var battleManager = fixture.Freeze <IBattleManager>();

            var staminaMonitor = fixture.Create <StaminaMonitor>();

            staminaMonitor.Stamina = 10;

            battleManager.ActionAttacked += Raise.Event <BattleManager.OnAttack>(battleManager,
                                                                                 attackingSide,
                                                                                 Substitute.For <ICombatGroup>(),
                                                                                 Substitute.For <ICombatObject>(),
                                                                                 Substitute.For <ICombatGroup>(),
                                                                                 target,
                                                                                 20m,
                                                                                 1,
                                                                                 1);

            staminaMonitor.Stamina.Should().Be((short)expectedStamina);
        }
コード例 #16
0
        private void BattleActionAttacked(IBattleManager battle,
                                          BattleManager.BattleSide attackingSide,
                                          ICombatGroup attackerGroup,
                                          ICombatObject source,
                                          ICombatGroup targetGroup,
                                          ICombatObject target,
                                          decimal damage,
                                          int attackerCount,
                                          int targetCount)
        {
            var packet = CreatePacket(battle, Command.BattleAttack);

            packet.AddByte((byte)attackingSide);
            packet.AddUInt32(attackerGroup.Id);
            packet.AddUInt32(source.Id);
            packet.AddUInt32(targetGroup.Id);
            packet.AddUInt32(target.Id);
            packet.AddFloat((float)damage);
            packet.AddInt32(attackerCount);
            packet.AddInt32(targetCount);
            channel.Post(channelName, packet);
        }
コード例 #17
0
        private void BattleOnActionAttacked(IBattleManager battle,
                                            BattleManager.BattleSide attackingSide,
                                            ICombatGroup attackerGroup,
                                            ICombatObject attacker,
                                            ICombatGroup targetGroup,
                                            ICombatObject target,
                                            decimal damage,
                                            int attackerCount,
                                            int targetCount)
        {
            if (attackingSide != BattleManager.BattleSide.Attack || attackerGroup.Owner.Type != BattleOwnerType.City)
            {
                return;
            }

            ICity attackingCity;

            if (!gameObjectLocator.TryGetObjects(attackerGroup.Owner.Id, out attackingCity))
            {
                throw new Exception("Attacker city not found");
            }

            if (!attackingCity.Owner.IsInTribe)
            {
                return;
            }

            var tribeId = attackingCity.Owner.Tribesman.Tribe.Id;

            if (tribeDamageDealt.ContainsKey(tribeId))
            {
                tribeDamageDealt[tribeId] += damage;
            }
            else
            {
                tribeDamageDealt[tribeId] = damage;
            }
        }
コード例 #18
0
 public void AddTribeToBattle(ITribe tribe, BattleManager.BattleSide side)
 {
     battleReportWriter.SnapTribeToBattle(battle.BattleId, tribe.Id, side == BattleManager.BattleSide.Attack);
 }
コード例 #19
0
        private void BattleActionAttacked(IBattleManager battle,
                                          BattleManager.BattleSide attackingSide,
                                          ICombatGroup attackerGroup,
                                          ICombatObject attacker,
                                          ICombatGroup targetGroup,
                                          ICombatObject target,
                                          decimal damage,
                                          int attackerCount,
                                          int targetCount)
        {
            ICity        city;
            ITroopObject troopObject;

            if (!gameObjectLocator.TryGetObjects(cityId, troopObjectId, out city, out troopObject))
            {
                throw new ArgumentException();
            }

            if (attackerGroup.Id == groupId && target.ClassType == BattleClass.Structure && target is ICombatStructure &&
                target.IsDead)
            {
                // if our troop knocked down a building, we get the bonus.
                bonus.Add(structureCsvFactory.GetCost(target.Type, target.Lvl) / 2);

                IStructure structure = ((ICombatStructure)target).Structure;
                object     value;
                if (structure.Properties.TryGet("Crop", out value))
                {
                    if (value is int)
                    {
                        bonus.Crop += (int)value;
                    }
                }
                if (structure.Properties.TryGet("Gold", out value))
                {
                    if (value is int)
                    {
                        bonus.Gold += (int)value;
                    }
                }
                if (structure.Properties.TryGet("Iron", out value))
                {
                    if (value is int)
                    {
                        bonus.Iron += (int)value;
                    }
                }
                if (structure.Properties.TryGet("Wood", out value))
                {
                    if (value is int)
                    {
                        bonus.Wood += (int)value;
                    }
                }
                if (structure.Properties.TryGet("Labor", out value))
                {
                    if (value is int)
                    {
                        bonus.Labor += (int)value;
                    }
                }

                dbManager.Save(this);
            }
        }
コード例 #20
0
        public void NextObject_WhenCalled_CorrectAttackerIsReturned(int randomness, int attackerUpkeep, int defenderUpkeep, BattleManager.BattleSide side)
        {
            var random = Substitute.For <IBattleRandom>();

            random.Next(Arg.Any <int>()).Returns(randomness);
            BattleOrder battleOrder = new BattleOrder(random);

            ICombatObject outCombatObject;
            ICombatGroup  outCombatGroup;

            BattleManager.BattleSide foundInGroup;

            var attackerObject = CreateCombatObject(0);
            var attackerGroup  = CreateGroup(attackerObject);
            var attackerList   = CreateList(attackerUpkeep, attackerGroup);

            var defenderObject = CreateCombatObject(0);
            var defenderGroup  = CreateGroup(defenderObject);
            var defenderList   = CreateList(defenderUpkeep, defenderGroup);

            var result = battleOrder.NextObject(0, attackerList, defenderList, out outCombatObject, out outCombatGroup, out foundInGroup);

            result.Should().Be(true);
            outCombatObject.Should().Be(side == BattleManager.BattleSide.Attack ? attackerObject : defenderObject);
            foundInGroup.Should().Be(side);
            random.Received(1).Next(defenderUpkeep + attackerUpkeep);
        }
コード例 #21
0
        /// <summary>
        ///     Returns the next object from the primary group that should attack.
        ///     If primary group has no one able to attack, it will look into the secondary group instead.
        /// </summary>
        /// <returns>True if got an object from the current round. False if had to look into next round.</returns>
        public bool NextObject(uint round,
                               ICombatList attacker,
                               ICombatList defender,
                               out ICombatObject outCombatObject,
                               out ICombatGroup outCombatGroup,
                               out BattleManager.BattleSide foundInGroup)
        {
            var attackerUpkeep = attacker.UpkeepNotParticipatedInRound(round);
            var defenderUpkeep = defender.UpkeepNotParticipatedInRound(round);

            if (attackerUpkeep == 0 && defenderUpkeep == 0)
            {
                attackerUpkeep = attacker.UpkeepNotParticipatedInRound(round + 1);
                defenderUpkeep = defender.UpkeepNotParticipatedInRound(round + 1);
            }

            BattleManager.BattleSide sideAttack = random.Next(attackerUpkeep + defenderUpkeep) < attackerUpkeep
                                                          ? BattleManager.BattleSide.Attack
                                                          : BattleManager.BattleSide.Defense;
            var offensiveCombatList = sideAttack == BattleManager.BattleSide.Attack ? attacker : defender;
            var defensiveCombatList = sideAttack == BattleManager.BattleSide.Attack ? defender : attacker;
            var offensiveSide       = sideAttack;
            var defensiveSide       = sideAttack == BattleManager.BattleSide.Attack
                                        ? BattleManager.BattleSide.Defense
                                        : BattleManager.BattleSide.Attack;

            // Look into offenside combat list first
            ICombatObject outCombatObjectAttacker;
            ICombatGroup  outCombatGroupAttacker;

            if (NextObjectFromList(round, offensiveCombatList, out outCombatObjectAttacker, out outCombatGroupAttacker))
            {
                foundInGroup    = offensiveSide;
                outCombatGroup  = outCombatGroupAttacker;
                outCombatObject = outCombatObjectAttacker;
                return(true);
            }

            // Couldnt find in the attacker so look in defense
            ICombatObject outCombatObjectDefender;
            ICombatGroup  outCombatGroupDefender;

            if (NextObjectFromList(round, defensiveCombatList, out outCombatObjectDefender, out outCombatGroupDefender))
            {
                foundInGroup    = defensiveSide;
                outCombatGroup  = outCombatGroupDefender;
                outCombatObject = outCombatObjectDefender;
                return(true);
            }

            // Okay looks like both sides are done for this round. If we had an attacker
            // then we return that, otherwise go to the defender
            if (outCombatObjectAttacker != null)
            {
                foundInGroup    = offensiveSide;
                outCombatGroup  = outCombatGroupAttacker;
                outCombatObject = outCombatObjectAttacker;
            }
            else if (outCombatObjectDefender != null)
            {
                foundInGroup    = defensiveSide;
                outCombatGroup  = outCombatGroupDefender;
                outCombatObject = outCombatObjectDefender;
            }
            // If this happens then it means there is no one in the battle or the battle is prolly over
            else
            {
                outCombatGroup  = null;
                outCombatObject = null;
                foundInGroup    = offensiveSide;
                return(true);
            }

            return(false);
        }