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}"); }
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)); }
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); }
internal void RemoveTroop(BattleSideEnum side, MBGUID troopId) { Parties[(int)side].RemoveTroop(troopId); }
internal void RemoveTroop(MBGUID troopId) { Troops.Remove(Troops.Find(t => t.CharacterObject.Id == troopId)); }
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);
public static ulong Pair(MBGUID a, MBGUID b) { return(Pair(a.InternalValue, b.InternalValue)); }
public Argument(MBGUID guid) : this() { EventType = EventArgType.MBGUID; MbGUID = guid; }
private DataKey(MBGUID objectId, string key) => (ObjectId, Key) = (objectId, key);
public static void WriteMBGUID(this RailBitBuffer buffer, MBGUID guid) { buffer.WriteUInt(guid.InternalValue); }