Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of HardcoreCompany v1.0.4
HardcoreCompany.dll
Decompiled 3 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using Dissonance.Integrations.Unity_NFGO; using HardcoreCompany.Managers; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("HardcoreCompany")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("HardcoreCompany")] [assembly: AssemblyTitle("HardcoreCompany")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace HardcoreCompany { [BepInPlugin("WaterGun.HardcoreCompany", "Hardcore Company", "1.0.4")] public class Plugin : BaseUnityPlugin { [HarmonyPatch(typeof(GameNetworkManager), "StartHost")] internal class GameNetworkManager_StartHost { [HarmonyPostfix] public static void ChangeLobbyNamePrefix() { string text = GameNetworkManager.Instance.lobbyHostSettings.lobbyName.ToString(); if (!string.IsNullOrEmpty(text) && text.Length > 4) { if (text.StartsWith("_PL_")) { string text2 = text; string text3 = "[Hardcore] " + text2.Substring(4, text2.Length - 4); GameNetworkManager.Instance.lobbyHostSettings.lobbyName = text3.ToString(); Instance.lang = "pl"; Debug.Log((object)("[Hardcore] Lobby renamed to: " + text3 + " | lang=" + Instance.lang)); } else if (text.StartsWith("_EN_")) { string text2 = text; string text4 = "[Hardcore] " + text2.Substring(4, text2.Length - 4); GameNetworkManager.Instance.lobbyHostSettings.lobbyName = text4.ToString(); Instance.lang = "eng"; Debug.Log((object)("[Hardcore] Lobby renamed to: " + text4 + " | lang=" + Instance.lang)); } else { string text5 = "[Hardcore] " + text; GameNetworkManager.Instance.lobbyHostSettings.lobbyName = text5.ToString(); Instance.lang = "eng"; Debug.Log((object)("[Hardcore] Lobby renamed to: " + text5 + " | lang=" + Instance.lang)); } } } } [HarmonyPatch(typeof(StartOfRound), "StartTrackingAllPlayerVoices")] internal class StartOfRound_OnPlayerConnectedClientRpc { [HarmonyPrefix] public static void DisplayWelcomeMessage(StartOfRound __instance) { if (!NetworkManager.Singleton.IsServer) { return; } for (int i = 0; i < __instance.allPlayerScripts.Length; i++) { if ((__instance.allPlayerScripts[i].isPlayerControlled || __instance.allPlayerScripts[i].isPlayerDead) && !((Component)__instance.allPlayerScripts[i]).gameObject.GetComponentInChildren<NfgoPlayer>().IsTracking) { ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(DisplayMessageAfterDelay(__instance.allPlayerScripts[i].playerUsername.ToString())); } } } } [HarmonyPatch(typeof(StartOfRound), "SetTimeAndPlanetToSavedSettings")] internal class StartOfRound_SetTimeAndPlanetToSavedSettings { [HarmonyPrefix] public static void TrackSaveFile() { if (NetworkManager.Singleton.IsServer && (Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)HardcoreNetworkManager.Instance != (Object)null) { string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName; Debug.Log((object)("[Hardcore] SetTimeAndPlanetToSavedSettings - current save: " + currentSaveFileName)); HardcoreNetworkManager.Instance.OnNewSaveLoaded(currentSaveFileName); } } [HarmonyPostfix] public static void StartOfRoundInstance(StartOfRound __instance) { if (!NetworkManager.Singleton.IsServer) { return; } if ((Object)(object)HardcoreNetworkManager.Instance == (Object)null) { ((Component)__instance).gameObject.AddComponent<HardcoreNetworkManager>(); Debug.Log((object)"[Hardcore] HardcoreNetworkManager instance created"); } if (ES3.KeyExists("WaterGunHardcoreLevel", GameNetworkManager.Instance.currentSaveFileName) && NetworkManager.Singleton.IsServer) { int num = ES3.Load<int>("WaterGunHardcoreLevel", GameNetworkManager.Instance.currentSaveFileName); HardcoreNetworkManager.Instance.HardcoreLevel = num; Debug.Log((object)$"[Hardcore] Loaded HardcoreLevel: {num}"); HardcoreNetworkManager.Instance.OnHardcoreLevelUpdate(); } else { Debug.Log((object)"[Hardcore] No saved HardcoreLevel found, starting at 0"); if ((Object)(object)HardcoreNetworkManager.Instance != (Object)null) { HardcoreNetworkManager.Instance.HardcoreLevel = Instance.StartingHardcoreLevel.Value; } } } } [HarmonyPatch(typeof(PreInitSceneScript), "Awake")] internal class PreInitSceneScript_Awake { private static bool hasStoredOriginals; [HarmonyPostfix] public static void StoreOriginals() { if (!hasStoredOriginals) { Debug.Log((object)"[Hardcore] PreInitSceneScript.Awake - will store originals when StartOfRound is ready"); hasStoredOriginals = true; } } } [HarmonyPatch(typeof(StartOfRound), "Awake")] internal class StartOfRound_Awake { [HarmonyPostfix] public static void StoreOriginals() { Debug.Log((object)"[Hardcore] StartOfRound.Awake - storing pure originals NOW"); HardcoreNetworkManager.StorePureOriginalsOnGameLaunch(); } } [HarmonyPatch(typeof(StartOfRound), "StartGame")] internal class StartOfRound_StartGame { [HarmonyPrefix] public static void ChooseRandomMap(StartOfRound __instance) { if (HardcoreNetworkManager.Instance.HardcoreLevel < 4 || !NetworkManager.Singleton.IsServer) { return; } List<string> list = new List<string>(); SelectableLevel[] levels = __instance.levels; foreach (SelectableLevel val in levels) { if (!list.Contains(val.sceneName) && !(val.sceneName == "Level12Liquidation") && !(val.sceneName == "CompanyBuilding")) { list.Add(val.sceneName); Debug.Log((object)"[Hardcore] StartOfRound.StartMatch - changing moon scene to a random L4"); } } if (list.Count != 0 && !(__instance.currentLevel.sceneName == "CompanyBuilding")) { int index = Random.Range(0, list.Count); __instance.currentLevel.sceneName = list[index]; } } } [HarmonyPatch(typeof(GameNetworkManager), "Disconnect")] internal class GameNetworkManager_Disconnect { [HarmonyPostfix] public static void OnDisconnect() { if (NetworkManager.Singleton.IsServer) { Debug.Log((object)"[Hardcore] GameNetworkManager.Disconnect detected"); if ((Object)(object)HardcoreNetworkManager.Instance != (Object)null) { HardcoreNetworkManager.Instance.OnSessionEnd(); } } } } [HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")] internal class GameNetworkManager_StartDisconnect { [HarmonyPostfix] public static void OnStartDisconnect() { Debug.Log((object)"[Hardcore] GameNetworkManager.StartDisconnect detected"); if ((Object)(object)HardcoreNetworkManager.Instance != (Object)null) { HardcoreNetworkManager.Instance.OnSessionEnd(); } } } [HarmonyPatch(typeof(StartOfRound), "SceneManager_OnLoad")] internal class StartOfRound_SceneManager_OnLoad { [HarmonyPostfix] public static void DisplayHardcoreLevel(StartOfRound __instance, ref string sceneName) { if (!NetworkManager.Singleton.IsServer || sceneName == "SampleSceneRelay" || sceneName == "MainMenu" || sceneName == "CompanyBuilding") { return; } if (HardcoreNetworkManager.Instance.HardcoreLevel >= 4) { int turretCount = Random.Range(3, 10); ((MonoBehaviour)__instance).StartCoroutine(HardcoreNetworkManager.Instance.SpawnOutsideTurrets(turretCount)); } if ((Object)(object)HardcoreNetworkManager.Instance != (Object)null) { if (Instance.lang == "pl") { HUDManager.Instance.AddTextToChatOnServer($"<color=#EE4B2B>Poziom Hardcore</color>: <color=#AAFF00>{HardcoreNetworkManager.Instance.HardcoreLevel}</color>", -1); } if (Instance.lang == "eng") { HUDManager.Instance.AddTextToChatOnServer($"<color=#EE4B2B>Hardcore Level</color>: <color=#AAFF00>{HardcoreNetworkManager.Instance.HardcoreLevel}</color>", -1); } } } } [HarmonyPatch(typeof(StartOfRound), "AutoSaveShipData")] internal class StartOfRound_AutoSaveShipData { [HarmonyPostfix] public static void SaveHardcoreData(StartOfRound __instance) { if (NetworkManager.Singleton.IsServer && NetworkManager.Singleton.IsServer && (Object)(object)HardcoreNetworkManager.Instance != (Object)null) { ES3.Save<int>("WaterGunHardcoreLevel", HardcoreNetworkManager.Instance.HardcoreLevel, GameNetworkManager.Instance.currentSaveFileName); Debug.Log((object)$"[Hardcore] Saved HardcoreLevel: {HardcoreNetworkManager.Instance.HardcoreLevel}"); } } } [HarmonyPatch(typeof(TimeOfDay), "UpdateProfitQuotaCurrentTime")] internal class TimeOfDay_UpdateProfitQuotaCurrentTime { private static int lastDeadline = -1; [HarmonyPostfix] public static void UpdatehardcoreLevel(TimeOfDay __instance) { if (!NetworkManager.Singleton.IsServer || (Object)(object)HardcoreNetworkManager.Instance == (Object)null) { return; } int daysUntilDeadline = __instance.daysUntilDeadline; if (lastDeadline == -1) { lastDeadline = daysUntilDeadline; return; } if (daysUntilDeadline < lastDeadline && daysUntilDeadline == 0) { if (HardcoreNetworkManager.Instance.HardcoreLevel >= 4) { if (Instance.lang == "pl") { HUDManager.Instance.AddTextToChatOnServer("<color=#AAFF00>Poziom Hardcore jest maksymalny</color>", -1); } else if (Instance.lang == "eng") { HUDManager.Instance.AddTextToChatOnServer("<color=#AAFF00>Hardcore level is at max</color>", -1); } } else if (HardcoreNetworkManager.Instance.HardcoreLevel < 4) { HardcoreNetworkManager.Instance.HardcoreLevel++; ES3.Save<int>("WaterGunHardcoreLevel", HardcoreNetworkManager.Instance.HardcoreLevel, GameNetworkManager.Instance.currentSaveFileName); if (Instance.lang == "pl") { HUDManager.Instance.AddTextToChatOnServer("<color=#EE4B2B>Poziom Hardcore wzrósł</color>", -1); } if (Instance.lang == "eng") { HUDManager.Instance.AddTextToChatOnServer("<color=#EE4B2B>Hardcore level has risen</color>", -1); } HardcoreNetworkManager.Instance.OnHardcoreLevelUpdate(); Debug.Log((object)$"[Hardcore] HardcoreLevel has risen to: {HardcoreNetworkManager.Instance.HardcoreLevel}"); } } lastDeadline = daysUntilDeadline; } } [CompilerGenerated] private sealed class <DisplayMessageAfterDelay>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string username; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DisplayMessageAfterDelay>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; if (Instance.lang == "pl") { HUDManager.Instance.AddTextToChatOnServer("<color=#AAFF00>Witaj</color> <color=#EE4B2B>" + username + ".</color> <color=#AAFF00>Ten server działa na modzie hardcore stworzonym przez</color> <color=#00FFFF>WaterGun.</color>", -1); } else if (Instance.lang == "eng") { HUDManager.Instance.AddTextToChatOnServer("<color=#AAFF00>Welcome</color> <color=#EE4B2B>" + username + ".</color> <color=#AAFF00>This server is running hardcore mod made by</color> <color=#00FFFF>WaterGun.</color>", -1); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string GUID = "WaterGun.HardcoreCompany"; private const string NAME = "Hardcore Company"; private const string VER = "1.0.4"; public static Plugin Instance; public ConfigEntry<int> StartingHardcoreLevel; public AssetBundle bundle; public string lang = "pl"; private void Awake() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown StartingHardcoreLevel = ((BaseUnityPlugin)this).Config.Bind<int>("Core", "StartingHardcoreLevel", 0, new ConfigDescription("Changes the hardcore level at which the new save starts with", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 4), Array.Empty<object>())); Instance = this; Harmony val = new Harmony("WaterGun.HardcoreCompany"); val.PatchAll(); Debug.Log((object)"[Hardcore] Plugin loaded and patches applied!"); } [IteratorStateMachine(typeof(<DisplayMessageAfterDelay>d__10))] public static IEnumerator DisplayMessageAfterDelay(string username) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DisplayMessageAfterDelay>d__10(0) { username = username }; } } } namespace HardcoreCompany.Managers { public class HardcoreNetworkManager : MonoBehaviour { private class LevelOriginalValues { public int maxEnemyPowerCount; public int maxOutsideEnemyPowerCount; public int maxScrap; public int minScrap; } private class LevelMapObjectValues { public AnimationCurve TurretCurve; public AnimationCurve LandmineCurve; public AnimationCurve TrapCurve; } [CompilerGenerated] private sealed class <SpawnOutsideTurrets>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int turretCount; public HardcoreNetworkManager <>4__this; private StartOfRound <sor>5__1; private GameObject <turretPrefab>5__2; private GameObject[] <allNodes>5__3; private Vector3 <shipPosition>5__4; private List<GameObject> <validNodes>5__5; private List<GameObject> <shuffledNodes>5__6; private int <turretsToSpawn>5__7; private SpawnableMapObject[] <>s__8; private int <>s__9; private SpawnableMapObject <mapObject>5__10; private GameObject[] <>s__11; private int <>s__12; private GameObject <node>5__13; private float <distance>5__14; private int <i>5__15; private GameObject <spawnNode>5__16; private Vector3 <spawnPosition>5__17; private Quaternion <spawnRotation>5__18; private GameObject <turretInstance>5__19; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SpawnOutsideTurrets>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <sor>5__1 = null; <turretPrefab>5__2 = null; <allNodes>5__3 = null; <validNodes>5__5 = null; <shuffledNodes>5__6 = null; <>s__8 = null; <mapObject>5__10 = null; <>s__11 = null; <node>5__13 = null; <spawnNode>5__16 = null; <turretInstance>5__19 = null; <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_0384: Unknown result type (might be due to invalid IL or missing references) //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_045d: Unknown result type (might be due to invalid IL or missing references) //IL_03db: Unknown result type (might be due to invalid IL or missing references) //IL_0424: Unknown result type (might be due to invalid IL or missing references) //IL_0432: Unknown result type (might be due to invalid IL or missing references) //IL_0438: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: <>1__state = -1; <sor>5__1 = StartOfRound.Instance; if ((Object)(object)<sor>5__1 == (Object)null || (Object)(object)<sor>5__1.currentLevel == (Object)null) { Debug.LogError((object)"[Hardcore] StartOfRound or currentLevel is null!"); return false; } <turretPrefab>5__2 = null; <>s__8 = <sor>5__1.currentLevel.spawnableMapObjects; for (<>s__9 = 0; <>s__9 < <>s__8.Length; <>s__9++) { <mapObject>5__10 = <>s__8[<>s__9]; if (<mapObject>5__10 != null && (Object)(object)<mapObject>5__10.prefabToSpawn != (Object)null && ((Object)<mapObject>5__10.prefabToSpawn).name == "TurretContainer") { <turretPrefab>5__2 = <mapObject>5__10.prefabToSpawn; break; } <mapObject>5__10 = null; } <>s__8 = null; if ((Object)(object)<turretPrefab>5__2 == (Object)null) { Debug.LogError((object)"[Hardcore] Could not find TurretContainer prefab!"); return false; } <allNodes>5__3 = GameObject.FindGameObjectsWithTag("OutsideAINode"); if (<allNodes>5__3 == null || <allNodes>5__3.Length == 0) { Debug.LogWarning((object)"[Hardcore] No OutsideAINode objects found!"); return false; } Debug.Log((object)$"[Hardcore] Found {<allNodes>5__3.Length} outside AI nodes"); <shipPosition>5__4 = <sor>5__1.shipLandingPosition.position; <validNodes>5__5 = new List<GameObject>(); <>s__11 = <allNodes>5__3; for (<>s__12 = 0; <>s__12 < <>s__11.Length; <>s__12++) { <node>5__13 = <>s__11[<>s__12]; if ((Object)(object)<node>5__13 != (Object)null) { <distance>5__14 = Vector3.Distance(<node>5__13.transform.position, <shipPosition>5__4); if (<distance>5__14 >= 25f) { <validNodes>5__5.Add(<node>5__13); } } <node>5__13 = null; } <>s__11 = null; if (<validNodes>5__5.Count == 0) { Debug.LogWarning((object)"[Hardcore] No valid nodes found (all too close to ship)!"); return false; } Debug.Log((object)$"[Hardcore] Found {<validNodes>5__5.Count} valid nodes (>10m from ship)"); <shuffledNodes>5__6 = <validNodes>5__5.OrderBy((GameObject x) => Random.value).ToList(); <turretsToSpawn>5__7 = Mathf.Min(turretCount, <shuffledNodes>5__6.Count); <i>5__15 = 0; while (<i>5__15 < <turretsToSpawn>5__7) { <spawnNode>5__16 = <shuffledNodes>5__6[<i>5__15]; <spawnPosition>5__17 = <spawnNode>5__16.transform.position; <spawnRotation>5__18 = Quaternion.Euler(0f, Random.Range(0f, 360f), 0f); <turretInstance>5__19 = Object.Instantiate<GameObject>(<turretPrefab>5__2, <spawnPosition>5__17, <spawnRotation>5__18); if ((Object)(object)<turretInstance>5__19 != (Object)null) { <turretInstance>5__19.transform.position = new Vector3(<spawnPosition>5__17.x, <spawnPosition>5__17.y, <spawnPosition>5__17.z); <turretInstance>5__19.GetComponent<NetworkObject>().Spawn(false); Debug.Log((object)$"[Hardcore] Spawned turret {<i>5__15 + 1}/{<turretsToSpawn>5__7} at {<spawnPosition>5__17}, distance from ship: {Vector3.Distance(<spawnPosition>5__17, <shipPosition>5__4):F2}m"); } else { Debug.LogError((object)$"[Hardcore] Failed to instantiate turret at position {<spawnPosition>5__17}"); } <spawnNode>5__16 = null; <turretInstance>5__19 = null; <i>5__15++; } Debug.Log((object)$"[Hardcore] Finished spawning {<turretsToSpawn>5__7} outside turrets"); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Dictionary<string, string> LevelSceneNames = new Dictionary<string, string>(); private static Dictionary<string, LevelOriginalValues> pureOriginalLevelValues = new Dictionary<string, LevelOriginalValues>(); private static Dictionary<string, int> pureOriginalEnemyHP = new Dictionary<string, int>(); private static Dictionary<string, int> pureOriginalEnemyRarity = new Dictionary<string, int>(); private static Dictionary<string, int> pureOriginalEnemyMaxCount = new Dictionary<string, int>(); private static Dictionary<string, LevelMapObjectValues> pureOriginalMapObjectValues = new Dictionary<string, LevelMapObjectValues>(); private static bool pureOriginalsStored = false; private static string currentSaveFileName = ""; public static HardcoreNetworkManager Instance; public int HardcoreLevel = -1; [IteratorStateMachine(typeof(<SpawnOutsideTurrets>d__12))] public IEnumerator SpawnOutsideTurrets(int turretCount) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SpawnOutsideTurrets>d__12(0) { <>4__this = this, turretCount = turretCount }; } private void Awake() { Instance = this; } public static void StorePureOriginalsOnGameLaunch() { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown if (pureOriginalsStored) { return; } if ((Object)(object)StartOfRound.Instance == (Object)null || StartOfRound.Instance.levels == null) { Debug.Log((object)"[Hardcore] Cannot store pure originals yet - StartOfRound not ready"); return; } Debug.Log((object)"[Hardcore] Storing PURE ORIGINAL values from game files..."); SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { string planetName = val.PlanetName; AnimationCurve turretCurve = null; AnimationCurve landmineCurve = null; AnimationCurve trapCurve = null; SpawnableMapObject[] spawnableMapObjects = val.spawnableMapObjects; foreach (SpawnableMapObject val2 in spawnableMapObjects) { if (((Object)val2.prefabToSpawn).name == "TurretContainer") { turretCurve = new AnimationCurve(val2.numberToSpawn.keys); } else if (((Object)val2.prefabToSpawn).name == "Landmine") { landmineCurve = new AnimationCurve(val2.numberToSpawn.keys); } else if (((Object)val2.prefabToSpawn).name == "SpikeRoofTrapHazard") { trapCurve = new AnimationCurve(val2.numberToSpawn.keys); } } LevelSceneNames[planetName] = val.sceneName; pureOriginalMapObjectValues[planetName] = new LevelMapObjectValues { TurretCurve = turretCurve, LandmineCurve = landmineCurve, TrapCurve = trapCurve }; pureOriginalLevelValues[planetName] = new LevelOriginalValues { maxEnemyPowerCount = val.maxEnemyPowerCount, maxOutsideEnemyPowerCount = val.maxOutsideEnemyPowerCount, maxScrap = val.maxScrap, minScrap = val.minScrap }; Debug.Log((object)$"[Hardcore] PURE ORIGINAL {val.PlanetName}: maxScrap={val.maxScrap}, minScrap={val.minScrap}, maxEnemyPower={val.maxEnemyPowerCount}, maxOutsidePower={val.maxOutsideEnemyPowerCount}"); foreach (SpawnableEnemyWithRarity enemy in val.Enemies) { string key = planetName + "_" + enemy.enemyType.enemyName + "_rarity"; if (!pureOriginalEnemyRarity.ContainsKey(key)) { pureOriginalEnemyRarity[key] = enemy.rarity; Debug.Log((object)$"[Hardcore] PURE ORIGINAL {enemy.enemyType.enemyName} rarity on {planetName}: {enemy.rarity}"); } if (!((Object)(object)enemy.enemyType != (Object)null)) { continue; } string key2 = enemy.enemyType.enemyName + "_maxcount"; if (!pureOriginalEnemyMaxCount.ContainsKey(key2)) { pureOriginalEnemyMaxCount[key2] = enemy.enemyType.MaxCount; Debug.Log((object)$"[Hardcore] PURE ORIGINAL {enemy.enemyType.enemyName} MAXCOUNT: {enemy.enemyType.MaxCount}"); } if (!enemy.enemyType.canDie) { continue; } string key3 = enemy.enemyType.enemyName + "_hp"; if (!pureOriginalEnemyHP.ContainsKey(key3)) { GameObject enemyPrefab = enemy.enemyType.enemyPrefab; EnemyAI val3 = ((enemyPrefab != null) ? enemyPrefab.GetComponent<EnemyAI>() : null); if ((Object)(object)val3 != (Object)null) { pureOriginalEnemyHP[key3] = val3.enemyHP; Debug.Log((object)$"[Hardcore] PURE ORIGINAL {enemy.enemyType.enemyName} HP: {val3.enemyHP}"); } } } } pureOriginalsStored = true; Debug.Log((object)("[Hardcore] Finished storing PURE ORIGINAL values. Total levels: " + pureOriginalLevelValues.Count)); } public void OnNewSaveLoaded(string saveFileName) { Debug.Log((object)("[Hardcore] OnNewSaveLoaded called. Current: '" + currentSaveFileName + "', New: '" + saveFileName + "'")); if (string.IsNullOrEmpty(saveFileName)) { Debug.Log((object)"[Hardcore] Save file name is empty, skipping"); } else if (currentSaveFileName != saveFileName) { Debug.Log((object)"[Hardcore] SAVE FILE CHANGED! Resetting to originals but keeping HardcoreLevel."); currentSaveFileName = saveFileName; ResetToPureOriginalValues(); Debug.Log((object)("[Hardcore] Current save file now: '" + currentSaveFileName + "'")); } else { Debug.Log((object)"[Hardcore] Same save file, no reset needed"); } } public void ResetToPureOriginalValues() { if (!pureOriginalsStored) { Debug.Log((object)"[Hardcore] Cannot reset - pure originals not stored yet"); StorePureOriginalsOnGameLaunch(); if (!pureOriginalsStored) { return; } } if ((Object)(object)StartOfRound.Instance == (Object)null || StartOfRound.Instance.levels == null) { Debug.Log((object)"[Hardcore] Cannot reset - StartOfRound not ready"); return; } Debug.Log((object)"[Hardcore] Resetting to PURE ORIGINAL values..."); SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { string planetName = val.PlanetName; if (LevelSceneNames.ContainsKey(planetName)) { val.sceneName = LevelSceneNames[planetName]; } if (pureOriginalLevelValues.ContainsKey(planetName)) { LevelOriginalValues levelOriginalValues = pureOriginalLevelValues[planetName]; val.maxEnemyPowerCount = levelOriginalValues.maxEnemyPowerCount; val.maxOutsideEnemyPowerCount = levelOriginalValues.maxOutsideEnemyPowerCount; val.maxScrap = levelOriginalValues.maxScrap; val.minScrap = levelOriginalValues.minScrap; Debug.Log((object)$"[Hardcore] Reset {val.PlanetName}: maxScrap={val.maxScrap}, minScrap={val.minScrap}, maxEnemyPower={val.maxEnemyPowerCount}, maxOutsidePower={val.maxOutsideEnemyPowerCount}"); } if (pureOriginalMapObjectValues.ContainsKey(planetName)) { LevelMapObjectValues levelMapObjectValues = pureOriginalMapObjectValues[planetName]; int num = 0; int num2 = 1; int num3 = 2; for (int j = 0; j < val.spawnableMapObjects.Count(); j++) { SpawnableMapObject val2 = val.spawnableMapObjects[j]; if (((Object)val2.prefabToSpawn).name == "TurretContainer") { num = j; } else if (((Object)val2.prefabToSpawn).name == "Landmine") { num2 = j; } else if (((Object)val2.prefabToSpawn).name == "SpikeRoofTrapHazard") { num3 = j; } } SpawnableMapObject[] spawnableMapObjects = val.spawnableMapObjects; foreach (SpawnableMapObject val3 in spawnableMapObjects) { if (((Object)val3.prefabToSpawn).name == "TurretContainer") { val.spawnableMapObjects[num].numberToSpawn = levelMapObjectValues.TurretCurve; } else if (((Object)val3.prefabToSpawn).name == "Landmine") { val.spawnableMapObjects[num2].numberToSpawn = levelMapObjectValues.LandmineCurve; } else if (((Object)val3.prefabToSpawn).name == "SpikeRoofTrapHazard") { val.spawnableMapObjects[num3].numberToSpawn = levelMapObjectValues.TrapCurve; } } } foreach (SpawnableEnemyWithRarity enemy in val.Enemies) { string key = planetName + "_" + enemy.enemyType.enemyName + "_rarity"; if (pureOriginalEnemyRarity.ContainsKey(key)) { enemy.rarity = pureOriginalEnemyRarity[key]; } if (!((Object)(object)enemy.enemyType != (Object)null)) { continue; } string key2 = enemy.enemyType.enemyName + "_hp"; if (pureOriginalEnemyHP.ContainsKey(key2)) { GameObject enemyPrefab = enemy.enemyType.enemyPrefab; EnemyAI val4 = ((enemyPrefab != null) ? enemyPrefab.GetComponent<EnemyAI>() : null); if ((Object)(object)val4 != (Object)null) { val4.enemyHP = pureOriginalEnemyHP[key2]; Debug.Log((object)$"[Hardcore] Reset {enemy.enemyType.enemyName} HP to: {val4.enemyHP}"); } } } } Debug.Log((object)"[Hardcore] Finished resetting to PURE ORIGINAL values"); } public void ApplyHardcoreSettings() { //IL_05cd: Unknown result type (might be due to invalid IL or missing references) //IL_05d2: Unknown result type (might be due to invalid IL or missing references) //IL_05e3: Unknown result type (might be due to invalid IL or missing references) //IL_05e8: Unknown result type (might be due to invalid IL or missing references) //IL_05f9: Unknown result type (might be due to invalid IL or missing references) //IL_05fe: Unknown result type (might be due to invalid IL or missing references) //IL_060f: Unknown result type (might be due to invalid IL or missing references) //IL_0614: Unknown result type (might be due to invalid IL or missing references) //IL_0619: Unknown result type (might be due to invalid IL or missing references) //IL_0620: Expected O, but got Unknown if (!pureOriginalsStored) { StorePureOriginalsOnGameLaunch(); } ResetToPureOriginalValues(); Debug.Log((object)$"[Hardcore] Applying hardcore settings for level: {HardcoreLevel}"); if (HardcoreLevel < 1) { Debug.Log((object)"[Hardcore] HardcoreLevel is 0, no changes applied"); return; } if (HardcoreLevel >= 1) { Debug.Log((object)"[Hardcore] Applying Level 1 modifications..."); SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { string planetName = val.PlanetName; if (!pureOriginalLevelValues.ContainsKey(planetName)) { continue; } LevelOriginalValues levelOriginalValues = pureOriginalLevelValues[planetName]; val.maxOutsideEnemyPowerCount = levelOriginalValues.maxOutsideEnemyPowerCount + 3; val.maxScrap = levelOriginalValues.maxScrap + 1; val.minScrap = levelOriginalValues.minScrap + 1; Debug.Log((object)$"[Hardcore] L1 - {val.PlanetName}: maxScrap={val.maxScrap}, minScrap={val.minScrap}, maxOutsidePower={val.maxOutsideEnemyPowerCount}"); foreach (SpawnableEnemyWithRarity enemy in val.Enemies) { string key = planetName + "_" + enemy.enemyType.enemyName + "_rarity"; if (pureOriginalEnemyRarity.ContainsKey(key) && pureOriginalEnemyRarity[key] > 80) { enemy.rarity = pureOriginalEnemyRarity[key] * 2; Debug.Log((object)$"[Hardcore] L1 - {enemy.enemyType.enemyName} rarity doubled to: {enemy.rarity}"); } } } } if (HardcoreLevel >= 2) { Debug.Log((object)"[Hardcore] Applying Level 2 modifications..."); SelectableLevel[] levels2 = StartOfRound.Instance.levels; foreach (SelectableLevel val2 in levels2) { string planetName2 = val2.PlanetName; if (!pureOriginalLevelValues.ContainsKey(planetName2)) { continue; } LevelOriginalValues levelOriginalValues2 = pureOriginalLevelValues[planetName2]; val2.maxEnemyPowerCount = levelOriginalValues2.maxEnemyPowerCount + 4; val2.maxOutsideEnemyPowerCount = levelOriginalValues2.maxOutsideEnemyPowerCount + 6; val2.maxScrap = levelOriginalValues2.maxScrap + 3; val2.minScrap = levelOriginalValues2.minScrap + 3; Debug.Log((object)$"[Hardcore] L2 - {val2.PlanetName}: maxScrap={val2.maxScrap}, minScrap={val2.minScrap}, maxEnemyPower={val2.maxEnemyPowerCount}, maxOutsidePower={val2.maxOutsideEnemyPowerCount}"); foreach (SpawnableEnemyWithRarity enemy2 in val2.Enemies) { if ((Object)(object)enemy2.enemyType != (Object)null && enemy2.enemyType.canDie) { string key2 = enemy2.enemyType.enemyName + "_hp"; if (pureOriginalEnemyHP.ContainsKey(key2)) { GameObject enemyPrefab = enemy2.enemyType.enemyPrefab; EnemyAI val3 = ((enemyPrefab != null) ? enemyPrefab.GetComponent<EnemyAI>() : null); if ((Object)(object)val3 != (Object)null) { val3.enemyHP = pureOriginalEnemyHP[key2] + 1; Debug.Log((object)$"[Hardcore] L2 - {enemy2.enemyType.enemyName} HP increased to: {val3.enemyHP}"); } } } string key3 = planetName2 + "_" + enemy2.enemyType.enemyName + "_rarity"; if (pureOriginalEnemyRarity.ContainsKey(key3)) { int num = pureOriginalEnemyRarity[key3]; bool flag = num > 80; bool flag2 = num > 50; if (flag && flag2) { enemy2.rarity = num * 4; Debug.Log((object)$"[Hardcore] L2 - {enemy2.enemyType.enemyName} rarity 4x to: {enemy2.rarity}"); } else if (flag2) { enemy2.rarity = num * 2; Debug.Log((object)$"[Hardcore] L2 - {enemy2.enemyType.enemyName} rarity 2x to: {enemy2.rarity}"); } } } } } if (HardcoreLevel >= 3) { Debug.Log((object)"[Hardcore] Applying Level 3 modifications..."); SelectableLevel[] levels3 = StartOfRound.Instance.levels; foreach (SelectableLevel val4 in levels3) { string planetName3 = val4.PlanetName; if (!pureOriginalLevelValues.ContainsKey(planetName3)) { continue; } LevelOriginalValues levelOriginalValues3 = pureOriginalLevelValues[planetName3]; val4.maxEnemyPowerCount = levelOriginalValues3.maxEnemyPowerCount + 8; val4.maxOutsideEnemyPowerCount = levelOriginalValues3.maxOutsideEnemyPowerCount + 12; for (int l = 0; l < val4.spawnableMapObjects.Count(); l++) { SpawnableMapObject val5 = val4.spawnableMapObjects[l]; if (((Object)val5.prefabToSpawn).name == "Landmine") { AnimationCurve numberToSpawn = new AnimationCurve((Keyframe[])(object)new Keyframe[4] { new Keyframe(0f, 25f), new Keyframe(0.5f, 25f), new Keyframe(0.5001f, 50f), new Keyframe(1f, 50f) }); val5.numberToSpawn = numberToSpawn; } } Debug.Log((object)$"[Hardcore] L3 - {val4.PlanetName}: maxScrap={val4.maxScrap}, minScrap={val4.minScrap}, maxEnemyPower={val4.maxEnemyPowerCount}, maxOutsidePower={val4.maxOutsideEnemyPowerCount}"); foreach (SpawnableEnemyWithRarity enemy3 in val4.Enemies) { string key4 = planetName3 + "_" + enemy3.enemyType.enemyName + "_rarity"; if (pureOriginalEnemyRarity.ContainsKey(key4)) { int num2 = pureOriginalEnemyRarity[key4]; bool flag3 = num2 > 80; bool flag4 = num2 > 50; bool flag5 = num2 > 120; if (flag3 && flag4 && flag5) { enemy3.rarity = num2 * 6; Debug.Log((object)$"[Hardcore] L3 - {enemy3.enemyType.enemyName} rarity 4x to: {enemy3.rarity}"); } else if (flag5) { enemy3.rarity = num2 * 4; Debug.Log((object)$"[Hardcore] L3 - {enemy3.enemyType.enemyName} rarity 2x to: {enemy3.rarity}"); } } } } } if (HardcoreLevel >= 4) { Debug.Log((object)"[Hardcore] Applying Level 4 modifications..."); SelectableLevel[] levels4 = StartOfRound.Instance.levels; foreach (SelectableLevel val6 in levels4) { string planetName4 = val6.PlanetName; if (!pureOriginalLevelValues.ContainsKey(planetName4)) { continue; } LevelOriginalValues levelOriginalValues4 = pureOriginalLevelValues[planetName4]; val6.maxEnemyPowerCount = levelOriginalValues4.maxEnemyPowerCount + 4; Debug.Log((object)$"[Hardcore] L4 - {val6.PlanetName}: maxScrap={val6.maxScrap}, minScrap={val6.minScrap}, maxEnemyPower={val6.maxEnemyPowerCount}, maxOutsidePower={val6.maxOutsideEnemyPowerCount}"); foreach (SpawnableEnemyWithRarity enemy4 in val6.Enemies) { if ((Object)(object)enemy4.enemyType != (Object)null && enemy4.enemyType.MaxCount == 1) { string key5 = enemy4.enemyType.enemyName + "_maxcount"; if (pureOriginalEnemyMaxCount.ContainsKey(key5)) { enemy4.enemyType.MaxCount = pureOriginalEnemyMaxCount[key5] + 1; Debug.Log((object)$"[Hardcore] L4 - {enemy4.enemyType.enemyName} MAXCOUNT increased to: {enemy4.enemyType.MaxCount}"); } } if (!((Object)(object)enemy4.enemyType != (Object)null) || !enemy4.enemyType.canDie) { continue; } string key6 = enemy4.enemyType.enemyName + "_hp"; if (pureOriginalEnemyHP.ContainsKey(key6)) { GameObject enemyPrefab2 = enemy4.enemyType.enemyPrefab; EnemyAI val7 = ((enemyPrefab2 != null) ? enemyPrefab2.GetComponent<EnemyAI>() : null); if ((Object)(object)val7 != (Object)null) { val7.enemyHP = pureOriginalEnemyHP[key6] + 2; Debug.Log((object)$"[Hardcore] L4 - {enemy4.enemyType.enemyName} HP increased to: {val7.enemyHP}"); } } } } } Debug.Log((object)"[Hardcore] Finished applying hardcore settings"); } public void OnHardcoreLevelUpdate() { ApplyHardcoreSettings(); } public void OnSessionEnd() { Debug.Log((object)"[Hardcore] Session ending - resetting values"); ResetToPureOriginalValues(); Debug.Log((object)"[Hardcore] Session ended, reset complete"); } } }