Пример #1
0
        private Troop GetTroop(MBGUID troopId)
        {
            foreach (var party in Parties)
            {
                if (party.Troops.Any(it => it.CharacterObject.Id == troopId))
                {
                    return(party.Troops.First(it => it.CharacterObject.Id == troopId));
                }
            }

            throw new Exception($"Could not find troop with Id {troopId}");
        }
Пример #2
0
        public static MBObjectBase ReadObjectReferenceFromPacket(
            MBObjectManager objectManager,
            CompressionInfo.UnsignedInteger compressionInfo,
            ref bool bufferReadValid)
        {
            uint id = GameNetworkMessage.ReadUintFromPacket(compressionInfo, ref bufferReadValid);

            if (!bufferReadValid || id <= 0U)
            {
                return((MBObjectBase)null);
            }
            MBGUID objectId = new MBGUID(id);

            return(objectManager.GetObject(objectId));
        }
Пример #3
0
 public ArmorCraftingQuest(string questId, Hero questGiver, Settlement settlement, CampaignTime duration, ItemObject craftedObject, int amountPaidInAdvance) : base(questId, questGiver, duration, 0)
 {
     this.craftedObject       = craftedObject;
     this.amountPaidInAdvance = amountPaidInAdvance;
     isInitialized            = false;
     this.settlement          = settlement;
     settlementId             = settlement.Id;
     objectId = craftedObject.Id;
     SetDialogs();
     Campaign.Current.ConversationManager.AddDialogFlow(startDialog, this);
     Campaign.Current.ConversationManager.AddDialogFlow(endDialog, this);
     CampaignEvents.HourlyTickEvent.AddNonSerializedListener(this, new Action(this.OnHourlyTick));
     CampaignEvents.DailyTickEvent.AddNonSerializedListener(this, new Action(this.onDailyTick));
     CampaignEvents.HeroOrPartyTradedGold.AddNonSerializedListener(this, new Action <ValueTuple <Hero, PartyBase>, ValueTuple <Hero, PartyBase>, ValueTuple <int, string>, bool>(this.HeroOrPartyTradedGold));
     daysSinceCraftingStarted = 0;
     daysToCraft         = 8;
     title               = new TextObject($"Waiting for your {craftedObject.Name} to be crafted at {settlement.Name}");
     hasWaitedLongEnough = false;
 }
        internal int SimulateHit(MBGUID strikerTroopId, MBGUID strikedTroopId, float strikerAdvantage)
        {
            var attacker = GetTroop(strikerTroopId);
            var defender = GetTroop(strikedTroopId);

            var troopNumbersAdvantage = CalculateNumbersAdvantage(attacker.PartyModel.Troops.Count, defender.PartyModel.Troops.Count);

            var attackerPower                     = attacker.GetPower();
            var attackerTacticModifiers           = attacker.GetModifiersFromTactics();
            var attackerSiegeModifiers            = attacker.GetAttackingSiegeModifier(defender);
            var attackerExtraPowerFromLeaderPerks = attacker.GetAttackingModifierFromLeaderPerks(defender, Terrain, Parties[1].Troops.Contains(attacker), Battle, Parties[0].Base);
            var attackerLeaderAttackModifier      = attacker.GetAttackModifierFromLeader();

            var defenderPower                     = defender.GetPower();
            var defenderTacticModifiers           = defender.GetModifiersFromTactics();
            var defenderSiegeModifiers            = defender.GetDefendingSiegeModifier(attacker);
            var defenderExtraPowerFromLeaderPerks = defender.GetDefendingModifierFromLeaderPerks(attacker, Terrain, Parties[1].Troops.Contains(defender), Battle);
            var defenderLeaderDefenseModifier     = defender.GetDefenseModifierFromLeader();

            bool makesSenseToAttackThisUnit = attacker.DoesItMakeSenseToAttackThisUnit(defender);
            //if it doesn't make sense to attack current defender, reduce damage by the value from config
            var makesSenseToAttackUnitModifier = makesSenseToAttackThisUnit ? 1f : 1f + (float)Config.CurrentConfig.DoesntMakeSenseToAttackModifier / 100;

            var finalAttackerPower = attackerPower
                                     * attackerTacticModifiers.AttackBonus
                                     * attackerSiegeModifiers
                                     * attackerExtraPowerFromLeaderPerks
                                     * attackerLeaderAttackModifier
                                     * makesSenseToAttackUnitModifier;

            var finalDefenderPower = defenderPower
                                     * defenderTacticModifiers.DefenseBonus
                                     * defenderSiegeModifiers
                                     * defenderExtraPowerFromLeaderPerks
                                     * defenderLeaderDefenseModifier;

            var damage = (int)(50f * (finalAttackerPower / finalDefenderPower) * strikerAdvantage * troopNumbersAdvantage);

            return(damage);
        }
Пример #5
0
 internal void RemoveTroop(BattleSideEnum side, MBGUID troopId)
 {
     Parties[(int)side].RemoveTroop(troopId);
 }
Пример #6
0
 internal void RemoveTroop(MBGUID troopId)
 {
     Troops.Remove(Troops.Find(t => t.CharacterObject.Id == troopId));
 }
Пример #7
0
 internal static bool TryRemoveSimulationModel(MBGUID battleId, out SimulationModel simulationModel)
 {
     return(pool.TryRemove(battleId, out simulationModel));
 }
        internal void InitializeAOHeroRelations()
        {
            Dictionary <long, int>  nativeRelations = new Dictionary <long, int>(FieldAccessHelper.heroRelationsByRef(FieldAccessHelper.heroRelationsInstanceByRef(CharacterRelationManager.Instance)));
            Dictionary <ulong, int> heroRelations   = new Dictionary <ulong, int>();

#if STABLE
            foreach (Hero baseHero in Hero.All.Where(h => (h.IsNoble || h.IsWanderer) && h != Hero.MainHero))
            {
                foreach (Hero otherHero in Hero.All.Where(h => (h.IsNoble || h.IsWanderer) && h != baseHero))
                {
                    heroRelations.Add(ElegantPairHelper.Pair(baseHero.Id, otherHero.Id), nativeRelations.TryGetValue(MBGUID.GetHash2(baseHero.Id, otherHero.Id), out int relation) ? relation : 0);
                }
            }
#else
            foreach (Hero baseHero in Hero.AllAliveHeroes.Where(h => (h.IsNoble || h.IsWanderer) && h != Hero.MainHero))
            {
                foreach (Hero otherHero in Hero.AllAliveHeroes.Where(h => (h.IsNoble || h.IsWanderer) && h != baseHero))
                {
                    heroRelations.Add(ElegantPairHelper.Pair(baseHero.Id, otherHero.Id), nativeRelations.TryGetValue(MBGUID.GetHash2(baseHero.Id, otherHero.Id), out int relation) ? relation : 0);
                }
            }
#endif
            _AOHeroRelations = heroRelations;
        }
 /// <summary>Pairs two <see cref="MBGUID" /> objects based on their position.</summary>
 /// <param name="a">First <see cref="MBGUID" /> object in a pair.</param>
 /// <param name="b">Second <see cref="MBGUID" /> object in a pair.</param>
 /// <returns>A 64-bit unsigned integer representing the initial pair.</returns>
 public static ulong Pair(MBGUID a, MBGUID b) => Pair(a.InternalValue, b.InternalValue);
Пример #10
0
 public static ulong Pair(MBGUID a, MBGUID b)
 {
     return(Pair(a.InternalValue, b.InternalValue));
 }
Пример #11
0
 public Argument(MBGUID guid) : this()
 {
     EventType = EventArgType.MBGUID;
     MbGUID    = guid;
 }
Пример #12
0
 private DataKey(MBGUID objectId, string key) => (ObjectId, Key) = (objectId, key);
Пример #13
0
 public static void WriteMBGUID(this RailBitBuffer buffer, MBGUID guid)
 {
     buffer.WriteUInt(guid.InternalValue);
 }