コード例 #1
0
 private static void MakeAgentsYell(HideoutMissionController controller, BattleSideEnum side)
 {
     foreach (var agent in controller.Mission.Agents)
     {
         if (agent.IsActive() && agent.Team.Side == side)
         {
             agent.SetWantsToYell();
         }
     }
 }
コード例 #2
0
        private static bool HasTroopsRemaining(HideoutMissionController controller, BattleSideEnum side)
        {
            IList missionSides = (IList)typeof(HideoutMissionController).GetField("_missionSides", BindingFlags.NonPublic | BindingFlags.Instance)
                                 .GetValue(controller);
            var mSide     = missionSides[(int)side];
            int numTroops = (int)typeof(HideoutMissionController).GetNestedType("MissionSide", BindingFlags.NonPublic)
                            .GetProperty("NumberOfActiveTroops", BindingFlags.Public | BindingFlags.Instance).GetValue(mSide);

            return(numTroops > 0);
        }
コード例 #3
0
 private static void FreeAgentsToMove(HideoutMissionController controller)
 {
     foreach (var agent in controller.Mission.Agents)
     {
         if (agent.IsActive())
         {
             agent.DisableScriptedMovement();
         }
     }
 }
コード例 #4
0
 private static void TryAlarmAgents(HideoutMissionController controller)
 {
     foreach (var agent in controller.Mission.Agents)
     {
         if (agent.IsAIControlled && !agent.IsAlarmed())
         {
             agent.SetWatchState(AgentAIStateFlagComponent.WatchState.Alarmed);
         }
     }
 }
コード例 #5
0
        private static void TrySetFormationsCharge(HideoutMissionController controller, BattleSideEnum side)
        {
            List <Team> teams = (from t in controller.Mission.Teams
                                 where t.Side == side
                                 select t).ToList();

            if (teams != null && teams.Count > 0)
            {
                foreach (var team in teams)
                {
                    foreach (var formation in team.Formations)
                    {
                        if (formation.MovementOrder.OrderType != OrderType.Charge)
                        {
                            formation.MovementOrder = MovementOrder.MovementOrderCharge;
                        }
                    }
                }
            }
        }
コード例 #6
0
        private static void SetTeamsHostile(HideoutMissionController controller, Team enemyTeam)
        {
            Team passivePlayerTeam = controller.Mission.Teams.Where((x) => x.Side == BattleSideEnum.None && x.Banner == controller.Mission.PlayerTeam.Banner).FirstOrDefault();
            Team passiveEnemyTeam  = controller.Mission.Teams.Where((x) => x.Side == BattleSideEnum.None && x.Banner == enemyTeam.Banner).FirstOrDefault();

            if (passivePlayerTeam != null)
            {
                List <Agent> list = new List <Agent>(passivePlayerTeam.ActiveAgents);
                foreach (var agent in list)
                {
                    agent.SetTeam(controller.Mission.Teams.Attacker, true);
                }
            }
            if (passiveEnemyTeam != null)
            {
                List <Agent> list = new List <Agent>(passiveEnemyTeam.ActiveAgents);
                foreach (var agent in list)
                {
                    agent.SetTeam(controller.Mission.Teams.Defender, true);
                }
            }
            controller.Mission.Teams.Attacker.SetIsEnemyOf(controller.Mission.Teams.Defender, true);
        }
コード例 #7
0
        static void Postfix(HideoutMissionController __instance, ref bool __result, BattleSideEnum side, ref int ____hideoutMissionState, Team ____enemyTeam)
        {
            //Only do something if the side was reported as being depleted and it is the attacker side
            if (__result && side == BattleSideEnum.Attacker)
            {
                if (HasTroopsRemaining(__instance, side))
                {
                    bool initial = __result;
                    if (PlayerIsDead())
                    {
                        //If the player died during the boss fight
                        if (____hideoutMissionState == 5 || ____hideoutMissionState == 6)
                        {
                            if (Settings.Instance.ContinueHideoutBattleOnPlayerLoseDuel)
                            {
                                if (!notified)
                                {
                                    //Tell troops to charge on both sides
                                    SetTeamsHostile(__instance, ____enemyTeam);
                                    FreeAgentsToMove(__instance);
                                    TryAlarmAgents(__instance);
                                    MakeAgentsYell(__instance);
                                    TrySetFormationsCharge(__instance, BattleSideEnum.Attacker);
                                    TrySetFormationsCharge(__instance, BattleSideEnum.Defender);
                                    InformationManager.DisplayMessage(new InformationMessage("You have lost the duel! Your men are avenging your defeat!"));
                                    notified = true;
                                    dueled   = true;
                                }

                                if (____hideoutMissionState != 6)
                                {
                                    ____hideoutMissionState = 6;
                                }

                                __result = false;
                            }
                        }
                        else
                        {
                            //The player died during the initial battle phase
                            if (Settings.Instance.ContinueHideoutBattleOnPlayerDeath && !dueled)
                            {
                                if (!notified)
                                {
                                    //The player is dead, but has troops remaining. We need to tell all remaining troops to charge, then report side is not depleted.
                                    TrySetFormationsCharge(__instance, BattleSideEnum.Attacker);
                                    MakeAgentsYell(__instance, BattleSideEnum.Attacker);
                                    InformationManager.DisplayMessage(new InformationMessage("You have fallen in the attack. Your troops are charging to avenge you!"));
                                    notified = true;
                                }

                                //Disable the boss fight
                                if (____hideoutMissionState != 1 && ____hideoutMissionState != 6)
                                {
                                    ____hideoutMissionState = 1;
                                }

                                __result = false;
                            }
                        }
                    }
                }
            }
        }
コード例 #8
0
 private static void MakeAgentsYell(HideoutMissionController controller)
 {
     MakeAgentsYell(controller, BattleSideEnum.Attacker);
     MakeAgentsYell(controller, BattleSideEnum.Defender);
 }
コード例 #9
0
        static void Postfix(HideoutMissionController __instance, ref bool __result, BattleSideEnum side, ref int ____hideoutMissionState, Team ____enemyTeam)
        {
            if (__result && side == BattleSideEnum.Attacker)
            {
                try
                {
                    if (HasTroopsRemaining(__instance, side))
                    {
                        if (PlayerIsDead() && BannerlordTweaksSettings.Instance is { } settings)
                        {
                            if (____hideoutMissionState == 5 || ____hideoutMissionState == 6)
                            {
                                if (settings.ContinueHideoutBattleOnPlayerLoseDuel)
                                {
                                    if (!Notified)
                                    {
                                        SetTeamsHostile(__instance, ____enemyTeam);
                                        FreeAgentsToMove(__instance);
                                        TryAlarmAgents(__instance);
                                        MakeAgentsYell(__instance);
                                        TrySetFormationsCharge(__instance, BattleSideEnum.Attacker);
                                        TrySetFormationsCharge(__instance, BattleSideEnum.Defender);
                                        InformationManager.DisplayMessage(new InformationMessage("You have lost the duel! Your men are avenging your defeat!"));
                                        Notified = true;
                                        Dueled   = true;
                                    }

                                    if (____hideoutMissionState != 6)
                                    {
                                        ____hideoutMissionState = 6;
                                    }

                                    __result = false;
                                }
                            }
                            else
                            {
                                if (settings.ContinueHideoutBattleOnPlayerDeath && !Dueled)
                                {
                                    if (!Notified)
                                    {
                                        TrySetFormationsCharge(__instance, BattleSideEnum.Attacker);
                                        MakeAgentsYell(__instance, BattleSideEnum.Attacker);
                                        InformationManager.DisplayMessage(new InformationMessage("You have fallen in the attack. Your troops are charging to avenge you!"));
                                        Notified = true;
                                    }

                                    if (____hideoutMissionState != 1 && ____hideoutMissionState != 6)
                                    {
                                        ____hideoutMissionState = 1;
                                    }

                                    __result = false;
                                }
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(exception.Message + "\n" + exception.StackTrace + "\n" + exception.InnerException);
                }
            }
        }