From 350c11dd646213d766e758475efc5c460eca05f0 Mon Sep 17 00:00:00 2001
From: ajkroeg <50463892+ajkroeg@users.noreply.github.com>
Date: Sun, 15 Jan 2023 13:09:11 -0500
Subject: [PATCH] fix broken alliance faction rep gain and prevent duplicate
alliances
---
IRTweaks/IRTweaks/IRTweaks.csproj | 1 +
IRTweaks/IRTweaks/ModConfig.cs | 2 +
.../IRTweaks/Modules/Misc/CheatDetection.cs | 35 ++++----
.../Modules/Misc/DisableMainMenuButtons.cs | 8 +-
.../Modules/Misc/FactionReputationFixes.cs | 87 +++++++++++++++++++
.../IRTweaks/Modules/Misc/FactionValueFix.cs | 6 +-
IRTweaks/IRTweaks/Properties/AssemblyInfo.cs | 4 +-
7 files changed, 115 insertions(+), 28 deletions(-)
create mode 100644 IRTweaks/IRTweaks/Modules/Misc/FactionReputationFixes.cs
diff --git a/IRTweaks/IRTweaks/IRTweaks.csproj b/IRTweaks/IRTweaks/IRTweaks.csproj
index 25a1e72..675ee92 100644
--- a/IRTweaks/IRTweaks/IRTweaks.csproj
+++ b/IRTweaks/IRTweaks/IRTweaks.csproj
@@ -144,6 +144,7 @@
+
diff --git a/IRTweaks/IRTweaks/ModConfig.cs b/IRTweaks/IRTweaks/ModConfig.cs
index 9db150a..9c3bad7 100644
--- a/IRTweaks/IRTweaks/ModConfig.cs
+++ b/IRTweaks/IRTweaks/ModConfig.cs
@@ -238,6 +238,7 @@ public class FixesFlags
public bool DisableLowFundsNotification = true;
public bool DisableMPHashCalculation = true;
public bool EventRequirementsScopeFix = true;
+ public bool FactionReputationFixes = true;
public bool FactionValueFix = true;
public bool MultiTargetStat = true;
public bool RandomStartByDifficulty = true;
@@ -308,6 +309,7 @@ public void LogConfig()
Mod.Log.Info?.Write($" ExplodingBuildingFix: {this.Fixes.ExplodingBuildingFix}");
Mod.Log.Info?.Write($" EventRequirementsScopeFix: {this.Fixes.EventRequirementsScopeFix}");
Mod.Log.Info?.Write($" ExtendedStats: {this.Fixes.ExtendedStats}");
+ Mod.Log.Info?.Write($" FactionReputationFixes: {this.Fixes.FactionReputationFixes}");
Mod.Log.Info?.Write($" FlexibleSensorLock: {this.Fixes.FlexibleSensorLock}");
Mod.Log.Info?.Write($" MaxArmorMaxesArmor: {this.Fixes.MaxArmorMaxesArmor}");
Mod.Log.Info?.Write($" MechbayLayout: {this.Fixes.MechbayLayout}");
diff --git a/IRTweaks/IRTweaks/Modules/Misc/CheatDetection.cs b/IRTweaks/IRTweaks/Modules/Misc/CheatDetection.cs
index 9888af3..3bc408d 100644
--- a/IRTweaks/IRTweaks/Modules/Misc/CheatDetection.cs
+++ b/IRTweaks/IRTweaks/Modules/Misc/CheatDetection.cs
@@ -280,21 +280,21 @@ public static class SGBarracksMWDetailPanel_OnPilotReset
{
static bool Prepare() => Mod.Config.CheatDetection.CheatDetection;
- public static void Postfix(SGBarracksMWDetailPanel __instance, Pilot ___tempPilot, Pilot ___curPilot)
+ public static void Postfix(SGBarracksMWDetailPanel __instance)
{
var sim = UnityGameInstance.BattleTechGame.Simulation;
if (sim == null) return;
- if (String.IsNullOrEmpty(___curPilot.GUID)) return;
- if (!ModState.PilotCurrentFreeXP.ContainsKey(___curPilot.GUID))
+ if (String.IsNullOrEmpty(__instance.curPilot.GUID)) return;
+ if (!ModState.PilotCurrentFreeXP.ContainsKey(__instance.curPilot.GUID))
{
- ModState.PilotCurrentFreeXP.Add(___curPilot.GUID, ___curPilot.UnspentXP);
+ ModState.PilotCurrentFreeXP.Add(__instance.curPilot.GUID, __instance.curPilot.UnspentXP);
Mod.Log.Info?.Write(
- $"CHEATDETECTION: {___curPilot.Description.Id}: Added key {___curPilot.GUID} to PilotCurrentXP with UnspentXP {___curPilot.UnspentXP} but should have been done already. At OnPilotReset, Post.");
+ $"CHEATDETECTION: {__instance.curPilot.Description.Id}: Added key {__instance.curPilot.GUID} to PilotCurrentXP with UnspentXP {__instance.curPilot.UnspentXP} but should have been done already. At OnPilotReset, Post.");
}
- ModState.PilotCurrentFreeXP[___curPilot.GUID] = ___curPilot.UnspentXP;
+ ModState.PilotCurrentFreeXP[__instance.curPilot.GUID] = __instance.curPilot.UnspentXP;
Mod.Log.Info?.Write(
- $"CHEATDETECTION: {___curPilot.Description.Id}: {___curPilot.GUID} Free XP state was {ModState.PilotCurrentFreeXP[___curPilot.GUID]} after changing to basePilot {___curPilot.UnspentXP} at OnPilotReset, Post.");
+ $"CHEATDETECTION: {__instance.curPilot.Description.Id}: {__instance.curPilot.GUID} Free XP state was {ModState.PilotCurrentFreeXP[__instance.curPilot.GUID]} after changing to basePilot {__instance.curPilot.UnspentXP} at OnPilotReset, Post.");
}
}
@@ -303,8 +303,7 @@ public static class SGBarracksWidget_ReceiveButtonPress
{
static bool Prepare() => Mod.Config.CheatDetection.CheatDetection;
- public static void Postfix(SGBarracksWidget __instance, string button,
- SGBarracksMWDetailPanel ___mechWarriorDetails)
+ public static void Postfix(SGBarracksWidget __instance, string button)
{
if (button != "Close") return;
var sim = UnityGameInstance.BattleTechGame.Simulation;
@@ -335,25 +334,23 @@ public static class SGBarracksAdvancementPanel_OnValueClick_Patch
{
static bool Prepare() => Mod.Config.CheatDetection.CheatDetection;
- public static void Prefix(SGBarracksAdvancementPanel __instance, Pilot ___curPilot, Pilot ___basePilot,
- List ___gunPips, List ___pilotPips,
- List ___gutPips, List ___tacPips, string type, int value)
+ public static void Prefix(SGBarracksAdvancementPanel __instance, string type, int value)
{
- if (___curPilot.StatCollection.GetValue(type) > value)
+ if (__instance.curPilot.StatCollection.GetValue(type) > value)
{
var sim = UnityGameInstance.BattleTechGame.Simulation;
if (sim == null) return;
- if (String.IsNullOrEmpty(___curPilot.GUID)) return;
- if (!ModState.PilotCurrentFreeXP.ContainsKey(___curPilot.GUID))
+ if (String.IsNullOrEmpty(__instance.curPilot.GUID)) return;
+ if (!ModState.PilotCurrentFreeXP.ContainsKey(__instance.curPilot.GUID))
{
- ModState.PilotCurrentFreeXP.Add(___curPilot.GUID, ___curPilot.UnspentXP);
+ ModState.PilotCurrentFreeXP.Add(__instance.curPilot.GUID, __instance.curPilot.UnspentXP);
Mod.Log.Info?.Write(
- $"CHEATDETECTION: {___curPilot.Description.Id}: Added key {___curPilot.GUID} to PilotCurrentXP with UnspentXP {___curPilot.UnspentXP} but should have been done already. At SGBarracksAdvancementPanel.OnValueClick, Pre.");
+ $"CHEATDETECTION: {__instance.curPilot.Description.Id}: Added key {__instance.curPilot.GUID} to PilotCurrentXP with UnspentXP {__instance.curPilot.UnspentXP} but should have been done already. At SGBarracksAdvancementPanel.OnValueClick, Pre.");
}
- ModState.PilotCurrentFreeXP[___curPilot.GUID] = ___basePilot.UnspentXP;
+ ModState.PilotCurrentFreeXP[__instance.curPilot.GUID] = __instance.basePilot.UnspentXP;
Mod.Log.Info?.Write(
- $"CHEATDETECTION: {___curPilot.Description.Id}: {___curPilot.GUID} Free XP state was {ModState.PilotCurrentFreeXP[___curPilot.GUID]} after changing to basePilot {___basePilot.UnspentXP} At SGBarracksAdvancementPanel.OnValueClick, Pre.");
+ $"CHEATDETECTION: {__instance.curPilot.Description.Id}: {__instance.curPilot.GUID} Free XP state was {ModState.PilotCurrentFreeXP[__instance.curPilot.GUID]} after changing to basePilot {__instance.curPilot.UnspentXP} At SGBarracksAdvancementPanel.OnValueClick, Pre.");
}
}
}
diff --git a/IRTweaks/IRTweaks/Modules/Misc/DisableMainMenuButtons.cs b/IRTweaks/IRTweaks/Modules/Misc/DisableMainMenuButtons.cs
index a87ad17..e52c958 100644
--- a/IRTweaks/IRTweaks/Modules/Misc/DisableMainMenuButtons.cs
+++ b/IRTweaks/IRTweaks/Modules/Misc/DisableMainMenuButtons.cs
@@ -11,13 +11,13 @@ public static class MainMenu_Init {
static bool Prepare() => Mod.Config.Fixes.DisableCampaign || Mod.Config.Fixes.DisableDebug;
- public static void Prefix(HBSRadioSet ___topLevelMenu) {
+ public static void Prefix(MainMenu __instance) {
if (Mod.Config.Fixes.DisableCampaign)
{
Mod.Log.Info?.Write($"Disabling the campaign button on the main menu.");
try
{
- foreach (HBSButton button in ___topLevelMenu.RadioButtons)
+ foreach (HBSButton button in __instance.topLevelMenu.RadioButtons)
{
if (button.gameObject != null && button.gameObject.name == "button-CAMPAIGN")
{
@@ -33,14 +33,14 @@ public static void Prefix(HBSRadioSet ___topLevelMenu) {
}
}
- public static void Postfix(MainMenu __instance, GameObject[] ___enableInDevelopmentbuildsOnly)
+ public static void Postfix(MainMenu __instance)
{
if (Mod.Config.Fixes.DisableDebug)
{
Mod.Log.Info?.Write($"Disabling the debug buttons in the main menu.");
try
{
- GameObject[] array = ___enableInDevelopmentbuildsOnly;
+ GameObject[] array = __instance.enableInDevelopmentbuildsOnly;
for (int i = 0; i < array.Length; i++)
{
array[i].SetActive(false);
diff --git a/IRTweaks/IRTweaks/Modules/Misc/FactionReputationFixes.cs b/IRTweaks/IRTweaks/Modules/Misc/FactionReputationFixes.cs
new file mode 100644
index 0000000..9a37fec
--- /dev/null
+++ b/IRTweaks/IRTweaks/Modules/Misc/FactionReputationFixes.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BattleTech;
+using BattleTech.Save;
+using BattleTech.UI;
+using Harmony;
+
+namespace IRTweaks.Modules.Misc
+{
+ //remove duplicates
+ [HarmonyPatch(typeof(SimGameState), "AddAllyFaction")]
+ public static class SimGameState_AddAllyFaction
+ {
+ static bool Prepare() => Mod.Config.Fixes.FactionReputationFixes;
+
+ public static void Postfix(SimGameState __instance)
+ {
+ var alliedFactions = new List(__instance.AlliedFactions.Distinct());
+ __instance.AlliedFactions = alliedFactions.ToList();
+ }
+ }
+
+ //update stat validators to not be dumb
+ [HarmonyPatch(typeof(SimGameState), "RemoveAllyFaction")]
+ public static class SimGameState_RemoveAllyFaction
+ {
+ static bool Prepare() => Mod.Config.Fixes.FactionReputationFixes;
+
+ public static void Postfix(SimGameState __instance, FactionValue faction)
+ {
+ var alliedFactions = new List(__instance.AlliedFactions.Distinct());
+ __instance.AlliedFactions = alliedFactions.ToList();
+ __instance.AlliedFactions.Remove(faction.Name);
+
+ FactionDef factionDef = __instance.GetFactionDef(faction.Name);
+ foreach (var enemyFactionName in factionDef.Enemies)
+ {
+ FactionValue enemyFactionValue = FactionEnumeration.GetFactionByName(enemyFactionName);
+ string repID = __instance.GetRepID("Reputation", enemyFactionValue);
+ Statistic statistic = __instance.CompanyStats.GetStatistic(repID);
+ bool flag = false;
+ bool flag2 = false;
+ if (enemyFactionValue.DoesGainReputation)
+ {
+ if (__instance.IsFactionAlly(enemyFactionValue))
+ {
+ statistic.SetValidator(new Statistic.Validator(__instance.ReputationAllyValidator));
+ flag = true;
+ }
+ else if (__instance.IsFactionEnemy(enemyFactionValue))
+ {
+ statistic.SetValidator(new Statistic.Validator(__instance.ReputationEnemyValidator));
+ flag2 = true;
+ }
+ else
+ {
+ statistic.SetValidator(new Statistic.Validator(__instance.ReputationNormalValidator));
+ }
+
+ statistic.SetValue(statistic.Value(), true);
+ string text2 = enemyFactionName.ToString();
+ string text3 = "ALLIED_FACTION_" + text2;
+ string text4 = "ENEMY_FACTION_" + text2;
+ if (flag && !__instance.companyTags.Contains(text3))
+ {
+ __instance.companyTags.Add(text3);
+ }
+ else if (!flag && __instance.companyTags.Contains(text3))
+ {
+ __instance.companyTags.Remove(text3);
+ }
+ if (flag2 && !__instance.companyTags.Contains(text4))
+ {
+ __instance.companyTags.Add(text4);
+ }
+ else if (!flag2 && __instance.companyTags.Contains(text4))
+ {
+ __instance.companyTags.Remove(text4);
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/IRTweaks/IRTweaks/Modules/Misc/FactionValueFix.cs b/IRTweaks/IRTweaks/Modules/Misc/FactionValueFix.cs
index 4d89285..9d3f4a5 100644
--- a/IRTweaks/IRTweaks/Modules/Misc/FactionValueFix.cs
+++ b/IRTweaks/IRTweaks/Modules/Misc/FactionValueFix.cs
@@ -14,18 +14,18 @@ public static class SimGameState_Rehydrate
{
static bool Prepare() => Mod.Config.Fixes.FactionValueFix;
- public static void Postfix(SimGameState __instance, GameInstanceSave gameInstanceSave, ref List ___ignoredContractTargets)
+ public static void Postfix(SimGameState __instance, GameInstanceSave gameInstanceSave)
{
var save = gameInstanceSave.SimGameSave;
if (save.IgnoredContractTargets == null) return;
- ___ignoredContractTargets = new List();
+ __instance.ignoredContractTargets = new List();
foreach (var factionID2 in save.IgnoredContractTargets)
{
var factionValue = FactionEnumeration.GetFactionByID(factionID2);
if (!factionValue.IsCareerIgnoredContractTarget)
{
Mod.Log.Info?.Write($"FactionValueFix: {factionValue.Name} is no longer IsCareerIgnoredContractTarget = true, removing from ignoredContractTargets.");
- ___ignoredContractTargets.RemoveAll(x => x == factionValue.Name);
+ __instance.ignoredContractTargets.RemoveAll(x => x == factionValue.Name);
}
}
}
diff --git a/IRTweaks/IRTweaks/Properties/AssemblyInfo.cs b/IRTweaks/IRTweaks/Properties/AssemblyInfo.cs
index 9fd491c..458bb49 100644
--- a/IRTweaks/IRTweaks/Properties/AssemblyInfo.cs
+++ b/IRTweaks/IRTweaks/Properties/AssemblyInfo.cs
@@ -31,5 +31,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.9.8.0")]
-[assembly: AssemblyFileVersion("0.9.8.0")]
+[assembly: AssemblyVersion("0.9.8.1")]
+[assembly: AssemblyFileVersion("0.9.8.1")]