public override void OnBehaviourInitialize() { base.OnBehaviourInitialize(); this._siegeDeploymentHandler = this.Mission.GetMissionBehaviour <SiegeDeploymentHandler>(); this._missionBoundaryPlacer = this.Mission.GetMissionBehaviour <MissionBoundaryPlacer>(); this._missionAgentSpawnLogic = this.Mission.GetMissionBehaviour <MissionAgentSpawnLogic>(); }
public TeamQuerySystem(Team team) { TeamQuerySystem teamQuerySystem = this; this.Team = team; this._mission = Mission.Current; this._memberCount = new QueryData <int>((Func <int>)(() => teamQuerySystem.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, int>)(f => f.CountOfUnits))), 2f); this._allyMemberCount = new QueryData <int>((Func <int>)(() => teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(t => t.MemberCount))), 2f); this._enemyMemberCount = new QueryData <int>((Func <int>)(() => teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(t => t.MemberCount))), 2f); this._averagePosition = new QueryData <Vec2>((Func <Vec2>)(() => teamQuerySystem._mission.GetAveragePositionOfTeam(team)), 5f); this._medianPosition = new QueryData <WorldPosition>((Func <WorldPosition>)(() => teamQuerySystem._mission.GetMedianPositionOfTeam(team, teamQuerySystem.AveragePosition)), 5f); this._averageEnemyPosition = new QueryData <Vec2>((Func <Vec2>)(() => { Vec2 positionOfEnemies = teamQuerySystem._mission.GetAveragePositionOfEnemies(team); if (positionOfEnemies.IsValid) { return(positionOfEnemies); } if (team.Side == BattleSideEnum.Attacker) { SiegeDeploymentHandler missionBehaviour = teamQuerySystem._mission.GetMissionBehaviour <SiegeDeploymentHandler>(); if (missionBehaviour != null) { return(missionBehaviour.GetEstimatedAverageDefenderPosition()); } } return(teamQuerySystem.AveragePosition.IsValid ? teamQuerySystem.AveragePosition : teamQuerySystem._mission.GetAveragePositionOfTeam(team)); }), 5f); this._medianTargetFormationPosition = new QueryData <WorldPosition>((Func <WorldPosition>)(() => !teamQuerySystem._mission.Teams.Where <Team>((Func <Team, bool>)(t => t.IsEnemyOf(teamQuerySystem.Team))).SelectMany <Team, Formation>((Func <Team, IEnumerable <Formation> >)(t => t.FormationsIncludingSpecial)).Any <Formation>() ? teamQuerySystem.MedianPosition : teamQuerySystem._mission.Teams.Where <Team>((Func <Team, bool>)(t => t.IsEnemyOf(teamQuerySystem.Team))).SelectMany <Team, Formation>((Func <Team, IEnumerable <Formation> >)(t => t.FormationsIncludingSpecial)).MinBy <Formation, float>((Func <Formation, float>)(f => f.QuerySystem.MedianPosition.AsVec2.DistanceSquared(teamQuerySystem.AverageEnemyPosition))).QuerySystem.MedianPosition), 1f); QueryData <WorldPosition> .SetupSyncGroup((IQueryData)this._averageEnemyPosition, (IQueryData)this._medianTargetFormationPosition); this._leftFlankEdgePosition = new QueryData <WorldPosition>((Func <WorldPosition>)(() => { Vec2 vec2 = (teamQuerySystem.MedianTargetFormationPosition.AsVec2 - teamQuerySystem.AveragePosition).RightVec(); double num = (double)vec2.Normalize(); WorldPosition formationPosition = teamQuerySystem.MedianTargetFormationPosition; formationPosition.SetVec2(formationPosition.AsVec2 - vec2 * 50f); return(formationPosition); }), 5f); this._rightFlankEdgePosition = new QueryData <WorldPosition>((Func <WorldPosition>)(() => { Vec2 vec2 = (teamQuerySystem.MedianTargetFormationPosition.AsVec2 - teamQuerySystem.AveragePosition).RightVec(); double num = (double)vec2.Normalize(); WorldPosition formationPosition = teamQuerySystem.MedianTargetFormationPosition; formationPosition.SetVec2(formationPosition.AsVec2 + vec2 * 50f); return(formationPosition); }), 5f); this._infantryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.MemberCount != 0 ? (teamQuerySystem.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.InfantryUnitRatio * (float)f.CountOfUnits)) + (float)team.Heroes.Count <Agent>((Func <Agent, bool>)(h => QueryLibrary.IsInfantry(h)))) / (float)teamQuerySystem.MemberCount : 0.0f), 15f); this._rangedRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.MemberCount != 0 ? (teamQuerySystem.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.RangedUnitRatio * (float)f.CountOfUnits)) + (float)team.Heroes.Count <Agent>((Func <Agent, bool>)(h => QueryLibrary.IsRanged(h)))) / (float)teamQuerySystem.MemberCount : 0.0f), 15f); this._cavalryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.MemberCount != 0 ? (teamQuerySystem.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.CavalryUnitRatio * (float)f.CountOfUnits)) + (float)team.Heroes.Count <Agent>((Func <Agent, bool>)(h => QueryLibrary.IsCavalry(h)))) / (float)teamQuerySystem.MemberCount : 0.0f), 15f); this._rangedCavalryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.MemberCount != 0 ? (teamQuerySystem.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.RangedCavalryUnitRatio * (float)f.CountOfUnits)) + (float)team.Heroes.Count <Agent>((Func <Agent, bool>)(h => QueryLibrary.IsRangedCavalry(h)))) / (float)teamQuerySystem.MemberCount : 0.0f), 15f); QueryData <float> .SetupSyncGroup((IQueryData)this._infantryRatio, (IQueryData)this._rangedRatio, (IQueryData)this._cavalryRatio, (IQueryData)this._rangedCavalryRatio); this._allyInfantryRatio = new QueryData <float>((Func <float>)(() => { int num = teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(a => a.MemberCount)); return(num == 0 ? 0.0f : teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(a => a.InfantryRatio * (float)a.MemberCount)) / (float)num); }), 15f); this._allyRangedRatio = new QueryData <float>((Func <float>)(() => { int num = teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(a => a.MemberCount)); return(num == 0 ? 0.0f : teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(a => a.RangedRatio * (float)a.MemberCount)) / (float)num); }), 15f); this._allyCavalryRatio = new QueryData <float>((Func <float>)(() => { int num = teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(a => a.MemberCount)); return(num == 0 ? 0.0f : teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(a => a.CavalryRatio * (float)a.MemberCount)) / (float)num); }), 15f); this._allyRangedCavalryRatio = new QueryData <float>((Func <float>)(() => { int num = teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(a => a.MemberCount)); return(num == 0 ? 0.0f : teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(a => a.RangedCavalryRatio * (float)a.MemberCount)) / (float)num); }), 15f); QueryData <float> .SetupSyncGroup((IQueryData)this._allyInfantryRatio, (IQueryData)this._allyRangedRatio, (IQueryData)this._allyCavalryRatio, (IQueryData)this._allyRangedCavalryRatio); this._enemyInfantryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) != 0 ? teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(e => e.InfantryRatio * (float)e.MemberCount)) / (float)teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) : 0.0f), 15f); this._enemyRangedRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) != 0 ? teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(e => e.RangedRatio * (float)e.MemberCount)) / (float)teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) : 0.0f), 15f); this._enemyCavalryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) != 0 ? teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(e => e.CavalryRatio * (float)e.MemberCount)) / (float)teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) : 0.0f), 15f); this._enemyRangedCavalryRatio = new QueryData <float>((Func <float>)(() => teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) != 0 ? teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(e => e.RangedCavalryRatio * (float)e.MemberCount)) / (float)teamQuerySystem.EnemyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, int>)(e => e.MemberCount)) : 0.0f), 15f); this._teamPower = new QueryData <float>((Func <float>)(() => team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.GetFormationPower()))), 5f); this._overallPowerRatio = new QueryData <float>((Func <float>)(() => (float)((double)teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(at => at.Team.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.FormationPower)) + 1f)) * 1.0 / ((double)teamQuerySystem._mission.Teams.GetEnemiesOf(team).Sum <Team>((Func <Team, float>)(et => et.FormationsIncludingSpecial.Sum <Formation>((Func <Formation, float>)(f => f.QuerySystem.FormationPower)))) + 1.0))), 5f); this._powerRatioIncludingCasualties = new QueryData <float>((Func <float>)(() => { CasualtyHandler casualtyHandler = teamQuerySystem._mission.GetMissionBehaviour <CasualtyHandler>(); return((float)(((double)teamQuerySystem.AllyTeams.Sum <TeamQuerySystem>((Func <TeamQuerySystem, float>)(at => at.Team.FormationsIncludingSpecialAndEmpty.Sum <Formation>((Func <Formation, float>)(f => f.GetFormationPower() + casualtyHandler.GetCasualtyPowerLossOfFormation(f))))) + 1.0) / ((double)teamQuerySystem._mission.Teams.GetEnemiesOf(team).Sum <Team>((Func <Team, float>)(et => et.FormationsIncludingSpecialAndEmpty.Sum <Formation>((Func <Formation, float>)(f => f.GetFormationPower() + casualtyHandler.GetCasualtyPowerLossOfFormation(f))))) + 1.0))); }), 10f); this._insideWallsRatio = new QueryData <float>((Func <float>)(() => { if (!(team.TeamAI is TeamAISiegeComponent)) { return(1f); } if (teamQuerySystem.AllyUnitCount == 0) { return(0.0f); } int num = 0; foreach (Team team1 in Mission.Current.Teams.GetAlliesOf(team, true)) { foreach (Formation formation in team1.FormationsIncludingSpecial) { num += formation.CountUnitsOnNavMeshIDMod10(1, false); } } return((float)num / (float)teamQuerySystem.AllyUnitCount); }), 10f); this._maxUnderRangedAttackRatio = new QueryData <float>((Func <float>)(() => { float num1; if (teamQuerySystem.AllyUnitCount == 0) { num1 = 0.0f; } else { float currentTime = MBCommon.TimeType.Mission.GetTime(); int num2 = 0; foreach (TeamQuerySystem allyTeam in teamQuerySystem.AllyTeams) { foreach (Formation formation in allyTeam.Team.Formations) { num2 += formation.GetCountOfUnitsWithCondition((Func <Agent, bool>)(agent => (double)currentTime - (double)agent.LastRangedHitTime < 10.0 && !agent.Equipment.HasShield())); } } num1 = (float)num2 / (float)teamQuerySystem.AllyUnitCount; } return((double)num1 > (double)teamQuerySystem._maxUnderRangedAttackRatio.GetCachedValue() ? num1 : teamQuerySystem._maxUnderRangedAttackRatio.GetCachedValue()); }), 3f); this.DeathCount = 0; this.DeathByRangedCount = 0; this.InitializeTelemetryScopeNames(); }
public static Mission OpenSiegeMissionWithDeployment( string scene, BasicCharacterObject character, CustomBattleCombatant playerParty, CustomBattleCombatant enemyParty, bool isPlayerGeneral, float[] wallHitPointPercentages, bool hasAnySiegeTower, Dictionary <SiegeEngineType, int> siegeWeaponsCountOfAttackers, Dictionary <SiegeEngineType, int> siegeWeaponsCountOfDefenders, bool isPlayerAttacker, int sceneUpgradeLevel = 0, string seasonString = "", bool isSallyOut = false, bool isReliefForceAttack = false, float timeOfDay = 6f) { string str1; switch (sceneUpgradeLevel) { case 1: str1 = "level_1"; break; case 2: str1 = "level_2"; break; default: str1 = "level_3"; break; } string str2 = str1 + " siege"; BattleSideEnum playerSide = playerParty.Side; IMissionTroopSupplier[] troopSuppliers = new IMissionTroopSupplier[2]; CustomBattleTroopSupplier battleTroopSupplier1 = new CustomBattleTroopSupplier(playerParty, true); troopSuppliers[(int)playerParty.Side] = (IMissionTroopSupplier)battleTroopSupplier1; CustomBattleTroopSupplier battleTroopSupplier2 = new CustomBattleTroopSupplier(enemyParty, false); troopSuppliers[(int)enemyParty.Side] = (IMissionTroopSupplier)battleTroopSupplier2; bool isPlayerSergeant = !isPlayerGeneral; return(MissionState.OpenNew("CustomSiegeBattle", new MissionInitializerRecord(scene) { PlayingInCampaignMode = false, AtmosphereOnCampaign = BannerlordMissions.CreateAtmosphereInfoForMission(seasonString, (int)timeOfDay), SceneLevels = str2, TimeOfDay = timeOfDay }, (InitializeMissionBehvaioursDelegate)(mission => { List <MissionBehaviour> missionBehaviourList = new List <MissionBehaviour>(); missionBehaviourList.Add((MissionBehaviour) new BattleSpawnLogic(isSallyOut ? "sally_out_set" : (isReliefForceAttack ? "relief_force_attack_set" : "battle_set"))); missionBehaviourList.Add((MissionBehaviour) new MissionOptionsComponent()); missionBehaviourList.Add((MissionBehaviour) new BattleEndLogic()); missionBehaviourList.Add((MissionBehaviour) new MissionCombatantsLogic((IEnumerable <IBattleCombatant>)null, (IBattleCombatant)playerParty, !isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, !isSallyOut ? Mission.MissionTeamAITypeEnum.Siege : Mission.MissionTeamAITypeEnum.SallyOut, isPlayerSergeant)); missionBehaviourList.Add((MissionBehaviour) new SiegeMissionPreparationHandler(isSallyOut, isReliefForceAttack, wallHitPointPercentages, hasAnySiegeTower)); missionBehaviourList.Add((MissionBehaviour) new MissionAgentSpawnLogic(troopSuppliers, playerSide)); if (isSallyOut) { missionBehaviourList.Add((MissionBehaviour) new CustomSiegeSallyOutMissionSpawnHandler(!isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty)); } else { missionBehaviourList.Add((MissionBehaviour) new CustomSiegeMissionSpawnHandler(!isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty)); missionBehaviourList.Add((MissionBehaviour) new AgentFadeOutLogic()); } missionBehaviourList.Add((MissionBehaviour) new BattleObserverMissionLogic()); missionBehaviourList.Add((MissionBehaviour) new CustomBattleAgentLogic()); missionBehaviourList.Add((MissionBehaviour) new AgentBattleAILogic()); if (!isSallyOut) { missionBehaviourList.Add((MissionBehaviour) new AmmoSupplyLogic(new List <BattleSideEnum>() { BattleSideEnum.Defender })); } missionBehaviourList.Add((MissionBehaviour) new AgentVictoryLogic()); missionBehaviourList.Add((MissionBehaviour) new SiegeMissionController(BannerlordMissions.GetSiegeWeaponTypes(siegeWeaponsCountOfAttackers), BannerlordMissions.GetSiegeWeaponTypes(siegeWeaponsCountOfDefenders), isPlayerAttacker, isSallyOut)); missionBehaviourList.Add((MissionBehaviour) new AssignPlayerRoleInTeamMissionController(isPlayerGeneral, isPlayerSergeant, false)); SiegeDeploymentHandler deploymentHandler = new SiegeDeploymentHandler(isPlayerAttacker, isPlayerAttacker ? BannerlordMissions.GetSiegeWeaponTypes(siegeWeaponsCountOfAttackers) : BannerlordMissions.GetSiegeWeaponTypes(siegeWeaponsCountOfDefenders)); missionBehaviourList.Add((MissionBehaviour)deploymentHandler); missionBehaviourList.Add((MissionBehaviour) new MissionAgentPanicHandler()); missionBehaviourList.Add((MissionBehaviour) new MissionBoundaryPlacer()); missionBehaviourList.Add((MissionBehaviour) new MissionBoundaryCrossingHandler()); missionBehaviourList.Add((MissionBehaviour) new AgentMoraleInteractionLogic()); missionBehaviourList.Add((MissionBehaviour) new HighlightsController()); missionBehaviourList.Add((MissionBehaviour) new BattleHighlightsController()); return (IEnumerable <MissionBehaviour>)missionBehaviourList.ToArray(); }))); }