Skip to content

Commit

Permalink
yet another rework and fix for ID bullshits
Browse files Browse the repository at this point in the history
  • Loading branch information
ajkroeg committed Jul 10, 2023
1 parent 35594fb commit ce73c85
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 13 deletions.
4 changes: 2 additions & 2 deletions MapRandomizer/MapRandomizer/MapRandomizer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
<PropertyGroup>
<!-- avoids IgnoresAccessChecksToAttribute warnings -->
<PublicizerRuntimeStrategies>Unsafe</PublicizerRuntimeStrategies>
<AssemblyVersion>1.2.0.0</AssemblyVersion>
<FileVersion>1.2.0.0</FileVersion>
<AssemblyVersion>1.2.0.1</AssemblyVersion>
<FileVersion>1.2.0.1</FileVersion>
</PropertyGroup>
<ItemGroup>
<Compile Remove="source\Logger.cs" />
Expand Down
51 changes: 50 additions & 1 deletion MapRandomizer/MapRandomizer/source/Framework.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Runtime.Remoting.Messaging;
using BattleTech;
using BattleTech.Data;
using BattleTech.Framework;
using BattleTech.Save.SaveGameStructure;
using HBS.Util;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SVGImporter;
Expand Down Expand Up @@ -33,6 +38,50 @@ public class ContractOverrideExtension

public static class Utils
{
public static bool IDRehydratePredicate(string memberName)
{
return memberName == "ID";
}
public static string FetchCachedOverrideID(this ContractOverride contractOverride)
{
if (!string.IsNullOrEmpty(contractOverride.ID)) return contractOverride.ID;
if (ModState.OverrideIDCache.TryGetValue(contractOverride, out var cachedID)) return cachedID;
if (string.IsNullOrEmpty(contractOverride.cachedJson))
{
foreach (var result in contractOverride.OnContractSuccessResults)
{
if (result.Actions != null)
{
SimGameResultAction[] actions = result.Actions;
for (int i = 0; i < actions.Length; i++)
{
if (actions[i].Type == SimGameResultAction.ActionType.System_StartNonProceduralContract)
{
if (actions[i].additionalValues.Length > 3)
{
if (!string.IsNullOrEmpty(actions[i].additionalValues[3]))
return actions[i].additionalValues[3];
}
}
}
}
}
return null;
}

var deserializedOverride = new ContractOverride();

JSONSerializationUtility.FromJSON<ContractOverride>(contractOverride, contractOverride.cachedJson, new Func<string, bool>[]
{
new Func<string, bool>(IDRehydratePredicate)
});
ModState.OverrideIDCache.Add(contractOverride, deserializedOverride.ID);
return deserializedOverride.ID;
//JSONSerializationUtility.FromJSON<ContractOverride>(deserializedOverride, contractOverride.cachedJson);
//deserializedOverride.UpgradeToDataDrivenEnums();
//contractOverride.ID = deserializedOverride.ID;
}

public static void ForceTakeContractExpiration(this SimGameState sim, Contract contract)
{
if (sim.CompletedContract != null)
Expand Down
10 changes: 7 additions & 3 deletions MapRandomizer/MapRandomizer/source/ModState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using BattleTech;
using BattleTech.Framework;
using HBS.Collections;
using MapRandomizer.source;
using Newtonsoft.Json.Linq;
using static MapRandomizer.source.Classes;

Expand All @@ -19,6 +20,8 @@ public static class ModState
public static Dictionary<string, int> SavedDiffs = new Dictionary<string, int>();
public static Dictionary<string, int> SavedDiffOverrides = new Dictionary<string, int>();

public static Dictionary<ContractOverride, string> OverrideIDCache = new Dictionary<ContractOverride, string>();

public static void Reset()
{
IsSystemActionPatch = null;
Expand All @@ -38,9 +41,10 @@ public static class OverrideExtensionManager
public static bool GetContractOverrideExtension(this ContractOverride contractOverride, out ContractOverrideExtension extension)
{
extension = new ContractOverrideExtension();
if (contractOverride.ID == null) contractOverride.FullRehydrate();
if (contractOverride.ID == null) return false;
if (ContractOverrideExtensionDict.TryGetValue(contractOverride.ID, out var contractOverrideExtension))
var extensionID = contractOverride.ID;
if (string.IsNullOrEmpty(extensionID)) extensionID = contractOverride.FetchCachedOverrideID();
if (string.IsNullOrEmpty(extensionID)) return false;
if (ContractOverrideExtensionDict.TryGetValue(extensionID, out var contractOverrideExtension))
{
extension = contractOverrideExtension;
return true;
Expand Down
15 changes: 10 additions & 5 deletions MapRandomizer/MapRandomizer/source/Patches/ContractExpiration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public static void Postfix(Contract __instance, ref bool __result)
if (__result)
{
contractWidget.ListContracts(sim.GetAllCurrentlySelectableContracts(true), null);

if (__instance.Override.GetContractOverrideExtension(out var extension))
{
if (extension.ResultsOnExpiration.Count > 0)
Expand Down Expand Up @@ -87,8 +88,9 @@ public static void Postfix(Contract __instance, ref bool __result)

foreach (var entry in sim.RoomManager.timelineWidget.ActiveItems)
{
var overrideID = __instance.Override.FetchCachedOverrideID();
if (entry.Key is Classes.WorkOrderEntry_Notification_Timed timed &&
entry.Key.ID == $"{__instance.Override.ID}_TimeLeft")
entry.Key.ID == $"{overrideID}_TimeLeft")
{
timed.PayCost(1);
if (timed.IsCostPaid())
Expand All @@ -106,6 +108,7 @@ public static void Postfix(Contract __instance, ref bool __result)
new Type[] { typeof(string), typeof(string), typeof(string), typeof(ContractTypeValue), typeof(GameInstance), typeof(ContractOverride), typeof(GameContext), typeof(bool), typeof(int), typeof(int), typeof(int?) })]
public static class Contract_Constructor_Long
{
static bool Prepare() => true;
public static void Postfix(Contract __instance, string mapName, string mapPath, string encounterLayerGuid, ContractTypeValue contractTypeValue, GameInstance game, ContractOverride contractOverride, GameContext baseContext, bool fromSim = false, int difficulty = -1, int initialContractValue = 0, int? playerOneMoraleOverride = null)
{
var sim = UnityGameInstance.BattleTechGame.Simulation;
Expand All @@ -123,20 +126,22 @@ public static void Postfix(Contract __instance, string mapName, string mapPath,
[HarmonyPatch(typeof(ContractOverride), "CopyContractTypeData", new Type[] { typeof(ContractOverride) })]
public static class ContractOverride_CopyContractTypeData
{
static bool Prepare() => true;
public static void Postfix(ContractOverride __instance, ContractOverride ovr)
{
__instance.usesExpiration = ovr.usesExpiration;
__instance.expirationTimeOverride = ovr.expirationTimeOverride;
if (!string.IsNullOrEmpty(ovr.ID) && string.IsNullOrEmpty(__instance.ID))
{
__instance.ID = ovr.ID;
}
//if (!string.IsNullOrEmpty(ovr.ID) && string.IsNullOrEmpty(__instance.ID))
//{
// __instance.ID = ovr.ID;
//}
}
}

[HarmonyPatch(typeof(SGContractsListItem), "Init", new Type[] { typeof(Contract), typeof(SimGameState) })]
public static class SGContractsListItem_Postfix
{
static bool Prepare() => true;
public static void Postfix(SGContractsListItem __instance, Contract contract, SimGameState sim)
{
if (contract.UsingExpiration && __instance.expirationElement == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public class ContractOverrideExtensions
[HarmonyPatch(typeof(ContractOverride), "FromJSON")]
public static class ContractOverride_FromJSON
{
static bool Prepare() => false; //fuckit
public static void Prefix(ContractOverride __instance, ref string json)
{
var contracOverrideJO= JObject.Parse(json);
Expand Down Expand Up @@ -71,10 +72,59 @@ public static void Prefix(ContractOverride __instance, ref string json)
[HarmonyPatch(typeof(DataManager.ContractOverrideLoadRequest), "OnLoadedWithJSON")]
public static class DataManagerContractOverrideLoadRequest__OnLoadedWithJSON
{
static bool Prepare() => true; //fuckit
public static void Postfix(DataManager.ContractOverrideLoadRequest __instance, string json)
{
OverrideExtensionManager.ContractOverrideExtensionDict.AddOrUpdate(__instance.resourceId, OverrideExtensionManager.PendingExtension.Extension, (k, v) => OverrideExtensionManager.PendingExtension.Extension);
ModInit.modLog?.Trace?.Write($"[TRACE] ContractOverride_FromJSON - added {__instance.resourceId} to dict with values ForceStartOnExpiration [{OverrideExtensionManager.PendingExtension.Extension.ForceStartOnExpiration}]\rResultsOnExpiration [{OverrideExtensionManager.PendingExtension.Extension.ResultsOnExpiration.Count}]\rUniversalContractEffects [{OverrideExtensionManager.PendingExtension.Extension.UniversalContractEffects.Count}]");
if (OverrideExtensionManager.PendingExtension == null)
OverrideExtensionManager.PendingExtension = new PendingContractOverrideExtension();

var contracOverrideJO = JObject.Parse(json);
var state = new ContractOverrideExtension();
OverrideExtensionManager.PendingExtension = new PendingContractOverrideExtension();

if (contracOverrideJO["ForceStartOnExpiration"] != null)
{
state.ForceStartOnExpiration = (bool)contracOverrideJO["ForceStartOnExpiration"];
contracOverrideJO.Remove("ForceStartOnExpiration");
}

if (contracOverrideJO["ResultsOnExpiration"] != null)
{
var results = new List<SimGameEventResult>();
foreach (var resultJT in contracOverrideJO["ResultsOnExpiration"])
{
var resultJO = (JObject)resultJT;
if (resultJO == null) continue;
var result = resultJO.ProcessExpirationResult();
results.Add(result);
ModInit.modLog?.Trace?.Write($"[TRACE] Processed result with scope {result.Scope}");
}
state.ResultsOnExpiration = results;
contracOverrideJO.Remove("ResultsOnExpiration");
}

if (contracOverrideJO["UniversalContractEffects"] != null)
{
var effectDatas = new List<EffectData>();
foreach (var erffectJT in contracOverrideJO["UniversalContractEffects"])
{
var effectJO = (JObject)erffectJT;
if (effectJO == null) continue;
var effectData = new EffectData();
effectData.FromJSON(effectJO.ToString());
effectDatas.Add(effectData);
ModInit.modLog?.Trace?.Write($"[TRACE] Processed effectData with Id {effectData.Description.Id}");
}
state.UniversalContractEffects = effectDatas;
contracOverrideJO.Remove("UniversalContractEffects");
}

OverrideExtensionManager.PendingExtension.Extension = state;
//json = contracOverrideJO.ToString(Formatting.Indented);
ModInit.modLog?.Trace?.Write($"[TRACE] DataManagerContractOverrideLoadRequest__OnLoadedWithJSON POSTFIXING");

OverrideExtensionManager.ContractOverrideExtensionDict.AddOrUpdate(__instance.resourceId, OverrideExtensionManager.PendingExtension?.Extension, (k, v) => OverrideExtensionManager.PendingExtension?.Extension);
ModInit.modLog?.Trace?.Write($"[TRACE] DataManagerContractOverrideLoadRequest__OnLoadedWithJSON - added {__instance.resourceId} to dict with values ForceStartOnExpiration [{OverrideExtensionManager.PendingExtension?.Extension?.ForceStartOnExpiration}]\rResultsOnExpiration [{OverrideExtensionManager.PendingExtension?.Extension?.ResultsOnExpiration?.Count}]\rUniversalContractEffects [{OverrideExtensionManager.PendingExtension?.Extension?.UniversalContractEffects?.Count}]");
OverrideExtensionManager.ResetContractExtension();
}
}
Expand Down

0 comments on commit ce73c85

Please sign in to comment.