Skip to content

Commit

Permalink
fix broken alliance faction rep gain and prevent duplicate alliances
Browse files Browse the repository at this point in the history
  • Loading branch information
ajkroeg committed Jan 15, 2023
1 parent e2f211f commit 350c11d
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 28 deletions.
1 change: 1 addition & 0 deletions IRTweaks/IRTweaks/IRTweaks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
<Compile Include="Modules\Combat\SpawnProtection.cs" />
<Compile Include="Modules\Combat\UrbanExplosionsFix.cs" />
<Compile Include="Modules\Misc\CheatDetection.cs" />
<Compile Include="Modules\Misc\FactionReputationFixes.cs" />
<Compile Include="Modules\Misc\EventRequirementsScopeFix.cs" />
<Compile Include="Modules\Misc\DeathChanceStatFix.cs" />
<Compile Include="Modules\Misc\RestoreMechTagsOnReady.cs" />
Expand Down
2 changes: 2 additions & 0 deletions IRTweaks/IRTweaks/ModConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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}");
Expand Down
35 changes: 16 additions & 19 deletions IRTweaks/IRTweaks/Modules/Misc/CheatDetection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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.");
}
}

Expand All @@ -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;
Expand Down Expand Up @@ -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<SGBarracksSkillPip> ___gunPips, List<SGBarracksSkillPip> ___pilotPips,
List<SGBarracksSkillPip> ___gutPips, List<SGBarracksSkillPip> ___tacPips, string type, int value)
public static void Prefix(SGBarracksAdvancementPanel __instance, string type, int value)
{
if (___curPilot.StatCollection.GetValue<int>(type) > value)
if (__instance.curPilot.StatCollection.GetValue<int>(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.");
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions IRTweaks/IRTweaks/Modules/Misc/DisableMainMenuButtons.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
{
Expand All @@ -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);
Expand Down
87 changes: 87 additions & 0 deletions IRTweaks/IRTweaks/Modules/Misc/FactionReputationFixes.cs
Original file line number Diff line number Diff line change
@@ -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<string>(__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<string>(__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<int>(new Statistic.Validator<int>(__instance.ReputationAllyValidator<int>));
flag = true;
}
else if (__instance.IsFactionEnemy(enemyFactionValue))
{
statistic.SetValidator<int>(new Statistic.Validator<int>(__instance.ReputationEnemyValidator<int>));
flag2 = true;
}
else
{
statistic.SetValidator<int>(new Statistic.Validator<int>(__instance.ReputationNormalValidator<int>));
}

statistic.SetValue<int>(statistic.Value<int>(), 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);
}
}
}
}
}
}
6 changes: 3 additions & 3 deletions IRTweaks/IRTweaks/Modules/Misc/FactionValueFix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> ___ignoredContractTargets)
public static void Postfix(SimGameState __instance, GameInstanceSave gameInstanceSave)
{
var save = gameInstanceSave.SimGameSave;
if (save.IgnoredContractTargets == null) return;
___ignoredContractTargets = new List<string>();
__instance.ignoredContractTargets = new List<string>();
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);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions IRTweaks/IRTweaks/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]

0 comments on commit 350c11d

Please sign in to comment.