Пример #1
0
        private bool CheckForLanceOverrideSkips(TeamOverride teamOverride, LanceOverride lanceOverride)
        {
            Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Checking lance '{lanceOverride.name}'...");
            if (Main.Settings.ExtendedLances.GetSkipWhenTaggedWithAny().Count > 0 && lanceOverride.lanceTagSet.ContainsAny(Main.Settings.ExtendedLances.GetSkipWhenTaggedWithAny()))
            {
                Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Lance contains a tag set in 'SkipWhenTaggedWithAny'. Skipping '{lanceOverride.name}'");
                lancesToSkip.Add(lanceOverride.GUID);
                return(true);
            }

            if (Main.Settings.ExtendedLances.GetSkipWhenTaggedWithAll().Count > 0 && lanceOverride.lanceTagSet.ContainsAll(Main.Settings.ExtendedLances.GetSkipWhenTaggedWithAll()))
            {
                Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Lance contains a tag set in 'SkipWhenTaggedWithAll'. Skipping '{lanceOverride.name}'");
                lancesToSkip.Add(lanceOverride.GUID);
                return(true);
            }

            if (Main.Settings.ExtendedLances.GetSkipWhenExcludeTagsContain().Count > 0 && lanceOverride.lanceExcludedTagSet.ContainsAny(Main.Settings.ExtendedLances.GetSkipWhenExcludeTagsContain()))
            {
                Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Lance contains an exclude tag set in 'GetSkipWhenExcludeTagsContain'. Skipping '{lanceOverride.name}'");
                lancesToSkip.Add(lanceOverride.GUID);
                return(true);
            }

            return(false);
        }
        public static bool Prefix(LanceOverride __instance, Contract contract, LanceDef lanceDef)
        {
            if (contract != null)
            {
                if (LanceOverride_RunMadLibs.teamOverrides.ContainsKey(__instance.GetHashCode()))
                {
                    // Setup CurrentTeam before running the madlibs
                    TeamOverride teamOverride = LanceOverride_RunMadLibs.teamOverrides[__instance.GetHashCode()];
                    IRBT14MadlibsFix.Logger.Log($"LO:RMLOLD using teamOverride:[{teamOverride.GetHashCode()}] for lanceOverride:[{__instance?.GetHashCode()}]");
                    contract.GameContext.SetObject(GameContextObjectTagEnum.CurrentTeam, teamOverride);
                }
                else
                {
                    IRBT14MadlibsFix.Logger.Log($"LO:RMLOLD COULD NOT LOAD teamOverride using lanceOverride:[{__instance.GetHashCode()}]! MadLibs may break!");
                }

                contract.RunMadLib(lanceDef.LanceTags);

                foreach (LanceDef.Unit unit in lanceDef.LanceUnits)
                {
                    Traverse ensureTagSetsT = Traverse.Create(unit).Method("EnsureTagSets");
                    ensureTagSetsT.GetValue();

                    IRBT14MadlibsFix.Logger.Log($"LO:RMLOLD BEFORE madlibs lanceTagSet is:[{unit.unitTagSet}]");
                    contract.RunMadLib(unit.unitTagSet);
                    IRBT14MadlibsFix.Logger.Log($"LO:RMLOLD AFTER madlibs lanceTagSet is:[{unit.unitTagSet}]");

                    contract.RunMadLib(unit.excludedUnitTagSet);
                    contract.RunMadLib(unit.pilotTagSet);
                    contract.RunMadLib(unit.excludedPilotTagSet);
                }
            }

            return(false);
        }
    public static UnitSpawnPointOverride GetUnitToCopy(this LanceOverride lanceOverride)
    {
        if (lanceOverride.unitSpawnPointOverrideList.Count <= 0)
        {
            MissionControl.Main.LogDebug("[GetUnitToCopy] No UnitSpawnPointOverrides in lance. No unit to copy");
            return(null);
        }

        UnitSpawnPointOverride originalUnitSpawnPointOverride = lanceOverride.GetAnyTaggedLanceMember();

        // If there are only manual units - then select one at random from the Lance. Previously this selected copies of the first unit in the lance
        if (originalUnitSpawnPointOverride == null)
        {
            MissionControl.Main.LogDebug($"[LanceOverrideExtensions.GetUnitToCopy] Using '{MissionControl.Main.Settings.ExtendedLances.AutofillUnitCopyType}' to get unit to copy");
            if (MissionControl.Main.Settings.ExtendedLances.AutofillUnitCopyType == "FirstInLance")
            {
                originalUnitSpawnPointOverride = lanceOverride.unitSpawnPointOverrideList[0];
            }
            else // RandomInLance
            {
                originalUnitSpawnPointOverride = lanceOverride.GetRandomNonEmptyUnit();
            }
        }
        return(originalUnitSpawnPointOverride);
    }
Пример #4
0
        static void Prefix(LanceOverride __instance)
        {
            MissionControl encounterManager = MissionControl.Instance;
            RunPayload     payload          = new ContractAndLanceOverridePayload(encounterManager.CurrentContract.Override, __instance);

            MissionControl.Instance.RunEncounterRules(LogicBlock.LogicType.REQUEST_LANCE_COMPLETE, payload);
        }
Пример #5
0
 // Checks if the LanceOverride lance unit count should be used to override the Faction lance unit count
 // It does this by checking a set tag. If it's present then it will be forced.
 private bool IsLanceOverrideForced(LanceOverride lanceOverride)
 {
     if (lanceOverride.lanceTagSet.GetTagSetSourceFile().Contains(Main.Settings.ExtendedLances.ForceLanceOverrideSizeWithTag))
     {
         return(true);
     }
     return(false);
 }
Пример #6
0
        public new MLanceOverride Copy()
        {
            LanceOverride  lanceOveride   = base.Copy();
            MLanceOverride mLanceOverride = new MLanceOverride(lanceOveride);

            mLanceOverride.LanceKey        = this.LanceKey;
            mLanceOverride.SupportAutofill = this.SupportAutofill;
            return(mLanceOverride);
        }
Пример #7
0
 public MLanceOverride(LanceOverride lanceOverride)
 {
     this.lanceDefId                 = lanceOverride.lanceDefId;
     this.lanceTagSet                = new TagSet(lanceOverride.lanceTagSet);
     this.lanceExcludedTagSet        = new TagSet(lanceOverride.lanceExcludedTagSet);
     this.spawnEffectTags            = new TagSet(lanceOverride.spawnEffectTags);
     this.lanceDifficultyAdjustment  = lanceOverride.lanceDifficultyAdjustment;
     this.unitSpawnPointOverrideList = lanceOverride.unitSpawnPointOverrideList;
 }
    public static List <int> GetUnresolvedUnitIndexes(this LanceOverride lanceOverride, int startingIndex)
    {
        bool isManualLance = lanceOverride.lanceDefId.ToLower() == "manual";

        Debug.Log($"[ExtendedLances.GetUnresolvedUnitIndexes] Running with Autofill Type '{MissionControl.Main.Settings.ExtendedLances.AutofillType}' and '{(isManualLance ? "Manual" : "Tagged / Direct Reference")} Lance'");
        List <int> unresolvedUnitIndexes = new List <int>();

        if (MissionControl.Main.Settings.ExtendedLances.AutofillType == "RespectEmpty")
        {
            if (isManualLance)
            {
                // RespectEmpty and Manual Lance - Start counting from the original UnitOverride count up to the end
                for (int i = startingIndex; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
                {
                    UnitSpawnPointOverride unitOverride = lanceOverride.unitSpawnPointOverrideList[i];
                    if (unitOverride.IsUnresolved())
                    {
                        unresolvedUnitIndexes.Add(i);
                    }
                }
            }
            else // Tagged/Direct Lance Reference
            // RespectEmpty and Tagged/Direct Referenced Lance - Start counting from the LanceDef size up to the end
            {
                LanceDef loadedLanceDef = (LanceDef)AccessTools.Field(typeof(LanceOverride), "loadedLanceDef").GetValue(lanceOverride);
                if (loadedLanceDef == null)
                {
                    return(unresolvedUnitIndexes);
                }

                for (int i = loadedLanceDef.LanceUnits.Length; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
                {
                    UnitSpawnPointOverride unitOverride = lanceOverride.unitSpawnPointOverrideList[i];
                    if (unitOverride.IsUnresolved())
                    {
                        unresolvedUnitIndexes.Add(i);
                    }
                }
            }
        }
        else // FillEmpty
        // FillEmpty and Manual/Tagged/Direct Reference Lance- Start looking at all UnitOverrides and fill empty up to the end
        {
            for (int i = 0; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
            {
                UnitSpawnPointOverride unitOverride = lanceOverride.unitSpawnPointOverrideList[i];
                if (unitOverride.IsUnresolved())
                {
                    unresolvedUnitIndexes.Add(i);
                }
            }
        }

        return(unresolvedUnitIndexes);
    }
        private void ApplyDifficultyMod(TeamOverride teamOverride, LanceOverride lanceOverride)
        {
            int previousAjustedDifficulty        = lanceOverride.lanceDifficultyAdjustment;
            int updatedLanceDifficultyAdjustment = Main.Settings.ExtendedLances.GetFactionLanceDifficulty(teamOverride.faction, lanceOverride);

            if (previousAjustedDifficulty != updatedLanceDifficultyAdjustment)
            {
                Main.Logger.Log($"[AddExtraLanceMembers.ApplyDifficultyMod] [Faction:{teamOverride.faction}] Changing lance '{lanceOverride.name}' adjusted difficulty from '{lanceOverride.lanceDifficultyAdjustment}' to '{updatedLanceDifficultyAdjustment}'");
                lanceOverride.lanceDifficultyAdjustment = updatedLanceDifficultyAdjustment;
            }
        }
Пример #10
0
        private void AutofillWithEmptyUnitOverrideSlots(TeamOverride teamOverride, LanceOverride lanceOverride, int numberOfUnitsInLanceOverride, int intendedLanceSize)
        {
            UnitSpawnPointOverride emptyUnitSpawnPointOverride = new UnitSpawnPointOverride();

            emptyUnitSpawnPointOverride.unitDefId = UnitSpawnPointOverride.UseLance;

            for (int i = numberOfUnitsInLanceOverride; i < intendedLanceSize; i++)
            {
                Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Non-autofill mode. No autofill, turret lance or no units to copy. Expanding lance size for position {i + 1} with a placeholder empty unit override.");
                lanceOverride.unitSpawnPointOverrideList.Add(emptyUnitSpawnPointOverride.DeepCopy());
            }
        }
    public static UnitSpawnPointOverride GetAnyTaggedLanceMember(this LanceOverride lanceOverride)
    {
        List <UnitSpawnPointOverride> unitSpawnOverrides = lanceOverride.unitSpawnPointOverrideList;

        foreach (UnitSpawnPointOverride unitSpawnOverride in unitSpawnOverrides)
        {
            if ((unitSpawnOverride.unitDefId == "Tagged") || (unitSpawnOverride.unitDefId == "UseLance") || (unitSpawnOverride.unitDefId == "mechDef_InheritLance") || (unitSpawnOverride.unitDefId == "vehicleDef_InheritLance") || (unitSpawnOverride.unitDefId == "turretDef_InheritLance"))
            {
                return(unitSpawnOverride);
            }
        }
        return(null);
    }
Пример #12
0
    public static bool ContainsAtLeastOneTurret(this LanceOverride lanceOverride)
    {
        List <UnitSpawnPointOverride> units = lanceOverride.unitSpawnPointOverrideList;

        for (int i = 0; i < units.Count; i++)
        {
            UnitSpawnPointOverride unit = units[i];
            if (unit.unitType == BattleTech.UnitType.Turret)
            {
                return(true);
            }
        }

        return(false);
    }
        private bool CheckForLanceSkips(TeamOverride teamOverride, LanceOverride lanceOverride)
        {
            if (lancesToSkip.Contains(lanceOverride.GUID))
            {
                Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected a lance to skip. Skipping.");
                return(true);
            }

            if (lanceOverride.IsATurretLance())
            {
                Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected a turret lance Ignoring for Extended Lances.");
                return(true);
            }

            return(false);
        }
        public int GetFactionLanceDifficulty(string factionKey, LanceOverride lanceOverride)
        {
            foreach (KeyValuePair <string, List <ExtendedLance> > lanceSetPair in LanceSizes)
            {
                int lanceSize = int.Parse(lanceSetPair.Key);
                List <ExtendedLance> factions = lanceSetPair.Value;

                ExtendedLance lance = factions.FirstOrDefault(extendedLance => extendedLance.Faction == factionKey);

                if (lance != null)
                {
                    return(lanceOverride.lanceDifficultyAdjustment + lance.DifficultyMod);
                }
            }

            return(lanceOverride.lanceDifficultyAdjustment);
        }
    public static UnitSpawnPointOverride GetRandomNonEmptyUnit(this LanceOverride lanceOverride)
    {
        if (lanceOverride.unitSpawnPointOverrideList.Count <= 0)
        {
            MissionControl.Main.LogDebug("[GetRandomNonEmptyUnit] No UnitSpawnPointOverrides in lance. No unit to copy");
            return(null);
        }

        for (int i = 0; i < 10; i++)
        {
            UnitSpawnPointOverride unitOverride = lanceOverride.unitSpawnPointOverrideList.GetRandom();
            if (!unitOverride.IsUnitDefNone)
            {
                return(unitOverride);
            }
        }
        return(lanceOverride.unitSpawnPointOverrideList[0]); // Fallback
    }
        private bool CheckForLanceOverrideSkips(LanceOverride lanceOverride, TeamOverride teamOverride, string lanceGUID)
        {
            Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] [{teamOverride.faction}] Checking first pass skips in second pass...");

            if (lancesToSkip.Contains(lanceOverride.GUID))
            {
                Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] [Faction:{teamOverride.faction}] Detected a lance to skip. Skipping.");
                return(true);
            }

            if (lanceOverride.IsATurretLance())
            {
                Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] [Faction:{teamOverride.faction}] Detected a turret lance Ignoring for Extended Lances.");
                return(true);
            }

            return(false);
        }
Пример #17
0
        public override void Run(RunPayload payload)
        {
            Main.Logger.Log($"[AddLanceToPlayerTeam] Adding lance to player lance");
            ContractOverride contractOverride   = ((ContractOverridePayload)payload).ContractOverride;
            TeamOverride     teamOverride       = contractOverride.player1Team;
            TeamOverride     targetTeamOverride = contractOverride.targetTeam;

            List <LanceOverride> lanceOverrideList = targetTeamOverride.lanceOverrideList;

            if (lanceOverrideList.Count > 0)
            {
                LanceOverride lanceOverride = lanceOverrideList[0].Copy();

                lanceOverride.name = "Lance_Player_Reinforcements";
                lanceOverride.lanceTagSet.Add("lance_type_mech");

                if (unitGuids.Count > 4)
                {
                    for (int i = 4; i < unitGuids.Count; i++)
                    {
                        UnitSpawnPointOverride unitSpawnOverride = lanceOverride.unitSpawnPointOverrideList[0].Copy();
                        lanceOverride.unitSpawnPointOverrideList.Add(unitSpawnOverride);
                    }
                }

                for (int i = 0; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
                {
                    string            unitGuid     = unitGuids[i];
                    UnitSpawnPointRef unitSpawnRef = new UnitSpawnPointRef();
                    unitSpawnRef.EncounterObjectGuid = unitGuid;
                    lanceOverride.unitSpawnPointOverrideList[i].unitSpawnPoint = unitSpawnRef;
                }

                LanceSpawnerRef lanceSpawnerRef = new LanceSpawnerRef();
                lanceSpawnerRef.EncounterObjectGuid = lanceGuid;
                lanceOverride.lanceSpawner          = lanceSpawnerRef;

                teamOverride.lanceOverrideList.Add(lanceOverride);
            }
            else
            {
                Main.Logger.LogError("[AddLanceToPlayerTeam] Team Override has no lances available to copy. TODO: Generate new lance from stored JSON data");
            }
        }
        public static bool Prefix(LanceOverride __instance, Contract contract,
                                  ref TagSet ___lanceTagSet, ref TagSet ___lanceExcludedTagSet, ref List <UnitSpawnPointOverride> ___unitSpawnPointOverrideList)
        {
            TeamOverride teamOverride = TeamOverride_RunMadLibs.lanceOverrides[__instance.GetHashCode()];

            IRBT14MadlibsFix.Logger.Log($"LO:RML using teamOverride:[{teamOverride.GetHashCode()}] for lanceOverride:[{__instance?.GetHashCode()}]");
            LanceOverride_RunMadLibs.teamOverrides[__instance.GetHashCode()] = teamOverride;
            contract.GameContext.SetObject(GameContextObjectTagEnum.CurrentTeam, teamOverride);

            IRBT14MadlibsFix.Logger.Log($"LO:RML BEFORE madlibs lanceTagSet is:[{___lanceTagSet}]");
            contract.RunMadLib(___lanceTagSet);
            IRBT14MadlibsFix.Logger.Log($"LO:RML AFTER madlibs lanceTagSet is:[{___lanceTagSet}]");
            contract.RunMadLib(___lanceExcludedTagSet);

            for (int i = 0; i < ___unitSpawnPointOverrideList.Count; ++i)
            {
                ___unitSpawnPointOverrideList[i].RunMadLib(contract);
            }

            return(false);
        }
        public static bool Prefix(TeamOverride __instance, Contract contract, DataManager dataManager,
                                  ref Contract ___contract, ref DataManager ___dataManager, ref string ___teamLeaderCastDefId, ref List <LanceOverride> ___lanceOverrideList, ref Faction ___faction)
        {
            ___contract    = contract;
            ___dataManager = dataManager;

            if (___teamLeaderCastDefId == CastDef.castDef_TeamLeader_Current)
            {
                ___teamLeaderCastDefId = CastDef.GetCombatCastDefIdFromFaction(___faction, contract.BattleTechGame.DataManager);
            }

            for (int i = 0; i < ___lanceOverrideList.Count; ++i)
            {
                LanceOverride lanceOverride = ___lanceOverrideList[i];
                lanceOverrides[lanceOverride.GetHashCode()] = __instance;
                IRBT14MadlibsFix.Logger.Log($"TO:RML setting teamOverride:[{__instance.GetHashCode()}] for lanceOverride:[{lanceOverride.GetHashCode()}]");
                lanceOverride.RunMadLibs(contract);
            }

            return(false);
        }
Пример #20
0
        public override void Run(RunPayload payload)
        {
            Main.Logger.Log($"[AddLanceToAllyTeam] Adding lance to ally lance");
            ContractOverride contractOverride   = ((ContractOverridePayload)payload).ContractOverride;
            TeamOverride     teamOverride       = contractOverride.employerTeam;
            TeamOverride     targetTeamOverride = contractOverride.targetTeam;

            LanceOverride lanceOverride = SelectAppropriateLanceOverride("allies").Copy();

            lanceOverride.name = $"Lance_Ally_Force_{lanceGuid}";

            if (unitGuids.Count > 4)
            {
                for (int i = 4; i < unitGuids.Count; i++)
                {
                    UnitSpawnPointOverride unitSpawnOverride = lanceOverride.unitSpawnPointOverrideList[0].Copy();
                    lanceOverride.unitSpawnPointOverrideList.Add(unitSpawnOverride);
                }
            }

            for (int i = 0; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
            {
                string            unitGuid     = unitGuids[i];
                UnitSpawnPointRef unitSpawnRef = new UnitSpawnPointRef();
                unitSpawnRef.EncounterObjectGuid = unitGuid;
                lanceOverride.unitSpawnPointOverrideList[i].unitSpawnPoint = unitSpawnRef;
            }

            LanceSpawnerRef lanceSpawnerRef = new LanceSpawnerRef();

            lanceSpawnerRef.EncounterObjectGuid = lanceGuid;
            lanceOverride.lanceSpawner          = lanceSpawnerRef;

            lanceOverride.RunMadLibs(contractOverride.contract, teamOverride);

            teamOverride.lanceOverrideList.Add(lanceOverride);
        }
Пример #21
0
        public override void Run(RunPayload payload)
        {
            Main.Logger.Log($"[AddLanceToTargetTeam] Adding lance to target lance");
            ContractOverride contractOverride = ((ContractOverridePayload)payload).ContractOverride;
            TeamOverride     teamOverride     = contractOverride.targetTeam;

            LanceOverride lanceOverride = (manuallySpecifiedLance == null) ? SelectAppropriateLanceOverride("enemy").Copy() : manuallySpecifiedLance.Copy();

            lanceOverride.name = $"Lance_Enemy_OpposingForce_{lanceGuid}";

            if (unitGuids.Count > 4)
            {
                for (int i = 4; i < unitGuids.Count; i++)
                {
                    UnitSpawnPointOverride unitSpawnOverride = lanceOverride.unitSpawnPointOverrideList[0].Copy();
                    lanceOverride.unitSpawnPointOverrideList.Add(unitSpawnOverride);
                }
            }

            for (int i = 0; i < lanceOverride.unitSpawnPointOverrideList.Count; i++)
            {
                string            unitGuid     = unitGuids[i];
                UnitSpawnPointRef unitSpawnRef = new UnitSpawnPointRef();
                unitSpawnRef.EncounterObjectGuid = unitGuid;
                lanceOverride.unitSpawnPointOverrideList[i].unitSpawnPoint = unitSpawnRef;
            }

            LanceSpawnerRef lanceSpawnerRef = new LanceSpawnerRef();

            lanceSpawnerRef.EncounterObjectGuid = lanceGuid;
            lanceOverride.lanceSpawner          = lanceSpawnerRef;

            lanceOverride.RunMadLibs(contractOverride.contract, teamOverride);

            teamOverride.lanceOverrideList.Add(lanceOverride);
        }
 public static bool ContainsTurretTag(this LanceOverride lanceOverride)
 {
     return(lanceOverride.lanceTagSet.Contains("lance_type_turret"));
 }
 public static bool IsATurretLance(this LanceOverride lanceOverride)
 {
     return(lanceOverride.ContainsTurretTag() || lanceOverride.ContainsAtLeastOneTurret());
 }
        public override void Run(RunPayload payload)
        {
            Main.Logger.Log($"[AddExtraLanceMembersIndividualSecondPass] Running second pass after LanceDef has resolved, if required");
            ContractOverride contractOverride = ((ContractAndLanceOverridePayload)payload).ContractOverride;
            LanceOverride    lanceOverride    = ((ContractAndLanceOverridePayload)payload).LanceOverride;
            bool             isManualLance    = lanceOverride.lanceDefId == "Manual";
            int currentLanceSize = lanceOverride.unitSpawnPointOverrideList.Count;

            TeamOverride teamOverride = contractOverride.GetTeamOverrideLanceBelongsTo(lanceOverride.GUID);

            Main.Logger.Log($"[AddExtraLanceMembersIndividualSecondPass] Team Override for lance '{lanceOverride.name} - {lanceOverride.GUID}' is: {teamOverride.teamName}");

            // GUARD: Don't process factions that aren't allowed
            if (!IsTeamAllowedExtendedLances(contractOverride, teamOverride))
            {
                Main.Logger.Log($"[AddExtraLanceMembersIndividualSecondPass] Ignoring lance '{lanceOverride.name} - {lanceOverride.GUID}' is: {teamOverride.teamName}. Team is not allowed to be extended.");
                return;
            }

            lancesToSkip = (List <string>)state.GetObject("LancesToSkip");

            // Check first pass LanceOverride skips and check LanceDef skips in this second pass, if one exists, and check tags for skipping or override
            if (!isManualLance)
            {
                LanceDef loadedLanceDef = (LanceDef)AccessTools.Field(typeof(LanceOverride), "loadedLanceDef").GetValue(lanceOverride);
                Main.Logger.Log($"[AddExtraLanceMembersIndividualSecondPass] Loaded LanceDef is '{loadedLanceDef.Description.Id}'");

                bool skip = CheckForLanceOverrideSkips(lanceOverride, teamOverride, lanceOverride.GUID);
                if (!skip)
                {
                    skip = CheckForLanceDefSkips(loadedLanceDef, teamOverride, lanceOverride.GUID);
                }

                if (skip)
                {
                    return;
                }


                Main.Logger.Log($"[AddExtraLanceMembersIndividualSecondPass] No Skips Detected. Processing second pass.");

                // Check for LanceDef tags to force LanceDef to override the EL lance unit count
                if (IsLanceDefForced(loadedLanceDef))
                {
                    this.state.Set($"LANCE_DEF_FORCED_{lanceOverride.GUID}", true);

                    int newLanceSize = loadedLanceDef.LanceUnits.Length;
                    Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] Force overriding lance def '{lanceOverride.name}' from faction size of '{currentLanceSize}' to '{newLanceSize}'");

                    if (newLanceSize < currentLanceSize)
                    {
                        // Remove UnitOverrides. Last to First. This is because the override in the LanceDef has fewer units that the EL faction size, or forced Contract Override size
                        for (int i = currentLanceSize - 1; i >= newLanceSize; i--)
                        {
                            Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] Removing UnitOverride '{i + 1}' from LanceOverride");
                            lanceOverride.unitSpawnPointOverrideList.RemoveAt(i);
                        }
                    }
                    else if (newLanceSize > currentLanceSize)
                    {
                        // Add UnitOverrides. This is because the override in the LanceDef has more units that the EL faction size, or forced Contract Override size
                        // This allows the LanceOverride to allocated the correct LanceDef units to the right UnitOverride slots
                        UnitSpawnPointOverride emptyUnitSpawnPointOverride = new UnitSpawnPointOverride();
                        emptyUnitSpawnPointOverride.unitDefId = UnitSpawnPointOverride.UseLance;

                        for (int i = currentLanceSize; i < newLanceSize; i++)
                        {
                            Main.LogDebug($"[AddExtraLanceMembersIndividualSecondPass] Adding UnitOverride '{i + 1}' to LanceOverride");
                            lanceOverride.unitSpawnPointOverrideList.Add(emptyUnitSpawnPointOverride.DeepCopy());
                        }
                    }
                }
            }
        }
 public ContractAndLanceOverridePayload(ContractOverride contractOverride, LanceOverride lanceOverride)
 {
     ContractOverride = contractOverride;
     LanceOverride    = lanceOverride;
 }
        private bool AreAnyLanceMembersTagged(LanceOverride lanceOverride)
        {
            UnitSpawnPointOverride unitSpawnOverrides = lanceOverride.GetAnyTaggedLanceMember();

            return(unitSpawnOverrides != null);
        }
Пример #27
0
        private void AddNewLanceMembers(ContractOverride contractOverride, TeamOverride teamOverride, LanceOverride lanceOverride, int numberOfUnitsInLance, int factionLanceSize)
        {
            for (int i = numberOfUnitsInLance; i < factionLanceSize; i++)
            {
                UnitSpawnPointOverride originalUnitSpawnPointOverride = lanceOverride.GetAnyTaggedLanceMember();
                if (originalUnitSpawnPointOverride == null)
                {
                    originalUnitSpawnPointOverride = lanceOverride.unitSpawnPointOverrideList[0];
                }
                UnitSpawnPointOverride unitSpawnPointOverride = originalUnitSpawnPointOverride.DeepCopy();
                TagSet companyTags = new TagSet(UnityGameInstance.BattleTechGame.Simulation.CompanyTags);

                unitSpawnPointOverride.GenerateUnit(MetadataDatabase.Instance, UnityGameInstance.Instance.Game.DataManager, lanceOverride.selectedLanceDifficulty, lanceOverride.name, null, i, DataManager.Instance.GetSimGameCurrentDate(), companyTags);
                lanceOverride.unitSpawnPointOverrideList.Add(unitSpawnPointOverride);
            }
        }
        private void IncreaseLanceSpawnPoints(ContractOverride contractOverride, TeamOverride teamOverride)
        {
            List <LanceOverride> lanceOverrides = teamOverride.lanceOverrideList;
            int           factionLanceSize      = Main.Settings.ExtendedLances.GetFactionLanceSize(teamOverride.faction.ToString());
            List <string> lancesToDelete        = new List <string>();

            for (int i = 0; i < lanceOverrides.Count; i++)
            {
                LanceOverride lanceOverride        = lanceOverrides[i];
                bool          isManualLance        = lanceOverride.lanceDefId == "Manual";
                int           numberOfUnitsInLance = lanceOverride.unitSpawnPointOverrideList.Count;

                if (lancesToSkip.Contains(lanceOverride.GUID))
                {
                    Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected a lance to skip. Skipping.");
                    continue;
                }

                if (lanceOverride.IsATurretLance())
                {
                    Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected a turret lance Ignoring for Extended Lances.");
                    continue;
                }

                if (isManualLance && numberOfUnitsInLance <= 0)
                {
                    Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected a lance that is set to manual but no units were manually specified. This is a bad contract json setup. Fix it! Ignoring for Extended Lances");
                    continue;
                }

                if ((numberOfUnitsInLance < factionLanceSize) && numberOfUnitsInLance > 0)
                {
                    // This is usually from a 'tagged' lance being selected which has less lance members than the faction lance size
                    if (Main.Settings.ExtendedLances.Autofill)
                    {
                        Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Populated lance '{lanceOverride.name}' has fewer units than the faction requires. Autofilling the missing units");

                        // GUARD: If an AdditionalLance lance config has been set to 'supportAutoFill' false, then don't autofill
                        if (lanceOverride is MLanceOverride)
                        {
                            MLanceOverride mLanceOverride = (MLanceOverride)lanceOverride;
                            if (!mLanceOverride.SupportAutofill)
                            {
                                Main.LogDebug($"[AddExtraLanceSpawnPoints] Lance Override '{mLanceOverride.GUID}' has 'autofill' explicitly turned off in MC lance '{mLanceOverride.LanceKey}'");
                                continue;
                            }
                        }

                        AddNewLanceMembers(contractOverride, teamOverride, lanceOverride, numberOfUnitsInLance, factionLanceSize);
                    }
                    else
                    {
                        Main.LogDebug($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Populated lance '{lanceOverride.name}' has fewer units than the faction requires. Allowing as a valid setup as 'Autofill' is false");
                    }
                }

                LanceSpawnerGameLogic lanceSpawner = lanceSpawners.Find(spawner => spawner.GUID == lanceOverride.lanceSpawner.EncounterObjectGuid);
                if (lanceSpawner != null)
                {
                    List <GameObject> unitSpawnPoints = lanceSpawner.gameObject.FindAllContains("UnitSpawnPoint");
                    numberOfUnitsInLance = lanceOverride.unitSpawnPointOverrideList.Count;

                    if (numberOfUnitsInLance > unitSpawnPoints.Count)
                    {
                        Main.Logger.Log($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Detected lance '{lanceOverride.name}' has more units than lance spawn points. Creating new lance spawns to accommodate.");
                        string     spawnerName     = lanceSpawner.gameObject.name;
                        GameObject orientationUnit = unitSpawnPoints[0].gameObject;
                        string     orientationKey  = $"{spawnerName}.{orientationUnit.name}";
                        encounterRules.ObjectLookup[orientationKey] = orientationUnit;

                        for (int j = unitSpawnPoints.Count; j < numberOfUnitsInLance; j++)
                        {
                            Vector3 randomLanceSpawn = unitSpawnPoints.GetRandom().transform.localPosition;
                            Vector3 spawnPositon     = SceneUtils.GetRandomPositionFromTarget(randomLanceSpawn, 24, 100);
                            spawnPositon = spawnPositon.GetClosestHexLerpedPointOnGrid();

                            // Ensure spawn position isn't on another unit spawn. Give up if one isn't possible.
                            int failSafe = 0;
                            while (spawnPositon.IsTooCloseToAnotherSpawn())
                            {
                                spawnPositon = SceneUtils.GetRandomPositionFromTarget(randomLanceSpawn, 24, 100);
                                spawnPositon = spawnPositon.GetClosestHexLerpedPointOnGrid();
                                if (failSafe > 20)
                                {
                                    break;
                                }
                                failSafe++;
                            }

                            Main.Logger.Log($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Creating lance '{lanceOverride.name}' spawn point 'UnitSpawnPoint{j + 1}'");
                            UnitSpawnPointGameLogic unitSpawnGameLogic = LanceSpawnerFactory.CreateUnitSpawnPoint(lanceSpawner.gameObject, $"UnitSpawnPoint{j + 1}", spawnPositon, lanceOverride.unitSpawnPointOverrideList[j].unitSpawnPoint.EncounterObjectGuid);

                            string spawnKey = $"{spawnerName}.{unitSpawnGameLogic.gameObject.name}";
                            encounterRules.ObjectLookup[spawnKey] = unitSpawnGameLogic.gameObject;
                            spawnKeys.Add(new string[] { spawnKey, orientationKey });
                        }
                    }
                }
                else
                {
                    Main.Logger.LogWarning($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Spawner is null for {lanceOverride.lanceSpawner.EncounterObjectGuid}. This is probably data from a restarted contract that hasn't been cleared up. It can be safely ignored.");
                    lancesToDelete.Add(lanceOverride.lanceSpawner.EncounterObjectGuid);
                }
            }

            for (int i = (lanceOverrides.Count - 1); i >= 0; i--)
            {
                LanceOverride lanceOverride = lanceOverrides[i];

                foreach (string lanceToDeleteByGuid in lancesToDelete)
                {
                    if (lanceOverride.lanceSpawner.EncounterObjectGuid == lanceToDeleteByGuid)
                    {
                        Main.Logger.LogWarning($"[AddExtraLanceSpawnPoints] [Faction:{teamOverride.faction}] Removing old lance data from contract. Deleting lance '{lanceToDeleteByGuid}'");
                        lanceOverrides.Remove(lanceOverride);
                    }
                }
            }
        }
 public static bool Prefix(LanceOverride __instance, Contract contract)
 {
     IRBT14MadlibsFix.Logger.Log($"LO:RL invoked with contract:[{contract}] with GUID:[{contract?.GUID}]");
     return(true);
 }
Пример #30
0
        private void AutofillWithTaggedOrFirstUnitOverrideSlots(TeamOverride teamOverride, LanceOverride lanceOverride, int numberOfUnitsInLanceOverride, int intendedLanceSize)
        {
            for (int i = numberOfUnitsInLanceOverride; i < intendedLanceSize; i++)
            {
                UnitSpawnPointOverride originalUnitSpawnPointOverride = lanceOverride.GetAnyTaggedLanceMember();

                if (originalUnitSpawnPointOverride == null)
                {
                    originalUnitSpawnPointOverride = lanceOverride.GetUnitToCopy();
                    Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Autofill mode. Adding unit {i + 1} by duplicating an existing unit.");
                }
                else
                {
                    Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Autofill mode. Adding unit {i + 1} by duplicating a 'Tagged' or 'Use Lance' lance member.");
                }

                UnitSpawnPointOverride unitSpawnPointOverride = originalUnitSpawnPointOverride.DeepCopy();
                unitSpawnPointOverride.customUnitName = "";
                Main.LogDebug($"[AddExtraLanceMembers] [{teamOverride.faction}] Using unit with old GUID '{originalUnitSpawnPointOverride.GUID}' and new GUID '{unitSpawnPointOverride.GUID}' unitDefId '{unitSpawnPointOverride.unitDefId}' as a base");

                lanceOverride.unitSpawnPointOverrideList.Add(unitSpawnPointOverride);
            }
        }