public static Mission OpenCustomBattleMission(
            string scene,
            BasicCharacterObject character,
            CustomBattleCombatant playerParty,
            CustomBattleCombatant enemyParty,
            bool isPlayerGeneral,
            BasicCharacterObject playerSideGeneralCharacter,
            string sceneLevels  = "",
            string seasonString = "",
            float timeOfDay     = 6f)
        {
            BattleSideEnum playerSide       = playerParty.Side;
            bool           isPlayerAttacker = playerSide == BattleSideEnum.Attacker;

            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("CustomBattle", new MissionInitializerRecord(scene)
            {
                DoNotUseLoadingScreen = false,
                PlayingInCampaignMode = false,
                AtmosphereOnCampaign = BannerlordMissions.CreateAtmosphereInfoForMission(seasonString, (int)timeOfDay),
                SceneLevels = sceneLevels,
                TimeOfDay = timeOfDay
            }, (InitializeMissionBehvaioursDelegate)(missionController => (IEnumerable <MissionBehaviour>) new MissionBehaviour[20]
            {
                (MissionBehaviour) new MissionOptionsComponent(),
                (MissionBehaviour) new BattleEndLogic(),
                (MissionBehaviour) new MissionCombatantsLogic((IEnumerable <IBattleCombatant>)null, (IBattleCombatant)playerParty, !isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, isPlayerAttacker ? (IBattleCombatant)playerParty : (IBattleCombatant)enemyParty, Mission.MissionTeamAITypeEnum.FieldBattle, isPlayerSergeant),
                (MissionBehaviour) new BattleObserverMissionLogic(),
                (MissionBehaviour) new CustomBattleAgentLogic(),
                (MissionBehaviour) new MissionAgentSpawnLogic(troopSuppliers, playerSide),
                (MissionBehaviour) new CustomBattleMissionSpawnHandler(!isPlayerAttacker ? playerParty : enemyParty, isPlayerAttacker ? playerParty : enemyParty),
                (MissionBehaviour) new AgentBattleAILogic(),
                (MissionBehaviour) new AgentVictoryLogic(),
                (MissionBehaviour) new MissionAgentPanicHandler(),
                (MissionBehaviour) new MissionHardBorderPlacer(),
                (MissionBehaviour) new MissionBoundaryPlacer(),
                (MissionBehaviour) new MissionBoundaryCrossingHandler(),
                (MissionBehaviour) new BattleMissionAgentInteractionLogic(),
                (MissionBehaviour) new AgentFadeOutLogic(),
                (MissionBehaviour) new AgentMoraleInteractionLogic(),
                (MissionBehaviour) new AssignPlayerRoleInTeamMissionController(isPlayerGeneral, isPlayerSergeant, false, isPlayerSergeant ? Enumerable.Repeat <string>(character.StringId, 1).ToList <string>() : new List <string>()),
                (MissionBehaviour) new CreateBodyguardMissionBehavior(isPlayerAttacker & isPlayerGeneral ? character.GetName().ToString() : (isPlayerAttacker & isPlayerSergeant ? playerSideGeneralCharacter.GetName().ToString() : (string)null), !isPlayerAttacker & isPlayerGeneral ? character.GetName().ToString() : (!isPlayerAttacker & isPlayerSergeant ? playerSideGeneralCharacter.GetName().ToString() : (string)null)),
                (MissionBehaviour) new HighlightsController(),
                (MissionBehaviour) new BattleHighlightsController()
            })));
        }
Ejemplo n.º 2
0
 public MissionSide(
     BattleSideEnum side,
     IMissionTroopSupplier troopSupplier,
     bool isPlayerSide)
 {
     this._side              = side;
     this._spawnWithHorses   = true;
     this._spawnedFormations = new MBList <Formation>();
     this._preSuppliedTroops = new List <IAgentOriginBase>();
     this.IsPlayerSide       = isPlayerSide;
     this._troopSupplier     = troopSupplier;
 }
Ejemplo n.º 3
0
        public static Mission OpenCPUBenchmarkMission(string scene)
        {
            int realBattleSize      = BannerlordConfig.GetRealBattleSize();
            int attackerInfCount    = realBattleSize / 100 * 18;
            int attackerRangedCount = realBattleSize / 100 * 10;
            int attackerCavCount    = realBattleSize / 100 * 8;
            int defenderInfCount    = realBattleSize / 100 * 59;
            int defenderCavCount    = realBattleSize / 100 * 5;

            IMissionTroopSupplier[] troopSuppliers = new IMissionTroopSupplier[2];
            BasicCultureObject      culture        = MBObjectManager.Instance.GetObject <BasicCultureObject>("empire");
            Banner banner1 = new Banner("11.4.124.4345.4345.768.768.1.0.0.163.0.5.512.512.769.764.1.0.0");
            Banner banner2 = new Banner("11.45.126.4345.4345.768.768.1.0.0.462.0.13.512.512.769.764.1.0.0");
            CustomBattleCombatant playerParty = new CustomBattleCombatant(new TextObject("{=!}Player Party"), culture, banner1);

            playerParty.Side = BattleSideEnum.Attacker;
            playerParty.AddCharacter(MBObjectManager.Instance.GetObject <BasicCharacterObject>("imperial_legionary"), attackerInfCount);
            playerParty.AddCharacter(MBObjectManager.Instance.GetObject <BasicCharacterObject>("imperial_palatine_guard"), attackerRangedCount);
            playerParty.AddCharacter(MBObjectManager.Instance.GetObject <BasicCharacterObject>("imperial_cataphract"), attackerCavCount);
            CustomBattleCombatant enemyParty = new CustomBattleCombatant(new TextObject("{=!}Enemy Party"), culture, banner2);

            enemyParty.Side = BattleSideEnum.Defender;
            enemyParty.AddCharacter(MBObjectManager.Instance.GetObject <BasicCharacterObject>("battanian_wildling"), defenderInfCount);
            enemyParty.AddCharacter(MBObjectManager.Instance.GetObject <BasicCharacterObject>("battanian_horseman"), defenderCavCount);
            CustomBattleTroopSupplier battleTroopSupplier1 = new CustomBattleTroopSupplier(playerParty, true);

            troopSuppliers[(int)playerParty.Side] = (IMissionTroopSupplier)battleTroopSupplier1;
            CustomBattleTroopSupplier battleTroopSupplier2 = new CustomBattleTroopSupplier(enemyParty, false);

            troopSuppliers[(int)enemyParty.Side] = (IMissionTroopSupplier)battleTroopSupplier2;
            return(MissionState.OpenNew("CPUBenchmarkMission", new MissionInitializerRecord(scene)
            {
                DoNotUseLoadingScreen = false,
                PlayingInCampaignMode = false
            }, (InitializeMissionBehvaioursDelegate)(missionController => (IEnumerable <MissionBehaviour>) new MissionBehaviour[10]
            {
                (MissionBehaviour) new MissionCombatantsLogic((IEnumerable <IBattleCombatant>)null, (IBattleCombatant)playerParty, (IBattleCombatant)enemyParty, (IBattleCombatant)playerParty, Mission.MissionTeamAITypeEnum.FieldBattle, false),
                (MissionBehaviour) new MissionAgentSpawnLogic(troopSuppliers, BattleSideEnum.Attacker),
                (MissionBehaviour) new CPUBenchmarkMissionSpawnHandler(enemyParty, playerParty),
                (MissionBehaviour) new CPUBenchmarkMissionLogic(attackerInfCount, attackerRangedCount, attackerCavCount, defenderInfCount, defenderCavCount),
                (MissionBehaviour) new AgentBattleAILogic(),
                (MissionBehaviour) new AgentVictoryLogic(),
                (MissionBehaviour) new MissionHardBorderPlacer(),
                (MissionBehaviour) new MissionBoundaryPlacer(),
                (MissionBehaviour) new MissionBoundaryCrossingHandler(),
                (MissionBehaviour) new AgentFadeOutLogic()
            })));
        }
Ejemplo n.º 4
0
 public MissionAgentSpawnLogic(IMissionTroopSupplier[] suppliers, BattleSideEnum playerSide)
 {
     this._battleSize   = Math.Min(BannerlordConfig.GetRealBattleSize(), MissionAgentSpawnLogic.MaxNumberOfTroopsForMission);
     this._missionSides = new MissionAgentSpawnLogic.MissionSide[2];
     for (int index = 0; index < 2; ++index)
     {
         IMissionTroopSupplier supplier = suppliers[index];
         bool isPlayerSide = (BattleSideEnum)index == playerSide;
         this._missionSides[index] = new MissionAgentSpawnLogic.MissionSide((BattleSideEnum)index, supplier, isPlayerSide);
     }
     this._numberOfTroopsInTotal = new int[2];
     this._numberOfTroopsInQueueForReinforcement = new int[2];
     this._numberOfTroopsToSpawnPerSideFormation = new int[11];
     this._phases = new List <MissionAgentSpawnLogic.SpawnPhase> [2];
     for (int index = 0; index < 2; ++index)
     {
         this._phases[index] = new List <MissionAgentSpawnLogic.SpawnPhase>();
     }
 }
        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();
            })));
        }
        public static Mission OpenEnhancedBattleTestField(
            string scene,
            BattleConfig config,
            IEnhancedBattleTestCombatant playerParty,
            IEnhancedBattleTestCombatant enemyParty,
            float timeOfDay = 12f)
        {
            var playerSide = config.BattleTypeConfig.PlayerSide;
            var enemySide  = config.BattleTypeConfig.PlayerSide.GetOppositeSide();
            var player     = config.PlayerTeamConfig.General;

            if (player == null)
            {
                return(null);
            }

            bool hasPlayer = config.PlayerTeamConfig.HasGeneral;

            bool isPlayerAttacker = playerSide == BattleSideEnum.Attacker;

            IMissionTroopSupplier[] troopSuppliers = new IMissionTroopSupplier[2];
            bool isMultiplayer = EnhancedBattleTestSubModule.IsMultiplayer;

            troopSuppliers[(int)playerSide] = CreateTroopSupplier(playerParty, isMultiplayer, true);
            troopSuppliers[(int)enemySide]  = CreateTroopSupplier(enemyParty, isMultiplayer, false);
            bool isPlayerGeneral  = config.BattleTypeConfig.PlayerType == PlayerType.Commander;
            bool isPlayerSergeant = hasPlayer && config.BattleTypeConfig.PlayerType == PlayerType.Sergeant;

            List <CharacterObject> charactersInPlayerSideByPriority = null;
            List <CharacterObject> charactersInEnemySideByPriority  = null;
            string playerTeamGeneralName = null;
            string enemyTeamGeneralName  = null;

            if (!isMultiplayer)
            {
                var playerCharacter = player.CharacterObject as CharacterObject;
                if (playerCharacter == null)
                {
                    return(null);
                }
                charactersInPlayerSideByPriority = Utility.OrderHeroesByPriority(config.PlayerTeamConfig);
                var playerGeneral = hasPlayer && isPlayerGeneral
                    ? playerCharacter
                    : (hasPlayer && charactersInPlayerSideByPriority.First() == playerCharacter
                        ? charactersInPlayerSideByPriority.Skip(1).FirstOrDefault()
                        : charactersInPlayerSideByPriority.FirstOrDefault());
                if (playerGeneral != null)
                {
                    charactersInPlayerSideByPriority.Remove(playerGeneral);
                    playerTeamGeneralName = TextObject.ConvertToStringList(new List <TextObject>()
                    {
                        playerGeneral.Name
                    }).FirstOrDefault();
                }
                charactersInEnemySideByPriority = Utility.OrderHeroesByPriority(config.EnemyTeamConfig);
                var enemyGeneral = charactersInEnemySideByPriority.FirstOrDefault();
                if (enemyGeneral != null)
                {
                    charactersInEnemySideByPriority.Remove(enemyGeneral);
                    enemyTeamGeneralName = TextObject.ConvertToStringList(new List <TextObject>()
                    {
                        enemyGeneral.Name
                    }).FirstOrDefault();
                }
            }


            AtmosphereInfo atmosphereInfo = CreateAtmosphereInfoForMission(config.MapConfig.Season, timeOfDay);

            return(MissionState.OpenNew("EnhancedBattleTestFieldBattle", new MissionInitializerRecord(scene)
            {
                DoNotUseLoadingScreen = false,
                PlayingInCampaignMode = false,
                AtmosphereOnCampaign = atmosphereInfo,
                SceneLevels = "",
                TimeOfDay = timeOfDay
            }, mission =>
                                        new MissionBehaviour[]
            {
                new CommanderLogic(config),
                new MissionOptionsComponent(),
                new BattleEndLogic(),
                new MissionCombatantsLogic(null, playerParty,
                                           !isPlayerAttacker ? playerParty : enemyParty,
                                           isPlayerAttacker ? playerParty : enemyParty,
                                           Mission.MissionTeamAITypeEnum.FieldBattle, isPlayerSergeant),
                new BattleObserverMissionLogic(),
                new CustomBattleAgentLogic(),
                new MissionAgentSpawnLogic(troopSuppliers, playerSide),
                new EnhancedBattleTestMissionSpawnHandler(!isPlayerAttacker ? playerParty : enemyParty,
                                                          isPlayerAttacker ? playerParty : enemyParty),
                new AgentBattleAILogic(),
                new AgentVictoryLogic(),
                new MissionAgentPanicHandler(),
                new MissionHardBorderPlacer(),
                new MissionBoundaryPlacer(),
                new MissionBoundaryCrossingHandler(),
                new BattleMissionAgentInteractionLogic(),
                new FieldBattleController(),
                new AgentFadeOutLogic(),
                new AgentMoraleInteractionLogic(),
                new AssignPlayerRoleInTeamMissionController(isPlayerGeneral, isPlayerSergeant, isPlayerInArmy: false, isPlayerSergeant ? Enumerable.Repeat(config.PlayerTeamConfig.General.CharacterObject.StringId, 1).ToList() : new List <string>()),
                new CreateBodyguardMissionBehavior(
                    isPlayerAttacker ? playerTeamGeneralName : enemyTeamGeneralName,
                    !isPlayerAttacker ? playerTeamGeneralName : enemyTeamGeneralName,
                    null, null, true),
                new HighlightsController(),
                new BattleHighlightsController()
            }));
        }
        public static Mission OpenEnhancedBattleTestSiege(
            string scene,
            BattleConfig config,
            IEnhancedBattleTestCombatant playerParty,
            IEnhancedBattleTestCombatant enemyParty,
            float[] wallHitPointPercentages,
            Dictionary <SiegeEngineType, int> siegeWeaponsCountOfAttackers,
            Dictionary <SiegeEngineType, int> siegeWeaponsCountOfDefenders,
            bool isSallyOut          = false,
            bool isReliefForceAttack = false,
            float timeOfDay          = 6f)
        {
            bool hasAnySiegeTower = siegeWeaponsCountOfAttackers.ContainsKey(DefaultSiegeEngineTypes.SiegeTower);

            string levelString;

            switch (config.MapConfig.SceneLevel)
            {
            case 1:
                levelString = "level_1";
                break;

            case 2:
                levelString = "level_2";
                break;

            case 3:
                levelString = "level_3";
                break;

            default:
                levelString = "";
                break;
            }

            var sceneLevelString =
                !(isSallyOut | isReliefForceAttack) ? levelString + " siege" : levelString + " sally";
            var playerSide = config.BattleTypeConfig.PlayerSide;
            var enemySide  = config.BattleTypeConfig.PlayerSide.GetOppositeSide();


            var player = config.PlayerTeamConfig.General;

            if (player == null)
            {
                return(null);
            }
            bool hasPlayer        = config.PlayerTeamConfig.HasGeneral;
            bool isPlayerAttacker = playerSide == BattleSideEnum.Attacker;

            IMissionTroopSupplier[] troopSuppliers = new IMissionTroopSupplier[2];
            bool isMultiplayer = EnhancedBattleTestSubModule.IsMultiplayer;

            troopSuppliers[(int)playerSide] = CreateTroopSupplier(playerParty, isMultiplayer, true);
            troopSuppliers[(int)enemySide]  = CreateTroopSupplier(enemyParty, isMultiplayer, false);
            bool isPlayerGeneral  = config.BattleTypeConfig.PlayerType == PlayerType.Commander || !hasPlayer;
            bool isPlayerSergeant = hasPlayer && config.BattleTypeConfig.PlayerType == PlayerType.Sergeant;

            List <CharacterObject> charactersInPlayerSideByPriority = null;
            List <CharacterObject> charactersInEnemySideByPriority  = null;
            string playerTeamGeneralName = null;
            string enemyTeamGeneralName  = null;

            if (!isMultiplayer)
            {
                var playerCharacter = player.CharacterObject as CharacterObject;
                if (playerCharacter == null)
                {
                    return(null);
                }
                charactersInPlayerSideByPriority = Utility.OrderHeroesByPriority(config.PlayerTeamConfig);
                var playerGeneral = hasPlayer && isPlayerGeneral
                    ? playerCharacter
                    : (hasPlayer && charactersInPlayerSideByPriority.First() == playerCharacter
                        ? charactersInPlayerSideByPriority.Skip(1).FirstOrDefault()
                        : charactersInPlayerSideByPriority.FirstOrDefault());
                if (playerGeneral != null)
                {
                    charactersInPlayerSideByPriority.Remove(playerGeneral);
                    playerTeamGeneralName = TextObject.ConvertToStringList(new List <TextObject>()
                    {
                        playerGeneral.Name
                    }).FirstOrDefault();
                }
                charactersInEnemySideByPriority = Utility.OrderHeroesByPriority(config.EnemyTeamConfig);
                var enemyGeneral = charactersInEnemySideByPriority.FirstOrDefault();
                if (enemyGeneral != null)
                {
                    charactersInEnemySideByPriority.Remove(enemyGeneral);
                    enemyTeamGeneralName = TextObject.ConvertToStringList(new List <TextObject>()
                    {
                        enemyGeneral.Name
                    }).FirstOrDefault();
                }
            }

            AtmosphereInfo atmosphereInfo = CreateAtmosphereInfoForMission(config.MapConfig.Season, timeOfDay);

            var attackerSiegeWeapons =
                GetSiegeWeaponTypes(siegeWeaponsCountOfAttackers);
            var defenderSiegeWeapons =
                GetSiegeWeaponTypes(siegeWeaponsCountOfDefenders);

            return(MissionState.OpenNew("EnhancedBattleTestSiegeBattle", new MissionInitializerRecord(scene)
            {
                PlayingInCampaignMode = false,
                AtmosphereOnCampaign = atmosphereInfo,
                SceneLevels = sceneLevelString,
                TimeOfDay = timeOfDay
            }, mission =>
            {
                List <MissionBehaviour> missionBehaviourList = new List <MissionBehaviour>
                {
                    new CommanderLogic(config),
                    new BattleSpawnLogic(isSallyOut
                        ? "sally_out_set"
                        : (isReliefForceAttack ? "relief_force_attack_set" : "battle_set")),
                    new MissionOptionsComponent(),
                    new BattleEndLogic(),
                    new MissionCombatantsLogic(null, playerParty,
                                               !isPlayerAttacker ? playerParty : enemyParty,
                                               isPlayerAttacker ? playerParty : enemyParty,
                                               !isSallyOut ? Mission.MissionTeamAITypeEnum.Siege : Mission.MissionTeamAITypeEnum.SallyOut,
                                               isPlayerSergeant),
                    new SiegeMissionPreparationHandler(isSallyOut, isReliefForceAttack, wallHitPointPercentages,
                                                       hasAnySiegeTower),
                    new MissionAgentSpawnLogic(troopSuppliers, playerSide),
                    new BattleObserverMissionLogic(),
                    new CustomBattleAgentLogic(),
                    new AgentBattleAILogic(),
                    new AmmoSupplyLogic(new List <BattleSideEnum> {
                        BattleSideEnum.Defender
                    }),
                    new AgentVictoryLogic(),
                    new MissionAgentPanicHandler(),
                    new SiegeMissionController(
                        attackerSiegeWeapons,
                        defenderSiegeWeapons,
                        isPlayerAttacker, isSallyOut),
                    new SiegeDeploymentHandler(isPlayerAttacker,
                                               isPlayerAttacker ? attackerSiegeWeapons : defenderSiegeWeapons),
                    new MissionBoundaryPlacer(),
                    new MissionBoundaryCrossingHandler(),
                    new AgentMoraleInteractionLogic(),
                    new HighlightsController(),
                    new BattleHighlightsController(),
                    new AssignPlayerRoleInTeamMissionController(isPlayerGeneral, isPlayerSergeant, hasPlayer, charactersInPlayerSideByPriority?.Select(character => character.StringId).ToList()),
                    new CreateBodyguardMissionBehavior(
                        isPlayerAttacker ? playerTeamGeneralName : enemyTeamGeneralName,
                        !isPlayerAttacker ? playerTeamGeneralName : enemyTeamGeneralName,
                        null, null, false),
                };
                if (isSallyOut)
                {
                    missionBehaviourList.Add(new EnhancedBattleTestSiegeSallyOutMissionSpawnHandler(
                                                 isPlayerAttacker ? enemyParty : playerParty,
                                                 isPlayerAttacker ? playerParty : enemyParty));
                }
                else
                {
                    missionBehaviourList.Add(new EnhancedBattleTestSiegeMissionSpawnHandler(
                                                 isPlayerAttacker ? enemyParty : playerParty,
                                                 isPlayerAttacker ? playerParty : enemyParty));
                    missionBehaviourList.Add(new AgentFadeOutLogic());
                }
                return missionBehaviourList;
            }));
        }
Ejemplo n.º 8
0
        public static bool SpawnTroops_Prefix(int number, bool isReinforcement, bool enforceSpawningOnInitialPoint, ref int __result,
                                              IMissionTroopSupplier ____troopSupplier,
                                              bool ____spawnWithHorses, BattleSideEnum ____side, MBList <Formation> ____spawnedFormations, ref List <IAgentOriginBase> ____preSuppliedTroops)
        {
            if (number <= 0)
            {
                __result = 0;
            }
            int num = 0;
            List <IAgentOriginBase> list = new List <IAgentOriginBase>();
            int num2 = Math.Min(____preSuppliedTroops.Count, number);

            if (num2 > 0)
            {
                for (int i = 0; i < num2; i++)
                {
                    list.Add(____preSuppliedTroops[i]);
                }
                ____preSuppliedTroops.RemoveRange(0, num2);
            }
            int numberToAllocate = number - num2;

            list.AddRange(____troopSupplier.SupplyTroops(numberToAllocate));
            List <EnhancedBattleTestAgentOrigin> list2 = new List <EnhancedBattleTestAgentOrigin>();

            for (int j = 0; j < 8; j++)
            {
                list2.Clear();
                EnhancedBattleTestAgentOrigin agentOriginBase = null;
                FormationClass formationClass = (FormationClass)j;
                foreach (EnhancedBattleTestAgentOrigin item in list)
                {
                    if (formationClass == item.Troop.GetFormationClass(item.BattleCombatant))
                    {
                        if (item.Troop == Game.Current.PlayerTroop)
                        {
                            agentOriginBase = item;
                        }
                        else
                        {
                            list2.Add(item);
                        }
                    }
                }
                if (agentOriginBase != null)
                {
                    list2.Add(agentOriginBase);
                }
                int count = list2.Count;
                if (count > 0)
                {
                    foreach (EnhancedBattleTestAgentOrigin item2 in list2)
                    {
                        Formation formation;
                        if (((SPTroopSupplier)____troopSupplier)._isPlayerSide)
                        {
                            formation = Mission.GetAgentTeam(item2, true).GetFormation(formationClass);
                        }
                        else
                        {
                            formation = Mission.GetAgentTeam(item2, false).GetFormation(formationClass);
                        }
                        bool isMounted = ____spawnWithHorses && (formationClass == FormationClass.Cavalry || formationClass == FormationClass.LightCavalry || formationClass == FormationClass.HeavyCavalry || formationClass == FormationClass.HorseArcher);
                        if (formation != null && !(bool)HasBeenPositionedProperty.GetValue(formation))
                        {
                            formation.BeginSpawn(count, isMounted);
                            Mission.Current.SpawnFormation(formation, count, ____spawnWithHorses, isMounted, isReinforcement);
                            ____spawnedFormations.Add(formation);
                        }
                        if (((SPTroopSupplier)____troopSupplier)._isPlayerSide)
                        {
                            Mission.Current.SpawnTroop(item2, true, hasFormation: true, ____spawnWithHorses, isReinforcement, enforceSpawningOnInitialPoint, count, num, isAlarmed: true, wieldInitialWeapons: true);
                        }
                        else
                        {
                            Mission.Current.SpawnTroop(item2, false, hasFormation: true, ____spawnWithHorses, isReinforcement, enforceSpawningOnInitialPoint, count, num, isAlarmed: true, wieldInitialWeapons: true);
                        }
                        num++;
                    }
                }
            }
            if (num > 0)
            {
                foreach (Team team in Mission.Current.Teams)
                {
                    //team.QuerySystem.Expire();
                }
                Debug.Print(string.Concat(num, " troops spawned on ", ____side, " side."), 0, Debug.DebugColor.DarkGreen, 64uL);
            }
            foreach (Team team2 in Mission.Current.Teams)
            {
                foreach (Formation formation2 in team2.Formations)
                {
                    typeof(Formation).GetField("GroupSpawnIndex", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(formation2, 0);
                }
            }
            __result = num;
            return(false);
        }
Ejemplo n.º 9
0
        public static bool SpawnTroops_Prefix(int number, bool isReinforcement, bool enforceSpawningOnInitialPoint, ref int __result,
                                              IMissionTroopSupplier ____troopSupplier,
                                              bool ____spawnWithHorses, BattleSideEnum ____side, MBList <Formation> ____spawnedFormations)
        {
            if (number <= 0)
            {
                __result = 0;
                return(false);
            }
            int formationTroopIndex      = 0;
            List <IAgentOriginBase> list = ____troopSupplier.SupplyTroops(number).ToList();

            Mission.Current.ResetTotalWidth();
            for (int index = 0; index < 8; ++index)
            {
                var originToSpawn = new List <EnhancedBattleTestAgentOrigin>();
                EnhancedBattleTestAgentOrigin player = null;
                bool           isMounted             = false;
                FormationClass formationIndex        = (FormationClass)index;
                foreach (IAgentOriginBase agentOriginBase in list)
                {
                    if (agentOriginBase is EnhancedBattleTestAgentOrigin agentOrigin &&
                        formationIndex == agentOrigin.FormationIndex)
                    {
                        if (agentOrigin.SpawnableCharacter.IsPlayer)
                        {
                            player = agentOrigin;
                        }
                        else
                        {
                            originToSpawn.Add(agentOrigin);
                        }

                        isMounted = isMounted || agentOrigin.Troop.HasMount();
                    }
                }

                if (player != null)
                {
                    originToSpawn.Add(player);
                }

                int count = originToSpawn.Count;
                if (count <= 0)
                {
                    continue;
                }

                float num1 = isMounted ? 3f : 1f;
                float num2 = isMounted ? 0.75f : 0.6f;
                Mission.Current.SetTotalWidthBeforeNewFormation(num1 * (float)Math.Pow(count, num2));
                foreach (EnhancedBattleTestAgentOrigin agentOriginBase in originToSpawn)
                {
                    try
                    {
                        FormationClass formationClass = agentOriginBase.SpawnableCharacter.FormationIndex;
                        var            team           = agentOriginBase.IsUnderPlayersCommand ? Mission.Current.PlayerTeam : Mission.Current.PlayerEnemyTeam;
                        Formation      formation      = team.GetFormation(formationClass);
                        if (formation != null && !(bool)HasBeenPositionedProperty.GetValue(formation))
                        {
                            formation.BeginSpawn(count, isMounted);
                            Mission.Current.SpawnFormation(formation, count, ____spawnWithHorses, isMounted, isReinforcement);
                            ____spawnedFormations.Add(formation);
                        }
                        agentOriginBase.SpawnTroop(____side, true, ____spawnWithHorses, isReinforcement,
                                                   enforceSpawningOnInitialPoint, count, formationTroopIndex, true, true,
                                                   false, null, new MatrixFrame?());
                        ++formationTroopIndex;
                    }
                    catch (Exception e)
                    {
                        Utility.DisplayMessage(e.ToString());
                    }
                }
            }
            if (formationTroopIndex > 0)
            {
                foreach (Team team in Mission.Current.Teams)
                {
                    team.ExpireAIQuerySystem();
                }
                Debug.Print(formationTroopIndex + " troops spawned on " + ____side + " side.", 0, Debug.DebugColor.DarkGreen, 64UL);
            }
            foreach (Team team in Mission.Current.Teams)
            {
                foreach (Formation formation in team.Formations)
                {
                    typeof(Formation).GetField("GroupSpawnIndex", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(formation, 0);
                }
            }
            __result = formationTroopIndex;
            return(false);
        }
 public BattleMissionStarterLogic(
     IMissionTroopSupplier defenderTroopSupplier = null,
     IMissionTroopSupplier attackerTroopSupplier = null)
 {
 }