using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using AtlantumReactor;
using AtlantumReactor.Patches;
using BepInEx;
using BepInEx.Logging;
using EquinoxsModUtils;
using EquinoxsModUtils.Additions;
using FMOD.Studio;
using FMODUnity;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("AtlantumReactor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AtlantumReactor")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("28b722e4-d316-4e48-998b-1678719ad5d9")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
public static class AudioHelper
{
public static AudioClip WAVToAudioClip(byte[] wavBytes, string clipName)
{
if (wavBytes.Length < 44)
{
AtlantumReactorPlugin.Log.LogError((object)"Invalid WAV file: Header too short.");
return null;
}
int num = 0;
string @string = Encoding.ASCII.GetString(wavBytes, num, 4);
num += 4;
if (@string != "RIFF")
{
AtlantumReactorPlugin.Log.LogError((object)"Invalid WAV file: No RIFF header.");
return null;
}
num += 4;
string string2 = Encoding.ASCII.GetString(wavBytes, num, 4);
num += 4;
if (string2 != "WAVE")
{
AtlantumReactorPlugin.Log.LogError((object)"Invalid WAV file: No WAVE header.");
return null;
}
bool flag = false;
bool flag2 = false;
int num2 = 0;
int num3 = 0;
int num4 = 0;
float[] array = null;
while (num < wavBytes.Length)
{
string string3 = Encoding.ASCII.GetString(wavBytes, num, 4);
int num5 = BitConverter.ToInt32(wavBytes, num + 4);
num += 8;
if (string3 == "fmt ")
{
flag = true;
ushort num6 = BitConverter.ToUInt16(wavBytes, num);
if (num6 != 1)
{
AtlantumReactorPlugin.Log.LogError((object)"Invalid WAV file: Only PCM format is supported.");
return null;
}
num3 = BitConverter.ToUInt16(wavBytes, num + 2);
num2 = BitConverter.ToInt32(wavBytes, num + 4);
num4 = BitConverter.ToUInt16(wavBytes, num + 14);
num += num5;
continue;
}
if (string3.StartsWith("data") || string3 == "datapr")
{
flag2 = true;
int num7 = num5 / (num4 / 8);
array = new float[num7];
for (int i = 0; i < num7; i++)
{
switch (num4)
{
case 16:
{
short num8 = BitConverter.ToInt16(wavBytes, num);
array[i] = (float)num8 / 32768f;
num += 2;
break;
}
case 8:
array[i] = (float)(wavBytes[num] - 128) / 128f;
num++;
break;
}
}
break;
}
num += num5;
}
if (!flag || !flag2 || array == null)
{
AtlantumReactorPlugin.Log.LogError((object)"Failed to find necessary WAV header information.");
return null;
}
AudioClip val = AudioClip.Create(clipName, array.Length, num3, num2, false);
val.SetData(array, 0);
return val;
}
}
namespace AtlantumReactor
{
[BepInPlugin("com.equinox.AtlantumReactor", "AtlantumReactor", "1.0.3")]
public class AtlantumReactorPlugin : BaseUnityPlugin
{
private const string MyGUID = "com.equinox.AtlantumReactor";
private const string PluginName = "AtlantumReactor";
private const string VersionString = "1.0.3";
private static readonly Harmony Harmony = new Harmony("com.equinox.AtlantumReactor");
public static ManualLogSource Log = new ManualLogSource("AtlantumReactor");
public static SchematicsRecipeData reactorRecipe;
private static AudioSource audioSource;
private static bool audioLoaded = false;
public static GameObject reactorPrefab;
private void Awake()
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: AtlantumReactor, VersionString: 1.0.3 is loading...");
Harmony.PatchAll();
ApplyPatches();
ReactorGUI.LoadAssets();
LoadPrefabs();
AddContentToGame();
ModUtils.TechTreeStateLoaded += OnTechTreeStateLoaded;
ModUtils.GameLoaded += OnGameLoaded;
byte[] embeddedResourceBytes = GetEmbeddedResourceBytes("AtlantumReactor.Assets.Audio.Ignition.wav");
AudioClip val = AudioHelper.WAVToAudioClip(embeddedResourceBytes, "Ignition");
if ((Object)(object)val == (Object)null)
{
Log.LogError((object)"Failed to load audio clip.");
return;
}
audioSource = ((Component)this).gameObject.AddComponent<AudioSource>();
audioSource.clip = val;
audioSource.volume = 0.1f;
audioLoaded = true;
((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: AtlantumReactor, VersionString: 1.0.3 is loaded.");
Log = ((BaseUnityPlugin)this).Logger;
}
private void Update()
{
ReactorGUI.timeSinceClose += Time.deltaTime;
ReactorGUI.timeSinceIgnition += Time.deltaTime;
if (ReactorGUI.showGUI && (UnityInput.Current.GetKey((KeyCode)27) || UnityInput.Current.GetKey((KeyCode)9) || UnityInput.Current.GetKey((KeyCode)113) || UnityInput.Current.GetKey((KeyCode)101)))
{
ReactorGUI.showGUI = false;
ReactorGUI.timeSinceClose = 0f;
ModUtils.FreeCursor(false);
}
}
private void OnGUI()
{
if (ReactorGUI.showGUI)
{
ReactorGUI.DrawGUI();
}
}
private void OnTechTreeStateLoaded(object sender, EventArgs e)
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
Unlock unlockByName = ModUtils.GetUnlockByName("Crank Generator MKII", false);
Unlock unlockByName2 = ModUtils.GetUnlockByName("HVC Reach IV", false);
Unlock unlockByName3 = ModUtils.GetUnlockByName("Atlantum Reactor", false);
unlockByName3.treePosition = unlockByName.treePosition;
unlockByName3.requiredTier = unlockByName2.requiredTier;
unlockByName3.unlockedRecipes.Add(reactorRecipe);
}
private void OnGameLoaded(object sender, EventArgs e)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
MachineInstanceList<MemoryTreeInstance, MemoryTreeDefinition> machineList = MachineManager.instance.GetMachineList<MemoryTreeInstance, MemoryTreeDefinition>((MachineTypeEnum)30);
for (int i = 0; i < machineList.myArray.Length; i++)
{
MemoryTreeInstance reactor = machineList.myArray[i];
if ((Object)(object)((MemoryTreeInstance)(ref reactor)).myDef == (Object)null)
{
break;
}
if (((ResourceInfo)((MemoryTreeInstance)(ref reactor)).myDef).displayName == "Atlantum Reactor")
{
ReactorStage customDataForMachine = (ReactorStage)ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "stage");
if (ModUtils.NullCheck((object)customDataForMachine, "stage", false))
{
MemoryTreeInstancePatch.PlayReactorSound(ref reactor, customDataForMachine);
}
}
}
}
public static void PlayReactorIgnition()
{
if (!audioLoaded)
{
Log.LogError((object)"Cannot play ignite audio, not loaded");
return;
}
if (audioSource.isPlaying)
{
audioSource.Pause();
return;
}
audioSource.time = 0f;
audioSource.Play();
}
private void ApplyPatches()
{
Harmony.CreateAndPatchAll(typeof(InspectorUIPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(MemoryTreeDefinitionPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(MemoryTreeInstancePatch), (string)null);
Harmony.CreateAndPatchAll(typeof(PlayerInspectorPatch), (string)null);
Harmony.CreateAndPatchAll(typeof(PlayerInteractionPatch), (string)null);
}
private void LoadPrefabs()
{
AssetBundle val = LoadAssetBundle("reactorcore");
reactorPrefab = val.LoadAsset<GameObject>("assets/atlantium_power.prefab");
}
private static AssetBundle LoadAssetBundle(string filename)
{
Assembly callingAssembly = Assembly.GetCallingAssembly();
return AssetBundle.LoadFromStream(callingAssembly.GetManifestResourceStream("AtlantumReactor.Assets." + filename));
}
private static byte[] GetEmbeddedResourceBytes(string resourceName)
{
using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
if (stream == null)
{
Log.LogError((object)("Failed to find embedded resource: " + resourceName));
return null;
}
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
return array;
}
private void AddContentToGame()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Expected O, but got Unknown
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Expected O, but got Unknown
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
NewResourceDetails val = new NewResourceDetails();
val.name = "Atlantum Reactor";
val.description = string.Format("Consumes {0} and {1} to produce {2} -> {3}MW", "Atlantum Mixture Brick", "Shiverthorn Coolant", ReactorSettings.basePowerMW, (20000f + 500f * ReactorSettings.perCoolantBoost) / 1000f);
val.craftingMethod = (CraftingMethod)0;
val.craftTierRequired = 0;
val.headerTitle = "Production";
val.subHeaderTitle = "Power";
val.maxStackCount = 1;
val.sortPriority = 999;
val.unlockName = "Atlantum Reactor";
val.parentName = "Core Composer";
val.sprite = ModUtils.LoadSpriteFromFile("AtlantumReactor.Assets.Images.Reactor.png", false);
NewResourceDetails val2 = val;
MemoryTreeDefinition val3 = ScriptableObject.CreateInstance<MemoryTreeDefinition>();
EMUAdditions.AddNewMachine<MemoryTreeInstance, MemoryTreeDefinition>((MachineDefinition<MemoryTreeInstance, MemoryTreeDefinition>)(object)val3, val2, false);
EMUAdditions.AddNewRecipe(new NewRecipeDetails
{
GUID = "com.equinox.AtlantumReactor",
craftingMethod = (CraftingMethod)0,
craftTierRequired = 0,
duration = 10f,
unlockName = "Atlantum Reactor",
ingredients = new List<RecipeResourceInfo>
{
new RecipeResourceInfo("Core Composer", 1),
new RecipeResourceInfo("Crank Generator MKII", 5),
new RecipeResourceInfo("Steel Slab", 10)
},
outputs = new List<RecipeResourceInfo>
{
new RecipeResourceInfo("Atlantum Reactor", 1)
},
sortPriority = 10
}, false);
NewUnlockDetails val4 = new NewUnlockDetails();
val4.displayName = "Atlantum Reactor";
val4.description = string.Format("Consumes {0} and {1} to produce {2} -> {3}MW", "Atlantum Mixture Brick", "Shiverthorn Coolant", ReactorSettings.basePowerMW, (20000f + 500f * ReactorSettings.perCoolantBoost) / 1000f);
val4.category = (TechCategory)4;
val4.coreTypeNeeded = (CoreType)2;
val4.coreCountNeeded = 1000;
val4.requiredTier = (ResearchTier)1;
val4.treePosition = 0;
val4.sprite = ModUtils.LoadSpriteFromFile("AtlantumReactor.Assets.Images.Reactor.png", false);
EMUAdditions.AddNewUnlock(val4, false);
}
}
public static class ReactorGUI
{
public static bool lookingAtReactor;
public static bool showGUI;
public static uint currentReactor;
public static int currentReactorIndex;
public static float timeSinceClose;
public static float timeSinceIgnition = 0f;
private static float windowX = -1f;
private static float windowY = -1f;
private static float centerX = -1f;
private static float centerY = -1f;
private static float currentSafetyPanelOffset = 0f;
private static float currentFallSpeed = 2f;
private static float currentCore1Angle;
private static float currentCore2Angle;
private static float currentCore3Angle;
private static float currentCore4Angle;
private static float currentCore5Angle;
private static Vector2 pivotPoint = Vector2.zero;
private static Texture2D shaderTexture;
private static Texture2D reactorBackground;
private static Texture2D reactorButton;
private static Texture2D safetyPanel;
private static Texture2D meterCover;
private static Texture2D shiverMeter;
private static Texture2D kindleMeter;
private static Texture2D accumulatorMeter;
private static Texture2D chargesMeter;
private static Texture2D shiverBorder;
private static Texture2D kindleBorder;
private static Texture2D accumulatorBorder;
private static Texture2D chargesBorder;
private static Texture2D genBackground;
private static Texture2D coreStatic;
private static Texture2D core1;
private static Texture2D core2;
private static Texture2D core3;
private static Texture2D core4;
private static Texture2D core5;
public static void LoadAssets()
{
shaderTexture = ModUtils.LoadTexture2DFromFile(GetPath("ShaderTile"), false, (Assembly)null);
reactorBackground = ModUtils.LoadTexture2DFromFile(GetPath("ReactorControlPanel"), false, (Assembly)null);
reactorButton = ModUtils.LoadTexture2DFromFile(GetPath("ReactorButton"), false, (Assembly)null);
safetyPanel = ModUtils.LoadTexture2DFromFile(GetPath("ReactorSafetyPanel"), false, (Assembly)null);
meterCover = ModUtils.LoadTexture2DFromFile(GetPath("MeterCover"), false, (Assembly)null);
shiverMeter = ModUtils.LoadTexture2DFromFile(GetPath("ShiverMeter"), false, (Assembly)null);
kindleMeter = ModUtils.LoadTexture2DFromFile(GetPath("KindleMeter"), false, (Assembly)null);
accumulatorMeter = ModUtils.LoadTexture2DFromFile(GetPath("AccumulatorMeter"), false, (Assembly)null);
chargesMeter = ModUtils.LoadTexture2DFromFile(GetPath("ChargesMeter"), false, (Assembly)null);
shiverBorder = ModUtils.LoadTexture2DFromFile(GetPath("ShiverBorder"), false, (Assembly)null);
kindleBorder = ModUtils.LoadTexture2DFromFile(GetPath("KindleBorder"), false, (Assembly)null);
accumulatorBorder = ModUtils.LoadTexture2DFromFile(GetPath("AccumulatorBorder"), false, (Assembly)null);
chargesBorder = ModUtils.LoadTexture2DFromFile(GetPath("ChargesBorder"), false, (Assembly)null);
genBackground = ModUtils.LoadTexture2DFromFile(GetPath("ReactorGenBackground"), false, (Assembly)null);
coreStatic = ModUtils.LoadTexture2DFromFile(GetPath("CoreStatic"), false, (Assembly)null);
core1 = ModUtils.LoadTexture2DFromFile(GetPath("Core1"), false, (Assembly)null);
core2 = ModUtils.LoadTexture2DFromFile(GetPath("Core2"), false, (Assembly)null);
core3 = ModUtils.LoadTexture2DFromFile(GetPath("Core3"), false, (Assembly)null);
core4 = ModUtils.LoadTexture2DFromFile(GetPath("Core4"), false, (Assembly)null);
core5 = ModUtils.LoadTexture2DFromFile(GetPath("Core5"), false, (Assembly)null);
}
public static void DrawGUI()
{
DrawTexture2D(0f, 0f, Screen.width, Screen.height, shaderTexture);
SetDimensions();
ReactorStage customDataForMachine = (ReactorStage)ModUtils.GetCustomDataForMachine<int>(currentReactor, "stage");
if (customDataForMachine != ReactorStage.Ignited)
{
DrawTexture2D(windowX, windowY, ((Texture)reactorBackground).width, ((Texture)reactorBackground).height, reactorBackground);
DrawButton();
DrawMeter(-170f, "numShiver", shiverMeter, shiverBorder);
DrawMeter(-50f, "numKindle", kindleMeter, kindleBorder);
DrawMeter(70f, "capacitorCharge", accumulatorMeter, accumulatorBorder);
DrawMeter(190f, "numCharges", chargesMeter, chargesBorder);
DrawSafetyPanel();
}
else
{
DrawTexture2D(windowX, windowY, ((Texture)genBackground).width, ((Texture)genBackground).height, genBackground);
DrawTexture2D(windowX + 120f, windowY + 180f, ((Texture)coreStatic).width, ((Texture)coreStatic).height, coreStatic);
DrawQuantityLabels();
DrawPowerInfo();
DrawCore1();
DrawCore2();
DrawCore3();
DrawCore4();
DrawCore5();
}
}
public static void ResetSafetyPanelHeight()
{
currentSafetyPanelOffset = 0f;
currentFallSpeed = 2f;
}
private static string GetPath(string imageName)
{
return "AtlantumReactor.Assets.Images." + imageName + ".png";
}
private static void DrawTexture2D(Rect rect, Texture2D image)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Expected O, but got Unknown
//IL_007f: Expected O, but got Unknown
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle();
val.normal.background = image;
val.hover.background = image;
val.focused.background = image;
val.active.background = image;
val.onNormal.background = image;
val.onHover.background = image;
val.onFocused.background = image;
val.onActive.background = image;
val.border = new RectOffset(0, 0, 0, 0);
GUIStyle val2 = val;
GUI.Box(rect, "", val2);
}
private static void DrawTexture2D(float x, float y, float width, float height, Texture2D image)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
Rect rect = default(Rect);
((Rect)(ref rect))..ctor(x, y, width, height);
DrawTexture2D(rect, image);
}
private static void SetDimensions()
{
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
if (windowX < 0f)
{
windowX = (float)(Screen.width - ((Texture)reactorBackground).width) / 2f;
}
if (windowY < 0f)
{
windowY = (float)(Screen.height - ((Texture)reactorBackground).height) / 2f;
}
if (centerX < 0f)
{
centerX = (float)Screen.width / 2f;
}
if (centerY < 0f)
{
centerY = (float)Screen.height / 2f;
}
pivotPoint = new Vector2(windowX + 370f, windowY + 430f);
}
private static int GetNumCoolant()
{
MachineInstanceList<MemoryTreeInstance, MemoryTreeDefinition> machineList = MachineManager.instance.GetMachineList<MemoryTreeInstance, MemoryTreeDefinition>((MachineTypeEnum)30);
return ((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref machineList.GetIndex(currentReactorIndex), 0))).GetResourceCount(ModUtils.GetResourceIDByName("Shiverthorn Coolant", false), false);
}
private static void DrawButton()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Expected O, but got Unknown
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle();
val.normal.background = null;
val.hover.background = null;
val.focused.background = null;
val.active.background = null;
val.onNormal.background = null;
val.onHover.background = null;
val.onFocused.background = null;
val.onActive.background = null;
GUIStyle val2 = val;
if (GUI.Button(new Rect(windowX + 152f, windowY + 620f, 100f, 100f), (Texture)(object)reactorButton, val2))
{
ModUtils.UpdateCustomDataForMachine<int>(currentReactor, "stage", 6);
timeSinceIgnition = 0f;
AtlantumReactorPlugin.PlayReactorIgnition();
}
}
private static void DrawMeter(float height, string dataName, Texture2D meterTexture, Texture2D borderTexture)
{
DrawTexture2D(centerX - 466f, centerY + height + 2f, 1130f, 36f, meterTexture);
int customDataForMachine = ModUtils.GetCustomDataForMachine<int>(currentReactor, dataName);
float num = ((dataName == "capacitorCharge") ? 10000000 : 5000);
float num2 = Mathf.Min((float)customDataForMachine / num, 1f);
float num3 = 1134f * num2;
if (num2 != 1f)
{
DrawTexture2D(centerX - 468f + num3, centerY + height, 1134f - num3, 40f, meterCover);
}
DrawTexture2D(centerX - 468f, centerY + height, 1134f, 40f, borderTexture);
}
private static void DrawQuantityLabels()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Expected O, but got Unknown
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Expected O, but got Unknown
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Expected O, but got Unknown
//IL_018f: Unknown result type (might be due to invalid IL or missing references)
//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle
{
fontSize = 24,
fontStyle = (FontStyle)1,
alignment = (TextAnchor)1
};
val.normal.textColor = Color.yellow;
val.normal.background = null;
val.hover.textColor = Color.yellow;
val.hover.background = null;
val.active.textColor = Color.yellow;
val.active.background = null;
val.focused.textColor = Color.yellow;
val.focused.background = null;
val.onNormal.textColor = Color.yellow;
val.onNormal.background = null;
val.onHover.textColor = Color.yellow;
val.onHover.background = null;
val.onActive.textColor = Color.yellow;
val.onActive.background = null;
val.onFocused.textColor = Color.yellow;
val.onFocused.background = null;
GUIStyle val2 = val;
int resourceIDByName = ModUtils.GetResourceIDByName("Atlantum Mixture Brick", false);
MachineInstanceList<MemoryTreeInstance, MemoryTreeDefinition> machineList = MachineManager.instance.GetMachineList<MemoryTreeInstance, MemoryTreeDefinition>((MachineTypeEnum)30);
GUIContent val3 = new GUIContent(((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref machineList.GetIndex(currentReactorIndex), 0))).GetResourceCount(resourceIDByName, false).ToString());
GUIContent val4 = new GUIContent(GetNumCoolant().ToString());
GUI.Label(new Rect(pivotPoint.x - 50f, pivotPoint.y + 20f, 100f, 100f), val3, val2);
GUI.Label(new Rect(centerX - 25f, pivotPoint.y + 20f, 50f, 50f), val4, val2);
}
private static void DrawPowerInfo()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Expected O, but got Unknown
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_014c: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_017b: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_018e: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_0206: Unknown result type (might be due to invalid IL or missing references)
//IL_0211: Unknown result type (might be due to invalid IL or missing references)
//IL_021f: Expected O, but got Unknown
//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
//IL_02da: Unknown result type (might be due to invalid IL or missing references)
//IL_030b: Unknown result type (might be due to invalid IL or missing references)
//IL_033c: Unknown result type (might be due to invalid IL or missing references)
//IL_0378: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
GUIStyle val = new GUIStyle
{
fontSize = 16,
fontStyle = (FontStyle)1,
alignment = (TextAnchor)0
};
val.normal.textColor = Color.yellow;
val.normal.background = null;
val.hover.textColor = Color.yellow;
val.hover.background = null;
val.active.textColor = Color.yellow;
val.active.background = null;
val.focused.textColor = Color.yellow;
val.focused.background = null;
val.onNormal.textColor = Color.yellow;
val.onNormal.background = null;
val.onHover.textColor = Color.yellow;
val.onHover.background = null;
val.onActive.textColor = Color.yellow;
val.onActive.background = null;
val.onFocused.textColor = Color.yellow;
val.onFocused.background = null;
GUIStyle val2 = val;
GUIStyle val3 = new GUIStyle
{
fontSize = 16,
fontStyle = (FontStyle)1,
alignment = (TextAnchor)2
};
val3.normal.textColor = Color.yellow;
val3.normal.background = null;
val3.hover.textColor = Color.yellow;
val3.hover.background = null;
val3.active.textColor = Color.yellow;
val3.active.background = null;
val3.focused.textColor = Color.yellow;
val3.focused.background = null;
val3.onNormal.textColor = Color.yellow;
val3.onNormal.background = null;
val3.onHover.textColor = Color.yellow;
val3.onHover.background = null;
val3.onActive.textColor = Color.yellow;
val3.onActive.background = null;
val3.onFocused.textColor = Color.yellow;
val3.onFocused.background = null;
GUIStyle val4 = val3;
int num = Mathf.FloorToInt(ModUtils.GetCustomDataForMachine<float>(currentReactor, "cycleTimeRemaining"));
int customDataForMachine = ModUtils.GetCustomDataForMachine<int>(currentReactor, "currentPowerGen");
int numCoolant = GetNumCoolant();
int num2 = 20000 + Mathf.CeilToInt((float)numCoolant * ReactorSettings.perCoolantBoost);
customDataForMachine = Mathf.CeilToInt((float)customDataForMachine * PowerState.instance.powerOutputMultiplier);
num2 = Mathf.CeilToInt((float)num2 * PowerState.instance.powerOutputMultiplier);
GUI.Label(new Rect(windowX + 973f, windowY + 275f, 300f, 50f), "Next Cycle:", val2);
GUI.Label(new Rect(windowX + 973f, windowY + 325f, 300f, 50f), "Power Generation:", val2);
GUI.Label(new Rect(windowX + 973f, windowY + 375f, 300f, 50f), "Next Power Generation:", val2);
GUI.Label(new Rect(windowX + 973f, windowY + 275f, 280f, 50f), $"{num}s", val4);
GUI.Label(new Rect(windowX + 973f, windowY + 325f, 280f, 50f), $"{(float)customDataForMachine / 1000f} MW", val4);
GUI.Label(new Rect(windowX + 973f, windowY + 375f, 280f, 50f), $"{(float)num2 / 1000f} MW", val4);
}
private static void DrawCore1()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
currentCore1Angle += 0.1f;
GUIUtility.RotateAroundPivot(currentCore1Angle, pivotPoint);
DrawTexture2D(windowX + 259f, windowY + 319f, ((Texture)core1).width, ((Texture)core1).height, core1);
}
private static void DrawCore2()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
currentCore2Angle -= 0.2f;
GUIUtility.RotateAroundPivot(currentCore2Angle, pivotPoint);
DrawTexture2D(windowX + 225f, windowY + 285f, ((Texture)core2).width, ((Texture)core2).height, core2);
}
private static void DrawCore3()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
currentCore3Angle += 0.3f;
GUIUtility.RotateAroundPivot(currentCore3Angle, pivotPoint);
DrawTexture2D(windowX + 168f, windowY + 228f, ((Texture)core3).width, ((Texture)core3).height, core3);
}
private static void DrawCore4()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
currentCore4Angle -= 0.4f;
GUIUtility.RotateAroundPivot(currentCore4Angle, pivotPoint);
DrawTexture2D(windowX + 137f, windowY + 197f, ((Texture)core4).width, ((Texture)core4).height, core4);
}
private static void DrawCore5()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
currentCore5Angle += 0.5f;
GUIUtility.RotateAroundPivot(currentCore5Angle, pivotPoint);
DrawTexture2D(windowX + 100f, windowY + 160f, ((Texture)core5).width, ((Texture)core5).height, core5);
}
private static void DrawSafetyPanel()
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Expected O, but got Unknown
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
if (currentSafetyPanelOffset < (float)GetMaxSafetyPanelOffset())
{
currentSafetyPanelOffset += currentFallSpeed;
currentFallSpeed *= 1.025f;
}
else
{
currentFallSpeed = 2f;
}
GUIStyle val = new GUIStyle();
val.normal.background = safetyPanel;
GUIStyle val2 = val;
Rect val3 = default(Rect);
((Rect)(ref val3))..ctor(windowX - 20f, windowY - 20f, (float)((Texture)safetyPanel).width, (float)(((Texture)reactorBackground).height + 20));
GUI.BeginScrollView(val3, new Vector2(0f, 0f), val3, false, false);
GUI.Box(new Rect(windowX - 20f, windowY - 20f + currentSafetyPanelOffset, (float)((Texture)safetyPanel).width, (float)((Texture)safetyPanel).height), "", val2);
GUI.EndScrollView();
}
private static int GetMaxSafetyPanelOffset()
{
switch ((ReactorStage)ModUtils.GetCustomDataForMachine<int>(currentReactor, "stage"))
{
case ReactorStage.Idle:
case ReactorStage.Cooling:
return 260;
case ReactorStage.Heating:
return 380;
case ReactorStage.Charging:
return 500;
case ReactorStage.Kickstarting:
return 620;
case ReactorStage.Ready:
case ReactorStage.Ignited:
return 760;
default:
return 740;
}
}
}
public static class ReactorProperties
{
public const string stage = "stage";
public const string numShiver = "numShiver";
public const string numKindle = "numKindle";
public const string capacitorCharge = "capacitorCharge";
public const string numCharges = "numCharges";
public const string cycleTimeRemaining = "cycleTimeRemaining";
public const string currentPowerGen = "currentPowerGen";
public const string startedRunningSound = "startedRunnnigSound";
}
public enum ReactorStage
{
Idle,
Cooling,
Heating,
Charging,
Kickstarting,
Ready,
Ignited
}
}
namespace AtlantumReactor.Properties
{
[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[DebuggerNonUserCode]
[CompilerGenerated]
public class Resources
{
private static ResourceManager resourceMan;
private static CultureInfo resourceCulture;
[EditorBrowsable(EditorBrowsableState.Advanced)]
public static ResourceManager ResourceManager
{
get
{
if (resourceMan == null)
{
ResourceManager resourceManager = new ResourceManager("AtlantumReactor.Properties.Resources", typeof(Resources).Assembly);
resourceMan = resourceManager;
}
return resourceMan;
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public static CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
internal Resources()
{
}
}
}
namespace AtlantumReactor.Patches
{
internal class GameDefinesPatch
{
private static bool hasAdded;
private static MemoryTreeDefinition coreComposerDefinition;
private static MemoryTreeDefinition reactorDefinition;
[HarmonyPatch(typeof(GameDefines), "GetMaxResId")]
[HarmonyPrefix]
private static void AddReactorToGame()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Expected O, but got Unknown
if (!hasAdded)
{
hasAdded = true;
coreComposerDefinition = (MemoryTreeDefinition)ModUtils.GetResourceInfoByNameUnsafe("Core Composer", false);
AddReactor();
AddReactorRecipe();
ModUtils.SetPrivateStaticField<GameDefines>("_topResId", GameDefines.instance, (object)(-1));
}
}
private static void AddReactor()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Expected O, but got Unknown
reactorDefinition = (MemoryTreeDefinition)ScriptableObject.CreateInstance(typeof(MemoryTreeDefinition));
ModUtils.CloneObject<MemoryTreeDefinition>(coreComposerDefinition, ref reactorDefinition);
((ResourceInfo)reactorDefinition).description = string.Format("Consumes {0} and {1} to produce {2} -> {3}MW", "Atlantum Mixture Brick", "Shiverthorn Coolant", ReactorSettings.basePowerMW, (20000f + 500f * ReactorSettings.perCoolantBoost) / 1000f);
((ResourceInfo)reactorDefinition).rawName = "Atlantum Reactor";
((ResourceInfo)reactorDefinition).rawSprite = ModUtils.LoadSpriteFromFile("AtlantumReactor.Assets.Images.Reactor.png", false);
((UniqueIdScriptableObject)reactorDefinition).uniqueId = ModUtils.GetNewResourceID(false);
((BuilderInfo)reactorDefinition).kWPowerConsumption = -20000;
GameDefines.instance.resources.Add((ResourceInfo)(object)reactorDefinition);
GameDefines.instance.buildableResources.Add((BuilderInfo)(object)reactorDefinition);
ResourceNames.SafeResources.Add("Atlantum Reactor");
}
private static void AddReactorRecipe()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Expected O, but got Unknown
NewRecipeDetails val = new NewRecipeDetails
{
craftingMethod = (CraftingMethod)0,
craftTierRequired = 0,
duration = 120,
ingredients = new List<RecipeResourceInfo>
{
new RecipeResourceInfo("Core Composer", 1),
new RecipeResourceInfo("Crank Generator MKII", 5),
new RecipeResourceInfo("Steel Slab", 10)
},
outputs = new List<RecipeResourceInfo>
{
new RecipeResourceInfo("Atlantum Reactor", 1)
},
sortPriority = 10
};
AtlantumReactorPlugin.reactorRecipe = val.ConvertToRecipe();
((Object)AtlantumReactorPlugin.reactorRecipe).name = "Atlantum Reactor";
((UniqueIdScriptableObject)AtlantumReactorPlugin.reactorRecipe).uniqueId = ModUtils.GetNewRecipeID(false);
AtlantumReactorPlugin.reactorRecipe.unlock = ((ResourceInfo)coreComposerDefinition).unlock;
GameDefines.instance.schematicsRecipeEntries.Add(AtlantumReactorPlugin.reactorRecipe);
}
}
internal class MemoryTreeDefinitionPatch
{
public static Dictionary<Vector3, GameObject> myVisualsMap = new Dictionary<Vector3, GameObject>();
[HarmonyPatch(typeof(MemoryTreeDefinition), "InitInstance")]
[HarmonyPostfix]
private static void SetToGenerator(ref MemoryTreeInstance newInstance)
{
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Invalid comparison between Unknown and I4
if (!(((ResourceInfo)((MemoryTreeInstance)(ref newInstance)).myDef).displayName == "Atlantum Reactor"))
{
return;
}
newInstance.powerInfo.isGenerator = true;
newInstance.powerInfo.powerSatisfaction = 1f;
newInstance.powerInfo.curPowerConsumption = 0;
newInstance.powerInfo.maxPowerConsumption = 0;
newInstance.powerInfo.usesPowerSystem = true;
MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).numSlots = 3;
MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).myStacks = (ResourceStack[])(object)new ResourceStack[3];
bool flag = (int)MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).slotSizeMode != 1;
for (int i = 0; i < 3; i++)
{
if (!flag)
{
MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).myStacks[i].maxStack = MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).maxStackSize;
}
((ResourceStack)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref newInstance, 0).myStacks[i])).InitAsEmpty(flag);
}
}
[HarmonyPatch(typeof(MemoryTreeDefinition), "OnBuild")]
[HarmonyPostfix]
private static void AddNewMembers(MachineInstanceRef<MemoryTreeInstance> instRef)
{
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
if (!(((ResourceInfo)((MemoryTreeInstance)(ref instRef.Get())).myDef).displayName != "Atlantum Reactor"))
{
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "stage", 0);
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "numShiver", 0);
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "numKindle", 0);
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "capacitorCharge", 0);
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "numCharges", 0);
ModUtils.AddCustomDataForMachine<float>(instRef.instanceId, "cycleTimeRemaining", 60f);
ModUtils.AddCustomDataForMachine<int>(instRef.instanceId, "currentPowerGen", 0);
ModUtils.AddCustomDataForMachine<bool>(instRef.instanceId, "startedRunnnigSound", false);
GameObject value = Object.Instantiate<GameObject>(AtlantumReactorPlugin.reactorPrefab, ((GridInfo)(ref instRef.gridInfo)).BottomCenter, Quaternion.Euler(0f, (float)instRef.gridInfo.yawRot, 0f));
myVisualsMap.Add(((GridInfo)(ref instRef.gridInfo)).BottomCenter, value);
}
}
[HarmonyPatch(typeof(MachineDefinition<MemoryTreeInstance, MemoryTreeDefinition>), "OnDeconstruct")]
[HarmonyPostfix]
private static void RemoveAudioPlayer(ref MemoryTreeInstance erasedInstance)
{
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
if (!(((ResourceInfo)((MemoryTreeInstance)(ref erasedInstance)).myDef).displayName != "Atlantum Reactor"))
{
if (MemoryTreeInstancePatch.reactorAudioPlayers.ContainsKey(erasedInstance.commonInfo.instanceId))
{
EventInstance val = MemoryTreeInstancePatch.reactorAudioPlayers[erasedInstance.commonInfo.instanceId];
((EventInstance)(ref val)).stop((STOP_MODE)0);
MemoryTreeInstancePatch.reactorAudioPlayers.Remove(erasedInstance.commonInfo.instanceId);
}
if (myVisualsMap.ContainsKey(((GridInfo)(ref erasedInstance.gridInfo)).BottomCenter))
{
Object.Destroy((Object)(object)myVisualsMap[((GridInfo)(ref erasedInstance.gridInfo)).BottomCenter]);
myVisualsMap.Remove(((GridInfo)(ref erasedInstance.gridInfo)).BottomCenter);
}
}
}
}
public class InspectorUIPatch
{
[HarmonyPatch(typeof(InspectorUI), "SetInspectingMachine")]
[HarmonyPrefix]
private static bool ShowReactorGUI(GenericMachineInstanceRef machineHit)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Invalid comparison between Unknown and I4
if ((int)((GenericMachineInstanceRef)(ref machineHit)).typeIndex != 30 || ((ResourceInfo)((MemoryTreeInstance)(ref ((GenericMachineInstanceRef)(ref machineHit)).Get<MemoryTreeInstance>())).myDef).displayName != "Atlantum Reactor")
{
return true;
}
ModUtils.SetPrivateField<InspectorUI>("inspecting", UIManager.instance.inspectorUI, (object)true);
ReactorGUI.lookingAtReactor = true;
if (InputHandler.instance.InteractShortUp && !ReactorGUI.showGUI && ReactorGUI.timeSinceClose >= 0.2f)
{
ModUtils.FreeCursor(true);
ReactorGUI.currentReactor = ((GenericMachineInstanceRef)(ref machineHit)).instanceId;
ReactorGUI.currentReactorIndex = ((GenericMachineInstanceRef)(ref machineHit)).index;
ReactorGUI.ResetSafetyPanelHeight();
ReactorGUI.showGUI = true;
}
return false;
}
}
internal class MemoryTreeInstancePatch
{
public static Dictionary<uint, EventInstance> reactorAudioPlayers = new Dictionary<uint, EventInstance>();
private static float timeSinceDrain = 0f;
[HarmonyPatch(typeof(MemoryTreeInstance), "SimUpdate")]
[HarmonyPrefix]
private static bool UpdateReactor(MemoryTreeInstance __instance, float dt)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Invalid comparison between Unknown and I4
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Unknown result type (might be due to invalid IL or missing references)
//IL_01af: Unknown result type (might be due to invalid IL or missing references)
//IL_01b1: Invalid comparison between Unknown and I4
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
if (((ResourceInfo)((MemoryTreeInstance)(ref __instance)).myDef).displayName != "Atlantum Reactor")
{
return true;
}
RotateCenter(ref __instance);
ReactorStage customDataForMachine = (ReactorStage)ModUtils.GetCustomDataForMachine<int>(__instance.commonInfo.instanceId, "stage");
if (customDataForMachine != ReactorStage.Charging && customDataForMachine != ReactorStage.Ignited)
{
ConsumeFromInventory(ref __instance);
}
if (customDataForMachine == ReactorStage.Charging)
{
ConsumePower(ref __instance);
}
if (customDataForMachine != ReactorStage.Ready && customDataForMachine != ReactorStage.Ignited)
{
CheckForStageUpdate(ref __instance, customDataForMachine);
customDataForMachine = (ReactorStage)ModUtils.GetCustomDataForMachine<int>(__instance.commonInfo.instanceId, "stage");
}
PLAYBACK_STATE val = (PLAYBACK_STATE)2;
EventInstance val2;
if (reactorAudioPlayers.ContainsKey(__instance.commonInfo.instanceId))
{
val2 = reactorAudioPlayers[__instance.commonInfo.instanceId];
((EventInstance)(ref val2)).getPlaybackState(ref val);
}
if (customDataForMachine == ReactorStage.Kickstarting && (int)val == 2)
{
val2 = reactorAudioPlayers[__instance.commonInfo.instanceId];
((EventInstance)(ref val2)).start();
}
if (customDataForMachine == ReactorStage.Ignited)
{
SetToProducePower(ref __instance);
float customDataForMachine2 = ModUtils.GetCustomDataForMachine<float>(__instance.commonInfo.instanceId, "cycleTimeRemaining");
customDataForMachine2 -= Time.fixedDeltaTime;
if (customDataForMachine2 < 0f)
{
customDataForMachine2 = 60f;
OnCycleStart(ref __instance);
}
ModUtils.UpdateCustomDataForMachine<float>(__instance.commonInfo.instanceId, "cycleTimeRemaining", customDataForMachine2);
bool customDataForMachine3 = ModUtils.GetCustomDataForMachine<bool>(__instance.commonInfo.instanceId, "startedRunnnigSound");
if ((ReactorGUI.timeSinceIgnition > 4f && !customDataForMachine3) || ((int)val == 2 && customDataForMachine3))
{
PlayReactorSound(ref __instance, customDataForMachine);
}
}
customDataForMachine = (ReactorStage)ModUtils.GetCustomDataForMachine<int>(__instance.commonInfo.instanceId, "stage");
if (customDataForMachine > ReactorStage.Idle && customDataForMachine < ReactorStage.Ignited)
{
SetToConsumePower(ref __instance);
}
MachineManager.instance.GetMachineList<MemoryTreeInstance, MemoryTreeDefinition>((MachineTypeEnum)30).myArray[__instance.commonInfo.index].powerInfo = __instance.powerInfo;
return false;
}
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
[HarmonyPrefix]
private static bool CanAddItem(MemoryTreeInstance __instance, ref bool __result, int resId, int inventoryIndex, out int slotNum, AddResourceValidationType validationType)
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Invalid comparison between Unknown and I4
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
slotNum = -1;
if (((ResourceInfo)((MemoryTreeInstance)(ref __instance)).myDef).displayName != "Atlantum Reactor")
{
return true;
}
if (ModUtils.GetCustomDataForMachine<int>(__instance.commonInfo.instanceId, "stage") < 6)
{
int currentNeededResId = GetCurrentNeededResId(__instance.commonInfo.instanceId);
if (currentNeededResId == -1 || resId != currentNeededResId)
{
__result = false;
return false;
}
if ((int)validationType == 2)
{
__result = ((Inventory)(ref __instance.commonInfo.inventories[inventoryIndex])).CanAddResources(resId);
}
}
else
{
int resourceIDByName = ModUtils.GetResourceIDByName("Atlantum Mixture Brick", false);
int resourceIDByName2 = ModUtils.GetResourceIDByName("Shiverthorn Coolant", false);
if (resId != resourceIDByName && resId != resourceIDByName2)
{
__result = false;
return false;
}
int resourceCount = ((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref __instance, 0))).GetResourceCount(resId, false);
if (resourceCount >= 500)
{
__result = false;
return false;
}
__result = true;
}
return false;
}
private static void RotateCenter(ref MemoryTreeInstance reactor)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
GameObject val = MemoryTreeDefinitionPatch.myVisualsMap[((GridInfo)(ref reactor.gridInfo)).BottomCenter];
Transform obj = val.transform.Find("reactornew3/centrespin");
GameObject val2 = ((obj != null) ? ((Component)obj).gameObject : null);
if ((Object)(object)val2 != (Object)null)
{
float num = 200f;
float num2 = ModUtils.GetCustomDataForMachine<float>(reactor.commonInfo.instanceId, "cycleTimeRemaining") / 60f;
num2 = Mathf.Max(0.2f, num2);
val2.transform.Rotate(Vector3.forward, num * num2 * Time.deltaTime, (Space)1);
}
}
private static void ConsumeFromInventory(ref MemoryTreeInstance reactor)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: Unknown result type (might be due to invalid IL or missing references)
ModUtils.NullCheck((object)reactor, "reactor", false);
ModUtils.NullCheck((object)reactor.commonInfo, "reactor.commonInfo", false);
int currentNeededResId = GetCurrentNeededResId(reactor.commonInfo.instanceId);
ref Inventory reference = ref reactor.commonInfo.inventories[0];
ResourceStack[] myStacks = reference.myStacks;
for (int i = 0; i < myStacks.Length; i++)
{
ResourceStack val = myStacks[i];
if (!((ResourceStack)(ref val)).isEmpty && ((UniqueIdScriptableObject)((ResourceStack)(ref val)).info).uniqueId == currentNeededResId)
{
string customDataName = "";
switch (((ResourceStack)(ref val)).info.displayName)
{
case "Shiverthorn Extract":
customDataName = "numShiver";
break;
case "Kindlevine Extract":
customDataName = "numKindle";
break;
case "Mining Charge":
customDataName = "numCharges";
break;
}
AddToResCount(reactor.commonInfo.instanceId, customDataName, val.count);
((Inventory)(ref reference)).TryRemoveResources(((UniqueIdScriptableObject)((ResourceStack)(ref val)).info).uniqueId, val.count);
}
}
}
private static int GetCurrentNeededResId(uint instanceId)
{
return (ReactorStage)ModUtils.GetCustomDataForMachine<int>(instanceId, "stage") switch
{
ReactorStage.Idle => ModUtils.GetResourceIDByName("Shiverthorn Extract", false),
ReactorStage.Cooling => ModUtils.GetResourceIDByName("Shiverthorn Extract", false),
ReactorStage.Heating => ModUtils.GetResourceIDByName("Kindlevine Extract", false),
ReactorStage.Kickstarting => ModUtils.GetResourceIDByName("Mining Charge", false),
_ => -1,
};
}
private static void AddToResCount(uint instanceId, string customDataName, int amount)
{
int customDataForMachine = ModUtils.GetCustomDataForMachine<int>(instanceId, customDataName);
customDataForMachine += amount;
ModUtils.UpdateCustomDataForMachine<int>(instanceId, customDataName, customDataForMachine);
}
private static void ConsumePower(ref MemoryTreeInstance reactor)
{
timeSinceDrain += Time.deltaTime;
if (!(timeSinceDrain <= 1f))
{
timeSinceDrain = 0f;
PowerNetwork network = PowerNetwork.GetNetwork(reactor.powerInfo.powerNetwork);
int num = network.totalGenerated - network.totalUsage;
int customDataForMachine = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "capacitorCharge");
customDataForMachine += num;
ModUtils.UpdateCustomDataForMachine<int>(reactor.commonInfo.instanceId, "capacitorCharge", customDataForMachine);
}
}
private static void CheckForStageUpdate(ref MemoryTreeInstance reactor, ReactorStage currentStage)
{
int customDataForMachine = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "numShiver");
int customDataForMachine2 = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "numKindle");
int customDataForMachine3 = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "capacitorCharge");
int customDataForMachine4 = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "numCharges");
bool customDataForMachine5 = ModUtils.GetCustomDataForMachine<bool>(reactor.commonInfo.instanceId, "startedRunnnigSound");
switch (currentStage)
{
case ReactorStage.Idle:
if (customDataForMachine != 0)
{
SetStage(ref reactor, ReactorStage.Cooling);
}
break;
case ReactorStage.Cooling:
if (customDataForMachine >= 5000)
{
SetStage(ref reactor, ReactorStage.Heating);
}
break;
case ReactorStage.Heating:
if (customDataForMachine2 >= 5000)
{
SetStage(ref reactor, ReactorStage.Charging);
}
break;
case ReactorStage.Charging:
if (customDataForMachine3 >= 10000000)
{
SetStage(ref reactor, ReactorStage.Kickstarting);
}
break;
case ReactorStage.Kickstarting:
if (customDataForMachine4 >= 5000)
{
SetStage(ref reactor, ReactorStage.Ready);
}
break;
case ReactorStage.Ignited:
if (ReactorGUI.timeSinceIgnition > 4f && !customDataForMachine5)
{
PlayReactorSound(ref reactor, currentStage);
}
break;
case ReactorStage.Ready:
break;
}
}
private static void SetStage(ref MemoryTreeInstance reactor, ReactorStage stage)
{
ModUtils.UpdateCustomDataForMachine<int>(reactor.commonInfo.instanceId, "stage", (int)stage);
PlayReactorSound(ref reactor, stage);
}
public static void PlayReactorSound(ref MemoryTreeInstance reactor, ReactorStage stage)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
if (!reactorAudioPlayers.ContainsKey(reactor.commonInfo.instanceId))
{
EventInstance value = RuntimeManager.CreateInstance("event:/Silence");
reactorAudioPlayers.Add(reactor.commonInfo.instanceId, value);
}
string text = "event:/Silence";
switch (stage)
{
case ReactorStage.Cooling:
text = "event:/SFX/Machine SFX/Placeholders/Water Wheel Placeholder";
break;
case ReactorStage.Heating:
text = "event:/SFX/Machine SFX/Smelter Active";
break;
case ReactorStage.Charging:
text = "event:/SFX/Machine SFX/Accumulator";
break;
case ReactorStage.Kickstarting:
text = "event:/SFX/Machine SFX/Blast Smelter/Blast Smelter Explosion";
break;
case ReactorStage.Ready:
text = "event:/SFX/Machine SFX/Power Generator";
break;
case ReactorStage.Ignited:
text = "event:/SFX/Tool SFX/Multiplayer Tools/Multiplayer MOLE/Multiplayer MOLE BH";
ModUtils.UpdateCustomDataForMachine<bool>(reactor.commonInfo.instanceId, "startedRunnnigSound", true);
break;
}
EventInstance val = reactorAudioPlayers[reactor.commonInfo.instanceId];
((EventInstance)(ref val)).stop((STOP_MODE)0);
reactorAudioPlayers[reactor.commonInfo.instanceId] = RuntimeManager.CreateInstance(text);
val = reactorAudioPlayers[reactor.commonInfo.instanceId];
((EventInstance)(ref val)).set3DAttributes(RuntimeUtils.To3DAttributes(((GridInfo)(ref reactor.gridInfo)).Center));
val = reactorAudioPlayers[reactor.commonInfo.instanceId];
((EventInstance)(ref val)).setParameterByName("Volume", 0.2f, false);
val = reactorAudioPlayers[reactor.commonInfo.instanceId];
((EventInstance)(ref val)).start();
}
public static void PlayReactorSound(int index, ReactorStage stage)
{
MachineInstanceList<MemoryTreeInstance, MemoryTreeDefinition> machineList = MachineManager.instance.GetMachineList<MemoryTreeInstance, MemoryTreeDefinition>((MachineTypeEnum)30);
PlayReactorSound(ref machineList.GetIndex(index), stage);
}
private static void SetToConsumePower(ref MemoryTreeInstance reactor)
{
reactor.powerInfo.isGenerator = false;
reactor.powerInfo.powerSatisfaction = 1f;
reactor.powerInfo.curPowerConsumption = 5000;
reactor.powerInfo.maxPowerConsumption = 5000;
reactor.powerInfo.usesPowerSystem = true;
}
private static void SetToProducePower(ref MemoryTreeInstance reactor)
{
if (!reactor.powerInfo.isGenerator)
{
reactor.powerInfo.isGenerator = true;
reactor.powerInfo.powerSatisfaction = 1f;
reactor.powerInfo.curPowerConsumption = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "currentPowerGen");
reactor.powerInfo.maxPowerConsumption = ModUtils.GetCustomDataForMachine<int>(reactor.commonInfo.instanceId, "currentPowerGen");
reactor.powerInfo.usesPowerSystem = true;
}
}
private static void OnCycleStart(ref MemoryTreeInstance reactor)
{
int resourceIDByName = ModUtils.GetResourceIDByName("Atlantum Mixture Brick", false);
int resourceIDByName2 = ModUtils.GetResourceIDByName("Shiverthorn Coolant", false);
if (((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref reactor, 0))).HasAnyOfResource(resourceIDByName))
{
((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref reactor, 0))).TryRemoveResources(resourceIDByName, 1);
int num = Mathf.Min(((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref reactor, 0))).GetResourceCount(resourceIDByName2, false), 500);
int num2 = Mathf.CeilToInt((float)num * ReactorSettings.perCoolantBoost);
((Inventory)(ref MACHINE_INSTANCE_HELPER_EXTENSIONS.GetInventory<MemoryTreeInstance>(ref reactor, 0))).TryRemoveResources(resourceIDByName2, num);
int num3 = 20000 + num2;
ModUtils.UpdateCustomDataForMachine<int>(reactor.commonInfo.instanceId, "currentPowerGen", num3);
reactor.powerInfo.curPowerConsumption = -num3;
reactor.powerInfo.maxPowerConsumption = -num3;
}
else
{
reactor.powerInfo.curPowerConsumption = 0;
reactor.powerInfo.maxPowerConsumption = 0;
}
}
}
internal class PlayerInspectorPatch
{
[HarmonyPatch(typeof(PlayerInspector), "LateUpdate")]
[HarmonyPrefix]
private static void SetLookingAtReactor()
{
ReactorGUI.lookingAtReactor = false;
}
}
internal class PlayerInteractionPatch
{
[HarmonyPatch(typeof(PlayerInteraction), "UpdateUI")]
[HarmonyPostfix]
private static void ShowInspectButton()
{
if (!((Object)(object)UIManager.instance == (Object)null) && !((Object)(object)UIManager.instance.inspectorUI == (Object)null))
{
bool flag = (bool)ModUtils.GetPrivateField<InspectorUI>("inspecting", UIManager.instance.inspectorUI);
bool flag2 = ReactorGUI.lookingAtReactor && flag;
string text = (flag2 ? "Inspect" : "");
UIManager.instance.hud.SetOverrideButtonSetVisible(flag2, text);
}
}
}
public static class ReactorSettings
{
public const string name = "Atlantum Reactor";
public const int explosionDelay = 5;
public const int itemLimit = 5000;
public const int energyLimit = 10000000;
public const int basePower = 20000;
public const float coolantMultiplier = 0.025f;
public static float basePowerMW => 20f;
public static float perCoolantBoost => 500f;
}
}