using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EdgeDetection.Components;
using EdgeDetection.Menu;
using EdgeDetection.Structs;
using GlobalEnums;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Silksong.ModMenu.Elements;
using Silksong.ModMenu.Models;
using Silksong.ModMenu.Plugin;
using Silksong.ModMenu.Screens;
using TeamCherry.Localization;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("EdgeDetection")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+508c21dc30c48e3b3c9ee9197167f1766083a796")]
[assembly: AssemblyProduct("EdgeDetection")]
[assembly: AssemblyTitle("EdgeDetection")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/kaycodes13/Silksong.EdgeDetection")]
[assembly: NeutralResourcesLanguage("EN")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[CompilerGenerated]
internal sealed class <>z__ReadOnlyArray<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T>
{
int ICollection.Count => _items.Length;
bool ICollection.IsSynchronized => false;
object ICollection.SyncRoot => this;
object IList.this[int index]
{
get
{
return _items[index];
}
set
{
throw new NotSupportedException();
}
}
bool IList.IsFixedSize => true;
bool IList.IsReadOnly => true;
int IReadOnlyCollection<T>.Count => _items.Length;
T IReadOnlyList<T>.this[int index] => _items[index];
int ICollection<T>.Count => _items.Length;
bool ICollection<T>.IsReadOnly => true;
T IList<T>.this[int index]
{
get
{
return _items[index];
}
set
{
throw new NotSupportedException();
}
}
public <>z__ReadOnlyArray(T[] items)
{
_items = items;
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_items).GetEnumerator();
}
void ICollection.CopyTo(Array array, int index)
{
((ICollection)_items).CopyTo(array, index);
}
int IList.Add(object value)
{
throw new NotSupportedException();
}
void IList.Clear()
{
throw new NotSupportedException();
}
bool IList.Contains(object value)
{
return ((IList)_items).Contains(value);
}
int IList.IndexOf(object value)
{
return ((IList)_items).IndexOf(value);
}
void IList.Insert(int index, object value)
{
throw new NotSupportedException();
}
void IList.Remove(object value)
{
throw new NotSupportedException();
}
void IList.RemoveAt(int index)
{
throw new NotSupportedException();
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return ((IEnumerable<T>)_items).GetEnumerator();
}
void ICollection<T>.Add(T item)
{
throw new NotSupportedException();
}
void ICollection<T>.Clear()
{
throw new NotSupportedException();
}
bool ICollection<T>.Contains(T item)
{
return ((ICollection<T>)_items).Contains(item);
}
void ICollection<T>.CopyTo(T[] array, int arrayIndex)
{
((ICollection<T>)_items).CopyTo(array, arrayIndex);
}
bool ICollection<T>.Remove(T item)
{
throw new NotSupportedException();
}
int IList<T>.IndexOf(T item)
{
return ((IList<T>)_items).IndexOf(item);
}
void IList<T>.Insert(int index, T item)
{
throw new NotSupportedException();
}
void IList<T>.RemoveAt(int index)
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T>
{
private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T>
{
object IEnumerator.Current => _item;
T IEnumerator<T>.Current => _item;
public Enumerator(T item)
{
_item = item;
}
bool IEnumerator.MoveNext()
{
if (!_moveNextCalled)
{
return _moveNextCalled = true;
}
return false;
}
void IEnumerator.Reset()
{
_moveNextCalled = false;
}
void IDisposable.Dispose()
{
}
}
int ICollection.Count => 1;
bool ICollection.IsSynchronized => false;
object ICollection.SyncRoot => this;
object IList.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
set
{
throw new NotSupportedException();
}
}
bool IList.IsFixedSize => true;
bool IList.IsReadOnly => true;
int IReadOnlyCollection<T>.Count => 1;
T IReadOnlyList<T>.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
}
int ICollection<T>.Count => 1;
bool ICollection<T>.IsReadOnly => true;
T IList<T>.this[int index]
{
get
{
if (index != 0)
{
throw new IndexOutOfRangeException();
}
return _item;
}
set
{
throw new NotSupportedException();
}
}
public <>z__ReadOnlySingleElementList(T item)
{
_item = item;
}
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(_item);
}
void ICollection.CopyTo(Array array, int index)
{
array.SetValue(_item, index);
}
int IList.Add(object value)
{
throw new NotSupportedException();
}
void IList.Clear()
{
throw new NotSupportedException();
}
bool IList.Contains(object value)
{
return EqualityComparer<T>.Default.Equals(_item, (T)value);
}
int IList.IndexOf(object value)
{
if (!EqualityComparer<T>.Default.Equals(_item, (T)value))
{
return -1;
}
return 0;
}
void IList.Insert(int index, object value)
{
throw new NotSupportedException();
}
void IList.Remove(object value)
{
throw new NotSupportedException();
}
void IList.RemoveAt(int index)
{
throw new NotSupportedException();
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return new Enumerator(_item);
}
void ICollection<T>.Add(T item)
{
throw new NotSupportedException();
}
void ICollection<T>.Clear()
{
throw new NotSupportedException();
}
bool ICollection<T>.Contains(T item)
{
return EqualityComparer<T>.Default.Equals(_item, item);
}
void ICollection<T>.CopyTo(T[] array, int arrayIndex)
{
array[arrayIndex] = _item;
}
bool ICollection<T>.Remove(T item)
{
throw new NotSupportedException();
}
int IList<T>.IndexOf(T item)
{
if (!EqualityComparer<T>.Default.Equals(_item, item))
{
return -1;
}
return 0;
}
void IList<T>.Insert(int index, T item)
{
throw new NotSupportedException();
}
void IList<T>.RemoveAt(int index)
{
throw new NotSupportedException();
}
}
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;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class ExtensionMarkerAttribute : Attribute
{
private readonly string <Name>k__BackingField;
public string Name => <Name>k__BackingField;
public ExtensionMarkerAttribute(string name)
{
<Name>k__BackingField = name;
}
}
}
namespace BepInEx
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class BepInAutoPluginAttribute : Attribute
{
public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace BepInEx.Preloader.Core.Patching
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class PatcherAutoPluginAttribute : Attribute
{
public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace Microsoft.CodeAnalysis
{
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace EdgeDetection
{
[BepInDependency("org.silksong-modding.modmenu", "0.5.2")]
[BepInDependency("org.silksong-modding.i18n", "1.0.2")]
[BepInPlugin("io.github.kaycodes13.edgedetection", "EdgeDetection", "1.0.0")]
public class EdgeDetectionPlugin : BaseUnityPlugin, IModMenuCustomMenu, IModMenuInterface
{
public const string Id = "io.github.kaycodes13.edgedetection";
internal static EdgeDetectionPlugin Plugin { get; private set; }
internal static ManualLogSource Log { get; private set; }
internal static Shader SilhouetteShader { get; private set; }
internal static Shader EdgeDetectionShader { get; private set; }
internal static PassDef[] PassDefs { get; private set; }
private static Harmony Harmony { get; } = new Harmony("io.github.kaycodes13.edgedetection");
public static string Name => "EdgeDetection";
public static string Version => "1.0.0";
private void Awake()
{
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: 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_00cf: Expected O, but got Unknown
Plugin = this;
Log = ((BaseUnityPlugin)this).Logger;
Utils.ReadAsset("shaders.bundle", delegate(Stream stream)
{
AssetBundle obj = AssetBundle.LoadFromStream(stream);
SilhouetteShader = obj.LoadAsset<Shader>("assets/drawsilhouette.shader");
EdgeDetectionShader = obj.LoadAsset<Shader>("assets/edgedetection.shader");
});
PassDefs = Utils.ReadJsonAsset<PassDef[]>("pass_definitions.json");
int num = 0;
PassDef[] passDefs = PassDefs;
for (int i = 0; i < passDefs.Length; i++)
{
PassDef passDef = passDefs[i];
PassDefs[num++] = passDef with
{
Colour = ((BaseUnityPlugin)this).Config.Bind<Color>(passDef.Id, "Colour", passDef.Colour, (ConfigDescription)null).Value,
Width = ((BaseUnityPlugin)this).Config.Bind<byte>(passDef.Id, "Width", passDef.Width, new ConfigDescription("", (AcceptableValueBase)(object)new AcceptableValueRange<byte>((byte)0, (byte)16), Array.Empty<object>())).Value,
HalfRes = ((BaseUnityPlugin)this).Config.Bind<bool>(passDef.Id, "Low Res", passDef.HalfRes, (ConfigDescription)null).Value
};
}
Harmony.PatchAll();
Log.LogInfo((object)("Plugin " + Name + " (io.github.kaycodes13.edgedetection) has loaded!"));
}
internal bool GetPassConfig(string id, out ConfigEntry<Color> colour, out ConfigEntry<byte> width, out ConfigEntry<bool> halfRes)
{
bool num = ((BaseUnityPlugin)this).Config.TryGetEntry<Color>(id, "Colour", ref colour) & ((BaseUnityPlugin)this).Config.TryGetEntry<byte>(id, "Width", ref width) & ((BaseUnityPlugin)this).Config.TryGetEntry<bool>(id, "Low Res", ref halfRes);
if (!num)
{
Log.LogWarning((object)("Failed to load configuration for " + id + " pass."));
}
return num;
}
public LocalizedText ModMenuName()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
return LocalizedText.op_Implicit(MenuUtils.Localized("MOD_TITLE"));
}
public AbstractMenuScreen BuildCustomMenu()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Expected O, but got Unknown
VerticalGroup val = new VerticalGroup();
val.AddRange((IEnumerable<IMenuEntity>)EdgeDetectionPass.Passes.SelectMany<KeyValuePair<string, EdgeDetectionPass>, MenuElement>((KeyValuePair<string, EdgeDetectionPass> x) => GenerateDetectorOptions(x.Value)));
return (AbstractMenuScreen)(object)new ScrollMenuScreen(ModMenuName(), val);
}
private IEnumerable<MenuElement> GenerateDetectorOptions(EdgeDetectionPass pass)
{
//IL_0010: 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_003a: 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_006b: Unknown result type (might be due to invalid IL or missing references)
SubtitleLabel subtitleLabel = new SubtitleLabel(LocalizedText.op_Implicit(MenuUtils.Localized(pass.Id + "_NAME")));
HexColorInput hexColorInput = new HexColorInput(LocalizedText.op_Implicit(MenuUtils.Localized("LINE_COLOUR_LABEL")));
WiderSliderElement<byte> widerSliderElement = new WiderSliderElement<byte>(LocalizedText.op_Implicit(MenuUtils.Localized("LINE_WIDTH_LABEL")), (SliderModel<byte>)(object)new ByteSliderModel(0, 16));
ChoiceElement<bool> val = new ChoiceElement<bool>(LocalizedText.op_Implicit(MenuUtils.Localized("HALF_RES_LABEL")), (IChoiceModel<bool>)(object)MenuUtils.LocalizedBoolModel(), LocalizedText.op_Implicit(MenuUtils.Localized("HALF_RES_DESC")));
if (GetPassConfig(pass.Id, out ConfigEntry<Color> colour, out ConfigEntry<byte> width, out ConfigEntry<bool> halfRes))
{
ConfigEntryFactoryExtensions.SynchronizeWith<Color>((SelectableValueElement<Color>)(object)hexColorInput, colour);
ConfigEntryFactoryExtensions.SynchronizeWith<byte>((SelectableValueElement<byte>)(object)widerSliderElement, width);
ConfigEntryFactoryExtensions.SynchronizeWith<bool>((SelectableValueElement<bool>)(object)val, halfRes);
}
return new <>z__ReadOnlyArray<MenuElement>((MenuElement[])(object)new MenuElement[4]
{
(MenuElement)subtitleLabel,
(MenuElement)hexColorInput,
(MenuElement)widerSliderElement,
(MenuElement)val
});
}
}
internal static class Utils
{
[SpecialName]
public sealed class <G>$1A716C91D2B72E1C13325FC88724110E
{
[SpecialName]
public static class <M>$FD985437AAE2EF705567DB8FF4C7DF30
{
}
[ExtensionMarker("<M>$FD985437AAE2EF705567DB8FF4C7DF30")]
internal void RotateVertices(Quaternion rotation)
{
throw new NotSupportedException();
}
[ExtensionMarker("<M>$FD985437AAE2EF705567DB8FF4C7DF30")]
internal void RotateVertices(Quaternion rotation, Vector3 center)
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <SelfAndWalkHierarchy>d__4 : IEnumerable<Transform>, IEnumerable, IEnumerator<Transform>, IEnumerator, IDisposable
{
private int <>1__state;
private Transform <>2__current;
private int <>l__initialThreadId;
private GameObject go;
public GameObject <>3__go;
private IEnumerator<Transform> <>7__wrap1;
Transform IEnumerator<Transform>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <SelfAndWalkHierarchy>d__4(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 2)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>7__wrap1 = null;
<>1__state = -2;
}
private bool MoveNext()
{
try
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = go.transform;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>7__wrap1 = WalkHierarchy(go).GetEnumerator();
<>1__state = -3;
break;
case 2:
<>1__state = -3;
break;
}
if (<>7__wrap1.MoveNext())
{
Transform current = <>7__wrap1.Current;
<>2__current = current;
<>1__state = 2;
return true;
}
<>m__Finally1();
<>7__wrap1 = null;
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
if (<>7__wrap1 != null)
{
<>7__wrap1.Dispose();
}
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<Transform> IEnumerable<Transform>.GetEnumerator()
{
<SelfAndWalkHierarchy>d__4 <SelfAndWalkHierarchy>d__;
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
<SelfAndWalkHierarchy>d__ = this;
}
else
{
<SelfAndWalkHierarchy>d__ = new <SelfAndWalkHierarchy>d__4(0);
}
<SelfAndWalkHierarchy>d__.go = <>3__go;
return <SelfAndWalkHierarchy>d__;
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Transform>)this).GetEnumerator();
}
}
[CompilerGenerated]
private sealed class <WalkHierarchy>d__3 : IEnumerable<Transform>, IEnumerable, IEnumerator<Transform>, IEnumerator, IDisposable
{
private int <>1__state;
private Transform <>2__current;
private int <>l__initialThreadId;
private IEnumerable<GameObject> roots;
public IEnumerable<GameObject> <>3__roots;
private IEnumerator<Transform> <>7__wrap1;
Transform IEnumerator<Transform>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WalkHierarchy>d__3(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>7__wrap1 = null;
<>1__state = -2;
}
private bool MoveNext()
{
try
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>7__wrap1 = roots.SelectMany((GameObject x) => SelfAndWalkHierarchy(x)).GetEnumerator();
<>1__state = -3;
break;
case 1:
<>1__state = -3;
break;
}
if (<>7__wrap1.MoveNext())
{
Transform current = <>7__wrap1.Current;
<>2__current = current;
<>1__state = 1;
return true;
}
<>m__Finally1();
<>7__wrap1 = null;
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
if (<>7__wrap1 != null)
{
<>7__wrap1.Dispose();
}
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<Transform> IEnumerable<Transform>.GetEnumerator()
{
<WalkHierarchy>d__3 <WalkHierarchy>d__;
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
<WalkHierarchy>d__ = this;
}
else
{
<WalkHierarchy>d__ = new <WalkHierarchy>d__3(0);
}
<WalkHierarchy>d__.roots = <>3__roots;
return <WalkHierarchy>d__;
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Transform>)this).GetEnumerator();
}
}
[CompilerGenerated]
private sealed class <WalkHierarchy>d__5 : IEnumerable<Transform>, IEnumerable, IEnumerator<Transform>, IEnumerator, IDisposable
{
private int <>1__state;
private Transform <>2__current;
private int <>l__initialThreadId;
private GameObject go;
public GameObject <>3__go;
private IEnumerator <>7__wrap1;
private Transform <t>5__3;
private IEnumerator<Transform> <>7__wrap3;
Transform IEnumerator<Transform>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WalkHierarchy>d__5(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if ((uint)(num - -4) <= 1u || (uint)(num - 1) <= 1u)
{
try
{
if (num == -4 || num == 2)
{
try
{
}
finally
{
<>m__Finally2();
}
}
}
finally
{
<>m__Finally1();
}
}
<>7__wrap1 = null;
<t>5__3 = null;
<>7__wrap3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Expected O, but got Unknown
try
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>7__wrap1 = go.transform.GetEnumerator();
<>1__state = -3;
break;
case 1:
<>1__state = -3;
<>7__wrap3 = WalkHierarchy(((Component)<t>5__3).gameObject).GetEnumerator();
<>1__state = -4;
goto IL_00cd;
case 2:
{
<>1__state = -4;
goto IL_00cd;
}
IL_00cd:
if (<>7__wrap3.MoveNext())
{
Transform current = <>7__wrap3.Current;
<>2__current = current;
<>1__state = 2;
return true;
}
<>m__Finally2();
<>7__wrap3 = null;
<t>5__3 = null;
break;
}
if (<>7__wrap1.MoveNext())
{
<t>5__3 = (Transform)<>7__wrap1.Current;
<>2__current = <t>5__3;
<>1__state = 1;
return true;
}
<>m__Finally1();
<>7__wrap1 = null;
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
if (<>7__wrap1 is IDisposable disposable)
{
disposable.Dispose();
}
}
private void <>m__Finally2()
{
<>1__state = -3;
if (<>7__wrap3 != null)
{
<>7__wrap3.Dispose();
}
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<Transform> IEnumerable<Transform>.GetEnumerator()
{
<WalkHierarchy>d__5 <WalkHierarchy>d__;
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
<WalkHierarchy>d__ = this;
}
else
{
<WalkHierarchy>d__ = new <WalkHierarchy>d__5(0);
}
<WalkHierarchy>d__.go = <>3__go;
return <WalkHierarchy>d__;
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Transform>)this).GetEnumerator();
}
}
internal static readonly Assembly asm = Assembly.GetExecutingAssembly();
internal static void ReadAsset(string path, Action<Stream> action)
{
using Stream obj = asm.GetManifestResourceStream("EdgeDetection.Assets." + path);
action(obj);
}
internal static T ReadJsonAsset<T>(string path)
{
using StreamReader streamReader = new StreamReader(asm.GetManifestResourceStream("EdgeDetection.Assets." + path));
return JsonConvert.DeserializeObject<T>(streamReader.ReadToEnd());
}
[IteratorStateMachine(typeof(<WalkHierarchy>d__3))]
internal static IEnumerable<Transform> WalkHierarchy(IEnumerable<GameObject> roots)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <WalkHierarchy>d__3(-2)
{
<>3__roots = roots
};
}
[IteratorStateMachine(typeof(<SelfAndWalkHierarchy>d__4))]
internal static IEnumerable<Transform> SelfAndWalkHierarchy(GameObject go)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <SelfAndWalkHierarchy>d__4(-2)
{
<>3__go = go
};
}
[IteratorStateMachine(typeof(<WalkHierarchy>d__5))]
internal static IEnumerable<Transform> WalkHierarchy(GameObject go)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <WalkHierarchy>d__5(-2)
{
<>3__go = go
};
}
internal static void RotateVertices(this Mesh mesh, Quaternion rotation)
{
//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)
mesh.RotateVertices(rotation, Vector3.zero);
}
internal static void RotateVertices(this Mesh mesh, Quaternion rotation, Vector3 center)
{
//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_000e: 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)
mesh.vertices = mesh.vertices.Select((Vector3 v) => rotation * (v - center) + center).ToArray();
mesh.RecalculateNormals();
mesh.RecalculateBounds();
}
}
}
namespace EdgeDetection.Structs
{
[Serializable]
internal record struct ObjectMods(HashSet<string> HideViaLayer, Dictionary<string, PhysLayers> ChangeLayer, Dictionary<string, PhysLayers> ChangeAllLayers, HashSet<string> HideFromDetectors, HashSet<string> HideCollider, HashSet<string> HideSubColliders, Dictionary<string, PhysLayers> VisualizeSprite)
{
public const PhysLayers HIDE_LAYER = 18;
public const int HIDE_LAYER_INT = 18;
public readonly void Apply(Transform t)
{
Apply(((Component)t).gameObject);
}
public readonly void Apply(GameObject go)
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Expected I4, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Expected I4, but got Unknown
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
string text = CleanName(go);
Dictionary<string, PhysLayers> changeLayer = ChangeLayer;
if (changeLayer != null && changeLayer.TryGetValue(text, out var value))
{
go.layer = (int)value;
}
Dictionary<string, PhysLayers> changeAllLayers = ChangeAllLayers;
if (changeAllLayers != null && changeAllLayers.TryGetValue(text, out var value2))
{
Renderer val = default(Renderer);
foreach (Transform item in Utils.SelfAndWalkHierarchy(go))
{
if (((Component)item).TryGetComponent<Renderer>(ref val) && !(val is ParticleSystemRenderer) && !Object.op_Implicit((Object)(object)((Component)item).GetComponent<Collider2D>()))
{
((Component)item).gameObject.layer = (int)value2;
}
}
}
HashSet<string> hideViaLayer = HideViaLayer;
if (hideViaLayer != null && hideViaLayer.Contains(text))
{
go.layer = 18;
}
HashSet<string> hideFromDetectors = HideFromDetectors;
if (hideFromDetectors != null && hideFromDetectors.Contains(text))
{
Extensions.AddComponentIfNotPresent<HideFromCamera>(go).hideFromEdgeDetectors = true;
}
HashSet<string> hideCollider = HideCollider;
if (hideCollider != null && hideCollider.Contains(text))
{
go.AddComponent<RemoveColliderVisualizer>();
}
HashSet<string> hideSubColliders = HideSubColliders;
if (hideSubColliders != null && hideSubColliders.Contains(text))
{
foreach (Transform item2 in Utils.WalkHierarchy(go))
{
((Component)item2).gameObject.AddComponent<RemoveColliderVisualizer>();
}
}
Dictionary<string, PhysLayers> visualizeSprite = VisualizeSprite;
if (visualizeSprite != null && visualizeSprite.TryGetValue(text, out var value3))
{
Extensions.AddComponentIfNotPresent<SpriteVisualizer>(go).layer = value3;
}
}
public static string CleanName(GameObject go)
{
return Regex.Replace(((Object)go).name, "\\s?\\([a-zA-Z0-9]+\\)", "").Trim();
}
public static ObjectMods Union(ObjectMods one, ObjectMods two)
{
ObjectMods result = default(ObjectMods);
result.HideViaLayer = MergeSet<string>(one.HideViaLayer, two.HideViaLayer);
result.HideFromDetectors = MergeSet<string>(one.HideFromDetectors, two.HideFromDetectors);
result.HideCollider = MergeSet<string>(one.HideCollider, two.HideCollider);
result.HideSubColliders = MergeSet<string>(one.HideSubColliders, two.HideSubColliders);
result.ChangeLayer = MergeDict<string, PhysLayers>(one.ChangeLayer, two.ChangeLayer);
result.ChangeAllLayers = MergeDict<string, PhysLayers>(one.ChangeAllLayers, two.ChangeAllLayers);
result.VisualizeSprite = MergeDict<string, PhysLayers>(one.VisualizeSprite, two.VisualizeSprite);
return result;
static Dictionary<K, V> MergeDict<K, V>(Dictionary<K, V>? a, Dictionary<K, V>? b) where K : notnull where V : notnull
{
Dictionary<K, V> dictionary = new Dictionary<K, V>();
K key;
V value;
foreach (KeyValuePair<K, V> item in a ?? new Dictionary<K, V>())
{
item.Deconstruct(out key, out value);
K key2 = key;
V value2 = value;
dictionary.TryAdd(key2, value2);
}
foreach (KeyValuePair<K, V> item2 in b ?? new Dictionary<K, V>())
{
item2.Deconstruct(out key, out value);
K key3 = key;
V value3 = value;
dictionary.TryAdd(key3, value3);
}
return dictionary;
}
static HashSet<T> MergeSet<T>(HashSet<T>? a, HashSet<T>? b) where T : notnull
{
HashSet<T> hashSet = new HashSet<T>();
foreach (T item3 in (a ?? new HashSet<T>()).Union(b ?? new HashSet<T>()))
{
hashSet.Add(item3);
}
return hashSet;
}
}
}
[Serializable]
internal record struct PassDef(string Id, Color Colour, byte Width, bool HalfRes, PhysLayers[] Layers, float Threshold, float ClipFar, float ClipNear, string ExcludePass)
{
[CompilerGenerated]
private readonly bool PrintMembers(StringBuilder builder)
{
//IL_0027: 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)
builder.Append("Id = ");
builder.Append((object?)Id);
builder.Append(", Colour = ");
Color colour = Colour;
builder.Append(((object)(Color)(ref colour)).ToString());
builder.Append(", Width = ");
builder.Append(Width.ToString());
builder.Append(", HalfRes = ");
builder.Append(HalfRes.ToString());
builder.Append(", Layers = ");
builder.Append(Layers);
builder.Append(", Threshold = ");
builder.Append(Threshold.ToString());
builder.Append(", ClipFar = ");
builder.Append(ClipFar.ToString());
builder.Append(", ClipNear = ");
builder.Append(ClipNear.ToString());
builder.Append(", ExcludePass = ");
builder.Append((object?)ExcludePass);
return true;
}
}
}
namespace EdgeDetection.Patches
{
[HarmonyPatch]
internal static class ApplyObjectMods
{
[CompilerGenerated]
private sealed class <<OnSceneLoad>g__Coro|1_2>d : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public Scene scene;
private int <i>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <<OnSceneLoad>g__Coro|1_2>d(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
if (!Object.op_Implicit((Object)(object)GameManager.SilentInstance) || GameManager.instance.IsNonGameplayScene())
{
return false;
}
<i>5__2 = 0;
break;
case 1:
<>1__state = -1;
<i>5__2++;
break;
}
if (<i>5__2 < 2)
{
<>2__current = null;
<>1__state = 1;
return true;
}
if (!((Scene)(ref scene)).isLoaded)
{
return false;
}
foreach (Transform item in Utils.WalkHierarchy((IEnumerable<GameObject>)((Scene)(ref scene)).GetRootGameObjects()))
{
if (!ObjectVisualizer.IsVisualizer(item))
{
ShowColliderHideParticles(item);
genericMods.Apply(item);
}
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static readonly ObjectMods genericMods = ObjectMods.Union(Utils.ReadJsonAsset<ObjectMods>("generic_modifications.json"), Utils.ReadJsonAsset<ObjectMods>("boss_modifications.json"));
private static readonly HashSet<PhysLayers> colliderLayers = new HashSet<PhysLayers>
{
(PhysLayers)23,
(PhysLayers)22,
(PhysLayers)17,
(PhysLayers)12
};
[HarmonyPatch(typeof(GameCameras), "Start")]
[HarmonyPostfix]
private static void SoKParticles(GameCameras __instance)
{
foreach (Transform item in Utils.WalkHierarchy(((Component)__instance.sceneParticles).gameObject))
{
((Component)item).gameObject.layer = 18;
}
foreach (Transform item2 in Utils.WalkHierarchy(((Component)((Component)__instance).transform.Find("Roar Wave Emitter")).gameObject))
{
((Component)item2).gameObject.layer = 18;
}
}
[HarmonyPatch(typeof(GameManager), "Start")]
[HarmonyPostfix]
private static void OnSceneLoad()
{
SceneManager.activeSceneChanged -= SceneChangeHandler;
SceneManager.activeSceneChanged += SceneChangeHandler;
SceneManager.sceneLoaded -= SceneLoadHandler;
SceneManager.sceneLoaded += SceneLoadHandler;
[IteratorStateMachine(typeof(<<OnSceneLoad>g__Coro|1_2>d))]
static IEnumerator Coro(Scene scene)
{
//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)
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <<OnSceneLoad>g__Coro|1_2>d(0)
{
scene = scene
};
}
static void SceneChangeHandler(Scene _, Scene scene)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
((MonoBehaviour)EdgeDetectionPlugin.Plugin).StartCoroutine(Coro(scene));
}
static void SceneLoadHandler(Scene scene, LoadSceneMode mode)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Invalid comparison between Unknown and I4
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
if ((int)mode == 1)
{
((MonoBehaviour)EdgeDetectionPlugin.Plugin).StartCoroutine(Coro(scene));
}
}
}
[HarmonyPatch(typeof(ObjectPool), "Spawn", new Type[]
{
typeof(GameObject),
typeof(Transform),
typeof(Vector3),
typeof(Quaternion),
typeof(bool)
})]
[HarmonyPostfix]
private static void OnObjectSpawned(GameObject __result)
{
foreach (Transform item in Utils.SelfAndWalkHierarchy(__result))
{
ShowColliderHideParticles(item);
genericMods.Apply(item);
}
}
[HarmonyPatch(typeof(HeroController), "Awake")]
[HarmonyPostfix]
private static void OnHeroAwake(HeroController __instance)
{
ObjectMods objectMods = Utils.ReadJsonAsset<ObjectMods>("hornet_modifications.json");
foreach (Transform item in Utils.WalkHierarchy(((Component)__instance).gameObject))
{
ShowColliderHideParticles(item);
objectMods.Apply(item);
}
}
private static void ShowColliderHideParticles(Transform t)
{
//IL_000d: 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)
GameObject gameObject = ((Component)t).gameObject;
PhysLayers item = (PhysLayers)gameObject.layer;
Renderer component = gameObject.GetComponent<Renderer>();
if (!Object.op_Implicit((Object)(object)gameObject.GetComponent<Collider2D>()))
{
if (component is ParticleSystemRenderer)
{
gameObject.layer = 18;
}
else
{
if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)gameObject.GetComponent<Lever>()))
{
return;
}
foreach (Transform item2 in Utils.SelfAndWalkHierarchy(gameObject))
{
if (Object.op_Implicit((Object)(object)((Component)item2).GetComponent<Renderer>()) && !Object.op_Implicit((Object)(object)((Component)t).GetComponent<Collider2D>()))
{
((Component)item2).gameObject.layer = 19;
}
}
}
}
else if (!Object.op_Implicit((Object)(object)component) && (Object.op_Implicit((Object)(object)gameObject.GetComponent<DamageHero>()) || colliderLayers.Contains(item)))
{
Extensions.AddComponentIfNotPresent<ColliderVisualizer>(gameObject);
}
}
}
[HarmonyPatch(typeof(GameCameras), "Start")]
internal static class CameraSetup
{
private static void Postfix(GameCameras __instance)
{
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
PassDef[] passDefs = EdgeDetectionPlugin.PassDefs;
for (int i = 0; i < passDefs.Length; i++)
{
PassDef passDef = passDefs[i];
EdgeDetectionPass detector = ((Component)__instance.mainCamera).gameObject.AddComponent<EdgeDetectionPass>();
EdgeDetectionPass edgeDetectionPass = detector;
EdgeDetectionPass edgeDetectionPass2 = detector;
EdgeDetectionPass edgeDetectionPass3 = detector;
EdgeDetectionPass edgeDetectionPass4 = detector;
EdgeDetectionPass edgeDetectionPass5 = detector;
EdgeDetectionPass edgeDetectionPass6 = detector;
EdgeDetectionPass edgeDetectionPass7 = detector;
EdgeDetectionPass edgeDetectionPass8 = detector;
EdgeDetectionPass edgeDetectionPass9 = detector;
PassDef passDef2 = passDef;
(edgeDetectionPass.Id, edgeDetectionPass2.LineColor, edgeDetectionPass3.LineWidth, edgeDetectionPass4.HalfResolution, edgeDetectionPass5.Layers, edgeDetectionPass6.AlphaThreshold, edgeDetectionPass7.ClipFar, edgeDetectionPass8.ClipNear, edgeDetectionPass9.ExcludePass) = (PassDef)(ref passDef2);
if (EdgeDetectionPlugin.Plugin.GetPassConfig(passDef.Id, out ConfigEntry<Color> colour, out ConfigEntry<byte> width, out ConfigEntry<bool> halfRes))
{
colour.SettingChanged += delegate(object _, EventArgs e)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
detector.LineColor = GetValue<Color>(e);
};
width.SettingChanged += delegate(object _, EventArgs e)
{
detector.LineWidth = GetValue<byte>(e);
};
halfRes.SettingChanged += delegate(object _, EventArgs e)
{
detector.HalfResolution = GetValue<bool>(e);
};
}
}
static T GetValue<T>(EventArgs e)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return (T)((SettingChangedEventArgs)e).ChangedSetting.BoxedValue;
}
}
}
}
namespace EdgeDetection.Menu
{
internal class ByteSliderModel : SliderModel<byte>
{
public ByteSliderModel(byte min, byte max)
: base((int)min, (int)max)
{
}
protected override bool GetIndex(byte value, out int index)
{
index = value;
if (base.MinimumIndex <= index)
{
return index <= base.MaximumIndex;
}
return false;
}
protected override byte GetValue(int index)
{
return (byte)Math.Clamp(index, 0, 255);
}
}
internal class HexColorInput : TextInput<Color>
{
[CompilerGenerated]
private static class <>O
{
public static OnValidateInput <0>__HexValidation;
public static Parse<Color> <1>__HexParser;
public static Unparse<Color> <2>__HexUnparser;
}
private readonly GameObject swatch;
private static readonly Color InvalidColor = new Color(-1f, -1f, -1f, -1f);
public HexColorInput(LocalizedText label)
: this(label, LocalizedText.op_Implicit(""))
{
}
public HexColorInput(LocalizedText label, LocalizedText description)
: base(label, (ITextModel<Color>)(object)HexRGBModel(), description)
{
//IL_007a: 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_008b: Expected O, but got Unknown
//IL_00e2: 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_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Expected O, but got Unknown
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0140: 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_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: 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_0068: Expected O, but got Unknown
((Object)((MenuElement)this).Container).name = label.Text + "Input";
base.InputField.characterLimit = 6;
base.InputField.contentType = (ContentType)9;
InputField inputField = base.InputField;
object obj = <>O.<0>__HexValidation;
if (obj == null)
{
OnValidateInput val = HexValidation;
<>O.<0>__HexValidation = val;
obj = (object)val;
}
inputField.onValidateInput = (OnValidateInput)obj;
((MenuElement)this).ApplyDefaultColors = true;
swatch = new GameObject("Swatch")
{
layer = 5
};
swatch.transform.SetParent(((Component)base.InputField).transform.Find("Menu Option Text"), false);
Extensions.Reset(swatch.transform);
Image image = swatch.AddComponent<Image>();
((Graphic)image).material = new Material(Shader.Find("UI/Default"))
{
color = Color.white
};
Outline obj2 = swatch.AddComponent<Outline>();
((Shadow)obj2).effectColor = new Color(0.4f, 0.4f, 0.4f, 1f);
((Shadow)obj2).effectDistance = new Vector2(3f, 3f);
RectTransform val2 = (RectTransform)swatch.transform;
val2.sizeDelta = new Vector2(40f, 40f);
Vector2 val3 = default(Vector2);
((Vector2)(ref val3))..ctor(0f, 0.5f);
val2.anchorMin = val3;
val2.anchorMax = val3;
((SelectableValueElement<Color>)(object)this).Model.OnValueChanged += delegate(Color color)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
((Graphic)image).material.color = color;
};
}
public static char HexValidation(string input, int index, char addedChar)
{
if (!Parse($"{addedChar}", out var _))
{
return '0';
}
return addedChar;
}
public static ParserTextModel<Color> HexRGBModel()
{
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
return new ParserTextModel<Color>((Parse<Color>)HexParser, (Unparse<Color>)HexUnparser, InvalidColor);
}
private static bool HexParser(string x, out Color c)
{
//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_0069: 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)
c = InvalidColor;
x = x.Replace("#", "").Trim();
if (x.Length < 6)
{
return false;
}
if (Parse(x.Substring(0, 2), out var b) && Parse(x.Substring(2, 2), out var b2) && Parse(x.Substring(4, 2), out var b3))
{
c = Color32.op_Implicit(new Color32(b, b2, b3, byte.MaxValue));
return true;
}
return false;
}
private static bool HexUnparser(Color c, out string x)
{
//IL_0000: 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_001a: 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_002d: 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)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
if (In01(c.r) && In01(c.g) && In01(c.b))
{
Color32 val = Color32.op_Implicit(c);
x = $"{val.r:X2}{val.g:X2}{val.b:X2}";
}
else
{
x = "######";
}
return true;
static bool In01(float f)
{
if (0f <= f)
{
return f <= 1f;
}
return false;
}
}
private static bool Parse(string s, out byte b)
{
return byte.TryParse(s, NumberStyles.HexNumber, null, out b);
}
}
internal static class MenuUtils
{
[SpecialName]
public sealed class <G>$5E80EE1F91F68F4C0C8D9D82C38C5E67
{
[SpecialName]
public static class <M>$DA8EECEBA43A0DEF5767F437FCA1FFA2
{
}
[ExtensionMarker("<M>$DA8EECEBA43A0DEF5767F437FCA1FFA2")]
internal RectTransform RectTransform
{
[ExtensionMarker("<M>$DA8EECEBA43A0DEF5767F437FCA1FFA2")]
get
{
throw new NotSupportedException();
}
}
[ExtensionMarker("<M>$DA8EECEBA43A0DEF5767F437FCA1FFA2")]
internal void SetAnchors(Vector2 anchor)
{
throw new NotSupportedException();
}
[ExtensionMarker("<M>$DA8EECEBA43A0DEF5767F437FCA1FFA2")]
internal void SetSizeDelta(Vector2 size)
{
throw new NotSupportedException();
}
}
[SpecialName]
public sealed class <G>$1945437846AC44BD79BE419C90BB2AE7
{
[SpecialName]
public static class <M>$D30A0C6AD6B3A0DECA793BBD3009BA46
{
}
[ExtensionMarker("<M>$D30A0C6AD6B3A0DECA793BBD3009BA46")]
internal RectTransform AsRect
{
[ExtensionMarker("<M>$D30A0C6AD6B3A0DECA793BBD3009BA46")]
get
{
throw new NotSupportedException();
}
}
[ExtensionMarker("<M>$D30A0C6AD6B3A0DECA793BBD3009BA46")]
internal void SetAnchors(Vector2 anchor)
{
throw new NotSupportedException();
}
}
[SpecialName]
public sealed class <G>$22B4D88CDD78D2CB2B453E84388FEC0B
{
[SpecialName]
public static class <M>$66ED77F0E377F9BDC76426701AFF25DC
{
}
[ExtensionMarker("<M>$66ED77F0E377F9BDC76426701AFF25DC")]
internal IEnumerable<Selectable> AllSelectables()
{
throw new NotSupportedException();
}
}
private static Shader? uiShader;
internal static LocalisedString Localized(string key)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return new LocalisedString("Mods.io.github.kaycodes13.edgedetection", key);
}
internal static ListChoiceModel<bool> LocalizedBoolModel()
{
return new ListChoiceModel<bool>(new List<bool>(2) { false, true })
{
DisplayFn = (int idx, bool val) => LocalizedText.op_Implicit(val ? Localized("BOOL_TRUE") : Localized("BOOL_FALSE"))
};
}
internal static GameObject UIGameObject(string name, GameObject? parent)
{
//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_000e: Expected O, but got Unknown
GameObject val = new GameObject(name)
{
layer = 5
};
if (Object.op_Implicit((Object)(object)parent))
{
Extensions.SetParentReset(val.transform, parent.transform);
}
return val;
}
internal static Material UIMaterial(Color? color = null)
{
//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_003a: 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)
//IL_0045: Expected O, but got Unknown
if (!Object.op_Implicit((Object)(object)uiShader))
{
uiShader = Shader.Find("UI/Default");
}
return new Material(uiShader)
{
color = (Color)(((??)color) ?? Color.white)
};
}
internal static RectTransform get_RectTransform(GameObject go)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
return (RectTransform)go.transform;
}
internal static void SetAnchors(this GameObject go, Vector2 anchor)
{
//IL_000c: 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_000e: 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)
RectTransform obj = get_RectTransform(go);
Vector2 anchorMax = (get_RectTransform(go).anchorMin = anchor);
obj.anchorMax = anchorMax;
}
internal static void SetSizeDelta(this GameObject go, Vector2 size)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
get_RectTransform(go).sizeDelta = size;
}
internal static RectTransform get_AsRect(Transform t)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
return (RectTransform)t;
}
internal static void SetAnchors(this Transform t, Vector2 anchor)
{
//IL_000c: 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_000e: 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)
RectTransform obj = get_AsRect(t);
Vector2 anchorMax = (get_AsRect(t).anchorMin = anchor);
obj.anchorMax = anchorMax;
}
internal static IEnumerable<Selectable> AllSelectables(this VerticalGroup v)
{
return from x in ((AbstractGroup)v).AllElements().OfType<SelectableElement>()
select x.SelectableComponent;
}
}
internal class ScrollMenuScreen : AbstractMenuScreen
{
private const int MASK_SOFTNESS = 100;
private const int PADDING_BOTTOM = 100;
private const int PADDING_FULL = 125;
private const float VIEWPORT_WIDTH = 1920f;
private const float VIEWPORT_HEIGHT = 825f;
private const float SCROLLPANE_WIDTH = 1480f;
private readonly GameObject ScrollPane;
private readonly GameObject Viewport;
private readonly GameObject Bar;
private readonly GameObject Handle;
[CompilerGenerated]
private VerticalGroup <Content>k__BackingField;
public VerticalGroup Content
{
get
{
return <Content>k__BackingField;
}
set
{
if (value == null)
{
throw new ArgumentNullException("Content");
}
if (<Content>k__BackingField != value && <Content>k__BackingField != null)
{
IMenuEntityExtensions.ClearParents((IMenuEntity)(object)<Content>k__BackingField);
ScrollNavHelper scrollNavHelper = default(ScrollNavHelper);
foreach (Selectable item in <Content>k__BackingField.AllSelectables())
{
if (((Component)item).TryGetComponent<ScrollNavHelper>(ref scrollNavHelper))
{
Object.Destroy((Object)(object)scrollNavHelper);
}
}
}
<Content>k__BackingField = value;
((AbstractMenuScreen)this).AddChild((IMenuEntity)(object)<Content>k__BackingField);
((AbstractGroup)<Content>k__BackingField).SetGameObjectParent(base.ContentPane);
}
}
public ScrollRect ScrollRect => ScrollPane.GetComponent<ScrollRect>();
public ScrollMenuScreen(LocalizedText title, VerticalGroup content)
: base(title)
{
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//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_009c: 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_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: 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)
//IL_0184: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_022a: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Unknown result type (might be due to invalid IL or missing references)
ScrollPane = MenuUtils.UIGameObject("ScrollPane", base.Container);
Viewport = MenuUtils.UIGameObject("Viewport", ScrollPane);
Extensions.SetParentReset(base.ContentPane.transform, Viewport.transform);
Content = content;
Bar = MenuUtils.UIGameObject("Scrollbar", ScrollPane);
Handle = MenuUtils.UIGameObject("Handle", Bar);
Vector2 anchor = Vector2.one * 0.5f;
((Graphic)Handle.AddComponent<Image>()).material = MenuUtils.UIMaterial(Color.white);
Handle.SetSizeDelta(Vector2.one);
((Graphic)Bar.AddComponent<Image>()).material = MenuUtils.UIMaterial((Color?)new Color(1f, 1f, 1f, 0.4f));
Scrollbar val = Bar.AddComponent<Scrollbar>();
val.direction = (Direction)2;
val.handleRect = MenuUtils.get_RectTransform(Handle);
Bar.SetAnchors(new Vector2(1f, 0.5f));
Bar.SetSizeDelta(new Vector2(7f, 825f));
base.ContentPane.SetAnchors(anchor);
((Graphic)Viewport.AddComponent<Image>()).material = MenuUtils.UIMaterial(Color.clear);
Viewport.AddComponent<RectMask2D>().softness = new Vector2Int(0, 100);
Viewport.SetAnchors(anchor);
Viewport.SetSizeDelta(new Vector2(1920f, 950f));
ScrollRect obj = ScrollPane.AddComponent<ScrollRect>();
obj.horizontal = false;
obj.vertical = true;
obj.verticalScrollbarVisibility = (ScrollbarVisibility)1;
obj.movementType = (MovementType)2;
obj.scrollSensitivity = 50f;
obj.viewport = MenuUtils.get_RectTransform(Viewport);
obj.content = MenuUtils.get_RectTransform(base.ContentPane);
obj.verticalScrollbar = val;
ScrollPane.SetAnchors(anchor);
ScrollPane.SetSizeDelta(new Vector2(1480f, 950f));
((Transform)MenuUtils.get_RectTransform(ScrollPane)).localPosition = new Vector3(0f, -40f, 0f);
((AbstractMenuScreen)this).OnShow += delegate(NavigationType navType)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
((AbstractMenuScreen)this).UpdateLayout();
((Component)((AbstractMenuScreen)this).SelectOnShow(navType)).GetComponent<ScrollNavHelper>().ScrollToInstant();
};
}
protected override IEnumerable<IMenuEntity> AllEntities()
{
return new <>z__ReadOnlySingleElementList<IMenuEntity>((IMenuEntity)(object)Content);
}
protected override SelectableElement? GetDefaultSelectableInternal()
{
return ((AbstractGroup)Content).GetDefaultSelectable();
}
protected override void UpdateLayout()
{
//IL_004f: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
MenuElement[] array = (from x in ((AbstractGroup)Content).AllElements()
where !Content.HideInactiveElements || x.Visibility.VisibleInHierarchy
select x).ToArray();
float num = Mathf.Max(825f, (float)array.Length * Content.VerticalSpacing) + 125f;
base.ContentPane.SetSizeDelta(new Vector2(1920f, num));
((AbstractGroup)Content).UpdateLayout(new Vector2(0f, num / 2f - 100f));
foreach (Selectable item in Content.AllSelectables())
{
Extensions.AddComponentIfNotPresent<ScrollNavHelper>(((Component)item).gameObject).Panes = (ScrollPane, Viewport, base.ContentPane);
}
INavigableExtensions.SetNeighborDown((INavigable)(object)Content, (Selectable)(object)base.BackButton);
INavigableExtensions.SetNeighborUp((INavigable)(object)Content, (Selectable)(object)base.BackButton);
MenuButton backButton = base.BackButton;
Navigation navigation = default(Navigation);
((Navigation)(ref navigation)).mode = (Mode)4;
((Navigation)(ref navigation)).wrapAround = false;
Selectable val = default(Selectable);
((Navigation)(ref navigation)).selectOnDown = (INavigableExtensions.GetNeighborDown((INavigable)(object)Content, ref val) ? val : null);
Selectable val2 = default(Selectable);
((Navigation)(ref navigation)).selectOnUp = (INavigableExtensions.GetNeighborUp((INavigable)(object)Content, ref val2) ? val2 : null);
((Selectable)backButton).navigation = navigation;
}
}
internal class ScrollNavHelper : EventTrigger
{
[CompilerGenerated]
private sealed class <<ScrollToSmooth>g__Coro|11_0>d : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public ScrollNavHelper <>4__this;
private float <y>5__2;
private AnimationCurve <curve>5__3;
private float <time>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <<ScrollToSmooth>g__Coro|11_0>d(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<curve>5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0039: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
int num = <>1__state;
ScrollNavHelper scrollNavHelper = <>4__this;
switch (num)
{
default:
return false;
case 0:
<>1__state = -1;
<y>5__2 = scrollNavHelper.GetScrollPoint();
<curve>5__3 = AnimationCurve.EaseInOut(0f, scrollNavHelper.scrollRect.normalizedPosition.y, 0.2f, <y>5__2);
<time>5__4 = 0f;
break;
case 1:
<>1__state = -1;
<time>5__4 += Time.deltaTime;
break;
}
if (<time>5__4 <= 0.2f)
{
scrollNavHelper.scrollRect.normalizedPosition = new Vector2(0f, <curve>5__3.Evaluate(<time>5__4));
<>2__current = null;
<>1__state = 1;
return true;
}
scrollNavHelper.scrollRect.normalizedPosition = new Vector2(0f, <y>5__2);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private RectTransform scroll;
private RectTransform viewport;
private RectTransform content;
private ScrollRect scrollRect;
private static Coroutine? scrollRoutine;
private const float SCROLL_TIME = 0.2f;
public (GameObject scroll, GameObject viewport, GameObject content) Panes
{
set
{
RectTransform val = MenuUtils.get_RectTransform(value.scroll);
RectTransform val2 = MenuUtils.get_RectTransform(value.viewport);
RectTransform val3 = MenuUtils.get_RectTransform(value.content);
scroll = val;
viewport = val2;
content = val3;
scrollRect = ((Component)scroll).GetComponent<ScrollRect>();
}
}
public override void OnScroll(PointerEventData eventData)
{
scrollRect.OnScroll(eventData);
}
public override void OnSelect(BaseEventData eventData)
{
//IL_000e: 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)
if (eventData is AxisEventData && !(content.sizeDelta.y <= viewport.sizeDelta.y))
{
ScrollToSmooth();
}
}
public void ScrollToInstant()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
scrollRect.normalizedPosition = new Vector2(0f, GetScrollPoint());
}
public void ScrollToSmooth()
{
if (scrollRoutine != null)
{
((MonoBehaviour)this).StopCoroutine(scrollRoutine);
}
scrollRoutine = ((MonoBehaviour)this).StartCoroutine(Coro());
[IteratorStateMachine(typeof(<<ScrollToSmooth>g__Coro|11_0>d))]
IEnumerator Coro()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <<ScrollToSmooth>g__Coro|11_0>d(0)
{
<>4__this = this
};
}
}
private float GetScrollPoint()
{
//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_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: 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_005c: 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)
Transform transform = ((Component)this).gameObject.transform;
float num = (content.sizeDelta.y - viewport.sizeDelta.y) / 2f;
Vector3 val = ((Transform)scroll).InverseTransformPoint(((Transform)content).position);
Vector3 val2 = ((Transform)scroll).InverseTransformPoint(transform.position);
return (Mathf.Clamp((val - val2).y, 0f - num, num) - num) / (2f * (0f - num));
}
}
internal class SubtitleLabel : TextLabel
{
public SubtitleLabel(LocalizedText text)
: base(text)
{
((MenuElement)this).SetFontSizes((FontSizes)2);
base.Text.fontStyle = (FontStyle)2;
((MenuElement)this).ApplyDefaultColors = true;
}
}
internal class WiderSliderElement<T> : SliderElement<T>
{
public WiderSliderElement(LocalizedText label, SliderModel<T> model)
: base(label, model)
{
//IL_004c: 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_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: 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_0100: 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_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: 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_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: 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_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01d6: 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_01ea: Unknown result type (might be due to invalid IL or missing references)
Vector2 anchor = default(Vector2);
((Vector2)(ref anchor))..ctor(1f, 0.5f);
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor(0f, 0.5f);
Vector2 anchorMax = default(Vector2);
((Vector2)(ref anchorMax))..ctor(0.5f, 1f);
Vector2 anchorMin = default(Vector2);
((Vector2)(ref anchorMin))..ctor(0.5f, 0f);
Vector2 anchor2 = Vector2.one * 0.5f;
RectTransform obj = MenuUtils.get_AsRect(((Transform)((MenuElement)this).RectTransform).Find("Slider"));
RectTransform val2 = MenuUtils.get_AsRect(((Transform)obj).Find("Menu Option Label"));
RectTransform val3 = MenuUtils.get_AsRect(((Transform)obj).Find("CursorHotspot"));
RectTransform val4 = MenuUtils.get_AsRect(((Transform)val3).Find("CursorLeft"));
RectTransform val5 = MenuUtils.get_AsRect(((Transform)val3).Find("CursorRight"));
RectTransform rectTransform = ((MenuElement)this).RectTransform;
Vector2 sizeDelta = ((MenuElement)this).RectTransform.sizeDelta;
sizeDelta.x = 720f;
rectTransform.sizeDelta = sizeDelta;
((Transform)(object)((MenuElement)this).RectTransform).SetAnchors(anchor2);
RectTransform rectTransform2 = ((MenuElement)this).RectTransform;
sizeDelta = ((MenuElement)this).RectTransform.anchoredPosition;
sizeDelta.x = 0f;
rectTransform2.anchoredPosition = sizeDelta;
((Transform)(object)obj).SetAnchors(anchor);
obj.anchoredPosition = Vector2.zero;
val2.anchorMin = Vector2.zero;
val2.anchorMax = Vector2.one;
val2.pivot = val;
val2.anchoredPosition = new Vector2(0f - 2f * ((MenuElement)this).RectTransform.offsetMax.x - 91f, 0f);
val3.anchorMax = anchorMax;
val3.anchorMin = anchorMin;
val3.anchoredPosition = new Vector2(((MenuElement)this).RectTransform.offsetMin.x, 0f);
val3.sizeDelta = new Vector2(1000f + ((MenuElement)this).RectTransform.offsetMax.x, 0f);
((Transform)(object)val4).SetAnchors(val);
val4.anchoredPosition = Vector2.zero;
((Transform)(object)val5).SetAnchors(anchor);
val5.anchoredPosition = Vector2.zero;
base.ValueText.alignByGeometry = true;
}
}
}
namespace EdgeDetection.Components
{
internal class ColliderVisualizer : ObjectVisualizer
{
private Collider2D collider;
private Lever? lever;
private Vector3 origScale;
private Mesh mesh;
private static readonly Shader shader = Shader.Find("Sprites/Default");
private static readonly Type[] validTriggerTypes = new Type[3]
{
typeof(BouncePod),
typeof(BounceBalloon),
typeof(DamageHero)
};
protected override void InitDupe()
{
//IL_0027: 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)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: 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_017b: Expected O, but got Unknown
((Object)base.dupe).name = ((Object)((Component)this).gameObject).name + " Collider";
origScale = ((Component)this).transform.lossyScale;
lever = ((Component)((Component)this).transform).GetComponent<Lever>();
collider = ((Component)((Component)this).transform).GetComponent<Collider2D>();
if (!Object.op_Implicit((Object)(object)collider) || (collider.isTrigger && !IsTriggerVisualizable(collider)))
{
return;
}
Object.Destroy((Object)(object)mesh);
mesh = collider.CreateMesh(true, true, true);
if (Object.op_Implicit((Object)(object)mesh))
{
mesh.vertices = mesh.vertices.Select((Vector3 v) => v - ((Component)this).transform.position).ToArray();
mesh.RotateVertices(Quaternion.Inverse(((Component)this).transform.rotation));
mesh.colors = Enumerable.Repeat<Color>(Color.white, mesh.vertexCount).ToArray();
if (Object.op_Implicit((Object)(object)((Component)((Component)this).transform).GetComponent<DamageHero>()))
{
base.dupe.layer = 11;
}
else
{
base.dupe.layer = ((Component)this).gameObject.layer;
}
base.dupe.AddComponent<MeshFilter>().mesh = mesh;
((Renderer)base.dupe.AddComponent<MeshRenderer>()).material = new Material(shader);
base.dupe.AddComponent<HideFromCamera>().hideFromMain = true;
}
}
protected override void UpdateDupe()
{
//IL_0053: 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_0064: 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)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)mesh))
{
InitDupe();
}
else if (!((Behaviour)collider).enabled || (Object.op_Implicit((Object)(object)lever) && lever.hitBlocked))
{
base.dupe.SetActive(false);
}
else
{
base.dupe.transform.localScale = Vector3.Scale(Vector3.one, Extensions.DivideElements(((Component)this).transform.lossyScale, origScale));
}
}
protected override void DestroyDupe()
{
Object.Destroy((Object)(object)mesh);
}
private static bool IsTriggerVisualizable(Collider2D collider)
{
Collider2D collider2 = collider;
if (!validTriggerTypes.Any((Type x) => Object.op_Implicit((Object)(object)((Component)collider2).GetComponent(x))))
{
PlayMakerFSM val = default(PlayMakerFSM);
if (((Component)collider2).TryGetComponent<PlayMakerFSM>(ref val))
{
return val.FsmName == "hornet_multi_wounder";
}
return false;
}
return true;
}
}
[RequireComponent(typeof(Camera))]
[RequireComponent(typeof(CameraShakeManager))]
public class EdgeDetectionPass : MonoBehaviour
{
[CompilerGenerated]
private string <Id>k__BackingField = "";
[CompilerGenerated]
private byte <LineWidth>k__BackingField = 1;
[CompilerGenerated]
private PhysLayers[] <Layers>k__BackingField = (PhysLayers[])(object)new PhysLayers[1] { (PhysLayers)9 };
private int layerMask = LayerMask.GetMask(new string[1] { LayerMask.LayerToName(9) });
[CompilerGenerated]
private float <AlphaThreshold>k__BackingField = 0.4f;
[CompilerGenerated]
private float <ClipFar>k__BackingField = 1.8f;
[CompilerGenerated]
private float <ClipNear>k__BackingField = 1.8f;
[CompilerGenerated]
private string <ExcludePass>k__BackingField = "";
internal static readonly Dictionary<string, EdgeDetectionPass> Passes = new Dictionary<string, EdgeDetectionPass>();
internal const byte WIDTH_MIN = 0;
internal const byte WIDTH_MAX = 16;
private Material silMat;
private Material edgeMat;
private Camera mainCam;
private Camera detectorCam;
private CameraShakeManager mainShaker;
private CameraShakeManager detectorShaker;
private static readonly int thresholdID = Shader.PropertyToID("_AlphaThreshold");
private static readonly int lineColorID = Shader.PropertyToID("_LineColor");
private static readonly int sceneTexID = Shader.PropertyToID("_SceneTex");
private static readonly int subtractTexID = Shader.PropertyToID("_SubtractTex");
private const int DETECT_PASS = 0;
private const int COMPOSITE_PASS = 1;
public string Id
{
get
{
return <Id>k__BackingField;
}
set
{
if (<Id>k__BackingField != value)
{
if (Passes.ContainsKey(value))
{
throw new InvalidOperationException("The Id must be unique.");
}
Passes.Remove(<Id>k__BackingField);
Passes.TryAdd(value, this);
<Id>k__BackingField = value;
}
}
}
public Color LineColor { get; set; } = Color.white;
public byte LineWidth
{
get
{
return <LineWidth>k__BackingField;
}
set
{
<LineWidth>k__BackingField = Math.Clamp(value, (byte)0, (byte)16);
}
}
public PhysLayers[] Layers
{
get
{
return <Layers>k__BackingField;
}
set
{
<Layers>k__BackingField = value;
layerMask = LayerMask.GetMask(<Layers>k__BackingField.Select((PhysLayers x) => LayerMask.LayerToName((int)x)).ToArray());
}
}
public bool HalfResolution { get; set; }
public float AlphaThreshold
{
get
{
return <AlphaThreshold>k__BackingField;
}
set
{
<AlphaThreshold>k__BackingField = Mathf.Clamp01(value);
}
}
public float ClipFar
{
get
{
return <ClipFar>k__BackingField;
}
set
{
<ClipFar>k__BackingField = Mathf.Max(0f, value);
}
}
public float ClipNear
{
get
{
return <ClipNear>k__BackingField;
}
set
{
<ClipNear>k__BackingField = Mathf.Max(0f, value);
}
}
public string ExcludePass
{
get
{
return <ExcludePass>k__BackingField;
}
set
{
<ExcludePass>k__BackingField = value ?? "";
}
}
private void Start()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Expected O, but got Unknown
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Expected O, but got Unknown
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Expected O, but got Unknown
Passes.TryAdd(Id, this);
mainCam = ((Component)this).GetComponent<Camera>();
GameObject val = new GameObject(Id + " Edge Detection Camera");
Extensions.SetParentReset(val.transform, ((Component)this).transform);
detectorCam = Extensions.AddComponentIfNotPresent<Camera>(val);
((Behaviour)detectorCam).enabled = false;
mainShaker = ((Component)this).GetComponent<CameraShakeManager>();
detectorShaker = Extensions.AddComponentIfNotPresent<CameraShakeManager>(val);
mainShaker.CopyTo(val);
val.AddComponent<EdgeDetector>().Settings = this;
edgeMat = new Material(EdgeDetectionPlugin.EdgeDetectionShader);
silMat = new Material(EdgeDetectionPlugin.SilhouetteShader);
}
private void OnDestroy()
{
Object.DestroyImmediate((Object)(object)((Component)detectorCam).gameObject);
Object.DestroyImmediate((Object)(object)silMat);
Object.DestroyImmediate((Object)(object)edgeMat);
Passes.Remove(Id);
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
if (LineWidth < 1)
{
Graphics.Blit((Texture)(object)source, destination);
return;
}
int num = ((!HalfResolution) ? 1 : 2);
int width = ((Texture)source).width / num;
int height = ((Texture)source).height / num;
RenderTexture[] emptyTemporaryTextures = GetEmptyTemporaryTextures(3, width, height);
if (TryGetExcludePass(out EdgeDetectionPass other))
{
other.RenderSilhouette(emptyTemporaryTextures[2]);
edgeMat.SetTexture(subtractTexID, (Texture)(object)emptyTemporaryTextures[2]);
}
else
{
edgeMat.SetTexture(subtractTexID, (Texture)(object)Texture2D.blackTexture);
}
edgeMat.SetColor(lineColorID, LineColor);
edgeMat.SetTexture(sceneTexID, (Texture)(object)source);
RenderSilhouette(emptyTemporaryTextures[0]);
for (int i = 0; i < LineWidth; i++)
{
Graphics.Blit((Texture)(object)emptyTemporaryTextures[0], emptyTemporaryTextures[1], edgeMat, 0);
RenderTexture[] array = emptyTemporaryTextures;
RenderTexture val = emptyTemporaryTextures[1];
RenderTexture val2 = emptyTemporaryTextures[0];
emptyTemporaryTextures[0] = val;
array[1] = val2;
}
Graphics.Blit((Texture)(object)emptyTemporaryTextures[0], destination, edgeMat, 1);
for (int j = 0; j < emptyTemporaryTextures.Length; j++)
{
RenderTexture.ReleaseTemporary(emptyTemporaryTextures[j]);
}
}
internal void RenderSilhouette(RenderTexture output)
{
//IL_0023: 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_009c: Unknown result type (might be due to invalid IL or missing references)
detectorCam.CopyFrom(mainCam);
detectorCam.clearFlags = (CameraClearFlags)2;
detectorCam.backgroundColor = Color.clear;
detectorCam.cullingMask = layerMask;
if ((Object)(object)detectorShaker.cameraTypeReference != (Object)(object)mainShaker.cameraTypeReference)
{
mainShaker.CopyTo(((Component)detectorCam).gameObject);
}
if (Object.op_Implicit((Object)(object)HeroController.instance))
{
float num = HeroController.instance.transform.position.z - ((Component)detectorCam).transform.position.z;
detectorCam.farClipPlane = num + ClipFar;
detectorCam.nearClipPlane = num - ClipNear;
}
else
{
detectorCam.farClipPlane = 42f;
detectorCam.nearClipPlane = 38f;
}
RenderTexture val = GetEmptyTemporaryTextures(1, ((Texture)output).width, ((Texture)output).height)[0];
detectorCam.targetTexture = val;
detectorCam.Render();
silMat.SetFloat(thresholdID, AlphaThreshold);
Graphics.Blit((Texture)(object)val, output, silMat);
detectorCam.targetTexture = null;
RenderTexture.ReleaseTemporary(val);
}
private bool TryGetExcludePass(out EdgeDetectionPass other)
{
other = null;
if (ExcludePass != "" && ExcludePass != Id)
{
return Passes.TryGetValue(ExcludePass, out other);
}
return false;
}
private static RenderTexture[] GetEmptyTemporaryTextures(int count, int width, int height)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
RenderTexture[] array = (RenderTexture[])(object)new RenderTexture[count];
RenderTexture active = RenderTexture.active;
for (int i = 0; i < count; i++)
{
array[i] = RenderTexture.GetTemporary(width, height, 32, (RenderTextureFormat)0);
RenderTexture.active = array[i];
GL.Clear(true, true, Color.clear);
}
RenderTexture.active = active;
return array;
}
}
[RequireComponent(typeof(Camera))]
public class EdgeDetector : MonoBehaviour
{
public EdgeDetectionPass Settings { get; internal set; }
}
[RequireComponent(typeof(Renderer))]
public class HideFromCamera : MonoBehaviour
{
public bool hideFromMain;
public bool hideFromEdgeDetectors;
public readonly HashSet<Camera> filteredCameras = new HashSet<Camera>();
private Renderer rend;
private void Start()
{
rend = ((Component)this).GetComponent<Renderer>();
}
private void OnDisable()
{
SetVisible(value: true);
}
private void OnWillRenderObject()
{
SetVisible(value: true);
if ((hideFromMain && (Object)(object)Camera.current == (Object)(object)GameCameras.instance.mainCamera) || (hideFromEdgeDetectors && Object.op_Implicit((Object)(object)((Component)Camera.current).GetComponent<EdgeDetector>())) || filteredCameras.Contains(Camera.current))
{
SetVisible(value: false);
}
}
private void SetVisible(bool value)
{
//IL_002b: 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_0030: 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_0072: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)rend))
{
Start();
}
if (Object.op_Implicit((Object)(object)rend))
{
Color color = (value ? Color.white : Color.clear);
if (Object.op_Implicit((Object)(object)rend.sharedMaterial))
{
rend.sharedMaterial.color = color;
}
else if (Object.op_Implicit((Object)(object)rend.material))
{
rend.material.color = color;
}
}
}
}
internal abstract class ObjectVisualizer : MonoBehaviour
{
private static GameObject dupeParent;
protected GameObject dupe { get; private set; }
private void Start()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected O, but got Unknown
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Expected O, but got Unknown
if (IsVisualizer(((Component)this).gameObject))
{
Object.Destroy((Object)(object)this);
return;
}
if (!Object.op_Implicit((Object)(object)dupeParent))
{
dupeParent = new GameObject("Edge Detection Visualizers");
Object.DontDestroyOnLoad((Object)(object)dupeParent);
Extensions.Reset(dupeParent.transform);
}
if (!Object.op_Implicit((Object)(object)dupe))
{
dupe = new GameObject();
Extensions.SetParentReset(dupe.transform, dupeParent.transform);
InitDupe();
}
}
private void OnEnable()
{
Start();
if (Object.op_Implicit((Object)(object)dupe) && ((Component)this).gameObject.activeInHierarchy)
{
dupe.SetActive(true);
}
}
private void Update()
{
//IL_0058: 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_007e: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)dupe))
{
Start();
}
if (Object.op_Implicit((Object)(object)dupe))
{
if (!((Component)this).gameObject.activeInHierarchy)
{
dupe.SetActive(false);
return;
}
dupe.SetActive(true);
dupe.transform.SetPositionAndRotation(((Component)this).transform.position, ((Component)this).transform.rotation);
dupe.transform.localScale = ((Component)this).transform.lossyScale;
UpdateDupe();
}
}
private void OnDisable()
{
if (Object.op_Implicit((Object)(object)dupe))
{
dupe.SetActive(false);
}
}
private void OnDestroy()
{
DestroyDupe();
Object.Destroy((Object)(object)dupe);
}
public static bool IsVisualizer(GameObject go)
{
return IsVisualizer(go.transform);
}
public static bool IsVisualizer(Transform t)
{
if (Object.op_Implicit((Object)(object)dupeParent))
{
if (!((Object)(object)t == (Object)(object)dupeParent.transform))
{
return (Object)(object)t.parent == (Object)(object)dupeParent.transform;
}
return true;
}
return false;
}
protected abstract void InitDupe();
protected abstract void UpdateDupe();
protected abstract void DestroyDupe();
}
internal class RemoveColliderVisualizer : MonoBehaviour
{
private const int MAX_TRIES = 10;
private int tries;
private void Awake()
{
TryRemove();
}
private void Start()
{
TryRemove();
}
private void Update()
{
TryRemove();
}
private void TryRemove()
{
tries++;
ColliderVisualizer colliderVisualizer = default(ColliderVisualizer);
if (((Component)this).TryGetComponent<ColliderVisualizer>(ref colliderVisualizer))
{
Object.Destroy((Object)(object)colliderVisualizer);
Object.Destroy((Object)(object)this);
}
if (tries > 10)
{
Object.Destroy((Object)(object)this);
}
}
}
internal class SpriteVisualizer : ObjectVisualizer
{
public PhysLayers layer;
private SpriteRenderer sprite;
private SpriteRenderer dupeSprite;
private tk2dSprite tk2d;
private tk2dSprite dupeTk2d;
private MeshRenderer dupeMesh;
private Material dupeMat;
protected override void InitDupe()
{
((Object)base.dupe).name = ((Object)((Component)this).gameObject).name + " Sprite";
if (((Component)this).TryGetComponent<SpriteRenderer>(ref sprite))
{
dupeSprite = base.dupe.AddComponent<SpriteRenderer>();
((Renderer)dupeSprite).materials = ((IEnumerable<Material>)((Renderer)sprite).materials).Select((Func<Material, Material>)((Material x) => new Material(x.shader))).ToArray();
}
else if (((Component)this).TryGetComponent<tk2dSprite>(ref tk2d))
{
base.dupe.AddComponent<MeshFilter>();
dupeMesh = base.dupe.AddComponent<MeshRenderer>();
dupeTk2d = base.dupe.AddComponent<tk2dSprite>();
}
if (Object.op_Implicit((Object)(object)sprite) || Object.op_Implicit((Object)(object)tk2d))
{
base.dupe.AddComponent<HideFromCamera>().hideFromMain = true;
}
}
protected override void UpdateDupe()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected I4, but got Unknown
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: 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_00f1: Expected O, but got Unknown
//IL_00f6: Expected O, but got Unknown
base.dupe.layer = (int)layer;
if (Object.op_Implicit((Object)(object)sprite))
{
dupeSprite.sprite = sprite.sprite;
dupeSprite.flipX = sprite.flipX;
dupeSprite.flipY = sprite.flipY;
}
else if (Object.op_Implicit((Object)(object)tk2d) && ((tk2dBaseSprite)tk2d).CurrentSprite != ((tk2dBaseSprite)dupeTk2d).CurrentSprite)
{
if (Object.op_Implicit((Object)(object)dupeMat))
{
Object.Destroy((Object)(object)dupeMat);
}
((tk2dBaseSprite)dupeTk2d).scale = ((tk2dBaseSprite)tk2d).scale;
((tk2dBaseSprite)dupeTk2d).SetSprite(((tk2dBaseSprite)tk2d).collection, ((tk2dBaseSprite)tk2d).spriteId);
MeshRenderer obj = dupeMesh;
Material val = new Material(((Renderer)dupeMesh).material);
Material material = val;
dupeMat = val;
((Renderer)obj).material = material;
}
}
protected override void DestroyDupe()
{
Object.Destroy((Object)(object)dupeMat);
}
}
}