using 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 System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using Com.LuisPedroFonseca.ProCamera2D;
using DebugMod.Modules;
using DebugMod.Modules.Hitbox;
using HarmonyLib;
using InputExtension;
using JetBrains.Annotations;
using Microsoft.CodeAnalysis;
using MonsterLove.StateMachine;
using NineSolsAPI;
using NineSolsAPI.Utils;
using QFSW.QC;
using RCGFSM.Animation;
using RCGFSM.Transition;
using RCGFSM.Variable;
using RCGMaker.Core;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[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("DebugMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("My first plugin")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyInformationalVersion("1.2.0+d2ee5a1124e305740688b31a0101c47c6623fa87")]
[assembly: AssemblyProduct("DebugMod")]
[assembly: AssemblyTitle("DebugMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.2.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
internal static class IsExternalInit
{
}
}
namespace DebugMod
{
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
[MeansImplicitUse]
public class BindableMethod : Attribute
{
public string Name;
public KeyCode[] DefaultKeybind;
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("DebugMod", "DebugMod", "1.2.0")]
public class DebugMod : BaseUnityPlugin
{
public static DebugMod Instance;
private DebugUI debugUI;
private QuantumConsoleModule quantumConsoleModule;
private Harmony harmony;
private InfotextModule infotextModule;
public HitboxModule HitboxModule = new HitboxModule();
public SavestateModule SavestateModule = new SavestateModule();
public SpeedrunTimerModule SpeedrunTimerModule;
public FsmInspectorModule FsmInspectorModule;
public GhostModule GhostModule = new GhostModule();
private void Awake()
{
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
Instance = this;
Log.Init(((BaseUnityPlugin)this).Logger);
Log.Info("Plugin DebugMod started loading...");
try
{
harmony = Harmony.CreateAndPatchAll(typeof(DebugMod).Assembly, (string)null);
Log.Info($"Patched {harmony.GetPatchedMethods().Count()} methods...");
}
catch (Exception data)
{
Log.Error(data);
}
debugUI = ((Component)this).gameObject.AddComponent<DebugUI>();
quantumConsoleModule = new QuantumConsoleModule();
infotextModule = new InfotextModule();
SpeedrunTimerModule = new SpeedrunTimerModule();
FsmInspectorModule = new FsmInspectorModule();
GhostModule = new GhostModule();
SavestateModule.SavestateLoaded += delegate
{
SpeedrunTimerModule.OnSavestateLoaded();
};
SavestateModule.SavestateCreated += delegate
{
SpeedrunTimerModule.OnSavestateCreated();
};
KeybindManager.Add((MonoBehaviour)(object)this, (Action)ToggleConsole, (KeyCode[])(object)new KeyCode[2]
{
(KeyCode)306,
(KeyCode)46
});
KeybindManager.Add((MonoBehaviour)(object)this, (Action)ToggleSettings, (KeyCode[])(object)new KeyCode[2]
{
(KeyCode)306,
(KeyCode)44
});
ConfigEntry<KeyboardShortcut> changeModeShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("SpeedrunTimer", "Change Mode", default(KeyboardShortcut), (ConfigDescription)null);
ConfigEntry<KeyboardShortcut> setEndpointShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("SpeedrunTimer", "Set Endpoint", default(KeyboardShortcut), (ConfigDescription)null);
KeybindManager.Add((MonoBehaviour)(object)this, (Action)delegate
{
SpeedrunTimerModule.CycleTimerMode();
}, (Func<KeyboardShortcut>)(() => changeModeShortcut.Value));
KeybindManager.Add((MonoBehaviour)(object)this, (Action)delegate
{
SpeedrunTimerModule.SetEndpoint();
}, (Func<KeyboardShortcut>)(() => setEndpointShortcut.Value));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(FreecamModule));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(TimeModule));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(InfotextModule));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(HitboxModule));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(SavestateModule));
debugUI.AddBindableMethods(((BaseUnityPlugin)this).Config, typeof(CheatModule));
RCGLifeCycle.DontDestroyForever(((Component)this).gameObject);
Log.Info("Plugin DebugMod is loaded!");
}
private void ToggleConsole()
{
if (Object.op_Implicit((Object)(object)QuantumConsole.Instance))
{
QuantumConsole.Instance.Toggle();
}
}
private void ToggleSettings()
{
debugUI.settingsOpen = !debugUI.settingsOpen;
if (Player.i == null)
{
}
}
private void Update()
{
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: 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)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: 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)
FreecamModule.Update();
MapTeleportModule.Update();
infotextModule.Update();
if (!Input.GetKey((KeyCode)306))
{
return;
}
Cursor.visible = true;
if (!Input.GetMouseButtonDown(0))
{
return;
}
ToastManager.Toast((object)"click");
try
{
Camera theRealSceneCamera = SingletonBehaviour<CameraManager>.Instance.cameraCore.theRealSceneCamera;
Vector3 worldPosition = theRealSceneCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f - ((Component)theRealSceneCamera).transform.position.z));
worldPosition.z = 0f;
List<SpriteRenderer> list = PickSprite(worldPosition);
StateMachineOwner val = null;
foreach (SpriteRenderer item in list)
{
StateMachineOwner componentInParent = ((Component)item).GetComponentInParent<StateMachineOwner>();
if (Object.op_Implicit((Object)(object)componentInParent))
{
val = componentInParent;
}
}
if (Object.op_Implicit((Object)(object)val))
{
FsmInspectorModule.ObjectsToDisplay = new List<GameObject>(1) { ((Component)val).gameObject };
ToastManager.Toast((object)val);
}
}
catch (Exception ex)
{
ToastManager.Toast((object)ex);
}
}
private List<SpriteRenderer> PickSprite(Vector3 worldPosition)
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
List<SpriteRenderer> list = new List<SpriteRenderer>();
SpriteRenderer[] array = Object.FindObjectsOfType<SpriteRenderer>();
SpriteRenderer[] array2 = array;
foreach (SpriteRenderer val in array2)
{
if (IsWithinSpriteBounds(val, worldPosition))
{
string text = ((Object)((Component)val).gameObject).name.ToLower();
Transform parent = ((Component)val).gameObject.transform.parent;
string text2 = ((parent != null) ? ((Object)parent).name : null) ?? "";
if (!text.Contains("light") && !text.Contains("fade") && !text.Contains("glow") && !text.Contains("attack") && !text2.Contains("Vibe") && !text2.Contains("Skin"))
{
list.Add(val);
}
}
}
return list;
static bool IsWithinSpriteBounds(SpriteRenderer spriteRenderer, Vector3 position)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
Bounds bounds = ((Renderer)spriteRenderer).bounds;
return ((Bounds)(ref bounds)).Contains(position);
}
}
private void LateUpdate()
{
try
{
GhostModule.LateUpdate();
SpeedrunTimerModule.LateUpdate();
}
catch (Exception data)
{
Log.Error(data);
}
}
private void OnGUI()
{
SpeedrunTimerModule.OnGui();
FsmInspectorModule.OnGui();
}
private void OnDestroy()
{
harmony.UnpatchSelf();
HitboxModule.Unload();
SavestateModule.Unload();
quantumConsoleModule.Unload();
GhostModule.Unload();
SpeedrunTimerModule.Destroy();
infotextModule.Destroy();
Log.Info("Plugin DebugMod unloaded\n\n");
}
}
internal class DebugActionToggle
{
public bool Value;
public Action<bool> OnChange;
}
internal class DebugAction
{
public Action OnChange;
}
public class DebugUI : MonoBehaviour
{
public bool settingsOpen = false;
private GUIStyle styleButton;
private GUIStyle styleToggle;
private Dictionary<string, DebugActionToggle> toggles = new Dictionary<string, DebugActionToggle>();
private Dictionary<string, DebugAction> actions = new Dictionary<string, DebugAction>();
private void Awake()
{
toggles.Clear();
}
private void OnDestroy()
{
}
public void AddBindableMethods(ConfigFile config, Type ty)
{
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
MethodInfo[] methods = ty.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
foreach (MethodInfo methodInfo in methods)
{
BindableMethod customAttribute = methodInfo.GetCustomAttribute<BindableMethod>();
if (customAttribute != null)
{
string key = customAttribute.Name ?? methodInfo.Name;
Action action = (Action)Delegate.CreateDelegate(typeof(Action), methodInfo);
string text = new string(Array.FindAll(customAttribute.Name.ToCharArray(), char.IsLetterOrDigit));
ConfigEntry<KeyboardShortcut> keyboardShortcut = config.Bind<KeyboardShortcut>("Shortcuts", text, (customAttribute.DefaultKeybind != null) ? new KeyboardShortcut(customAttribute.DefaultKeybind[^1], customAttribute.DefaultKeybind[..^1]) : default(KeyboardShortcut), (ConfigDescription)null);
actions.Add(key, new DebugAction
{
OnChange = action
});
KeybindManager.Add((MonoBehaviour)(object)this, action, (Func<KeyboardShortcut>)(() => keyboardShortcut.Value));
}
}
}
public void AddToggle(string actionName, Action<bool> onChange, bool defaultValue = false)
{
toggles.Add(actionName, new DebugActionToggle
{
Value = defaultValue,
OnChange = onChange
});
}
private void OnGUI()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Expected O, but got Unknown
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Expected O, but got Unknown
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Expected O, but got Unknown
if (!settingsOpen)
{
return;
}
RCGInput.SetCursorVisible(true);
if (styleButton == null)
{
styleButton = new GUIStyle(GUI.skin.box)
{
alignment = (TextAnchor)5,
padding = new RectOffset(20, 20, 20, 20),
fontSize = 20
};
}
if (styleToggle == null)
{
styleToggle = new GUIStyle(GUI.skin.toggle)
{
fontSize = 20
};
}
GUILayout.BeginArea(new Rect(20f, 20f, (float)(Screen.width - 40), (float)(Screen.height - 40)));
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.FlexibleSpace();
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
string key;
foreach (KeyValuePair<string, DebugActionToggle> toggle in toggles)
{
toggle.Deconstruct(out key, out var value);
string arg = key;
DebugActionToggle debugActionToggle = value;
if (GUILayout.Button($"{arg}: {debugActionToggle.Value}", styleButton, Array.Empty<GUILayoutOption>()))
{
debugActionToggle.Value = !debugActionToggle.Value;
debugActionToggle.OnChange(debugActionToggle.Value);
ToastManager.Toast((object)$"change {arg} to {debugActionToggle.Value}");
}
}
foreach (KeyValuePair<string, DebugAction> action in actions)
{
action.Deconstruct(out key, out var value2);
string text = key;
DebugAction debugAction = value2;
if (GUILayout.Button(text ?? "", styleButton, Array.Empty<GUILayoutOption>()))
{
debugAction.OnChange();
}
}
GUILayout.EndVertical();
GUILayout.EndHorizontal();
GUILayout.FlexibleSpace();
GUILayout.EndArea();
}
}
[HarmonyPatch]
public class FastLoads
{
private static bool DoFastLoads => FreecamModule.FreecamActive || SavestateModule.IsLoadingSavestate;
[HarmonyPatch(typeof(GameCore), "FadeToBlack")]
[HarmonyPrefix]
private static void FadeToBlack(ref float fadeTime)
{
if (DoFastLoads)
{
fadeTime = 0f;
}
}
[HarmonyPatch(typeof(GameCore), "FadeOutBlack")]
[HarmonyPrefix]
private static void FadeOutBlack(ref float fadeTime, ref float delayTime)
{
if (DoFastLoads)
{
fadeTime = 0f;
delayTime = 0f;
}
}
[HarmonyPatch(typeof(UIExtension), "AddUITask")]
[HarmonyPrefix]
private static void AddUiTask(MonoBehaviour mb, Action action, ref float delay)
{
if (DoFastLoads)
{
delay = 0f;
}
}
[HarmonyPatch(typeof(GameCore), "ChangeScene", new Type[]
{
typeof(ChangeSceneData),
typeof(bool),
typeof(bool)
})]
[HarmonyPrefix]
private static void ChangeScene(ref ChangeSceneData changeSceneData, ref bool showTip, bool captureLastImage)
{
if (DoFastLoads)
{
showTip = false;
}
}
}
internal static class Log
{
private static ManualLogSource logSource;
internal static void Init(ManualLogSource logSource)
{
Log.logSource = logSource;
}
internal static void Debug(object data)
{
logSource.LogDebug(data);
}
internal static void Error(object data)
{
logSource.LogError(data);
}
internal static void Fatal(object data)
{
logSource.LogFatal(data);
}
internal static void Info(object data)
{
logSource.LogInfo(data);
}
internal static void Message(object data)
{
logSource.LogMessage(data);
}
internal static void Warning(object data)
{
logSource.LogWarning(data);
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "DebugMod";
public const string PLUGIN_NAME = "DebugMod";
public const string PLUGIN_VERSION = "1.2.0";
}
}
namespace DebugMod.Modules
{
[HarmonyPatch]
public class CheatModule
{
[BindableMethod(Name = "Refill all")]
private static void RefillAll()
{
Player i = Player.i;
if (i != null)
{
((Health)i.health).GainFull();
i.ammo.GainFull();
i.chiContainer.GainFull();
}
}
}
[HarmonyPatch]
public class FreecamModule
{
private const float Speed = 200f;
private const float FastMultiplier = 3f;
private const float ScrollSpeed = 1f;
public static bool FreecamActive;
private static PlayerInputStateType stateBefore = (PlayerInputStateType)3;
private static Camera sceneCamera => SingletonBehaviour<GameCore>.Instance.gameLevel.sceneCamera;
private static ProCamera2D proCamera => SingletonBehaviour<CameraManager>.Instance.cameraCore.proCamera2D;
[BindableMethod(/*Could not decode attribute arguments.*/)]
private static void ToggleFreecam()
{
//IL_008b: 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_009d: Unknown result type (might be due to invalid IL or missing references)
FreecamActive = !FreecamActive;
Player i = Player.i;
PlayerInputBinder playerInput = Player.i.playerInput;
if (FreecamActive)
{
((Behaviour)i).enabled = false;
((Health)i.health).BecomeInvincible((Object)(object)DebugMod.Instance);
((Behaviour)proCamera).enabled = false;
return;
}
((Behaviour)i).enabled = true;
((Health)i.health).RemoveInvincible((Object)(object)DebugMod.Instance);
((Behaviour)proCamera).enabled = true;
Transform transform = ((Component)sceneCamera).transform;
Vector3 position = ((Component)sceneCamera).transform.position;
position.z = -240f;
transform.position = position;
}
public static void Update()
{
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: 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_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: 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_0134: Unknown result type (might be due to invalid IL or missing references)
if (FreecamActive)
{
bool key = Input.GetKey((KeyCode)304);
float num = 200f * (key ? 3f : 1f);
float y = Input.mouseScrollDelta.y;
if (y != 0f)
{
Transform transform = ((Component)sceneCamera).transform;
float num2 = ((y < 0f) ? 1.1f : 0.9f);
Vector3 position = transform.position;
position.z = transform.position.z * num2 * 1f;
transform.position = position;
}
int num3 = (Input.GetKey((KeyCode)100) ? 1 : 0) - (Input.GetKey((KeyCode)97) ? 1 : 0);
int num4 = (Input.GetKey((KeyCode)119) ? 1 : 0) - (Input.GetKey((KeyCode)115) ? 1 : 0);
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor((float)num3, (float)num4);
Player.i.SetPosition(((Component)Player.i).transform.position + Vector2.op_Implicit(val * (Time.deltaTime * num)));
SingletonBehaviour<CameraManager>.Instance.camera2D.MoveCameraInstantlyToPosition(Vector2.op_Implicit(((Component)Player.i).transform.position), false);
}
}
}
[HarmonyPatch]
public class FsmInspectorModule
{
private static GUIStyle? style;
private string? text = null;
private static FieldRef<FSMStateMachineRunner, List<IStateMachine>> stateMachineRunnerStateMachineList = AccessTools.FieldRefAccess<FSMStateMachineRunner, List<IStateMachine>>("stateMachineList");
private static FieldRef<AbstractStateTransition, AbstractConditionComp[]> stateTransitionConditions = AccessTools.FieldRefAccess<AbstractStateTransition, AbstractConditionComp[]>("conditions");
private bool hideAnimationTransitions = true;
public List<GameObject> ObjectsToDisplay = new List<GameObject>();
[HarmonyPatch(typeof(PlayerBaseState), "OnStateEnter")]
[HarmonyPostfix]
private static void OnStateEnter(ref PlayerBaseState __instance)
{
}
[HarmonyPatch(typeof(Player), "ClearJumpState")]
[HarmonyPostfix]
private static void OnStateEnter(ref Player __instance)
{
}
private string InspectFSMMonsterLove(FSMStateMachineRunner runner)
{
string text = "";
List<IStateMachine> list = stateMachineRunnerStateMachineList.Invoke(runner);
foreach (IStateMachine item in list)
{
Type arg = ((object)item).GetType().GenericTypeArguments[0];
StateMapping currentStateMap = item.CurrentStateMap;
text += $"State type: {arg}\n";
text += $"Current state: {currentStateMap.stateObj}\n";
}
return text;
}
private string StateName(string name)
{
return StringExtensions.TrimStartMatches(name, (ReadOnlySpan<char>)"[State] ").ToString();
}
private string VariableName(AbstractVariable variable)
{
string text = StringExtensions.TrimEndMatches(StringExtensions.TrimStartMatches(((object)variable).ToString(), (ReadOnlySpan<char>)"[Variable] "), (ReadOnlySpan<char>)" (VariableBool)").ToString();
return text + " " + variable.FinalData.GetSaveID;
}
private string TransitionName(AbstractStateTransition transition)
{
if (!Object.op_Implicit((Object)(object)transition))
{
return "null";
}
return StringExtensions.TrimStartMatches(StringExtensions.TrimStartMatches(((Object)transition).name, (ReadOnlySpan<char>)"[Action] ").ToString(), (ReadOnlySpan<char>)"[Transition] ").ToString();
}
private string InspectFSM(GameObject gameObject)
{
if (!Object.op_Implicit((Object)(object)gameObject))
{
return "null";
}
string text = "";
FSMStateMachineRunner component = gameObject.GetComponent<FSMStateMachineRunner>();
if (Object.op_Implicit((Object)(object)component))
{
return InspectFSMMonsterLove(component);
}
StateMachineOwner component2 = gameObject.GetComponent<StateMachineOwner>();
if (!Object.op_Implicit((Object)(object)component2))
{
return "No fsm found";
}
GeneralFSMContext fsmContext = component2.FsmContext;
text = text + "Current State: " + StringExtensions.TrimStartMatches(((Object)((Component)((StateMachineContext<GeneralState, GeneralState>)(object)fsmContext).fsm.State).gameObject).name, (ReadOnlySpan<char>)"[State] ").ToString() + "\n";
text = text + "Last transition: " + TransitionName(fsmContext.LastTransition) + "\n";
GeneralState[] states = ((StateMachineContext<GeneralState, GeneralState>)(object)fsmContext).States;
foreach (GeneralState val in states)
{
text = text + "State " + StateName(((Object)val).name) + ":\n";
text += " Actions:\n";
AbstractStateAction[] actions = val.Actions;
foreach (AbstractStateAction val2 in actions)
{
if (val2 is StateTransitionAction)
{
continue;
}
string text2 = ((object)val2).ToString();
AnimatorPlayAction val3 = (AnimatorPlayAction)(object)((val2 is AnimatorPlayAction) ? val2 : null);
if (val3 != null)
{
if (hideAnimationTransitions)
{
continue;
}
text2 = "play animation " + val3.StateName + " on '" + ((Object)val3.animator).name + "'";
}
else
{
SetVariableBoolAction val4 = (SetVariableBoolAction)(object)((val2 is SetVariableBoolAction) ? val2 : null);
if (val4 != null && !val4.Multiple)
{
text2 = $"set bool {VariableName((AbstractVariable)(object)val4.targetFlag)} = {val4.TargetValue}";
}
}
if (!((Behaviour)val2).isActiveAndEnabled)
{
text2 = "(disabled) " + text2;
}
text = text + " " + text2 + "\n";
}
text += " Transitions:\n";
AbstractStateTransition[] transitions = val.Transitions;
foreach (AbstractStateTransition val5 in transitions)
{
ReadOnlySpan<char> readOnlySpan = StringExtensions.TrimStartMatches(StringExtensions.TrimStartMatches(((Object)val5).name, (ReadOnlySpan<char>)"[Action] ").ToString(), (ReadOnlySpan<char>)"[Transition] ");
text = text + " " + (val5.IsDefaultTransition ? "default" : "") + " to " + StateName(((Object)val5.target).name) + " (" + readOnlySpan.ToString() + ")\n";
AbstractConditionComp[] array = stateTransitionConditions.Invoke(val5);
foreach (AbstractConditionComp val6 in array)
{
string text3 = StringExtensions.TrimStartMatches(((Object)val6).name, (ReadOnlySpan<char>)"[Condition] ").ToString();
FlagBoolCondition val7 = (FlagBoolCondition)(object)((val6 is FlagBoolCondition) ? val6 : null);
if (val7 != null)
{
text3 = $"bool flag {VariableName((AbstractVariable)(object)val7.flagBool)} current {val7.flagBool.FlagValue}";
}
if (val6.FinalResultInverted)
{
text3 = "!" + text3;
}
text = text + " " + text3 + "\n";
}
}
}
return text;
}
public void OnGui()
{
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: 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_00d4: Expected O, but got Unknown
try
{
text = "";
foreach (GameObject item in ObjectsToDisplay)
{
text += ((item != null) ? ((Object)item).name : null);
text += "\n";
text += InspectFSM(item);
text += "\n";
}
}
catch (Exception ex)
{
ToastManager.Toast((object)ex);
}
if (style == null)
{
style = new GUIStyle(GUI.skin.label)
{
fontSize = 20
};
}
GUI.Label(new Rect(8f, 8f, 6000f, 1000f), text, style);
}
}
public record GhostFrame(Vector3 Position, string SpriteName, int Facing)
{
[CompilerGenerated]
protected virtual bool PrintMembers(StringBuilder builder)
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
RuntimeHelpers.EnsureSufficientExecutionStack();
builder.Append("Position = ");
Vector3 position = Position;
builder.Append(((object)(Vector3)(ref position)).ToString());
builder.Append(", SpriteName = ");
builder.Append((object?)SpriteName);
builder.Append(", Facing = ");
builder.Append(Facing.ToString());
return true;
}
}
internal class GhostPlayback
{
public SpriteRenderer PlayerCopy;
public GhostFrame[] Frames;
public int PlaybackIndex;
}
public class GhostModule
{
private Dictionary<string, Sprite> playerSprites = new Dictionary<string, Sprite>();
private bool recording = false;
private List<GhostFrame> recordingFrames = new List<GhostFrame>();
private List<GhostPlayback> playbacks = new List<GhostPlayback>();
public GhostFrame[] CurrentRecording => recordingFrames.ToArray();
public void StartRecording()
{
recordingFrames.Clear();
recording = true;
}
public void StopRecording()
{
recording = false;
}
public void ToggleRecording()
{
if (recording)
{
StopRecording();
}
else
{
StartRecording();
}
}
public void Playback(GhostFrame[] frames)
{
Player i = Player.i;
SpriteRenderer component = Object.Instantiate<GameObject>(((Component)i.PlayerSprite).gameObject).GetComponent<SpriteRenderer>();
Object.DontDestroyOnLoad((Object)(object)component);
playbacks.Add(new GhostPlayback
{
PlayerCopy = component,
PlaybackIndex = 0,
Frames = frames
});
}
private void UpdateRecord()
{
//IL_0022: 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)
//IL_0042: Expected I4, but got Unknown
Player i = Player.i;
if (Object.op_Implicit((Object)(object)i))
{
recordingFrames.Add(new GhostFrame(((Component)i).transform.position, ((Object)i.PlayerSprite.sprite).name, (int)((Actor)i).Facing));
}
}
private void UpdatePlayback(GhostPlayback playback, GhostFrame ghostFrame)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: 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_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
((Component)playback.PlayerCopy).transform.position = ghostFrame.Position + Vector3.down * 3.5f;
playerSprites.TryGetValue(ghostFrame.SpriteName, out var value);
playback.PlayerCopy.sprite = value;
((Component)playback.PlayerCopy).transform.localScale = new Vector3((float)ghostFrame.Facing, 1f, 1f);
}
public void LateUpdate()
{
if (recording)
{
UpdateRecord();
}
for (int num = playbacks.Count - 1; num >= 0; num--)
{
GhostPlayback ghostPlayback = playbacks[num];
if (ghostPlayback.PlaybackIndex < ghostPlayback.Frames.Length)
{
UpdatePlayback(ghostPlayback, ghostPlayback.Frames[ghostPlayback.PlaybackIndex]);
ghostPlayback.PlaybackIndex++;
}
else
{
Object.Destroy((Object)(object)ghostPlayback.PlayerCopy);
playbacks.RemoveAt(num);
}
}
Player i = Player.i;
if (i != null)
{
Sprite sprite = i.PlayerSprite.sprite;
string name = ((Object)sprite).name;
playerSprites.TryAdd(name, sprite);
}
}
public void Unload()
{
playbacks.ForEach(delegate(GhostPlayback playback)
{
Object.Destroy((Object)(object)playback.PlayerCopy);
});
playbacks.Clear();
}
}
public class InfotextModule
{
private static bool infotextActive;
private TMP_Text debugCanvasInfoText;
private FieldRef<Player, float> groundJumpReferenceY = AccessTools.FieldRefAccess<Player, float>("GroundJumpRefrenceY");
public InfotextModule()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_0072: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("Info Text");
val.transform.SetParent(((Component)NineSolsAPICore.FullscreenCanvas).gameObject.transform);
debugCanvasInfoText = (TMP_Text)(object)val.AddComponent<TextMeshProUGUI>();
debugCanvasInfoText.alignment = (TextAlignmentOptions)257;
debugCanvasInfoText.fontSize = 20f;
((Graphic)debugCanvasInfoText).color = Color.white;
RectTransform component = ((Component)debugCanvasInfoText).GetComponent<RectTransform>();
component.anchorMin = new Vector2(0f, 1f);
component.anchorMax = new Vector2(0f, 1f);
component.pivot = new Vector2(0f, 1f);
component.anchoredPosition = new Vector2(10f, -10f);
component.sizeDelta = new Vector2(800f, 0f);
}
[BindableMethod(Name = "Toggle Infotext")]
private static void ToggleFreecam()
{
infotextActive = !infotextActive;
}
public void Update()
{
if (infotextActive)
{
UpdateInfoText();
}
else
{
debugCanvasInfoText.text = "";
}
}
private void UpdateInfoText()
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Invalid comparison between Unknown and I4
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: 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_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_017c: Invalid comparison between Unknown and I4
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
string text = "";
if (!SingletonBehaviour<GameCore>.IsAvailable())
{
text += "not yet available\n";
debugCanvasInfoText.text = text;
return;
}
GameCore instance = SingletonBehaviour<GameCore>.Instance;
if ((int)instance.currentCoreState != 1)
{
string enumName = typeof(GameCoreState).GetEnumName(instance.currentCoreState);
text = text + enumName + "\n";
}
Player player = instance.player;
if (Object.op_Implicit((Object)(object)player))
{
text += $"Pos: {Vector2.op_Implicit(((Component)player).transform.position)}\n";
text += $"Speed: {((Actor)player).FinalVelocity}\n";
text += $"HP: {player.health.CurrentHealthValue} (+{player.health.CurrentInternalInjury})\n";
string enumName2 = typeof(PlayerStateType).GetEnumName(player.fsm.State);
PlayerInputStateType state = player.playerInput.fsm.State;
text = text + enumName2 + " " + (((int)state == 0) ? "" : ((object)(PlayerInputStateType)(ref state)).ToString()) + "\n";
if ((int)player.jumpState > 0)
{
float currentVarJumpTimer = player.currentVarJumpTimer;
text += string.Format("JumpState {0} {1} {2}\n", player.jumpState, (currentVarJumpTimer > 0f) ? currentVarJumpTimer.ToString("0.00") : "", player.IsAirJumping);
}
else
{
text += "\n";
}
List<(bool, string)> source = new List<(bool, string)>(4)
{
(player.isOnWall, "isOnWall"),
(player.isOnLedge, "isOnLedge"),
(player.isOnRope, "isOnRope"),
(player.kicked, "kicked")
};
string text2 = GeneralExtensions.Join<(bool, string)>(source.Where(((bool, string) x) => x.Item1), (Func<(bool, string), string>)(((bool, string) x) => x.Item2), " ");
text = text + text2 + "\n";
}
GameLevel gameLevel = instance.gameLevel;
if (Object.op_Implicit((Object)(object)gameLevel))
{
text += $"[{gameLevel.SceneName}] ({gameLevel.BlockCountX}x{gameLevel.BlockCountY})\n";
}
if (instance.currentCutScene != null)
{
text += $"{instance.currentCutScene}";
}
debugCanvasInfoText.text = text;
}
public void Destroy()
{
Object.Destroy((Object)(object)((Component)debugCanvasInfoText).gameObject);
}
}
public static class MapTeleportModule
{
public static void Update()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
bool forceReloadScene = Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305);
if (Input.GetMouseButtonDown(0) && SingletonBehaviour<UIManager>.IsAvailable())
{
try
{
TeleportToMap(Vector2.op_Implicit(Input.mousePosition), forceReloadScene);
}
catch (Exception arg)
{
ToastManager.Toast((object)$"Could not teleport: {arg}");
}
}
}
private static void TeleportToMap(Vector2 screenPosition, bool forceReloadScene)
{
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: 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_0071: 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)
MapPanelController mapPanelController = SingletonBehaviour<UIManager>.Instance.mapPanelController;
MapPanelController minimap = mapPanelController.completeMapPanel.Minimap;
if (((Behaviour)minimap).isActiveAndEnabled)
{
RectTransform imageMaskRoot = minimap.ImageMaskRoot;
Camera componentInChildren = ((Component)SingletonBehaviour<UIManager>.Instance).gameObject.GetComponentInChildren<Camera>();
Vector2 val = default(Vector2);
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(imageMaskRoot, screenPosition, componentInChildren, ref val))
{
Vector2 imageRatio = val / imageMaskRoot.sizeDelta;
Vector2 worldPosition = minimap.MapData.ImageRatioToWorldPosition(imageRatio);
TeleportTo(worldPosition, minimap.MapData.sceneID, forceReloadScene);
}
}
}
public static void TeleportTo(Vector2 worldPosition, string sceneID, bool forceReloadScene)
{
//IL_0046: 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_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: 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)
SingletonBehaviour<UIManager>.Instance.menuUI.HideMenu();
bool flag = sceneID == SingletonBehaviour<GameCore>.Instance.CurrentSceneName;
if (!flag || forceReloadScene)
{
GoToScene(sceneID, Vector2.op_Implicit(worldPosition), showTip: true);
}
else
{
((Component)Player.i).transform.position = Vector2.op_Implicit(worldPosition);
}
SingletonBehaviour<CameraManager>.Instance.camera2D.MoveCameraInstantlyToPosition(Vector2.op_Implicit(((Component)Player.i).transform.position), false);
}
private static void GoToScene(string sceneName, Vector3 worldPosition, bool showTip = false)
{
//IL_0007: 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_0010: 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_0031: Expected O, but got Unknown
//IL_0034: 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_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
ChangeSceneData val = default(ChangeSceneData);
val.sceneName = sceneName;
val.playerSpawnPosition = (SpawnPositionDelegate)(() => worldPosition);
val.changeSceneMode = (ChangeSceneMode)5;
ChangeSceneData val2 = val;
SingletonBehaviour<GameCore>.Instance.ChangeScene(val2, showTip, false, 0f);
}
}
internal static class Extensions
{
public static Vector2 ImageRatioToWorldPosition(this GameLevelMapData levelData, Vector2 imageRatio)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: 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)
float num = (imageRatio.x - levelData.ImageMapRatioMinX) / (levelData.ImageMapRatioMaxX - levelData.ImageMapRatioMinX);
float num2 = (imageRatio.y - levelData.ImageMapRatioMinY) / (levelData.ImageMapRatioMaxY - levelData.ImageMapRatioMinY);
float num3 = num * (float)levelData.MapWidth + (float)levelData.MapMinX;
float num4 = num2 * (float)levelData.MapHeight + (float)levelData.MapMinY;
return new Vector2(num3, num4);
}
}
[HarmonyPatch]
public class QuantumConsoleModule
{
private bool consoleInitialized;
[HarmonyPatch(typeof(QuantumConsoleProcessor), "LoadCommandsFromType")]
[HarmonyFinalizer]
private static Exception LoadCommandsFromType(Type type, Exception __exception)
{
return null;
}
[HarmonyPatch(typeof(QuantumConsole), "IsSupportedState")]
[HarmonyPrefix]
private static bool IsSupportedState(ref bool __result)
{
__result = true;
return false;
}
public QuantumConsoleModule()
{
QuantumConsoleProcessor.GenerateCommandTable(true, false);
SceneManager.sceneLoaded += OnSceneLoaded;
}
public void Unload()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
private void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode)
{
if (!consoleInitialized && Object.op_Implicit((Object)(object)QuantumConsole.Instance))
{
QuantumConsole.Instance.OnActivate += QuantumConsoleActivate;
QuantumConsole.Instance.OnDeactivate += QuantumConsoleDeactivate;
consoleInitialized = true;
}
}
private void QuantumConsoleActivate()
{
if (SingletonBehaviour<GameCore>.IsAvailable())
{
SingletonBehaviour<GameCore>.Instance.player.playerInput.VoteForState((PlayerInputStateType)7, (MonoBehaviour)(object)QuantumConsole.Instance);
}
}
private void QuantumConsoleDeactivate()
{
if (SingletonBehaviour<GameCore>.IsAvailable())
{
SingletonBehaviour<GameCore>.Instance.player.playerInput.RevokeAllMyVote((MonoBehaviour)(object)QuantumConsole.Instance);
}
}
}
internal class Savestate
{
public string MetaJson;
public byte[] Flags;
public string Scene;
public Vector3 PlayerPosition;
public Vector2 PlayerVelocity;
}
public class SavestateModule
{
[CanBeNull]
private static MethodInfo OldLoadFlagsMethodInfo = typeof(GameFlagManager).GetMethod("LoadFlags");
[CanBeNull]
private static MethodInfo NewLoadFlagsMethodInfo = typeof(GameFlagManager).GetMethod("LoadFlagsFromBinarySave");
[CanBeNull]
private static MethodInfo FlagsToBinary = typeof(GameFlagManager).GetMethod("FlagsToBinary");
public static bool IsLoadingSavestate = false;
private Dictionary<string, Savestate> savestates = new Dictionary<string, Savestate>();
public event EventHandler SavestateLoaded;
public event EventHandler SavestateCreated;
[BindableMethod(Name = "Create Savestate")]
private static void CreateSavestateMethod()
{
SavestateModule savestateModule = DebugMod.Instance.SavestateModule;
savestateModule.CreateSavestate("0");
ToastManager.Toast((object)"Savestate '0' created");
}
[BindableMethod(Name = "Load Savestate")]
private static void LoadSavestateMethod()
{
SavestateModule savestateModule = DebugMod.Instance.SavestateModule;
if (!savestateModule.savestates.TryGetValue("0", out var value))
{
ToastManager.Toast((object)"Savestate '0' not found");
return;
}
try
{
savestateModule.LoadSavestate(value);
}
catch (Exception ex)
{
ToastManager.Toast((object)ex);
}
}
[BindableMethod(Name = "Load Savestate\n(No reload)")]
private static void LoadSavestateMethodNoReload()
{
SavestateModule savestateModule = DebugMod.Instance.SavestateModule;
if (!savestateModule.savestates.TryGetValue("0", out var value))
{
ToastManager.Toast((object)"Savestate '0' not found");
return;
}
try
{
savestateModule.LoadSavestateNoReload(value);
}
catch (Exception ex)
{
ToastManager.Toast((object)ex);
}
}
private void CreateSavestate(string slot)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: 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_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
SaveManager instance = SingletonBehaviour<SaveManager>.Instance;
GameCore instance2 = SingletonBehaviour<GameCore>.Instance;
Player i = Player.i;
Vector3 position = ((Component)i).transform.position;
Vector2 velocity = ((PhysicsMover)i).Velocity;
SaveSlotMetaData val = instance2.playerGameData.SaveMetaData();
string metaJson = JsonUtility.ToJson((object)val);
byte[] flags = ((OldLoadFlagsMethodInfo != null) ? Encoding.UTF8.GetBytes(GameFlagManager.FlagsToJson(instance.allFlags)) : ((byte[])FlagsToBinary.Invoke(null, new object[1] { instance.allFlags })));
Savestate obj = new Savestate
{
MetaJson = metaJson,
Flags = flags
};
Scene scene = ((Component)instance2.gameLevel).gameObject.scene;
obj.Scene = ((Scene)(ref scene)).name;
obj.PlayerPosition = position;
obj.PlayerVelocity = velocity;
Savestate value = obj;
savestates[slot] = value;
this.SavestateCreated?.Invoke(this, EventArgs.Empty);
}
private void LoadFlags(Savestate savestate)
{
GameFlagCollection allFlags = SingletonBehaviour<SaveManager>.Instance.allFlags;
if (OldLoadFlagsMethodInfo != null)
{
OldLoadFlagsMethodInfo.Invoke(null, new object[3]
{
Encoding.UTF8.GetString(savestate.Flags),
allFlags,
(object)(TestMode)0
});
}
else if (NewLoadFlagsMethodInfo == null)
{
Log.Error("LoadFlagsFromBinarySave doesn't exist");
}
else
{
NewLoadFlagsMethodInfo.Invoke(null, new object[3]
{
savestate.Flags,
allFlags,
(object)(TestMode)0
});
}
}
private void LoadSavestate(Savestate savestate)
{
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: 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_0072: 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_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Expected O, but got Unknown
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
IsLoadingSavestate = true;
SaveManager instance = SingletonBehaviour<SaveManager>.Instance;
LoadFlags(savestate);
instance.allFlags.AllFlagInitStartAndEquip();
Vector3 currentPos = savestate.PlayerPosition;
SingletonBehaviour<GameCore>.Instance.ChangeScene(new ChangeSceneData
{
sceneName = savestate.Scene,
panData =
{
panType = (CameraPanType)0
},
panData =
{
fromPosition = currentPos
},
playerSpawnPosition = (SpawnPositionDelegate)(() => currentPos),
ChangedDoneEvent = delegate
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
((PhysicsMover)Player.i).Velocity = savestate.PlayerVelocity;
OnSavestateLoaded();
}
}, false, false, 0f);
ToastManager.Toast((object)"Savestate loaded");
IsLoadingSavestate = false;
}
private void LoadSavestateNoReload(Savestate savestate)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
IsLoadingSavestate = true;
SaveManager instance = SingletonBehaviour<SaveManager>.Instance;
LoadFlags(savestate);
instance.allFlags.AllFlagInitStartAndEquip();
SingletonBehaviour<GameCore>.Instance.ResetLevel(false);
MapTeleportModule.TeleportTo(Vector2.op_Implicit(savestate.PlayerPosition), savestate.Scene, forceReloadScene: false);
((PhysicsMover)Player.i).Velocity = savestate.PlayerVelocity;
OnSavestateLoaded();
ToastManager.Toast((object)"Savestate loaded");
IsLoadingSavestate = false;
}
private void OnSavestateLoaded()
{
this.SavestateLoaded?.Invoke(this, EventArgs.Empty);
}
public void Unload()
{
savestates = new Dictionary<string, Savestate>();
}
}
internal enum TimerMode
{
AfterSavestate,
NextRoom
}
internal enum SpeedrunTimerState
{
Inactive,
Running,
StartNextRoom
}
[HarmonyPatch]
public class SpeedrunTimerModule
{
private static bool isLoading;
private const bool EnableGhost = false;
private GUIStyle? style;
private float segmentStartTime = 0f;
private float time = 0f;
private string? startRoom = null;
private TimerMode timerMode = TimerMode.AfterSavestate;
private SpeedrunTimerState state = SpeedrunTimerState.Inactive;
private (Vector2, string)? endpoint = null;
private bool done = false;
private List<(string, float, GhostFrame[]?)>? lastSegments = null;
private List<(string, float, GhostFrame[]?)> currentSegments = new List<(string, float, GhostFrame[])>();
private float? lastTimeDelta;
private Sprite? endpointSprite;
private GameObject? endpointObject;
private GhostModule GhostModule => DebugMod.Instance.GhostModule;
[HarmonyPatch(typeof(GameCore), "InitializeGameLevel")]
[HarmonyPostfix]
private static void InitializeGameLevel()
{
isLoading = false;
SpeedrunTimerModule speedrunTimerModule = DebugMod.Instance.SpeedrunTimerModule;
if (speedrunTimerModule.startRoom != SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName)
{
speedrunTimerModule.OnLevelChangeDone();
}
speedrunTimerModule.SpawnEndpointTexture();
}
[HarmonyPatch(typeof(GameCore), "ChangeScene", new Type[]
{
typeof(ChangeSceneData),
typeof(bool),
typeof(bool)
})]
[HarmonyPostfix]
private static void ChangeScene()
{
isLoading = true;
SpeedrunTimerModule speedrunTimerModule = DebugMod.Instance.SpeedrunTimerModule;
speedrunTimerModule.OnLevelChange();
}
private void OnLevelChange()
{
EndSegment();
}
private void OnLevelChangeDone()
{
SegmentBegin();
if (state == SpeedrunTimerState.StartNextRoom && startRoom != SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName)
{
state = SpeedrunTimerState.Running;
}
}
private void EndSegment()
{
if (state != SpeedrunTimerState.Running)
{
return;
}
float num = time - segmentStartTime;
segmentStartTime = time;
Log.Info($"Ending segment of {num:0.00}s {lastSegments?.Count}");
GhostFrame[] item = null;
bool flag = false;
currentSegments.Add((SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName, num, item));
if (lastSegments == null)
{
return;
}
int num2 = 0;
float? num3 = null;
float? num4 = null;
while (true)
{
Log.Info(string.Format("{0} curr {1} last {2}", num2, currentSegments.Count, (lastSegments != null) ? lastSegments.Count.ToString() : "null"));
if (num2 >= currentSegments.Count)
{
lastTimeDelta = num4 - num3;
Log.Info($"lasttiemdelta of {lastTimeDelta:0.00}s");
break;
}
if (num2 >= lastSegments.Count)
{
break;
}
(string, float, GhostFrame[]) tuple = lastSegments[num2];
float? num5 = tuple.Item2;
string item2 = tuple.Item1;
num3 = num5;
tuple = currentSegments[num2];
float? num6 = tuple.Item2;
string item3 = tuple.Item1;
num4 = num6;
if (item2 != item3)
{
break;
}
num2++;
}
}
private (string, float, GhostFrame[]?)? GetMatchingLastSegment()
{
if (lastSegments == null)
{
return null;
}
(string, float, GhostFrame[])? tuple = null;
int num = 0;
while (true)
{
if (num >= lastSegments.Count)
{
return null;
}
tuple = lastSegments[num];
if (num >= currentSegments.Count)
{
break;
}
num++;
}
return tuple;
}
private void SegmentBegin()
{
segmentStartTime = time;
bool flag = false;
bool flag2 = false;
}
public void OnSavestateCreated()
{
state = SpeedrunTimerState.Inactive;
done = false;
currentSegments = new List<(string, float, GhostFrame[])>();
lastSegments = null;
lastTimeDelta = null;
segmentStartTime = 0f;
}
public void OnSavestateLoaded()
{
time = 0f;
segmentStartTime = 0f;
done = false;
currentSegments = new List<(string, float, GhostFrame[])>();
lastTimeDelta = null;
startRoom = SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName;
TimerMode timerMode = this.timerMode;
if (1 == 0)
{
}
SpeedrunTimerState speedrunTimerState = timerMode switch
{
TimerMode.AfterSavestate => SpeedrunTimerState.Running,
TimerMode.NextRoom => SpeedrunTimerState.StartNextRoom,
_ => throw new ArgumentOutOfRangeException(),
};
if (1 == 0)
{
}
state = speedrunTimerState;
SegmentBegin();
}
private void SpawnEndpointTexture()
{
//IL_001a: 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_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: 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_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Expected O, but got Unknown
//IL_016f: 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)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
(Vector2, string)? tuple = endpoint;
if (!tuple.HasValue)
{
return;
}
var (val, text) = tuple.GetValueOrDefault();
if (1 == 0 || SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName != text)
{
return;
}
if ((Object)(object)endpointSprite == (Object)null)
{
Texture2D val2 = Resources.LoadAll<Texture2D>("/").First((Texture2D t) => ((Object)t).name == "checkmark");
endpointSprite = Sprite.CreateSprite(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0f), 16f, 0u, (SpriteMeshType)0, Vector4.zero, false, Array.Empty<SecondarySpriteTexture>());
}
if (Object.op_Implicit((Object)(object)endpointObject))
{
Object.Destroy((Object)(object)endpointObject);
}
GameObject val3 = new GameObject("flag");
val3.transform.position = Vector2.op_Implicit(val);
endpointObject = val3;
SpriteRenderer val4 = endpointObject.AddComponent<SpriteRenderer>();
val4.sprite = endpointSprite;
((Renderer)val4).material.shader = Shader.Find("GUI/Text Shader");
((Renderer)val4).material.color = new Color(0.8f, 0.2f, 1f, 1f);
}
public void SetEndpoint()
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: 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_0023: Unknown result type (might be due to invalid IL or missing references)
Vector3 position = ((Component)Player.i).transform.position;
string sceneName = SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName;
endpoint = (Vector2.op_Implicit(position), sceneName);
SpawnEndpointTexture();
}
private void EndpointReached()
{
if (state == SpeedrunTimerState.Running)
{
EndSegment();
done = true;
state = SpeedrunTimerState.Inactive;
lastSegments = currentSegments;
ToastManager.Toast((object)$"endpoint reached with {currentSegments.Count}");
currentSegments = new List<(string, float, GhostFrame[])>();
}
}
public void CycleTimerMode()
{
timerMode = (TimerMode)((int)(timerMode + 1) % 2);
ToastManager.Toast((object)timerMode);
}
public void LateUpdate()
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: 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)
if (state == SpeedrunTimerState.Inactive)
{
return;
}
try
{
if (state == SpeedrunTimerState.Running && !isLoading)
{
time += RCGTime.deltaTime;
}
(Vector2, string)? tuple = endpoint;
if (!tuple.HasValue)
{
return;
}
var (val, text) = tuple.GetValueOrDefault();
if (text == SingletonBehaviour<GameCore>.Instance.gameLevel.SceneName)
{
float num = Vector2.Distance(Vector2.op_Implicit(((Component)Player.i).transform.position), val);
if (num < 20f)
{
EndpointReached();
}
}
}
catch (Exception arg)
{
Log.Error($"Error during speedruntime LateUpdate: {arg}");
}
}
public void OnGui()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: 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_004b: Expected O, but got Unknown
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
if (done || state != 0)
{
if (style == null)
{
style = new GUIStyle(GUI.skin.label)
{
fontStyle = (FontStyle)1,
fontSize = 30
};
}
string text = string.Format("{0}{1:0.0}s", done ? "Done in " : "", time);
float? num = lastTimeDelta;
if (num.HasValue)
{
string text2 = string.Format("{0}{1:0.0}s", (lastTimeDelta > 0f) ? "+" : "", lastTimeDelta);
text = text + "\nCompared to last: " + text2;
}
GUI.Label(new Rect(8f, 8f, 600f, 100f), text, style);
}
}
public void Destroy()
{
if (Object.op_Implicit((Object)(object)endpointObject))
{
Object.Destroy((Object)(object)endpointObject);
}
}
}
public class TimeModule
{
[BindableMethod(Name = "Toggle Fastforward")]
private static void OnFastForwardChange()
{
RCGTime.GlobalSimulationSpeed = ((RCGTime.GlobalSimulationSpeed != 1f) ? 1 : 2);
}
[BindableMethod(Name = "Play/Pause")]
private static void PlayPause()
{
RCGTime.GlobalSimulationSpeed = ((RCGTime.GlobalSimulationSpeed == 0f) ? 1 : 0);
}
[BindableMethod(Name = "Advance Frame")]
private static void FrameAdvance()
{
RCGTime.GlobalSimulationSpeed = 0f;
((MonoBehaviour)DebugMod.Instance).StartCoroutine(AdvanceFrameCoro());
}
private static IEnumerator AdvanceFrameCoro()
{
RCGTime.GlobalSimulationSpeed = 1f;
yield return null;
RCGTime.GlobalSimulationSpeed = 0f;
}
}
}
namespace DebugMod.Modules.Hitbox
{
public static class Drawing
{
private static Texture2D aaLineTex;
private static Texture2D lineTex;
private static Material blitMaterial;
private static Material blendMaterial;
private static Rect lineRect;
public static void DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width, bool antiAlias)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: 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_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: 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_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: 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)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
float num = pointB.x - pointA.x;
float num2 = pointB.y - pointA.y;
float num3 = Mathf.Sqrt(num * num + num2 * num2);
if (!(num3 < 0.001f))
{
Texture2D val;
Material val2;
if (antiAlias)
{
width *= 3f;
val = aaLineTex;
val2 = blendMaterial;
}
else
{
val = lineTex;
val2 = blitMaterial;
}
float num4 = width * num2 / num3;
float num5 = width * num / num3;
Matrix4x4 identity = Matrix4x4.identity;
identity.m00 = num;
identity.m01 = 0f - num4;
identity.m03 = pointA.x + 0.5f * num4;
identity.m10 = num2;
identity.m11 = num5;
identity.m13 = pointA.y - 0.5f * num5;
GL.PushMatrix();
GL.MultMatrix(identity);
Graphics.DrawTexture(lineRect, (Texture)(object)val, lineRect, 0, 0, 0, 0, color, val2);
if (antiAlias)
{
Graphics.DrawTexture(lineRect, (Texture)(object)val, lineRect, 0, 0, 0, 0, color, val2);
}
GL.PopMatrix();
}
}
public static void DrawCircle(Vector2 center, int radius, Color color, float width, int segmentsPerQuarter)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
DrawCircle(center, radius, color, width, antiAlias: false, segmentsPerQuarter);
}
public static void DrawCircle(Vector2 center, int radius, Color color, float width, bool antiAlias, int segmentsPerQuarter)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: 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_002a: 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_0042: 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_005b: 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_0071: 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)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: 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_00b6: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: 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_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: 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_0128: 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_0136: 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_013a: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: 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_014a: 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_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_015e: 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_0161: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
float num = (float)radius * 0.55191505f;
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor(center.x, center.y - (float)radius);
Vector2 endTangent = default(Vector2);
((Vector2)(ref endTangent))..ctor(center.x - num, center.y - (float)radius);
Vector2 startTangent = default(Vector2);
((Vector2)(ref startTangent))..ctor(center.x + num, center.y - (float)radius);
Vector2 val2 = default(Vector2);
((Vector2)(ref val2))..ctor(center.x + (float)radius, center.y);
Vector2 endTangent2 = default(Vector2);
((Vector2)(ref endTangent2))..ctor(center.x + (float)radius, center.y - num);
Vector2 startTangent2 = default(Vector2);
((Vector2)(ref startTangent2))..ctor(center.x + (float)radius, center.y + num);
Vector2 val3 = default(Vector2);
((Vector2)(ref val3))..ctor(center.x, center.y + (float)radius);
Vector2 startTangent3 = default(Vector2);
((Vector2)(ref startTangent3))..ctor(center.x - num, center.y + (float)radius);
Vector2 endTangent3 = default(Vector2);
((Vector2)(ref endTangent3))..ctor(center.x + num, center.y + (float)radius);
Vector2 val4 = default(Vector2);
((Vector2)(ref val4))..ctor(center.x - (float)radius, center.y);
Vector2 startTangent4 = default(Vector2);
((Vector2)(ref startTangent4))..ctor(center.x - (float)radius, center.y - num);
Vector2 endTangent4 = default(Vector2);
((Vector2)(ref endTangent4))..ctor(center.x - (float)radius, center.y + num);
DrawBezierLine(val, startTangent, val2, endTangent2, color, width, antiAlias, segmentsPerQuarter);
DrawBezierLine(val2, startTangent2, val3, endTangent3, color, width, antiAlias, segmentsPerQuarter);
DrawBezierLine(val3, startTangent3, val4, endTangent4, color, width, antiAlias, segmentsPerQuarter);
DrawBezierLine(val4, startTangent4, val, endTangent, color, width, antiAlias, segmentsPerQuarter);
}
public static void DrawBezierLine(Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color color, float width, bool antiAlias, int segments)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: 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_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: 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_0018: 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_0024: 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_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_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
Vector2 pointA = CubeBezier(start, startTangent, end, endTangent, 0f);
for (int i = 1; i < segments + 1; i++)
{
Vector2 val = CubeBezier(start, startTangent, end, endTangent, (float)i / (float)segments);
DrawLine(pointA, val, color, width, antiAlias);
pointA = val;
}
}
private static Vector2 CubeBezier(Vector2 s, Vector2 st, Vector2 e, Vector2 et, float t)
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: 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_0027: 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_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: 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_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
float num = 1f - t;
return num * num * num * s + 3f * num * num * t * st + 3f * num * t * t * et + t * t * t * e;
}
static Drawing()
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
aaLineTex = null;
lineTex = null;
blitMaterial = null;
blendMaterial = null;
lineRect = new Rect(0f, 0f, 1f, 1f);
Initialize();
}
private static void Initialize()
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Expected O, but got Unknown
//IL_0026: 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_00ec: Expected O, but got Unknown
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Expected O, but got Unknown
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: 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)
if ((Object)(object)lineTex == (Object)null)
{
lineTex = new Texture2D(1, 1, (TextureFormat)5, false);
lineTex.SetPixel(0, 1, Color.white);
lineTex.Apply();
}
if ((Object)(object)aaLineTex == (Object)null)
{
aaLineTex = new Texture2D(1, 3, (TextureFormat)5, false);
aaLineTex.SetPixel(0, 0, new Color(1f, 1f, 1f, 0f));
aaLineTex.SetPixel(0, 1, Color.white);
aaLineTex.SetPixel(0, 2, new Color(1f, 1f, 1f, 0f));
aaLineTex.Apply();
}
blitMaterial = (Material)typeof(GUI).GetMethod("get_blitMaterial", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
blendMaterial = (Material)typeof(GUI).GetMethod("get_blendMaterial", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
}
}
public class HitboxModule
{
private static bool hitboxesVisible;
private HitboxRender hitboxRender;
[BindableMethod(/*Could not decode attribute arguments.*/)]
private static void ToggleHitboxes()
{
hitboxesVisible = !hitboxesVisible;
if (hitboxesVisible)
{
DebugMod.Instance.HitboxModule.Load();
}
else
{
DebugMod.Instance.HitboxModule.Unload();
}
}
public void Load()
{
Unload();
SceneManager.activeSceneChanged += CreateHitboxRender;
CreateHitboxRender();
}
public void Unload()
{
SceneManager.activeSceneChanged -= CreateHitboxRender;
DestroyHitboxRender();
}
private void CreateHitboxRender(Scene current, Scene next)
{
CreateHitboxRender();
}
private void CreateHitboxRender()
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
DestroyHitboxRender();
hitboxRender = new GameObject().AddComponent<HitboxRender>();
}
private void DestroyHitboxRender()
{
if ((Object)(object)hitboxRender != (Object)null)
{
Object.Destroy((Object)(object)hitboxRender);
hitboxRender = null;
}
}
private void UpdateHitboxRender(GameObject go)
{
if ((Object)(object)hitboxRender != (Object)null)
{
hitboxRender.UpdateHitbox(go);
}
}
}
public class HitboxRender : MonoBehaviour
{
private struct HitboxType : IComparable<HitboxType>
{
public static readonly HitboxType Player = new HitboxType(Color.yellow, 0);
public static readonly HitboxType Enemy = new HitboxType(new Color(0.8f, 0f, 0f), 1);
public static readonly HitboxType PathFindAgent = new HitboxType(Color.cyan, 2);
public static readonly HitboxType Terrain = new HitboxType(new Color(0f, 0.8f, 0f), 3);
public static readonly HitboxType Trigger = new HitboxType(new Color(0.5f, 0.5f, 1f), 4);
public static readonly HitboxType EffectReceiver = new HitboxType(new Color(1f, 0.75f, 0.8f), 5);
public static readonly HitboxType Trap = new HitboxType(new Color(0f, 0f, 0.5f), 6);
public static readonly HitboxType AttackSensor = new HitboxType(new Color(0.5f, 0f, 0.5f), 7);
public static readonly HitboxType AkGameObj = new HitboxType(new Color(0.8f, 0.8f, 0.5f), 8);
public static readonly HitboxType MonsterPushAway = new HitboxType(new Color(0.9f, 0.3f, 0.4f), 9);
public static readonly HitboxType PathFindTarget = new HitboxType(new Color(0.3f, 0.6f, 0.8f), 10);
public static readonly HitboxType EffectDealer = new HitboxType(new Color(0.5f, 0.15f, 0.8f), 11);
public static readonly HitboxType PlayerSensor = new HitboxType(new Color(0.5f, 0.95f, 0.3f), 12);
public static readonly HitboxType ActorSensor = new HitboxType(new Color(0.1f, 0.95f, 0.3f), 13);
public static readonly HitboxType GeneralFindable = new HitboxType(new Color(0.8f, 0.15f, 0.3f), 14);
public static readonly HitboxType ChangeSceneTrigger = new HitboxType(new Color(0.8f, 0.85f, 0.3f), 15);
public static readonly HitboxType Finder = new HitboxType(new Color(0.8f, 0.85f, 0.8f), 16);
public static readonly HitboxType Interactable = new HitboxType(new Color(0.8f, 0.25f, 0.8f), 17);
public static readonly HitboxType Other = new HitboxType(new Color(0.9f, 0.6f, 0.4f), 18);
public readonly Color Color;
public readonly int Depth;
private HitboxType(Color color, int depth)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
Color = color;
Depth = depth;
}
public int CompareTo(HitboxType other)
{
return other.Depth.CompareTo(Depth);
}
}
private readonly SortedDictionary<HitboxType, HashSet<Collider2D>> colliders = new SortedDictionary<HitboxType, HashSet<Collider2D>>
{
{
HitboxType.ActorSensor,
new HashSet<Collider2D>()
},
{
HitboxType.AkGameObj,
new HashSet<Collider2D>()
},
{
HitboxType.AttackSensor,
new HashSet<Collider2D>()
},
{
HitboxType.ChangeSceneTrigger,
new HashSet<Collider2D>()
},
{
HitboxType.EffectDealer,
new HashSet<Collider2D>()
},
{
HitboxType.EffectReceiver,
new HashSet<Collider2D>()
},
{
HitboxType.Enemy,
new HashSet<Collider2D>()
},
{
HitboxType.GeneralFindable,
new HashSet<Collider2D>()
},
{
HitboxType.MonsterPushAway,
new HashSet<Collider2D>()
},
{
HitboxType.Other,
new HashSet<Collider2D>()
},
{
HitboxType.PathFindAgent,
new HashSet<Collider2D>()
},
{
HitboxType.PathFindTarget,
new HashSet<Collider2D>()
},
{
HitboxType.Player,
new HashSet<Collider2D>()
},
{
HitboxType.PlayerSensor,
new HashSet<Collider2D>()
},
{
HitboxType.Terrain,
new HashSet<Collider2D>()
},
{
HitboxType.Trap,
new HashSet<Collider2D>()
},
{
HitboxType.Trigger,
new HashSet<Collider2D>()
},
{
HitboxType.Interactable,
new HashSet<Collider2D>()
},
{
HitboxType.Finder,
new HashSet<Collider2D>()
}
};
public static float LineWidth => Math.Max(0.7f, (float)Screen.width / 2000f);
private void Start()
{
try
{
Collider2D[] array = Resources.FindObjectsOfTypeAll<Collider2D>();
foreach (Collider2D collider2D in array)
{
TryAddHitboxes(collider2D);
}
}
catch (Exception ex)
{
ToastManager.Toast((object)ex.ToString());
}
}
public void UpdateHitbox(GameObject go)
{
Collider2D[] componentsInChildren = go.GetComponentsInChildren<Collider2D>(true);
foreach (Collider2D collider2D in componentsInChildren)
{
TryAddHitboxes(collider2D);
}
}
private Vector2 LocalToScreenPoint(Camera camera, Collider2D collider2D, Vector2 point)
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: 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_0014: 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_001e: Unknown result type (might be due to invalid IL or missing references)
//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_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: 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_0056: 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_005e: Unknown result type (might be due to invalid IL or missing references)
Vector2 val = Vector2.op_Implicit(camera.WorldToScreenPoint(Vector2.op_Implicit(Vector2.op_Implicit(((Component)collider2D).transform.TransformPoint(Vector2.op_Implicit(point + collider2D.offset))))));
return new Vector2((float)(int)Math.Round(val.x), (float)(int)Math.Round((float)Screen.height - val.y));
}
private void TryAddHitboxes(Collider2D collider2D)
{
if (!((Object)(object)collider2D == (Object)null) && ((collider2D is BoxCollider2D || collider2D is PolygonCollider2D || collider2D is EdgeCollider2D || collider2D is CircleCollider2D) ? true : false))
{
GameObject gameObject = ((Component)collider2D).gameObject;
if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<MonsterPushAway>()))
{
colliders[HitboxType.MonsterPushAway].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<Trap>()))
{
colliders[HitboxType.Trap].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<DamageDealer>()))
{
colliders[HitboxType.Enemy].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<TriggerDetector>()))
{
colliders[HitboxType.Trigger].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<AttackSensor>()))
{
colliders[HitboxType.AttackSensor].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<AkGameObj>()))
{
colliders[HitboxType.AkGameObj].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<PathArea>()))
{
colliders[HitboxType.Terrain].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<EffectReceiver>()))
{
colliders[HitboxType.EffectReceiver].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<EffectDealer>()))
{
colliders[HitboxType.EffectDealer].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<PathFindAgent>()))
{
colliders[HitboxType.PathFindAgent].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<PlayerSensor>()))
{
colliders[HitboxType.PlayerSensor].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<ActorSensor>()))
{
colliders[HitboxType.ActorSensor].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<PathFindTarget>()))
{
colliders[HitboxType.PathFindTarget].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<GeneralFindable>()))
{
colliders[HitboxType.GeneralFindable].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<ChangeSceneTrigger>()))
{
colliders[HitboxType.ChangeSceneTrigger].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<Player>()))
{
colliders[HitboxType.Player].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<HookableFinder>()))
{
colliders[HitboxType.Finder].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<GeneralFinder>()))
{
colliders[HitboxType.Finder].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<ItemPicker>()))
{
colliders[HitboxType.Player].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<InteractableArea>()))
{
colliders[HitboxType.Interactable].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<InteractableFinder>()))
{
colliders[HitboxType.Interactable].Add(collider2D);
}
else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponent<Health>()))
{
colliders[HitboxType.Player].Add(collider2D);
}
else if (gameObject.GetComponents<object>().Length != 0)
{
colliders[HitboxType.Other].Add(collider2D);
}
}
}
private void OnGUI()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Invalid comparison between Unknown and I4
Event current = Event.current;
if (current == null || (int)current.type != 7 || !SingletonBehaviour<GameCore>.IsAvailable())
{
return;
}
GUI.depth = int.MaxValue;
Camera sceneCamera = SingletonBehaviour<GameCore>.Instance.gameLevel.sceneCamera;
float lineWidth = LineWidth;
foreach (KeyValuePair<HitboxType, HashSet<Collider2D>> collider in colliders)
{
foreach (Collider2D item in collider.Value)
{
DrawHitbox(sceneCamera, item, collider.Key, lineWidth);
}
}
}
private void DrawHitbox(Camera camera, Collider2D collider2D, HitboxType hitboxType, float lineWidth)
{
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
//IL_01de: 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_01e2: 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)
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: 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_00d7: 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_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_016d: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)collider2D == (Object)null || !((Behaviour)collider2D).isActiveAndEnabled)
{
return;
}
int depth = GUI.depth;
GUI.depth = hitboxType.Depth;
if ((collider2D is BoxCollider2D || collider2D is EdgeCollider2D || collider2D is PolygonCollider2D) ? true : false)
{
BoxCollider2D val = (BoxCollider2D)(object)((collider2D is BoxCollider2D) ? collider2D : null);
if (val == null)
{
EdgeCollider2D val2 = (EdgeCollider2D)(object)((collider2D is EdgeCollider2D) ? collider2D : null);
if (val2 == null)
{
PolygonCollider2D val3 = (PolygonCollider2D)(object)((collider2D is PolygonCollider2D) ? collider2D : null);
if (val3 != null)
{
for (int i = 0; i < val3.pathCount; i++)
{
List<Vector2> list = new List<Vector2>(val3.GetPath(i));
if (list.Count > 0)
{
list.Add(list[0]);
}
DrawPointSequence(list, camera, collider2D, hitboxType, lineWidth);
}
}
}
else
{
DrawPointSequence(new List<Vector2>(val2.points), camera, collider2D, hitboxType, lineWidth);
}
}
else
{
Vector2 val4 = val.size / 2f;
Vector2 item = default(Vector2);
((Vector2)(ref item))..ctor(0f - val4.x, val4.y);
Vector2 item2 = val4;
Vector2 item3 = default(Vector2);
((Vector2)(ref item3))..ctor(val4.x, 0f - val4.y);
Vector2 item4 = -val4;
List<Vector2> points = new List<Vector2> { item, item2, item3, item4, item };
DrawPointSequence(points, camera, collider2D, hitboxType, lineWidth);
}
}
else
{
CircleCollider2D val5 = (CircleCollider2D)(object)((collider2D is CircleCollider2D) ? collider2D : null);
if (val5 != null)
{
Vector2 val6 = LocalToScreenPoint(camera, collider2D, Vector2.zero);
Vector2 val7 = LocalToScreenPoint(camera, collider2D, Vector2.right * val5.radius);
int num = (int)Math.Round(Vector2.Distance(val6, val7));
Drawing.DrawCircle(val6, num, hitboxType.Color, lineWidth, antiAlias: true, Mathf.Clamp(num / 16, 4, 32));
}
}
GUI.depth = depth;
}
private void DrawPointSequence(List<Vector2> points, Camera camera, Collider2D collider2D, HitboxType hitboxType, float lineWidth)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//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_0027: 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_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
for (int i = 0; i < points.Count - 1; i++)
{
Vector2 pointA = LocalToScreenPoint(camera, collider2D, points[i]);
Vector2 pointB = LocalToScreenPoint(camera, collider2D, points[i + 1]);
Drawing.DrawLine(pointA, pointB, hitboxType.Color, lineWidth, antiAlias: true);
}
}
}
}