Ejemplo n.º 1
0
 public override void OnBehaviourInitialize()
 {
     base.OnBehaviourInitialize();
     this._siegeDeploymentHandler = this.Mission.GetMissionBehaviour <SiegeDeploymentHandler>();
     this._missionBoundaryPlacer  = this.Mission.GetMissionBehaviour <MissionBoundaryPlacer>();
     this._missionAgentSpawnLogic = this.Mission.GetMissionBehaviour <MissionAgentSpawnLogic>();
 }
Ejemplo n.º 2
0
        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();
            })));
        }