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); }
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); }
// 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); }
public new MLanceOverride Copy() { LanceOverride lanceOveride = base.Copy(); MLanceOverride mLanceOverride = new MLanceOverride(lanceOveride); mLanceOverride.LanceKey = this.LanceKey; mLanceOverride.SupportAutofill = this.SupportAutofill; return(mLanceOverride); }
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; } }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }