using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PluginConfig.API;
using PluginConfig.API.Fields;
using UnityEngine;
using UnityEngine.Networking;
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("KawKaw")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+35332e3f7ec0472d371186d5c1bd89eef12f9b9c")]
[assembly: AssemblyProduct("Kaw Kaw")]
[assembly: AssemblyTitle("KawKaw")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[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]
[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]
[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;
}
}
}
namespace KawKaw
{
[BepInPlugin("com.banana.kawkaw", "Kaw Kaw", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
public enum Character
{
KawKaw,
Flowery,
Queen,
ShadowMantle,
Random
}
public struct FrameSet
{
public List<Sprite> idle;
public List<Sprite> idleWhite;
}
public static EnumField<Character> character;
public static IntField amount;
private static List<GameObject> kawkaws = new List<GameObject>();
public static Texture2D kawKaw;
public static Texture2D kawKawwhite;
public const float SpriteScale = 3.75f;
private Harmony Harmony = new Harmony("com.banana.kawkaw");
public static BoolField TrailEnabled;
public static FloatField TrailLifetime;
public static FloatField HueShiftSpeed;
public static BoolField Muted;
public static FloatField MinPitch;
public static FloatField MaxPitch;
public static FloatField Volume;
public static BoolField PhysicsBounce;
public static FloatField restitution;
public static BoolField BounceOnOthers;
public static BoolField TriggerOnDamage;
public static BoolField TriggerEverySeconds;
public static FloatField TriggerInterval;
public static BoolField TriggerOnKey;
public static KeyCodeField TriggerKey;
private float triggerTimer;
private PluginConfigurator config;
private static GameObject sharedCanvasObj;
private static Dictionary<Character, FrameSet> frameCache = new Dictionary<Character, FrameSet>();
private static Character[] concreteCharacters;
private static Dictionary<Character, List<AudioClip>> soundCache = new Dictionary<Character, List<AudioClip>>();
private static Dictionary<Character, bool> soundLoadInProgress = new Dictionary<Character, bool>();
private static Dictionary<Character, List<Action<List<AudioClip>>>> pendingCallbacks = new Dictionary<Character, List<Action<List<AudioClip>>>>();
private static Plugin instance;
internal static ManualLogSource Logger { get; private set; } = null;
public static Plugin Instance => instance;
private void Awake()
{
//IL_00be: 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)
Harmony.PatchAll();
Logger = ((BaseUnityPlugin)this).Logger;
Logger.LogInfo((object)"Plugin com.banana.kawkaw is loaded!");
((Object)((Component)this).gameObject).hideFlags = (HideFlags)4;
SetupConfigs();
FrameSet orLoadFrames = GetOrLoadFrames(Character.KawKaw);
kawKaw = ((orLoadFrames.idle.Count > 0) ? orLoadFrames.idle[0].texture : null);
kawKawwhite = ((orLoadFrames.idleWhite.Count > 0) ? orLoadFrames.idleWhite[0].texture : null);
config.icon = Sprite.Create(kawKaw, new Rect(0f, 0f, (float)((Texture)kawKaw).width, (float)((Texture)kawKaw).height), new Vector2(0.5f, 0.5f));
}
private void SetupConfigs()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Expected O, but got Unknown
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Expected O, but got Unknown
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Expected O, but got Unknown
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Expected O, but got Unknown
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Expected O, but got Unknown
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Expected O, but got Unknown
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Expected O, but got Unknown
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Expected O, but got Unknown
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Expected O, but got Unknown
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Expected O, but got Unknown
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Expected O, but got Unknown
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Expected O, but got Unknown
//IL_017c: Unknown result type (might be due to invalid IL or missing references)
//IL_0186: Expected O, but got Unknown
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Expected O, but got Unknown
//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Expected O, but got Unknown
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_01d1: Expected O, but got Unknown
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e7: Expected O, but got Unknown
//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0201: Expected O, but got Unknown
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_0217: Expected O, but got Unknown
//IL_0224: Unknown result type (might be due to invalid IL or missing references)
//IL_022e: Expected O, but got Unknown
//IL_023a: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Expected O, but got Unknown
config = PluginConfigurator.Create("Bouncing Deltarune", "com.banana.kawkaw");
amount = new IntField(config.rootPanel, "Count", "com.kawkaw.count", 0, false);
character = new EnumField<Character>(config.rootPanel, "Character", "com.kawkaw.character", Character.KawKaw, true);
ConfigPanel val = new ConfigPanel(config.rootPanel, "Physics", "com.physics.panel");
PhysicsBounce = new BoolField(val, "Physics Bounce", "com.physics.bounce", false, true);
BounceOnOthers = new BoolField(val, "Bounce on Other", "com.others.bounce", true, true);
restitution = new FloatField(val, "Restitution", "com.restitution", 1f, true);
ConfigPanel val2 = new ConfigPanel(config.rootPanel, "Sound Settings", "com.sound.settings.panel");
Muted = new BoolField(val2, "Muted", "com.sound.muted", false);
MinPitch = new FloatField(val2, "Minimum Pitch", "com.sound.minpitch", 0.9f);
MaxPitch = new FloatField(val2, "Maximum Pitch", "com.sound.maxpitch", 1.1f);
Volume = new FloatField(val2, "Volume", "com.sound.volume", 1f);
ConfigPanel val3 = new ConfigPanel(config.rootPanel, "Trail Settings", "com.kawkaw.panel.trail");
TrailEnabled = new BoolField(val3, "Enabled", "com.enabled.trail", true);
TrailLifetime = new FloatField(val3, "Lifetime", "com.lifetime.trail", 0.5f);
HueShiftSpeed = new FloatField(val3, "Hue Shift Speed", "com.hueshift.trail", 0.5f);
ConfigPanel val4 = new ConfigPanel(config.rootPanel, "Triggers", "com.triggers.panel");
TriggerOnDamage = new BoolField(val4, "On Damage", "com.trigger.damage", true);
TriggerEverySeconds = new BoolField(val4, "Every Few Seconds", "com.trigger.timer.enabled", false);
TriggerInterval = new FloatField(val4, "Interval", "com.trigger.timer.interval", 2f);
TriggerOnKey = new BoolField(val4, "On Key Press", "com.trigger.key.enabled", false);
TriggerKey = new KeyCodeField(val4, "Key", "com.trigger.key", (KeyCode)107);
amount.onValueChange += new IntValueChangeEventDelegate(Amount_onValueChange);
character.onValueChange += Character_onValueChange;
}
private void Amount_onValueChange(IntValueChangeEvent data)
{
if (kawkaws.Count == data.value)
{
return;
}
if (kawkaws.Count < data.value)
{
int num = data.value - kawkaws.Count;
for (int i = 0; i < num; i++)
{
CreateUI();
}
return;
}
int num2 = kawkaws.Count - data.value;
for (int j = 0; j < num2; j++)
{
GameObject val = kawkaws[0];
kawkaws.Remove(val);
Object.Destroy((Object)(object)val);
}
}
private static GameObject GetOrCreateCanvas()
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)sharedCanvasObj != (Object)null)
{
return sharedCanvasObj;
}
sharedCanvasObj = new GameObject("KawKawCanvas");
Canvas val = sharedCanvasObj.AddComponent<Canvas>();
val.overrideSorting = true;
val.sortingOrder = 32767;
val.renderMode = (RenderMode)0;
CanvasScaler val2 = sharedCanvasObj.AddComponent<CanvasScaler>();
val2.uiScaleMode = (ScaleMode)1;
val2.referenceResolution = new Vector2(1920f, 1080f);
val2.screenMatchMode = (ScreenMatchMode)0;
val2.matchWidthOrHeight = 0.5f;
sharedCanvasObj.AddComponent<GraphicRaycaster>();
Object.DontDestroyOnLoad((Object)(object)sharedCanvasObj);
return sharedCanvasObj;
}
private void Character_onValueChange(EnumValueChangeEvent<Character> data)
{
Logger.LogInfo((object)$"Character selection changed to {data.value}.");
Nyon.RefreshAllFrames();
}
private Texture2D LoadTextureFromResourceName(string resourceName)
{
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Expected O, but got Unknown
Assembly executingAssembly = Assembly.GetExecutingAssembly();
using Stream stream = executingAssembly.GetManifestResourceStream(resourceName);
if (stream == null)
{
Logger.LogWarning((object)("[ItemIcon] Resource not found: " + resourceName));
return null;
}
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
ImageConversion.LoadImage(val, array);
((Texture)val).filterMode = (FilterMode)0;
((Object)val).name = resourceName;
return val;
}
private List<Sprite> LoadFrameSet(string folder, bool whiteSuffix, Character ch)
{
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_0118: Unknown result type (might be due to invalid IL or missing references)
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string text = ch.ToString();
string str = "KawKaw.Characters." + text + "." + folder + ".";
string pattern = (whiteSuffix ? ("^" + Regex.Escape(str) + ".+_idle_(\\d+)_white\\.png$") : ("^" + Regex.Escape(str) + ".+_idle_(\\d+)\\.png$"));
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
SortedDictionary<int, Sprite> sortedDictionary = new SortedDictionary<int, Sprite>();
string[] manifestResourceNames = executingAssembly.GetManifestResourceNames();
foreach (string text2 in manifestResourceNames)
{
Match match = regex.Match(text2);
if (match.Success)
{
int key = int.Parse(match.Groups[1].Value);
Texture2D val = LoadTextureFromResourceName(text2);
if (!((Object)(object)val == (Object)null))
{
Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
((Object)val2).name = text2;
sortedDictionary[key] = val2;
}
}
}
return sortedDictionary.Values.ToList();
}
public FrameSet GetOrLoadFrames(Character ch)
{
if (frameCache.TryGetValue(ch, out var value))
{
return value;
}
FrameSet frameSet = new FrameSet
{
idle = LoadFrameSet("Normal", whiteSuffix: false, ch),
idleWhite = LoadFrameSet("White", whiteSuffix: true, ch)
};
if (frameSet.idle.Count == 0)
{
Logger.LogWarning((object)$"No idle frames found for character '{ch}'.");
}
if (frameSet.idleWhite.Count == 0)
{
Logger.LogWarning((object)$"No white idle frames found for character '{ch}'.");
}
if (frameSet.idle.Count > 0 || frameSet.idleWhite.Count > 0)
{
Logger.LogInfo((object)$"Loaded {frameSet.idle.Count} idle frames, {frameSet.idleWhite.Count} white idle frames for '{ch}'.");
}
frameCache[ch] = frameSet;
return frameSet;
}
public static Vector2 SizeForSprite(Sprite sprite)
{
//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_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_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: 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)
if ((Object)(object)sprite == (Object)null)
{
return new Vector2(150f, 105f);
}
Rect rect = sprite.rect;
float width = ((Rect)(ref rect)).width;
rect = sprite.rect;
return new Vector2(width, ((Rect)(ref rect)).height) * 3.75f;
}
private static Character[] ConcreteCharacters()
{
if (concreteCharacters == null)
{
concreteCharacters = (from Character c in Enum.GetValues(typeof(Character))
where c != Character.Random
select c).ToArray();
}
return concreteCharacters;
}
public static Character RandomConcreteCharacter()
{
Character[] array = ConcreteCharacters();
return array[Random.Range(0, array.Length)];
}
public static Character ResolveCharacter()
{
return (character.value == Character.Random) ? RandomConcreteCharacter() : character.value;
}
public static List<AudioClip> GetCachedSounds(Character ch)
{
List<AudioClip> value;
return soundCache.TryGetValue(ch, out value) ? value : null;
}
public static IEnumerator LoadSoundsForCharacter(Character ch, Action<List<AudioClip>> onLoaded = null)
{
if (soundCache.TryGetValue(ch, out List<AudioClip> cached))
{
onLoaded?.Invoke(cached);
yield break;
}
if (soundLoadInProgress.TryGetValue(ch, out var inProgress) && inProgress)
{
if (!pendingCallbacks.ContainsKey(ch))
{
pendingCallbacks[ch] = new List<Action<List<AudioClip>>>();
}
if (onLoaded != null)
{
pendingCallbacks[ch].Add(onLoaded);
}
yield break;
}
soundLoadInProgress[ch] = true;
Assembly assembly = Assembly.GetExecutingAssembly();
string prefix = $".Sounds.{ch}.";
string[] soundResourceNames = (from name in assembly.GetManifestResourceNames()
where name.Contains(prefix)
select name).ToArray();
List<AudioClip> loaded = new List<AudioClip>();
string[] array = soundResourceNames;
foreach (string resourceName in array)
{
AudioType audioType = GetAudioTypeFromName(resourceName);
if ((int)audioType == 0)
{
Logger.LogWarning((object)("Skipping unknown audio type: " + resourceName));
continue;
}
byte[] buffer;
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
if (stream == null)
{
Logger.LogWarning((object)("Resource not found: " + resourceName));
continue;
}
buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
}
string ext = Path.GetExtension(resourceName);
string tempPath = Path.Combine(Application.temporaryCachePath, Path.GetRandomFileName() + ext);
File.WriteAllBytes(tempPath, buffer);
UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip("file://" + tempPath, audioType);
try
{
yield return www.SendWebRequest();
if ((int)www.result != 1)
{
Logger.LogWarning((object)("Failed to load " + resourceName + ": " + www.error));
}
else
{
AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
((Object)clip).name = Path.GetFileNameWithoutExtension(resourceName);
loaded.Add(clip);
Logger.LogInfo((object)("Loaded sound: " + ((Object)clip).name));
}
}
finally
{
((IDisposable)www)?.Dispose();
}
try
{
File.Delete(tempPath);
}
catch
{
}
buffer = null;
}
if (loaded.Count == 0)
{
Logger.LogWarning((object)$"No sounds found for character '{ch}'.");
}
soundCache[ch] = loaded;
soundLoadInProgress[ch] = false;
onLoaded?.Invoke(loaded);
if (pendingCallbacks.TryGetValue(ch, out List<Action<List<AudioClip>>> waiters))
{
foreach (Action<List<AudioClip>> cb in waiters)
{
cb(loaded);
}
waiters.Clear();
}
Logger.LogInfo((object)$"Loaded {loaded.Count} sounds for '{ch}'.");
}
private static AudioType GetAudioTypeFromName(string resourceName)
{
//IL_0019: 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_004a: 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_0043: Unknown result type (might be due to invalid IL or missing references)
string text = resourceName.ToLowerInvariant();
if (text.EndsWith(".wav"))
{
return (AudioType)20;
}
if (text.EndsWith(".ogg"))
{
return (AudioType)14;
}
if (text.EndsWith(".mp3"))
{
return (AudioType)13;
}
return (AudioType)0;
}
private void Update()
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
if (TriggerOnKey.value && Input.GetKeyDown(TriggerKey.value))
{
IntField obj = amount;
int value = obj.value;
obj.value = value + 1;
CreateUI();
}
if (TriggerEverySeconds.value)
{
triggerTimer += Time.deltaTime;
if (triggerTimer >= TriggerInterval.value)
{
triggerTimer = 0f;
IntField obj2 = amount;
int value = obj2.value;
obj2.value = value + 1;
CreateUI();
}
}
}
public static void CreateUI()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: 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)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
Character character = ResolveCharacter();
FrameSet orLoadFrames = Instance.GetOrLoadFrames(character);
GameObject orCreateCanvas = GetOrCreateCanvas();
GameObject val = new GameObject("DVD");
val.SetActive(false);
val.transform.SetParent(orCreateCanvas.transform, false);
Image val2 = val.AddComponent<Image>();
((Graphic)val2).color = Color.white;
((Graphic)val2).raycastTarget = false;
if (orLoadFrames.idle.Count > 0)
{
val2.sprite = orLoadFrames.idle[0];
}
else if ((Object)(object)kawKaw != (Object)null)
{
val2.sprite = Sprite.Create(kawKaw, new Rect(0f, 0f, (float)((Texture)kawKaw).width, (float)((Texture)kawKaw).height), new Vector2(0.5f, 0.5f));
}
else
{
Logger.LogWarning((object)$"No sprite available for character '{character}'.");
}
RectTransform rectTransform = ((Graphic)val2).rectTransform;
rectTransform.sizeDelta = SizeForSprite(val2.sprite);
rectTransform.anchoredPosition = Vector2.zero;
Nyon nyon = val.AddComponent<Nyon>();
nyon.Setup(character, orLoadFrames.idle, orLoadFrames.idleWhite);
val.SetActive(true);
kawkaws.Add(val);
}
private void OnEnable()
{
instance = this;
}
}
[HarmonyPatch]
public class Patches
{
[HarmonyPatch(typeof(NewMovement), "GetHurt")]
[HarmonyPostfix]
public static void Dmg(int damage)
{
if (Plugin.TriggerOnDamage.value && damage > 1)
{
IntField amount = Plugin.amount;
int value = amount.value;
amount.value = value + 1;
Plugin.CreateUI();
}
}
}
public class NyonTria : MonoBehaviour
{
private float t = 1f;
private Image img;
private void Awake()
{
img = ((Component)this).GetComponent<Image>();
}
private void Update()
{
//IL_0047: 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_0060: Unknown result type (might be due to invalid IL or missing references)
t -= Time.deltaTime / Plugin.TrailLifetime.value;
if (t <= 0f)
{
Object.Destroy((Object)(object)((Component)this).gameObject);
return;
}
Color color = ((Graphic)img).color;
color.a = t;
((Graphic)img).color = color;
}
}
public class Nyon : MonoBehaviour
{
public static float gravity = 1500f;
public Vector2 velocity = new Vector2(400f, 300f);
public float hueSpeed = 0.5f;
private RectTransform rect;
private Canvas canvas;
private float hue;
private float trailTimer = 0f;
private const float trailInterval = 0.03f;
private AudioSource source;
private Image img;
public Plugin.Character character;
private List<Sprite> frames;
private List<Sprite> framesWhite;
private List<AudioClip> sounds;
public float frameRate = 10f;
private int currentFrame = 0;
private float frameTimer = 0f;
private static readonly List<Nyon> activeNyons = new List<Nyon>();
public RectTransform Rect => rect;
public void Setup(Plugin.Character ch, List<Sprite> idle, List<Sprite> idleWhite)
{
character = ch;
frames = idle;
framesWhite = idleWhite;
}
private void Awake()
{
//IL_0129: 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_0132: 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_013d: Unknown result type (might be due to invalid IL or missing references)
rect = ((Component)this).GetComponent<RectTransform>();
canvas = ((Component)this).GetComponentInParent<Canvas>();
img = ((Component)this).GetComponent<Image>();
if (frames == null)
{
character = Plugin.ResolveCharacter();
Plugin.FrameSet orLoadFrames = Plugin.Instance.GetOrLoadFrames(character);
frames = orLoadFrames.idle;
framesWhite = orLoadFrames.idleWhite;
}
if (frames != null && frames.Count > 0)
{
currentFrame = Random.Range(0, frames.Count);
img.sprite = frames[currentFrame];
ApplySizeForCurrentSprite();
}
frameTimer = Random.Range(0f, 1f / frameRate);
hue = Random.value;
source = ((Component)this).gameObject.AddComponent<AudioSource>();
float num = Random.Range(300f, 600f);
Vector2 val = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f));
velocity = ((Vector2)(ref val)).normalized * num;
activeNyons.Add(this);
sounds = Plugin.GetCachedSounds(character);
if (sounds == null)
{
((MonoBehaviour)this).StartCoroutine(Plugin.LoadSoundsForCharacter(character, delegate(List<AudioClip> loaded)
{
sounds = loaded;
}));
}
}
private void OnDestroy()
{
activeNyons.Remove(this);
}
private void ApplySizeForCurrentSprite()
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)rect == (Object)null) && !((Object)(object)img == (Object)null) && !((Object)(object)img.sprite == (Object)null))
{
rect.sizeDelta = Plugin.SizeForSprite(img.sprite);
}
}
public static void RefreshAllFrames()
{
foreach (Nyon n in activeNyons)
{
if ((Object)(object)n == (Object)null)
{
continue;
}
Plugin.Character ch = Plugin.ResolveCharacter();
Plugin.FrameSet orLoadFrames = Plugin.Instance.GetOrLoadFrames(ch);
n.character = ch;
n.frames = orLoadFrames.idle;
n.framesWhite = orLoadFrames.idleWhite;
n.sounds = Plugin.GetCachedSounds(ch);
if (n.sounds == null)
{
((MonoBehaviour)n).StartCoroutine(Plugin.LoadSoundsForCharacter(ch, delegate(List<AudioClip> loaded)
{
if ((Object)(object)n != (Object)null)
{
n.sounds = loaded;
}
}));
}
if (n.frames.Count > 0)
{
n.currentFrame %= n.frames.Count;
n.img.sprite = n.frames[n.currentFrame];
n.ApplySizeForCurrentSprite();
}
else
{
n.currentFrame = 0;
}
}
}
private void Bounce()
{
if (sounds != null && sounds.Count != 0)
{
AudioClip val = sounds[Random.Range(0, sounds.Count)];
source.volume = Plugin.Volume.value;
source.pitch = Random.Range(Plugin.MinPitch.value, Plugin.MaxPitch.value);
source.PlayOneShot(val);
}
}
private void AdvanceAnimation()
{
if (frames != null && frames.Count != 0)
{
frameTimer += Time.deltaTime;
float num = 1f / frameRate;
while (frameTimer >= num)
{
frameTimer -= num;
currentFrame = (currentFrame + 1) % frames.Count;
img.sprite = frames[currentFrame];
}
}
}
private void SpawnKawKawTrail(Vector3 pos)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0109: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
if (Plugin.TrailEnabled.value)
{
GameObject val = new GameObject("trail");
val.transform.SetParent(((Component)this).transform.parent, false);
val.transform.SetSiblingIndex(((Component)this).transform.GetSiblingIndex());
Image val2 = val.AddComponent<Image>();
((Graphic)val2).color = Color.HSVToRGB(hue, 1f, 1f);
Sprite val3 = null;
if (framesWhite != null && framesWhite.Count > 0)
{
int index = Mathf.Min(currentFrame, framesWhite.Count - 1);
val3 = framesWhite[index];
}
else if ((Object)(object)Plugin.kawKawwhite != (Object)null)
{
val3 = Sprite.Create(Plugin.kawKawwhite, new Rect(0f, 0f, (float)((Texture)Plugin.kawKawwhite).width, (float)((Texture)Plugin.kawKawwhite).height), new Vector2(0.5f, 0.5f));
}
if ((Object)(object)val3 == (Object)null)
{
Object.Destroy((Object)(object)val);
return;
}
val2.sprite = val3;
((Graphic)val2).raycastTarget = false;
RectTransform rectTransform = ((Graphic)val2).rectTransform;
rectTransform.sizeDelta = rect.sizeDelta;
rectTransform.anchoredPosition = Vector2.op_Implicit(pos);
val.AddComponent<NyonTria>();
}
}
private void Update()
{
//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_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_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: 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_0112: 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_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: 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_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_016f: 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_01e9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_0278: Unknown result type (might be due to invalid IL or missing references)
//IL_0208: Unknown result type (might be due to invalid IL or missing references)
//IL_020f: Unknown result type (might be due to invalid IL or missing references)
//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
hue += Time.deltaTime * Plugin.HueShiftSpeed.value;
if (hue > 1f)
{
hue -= 1f;
}
AdvanceAnimation();
if (Plugin.PhysicsBounce.value)
{
velocity.y -= gravity * Time.deltaTime;
}
RectTransform obj = rect;
obj.anchoredPosition += velocity * Time.deltaTime;
RectTransform component = ((Component)canvas).GetComponent<RectTransform>();
Rect val = component.rect;
Vector2 val2 = ((Rect)(ref val)).size * 0.5f;
Vector2 val3 = rect.sizeDelta * 0.5f;
Vector2 anchoredPosition = rect.anchoredPosition;
float num = (Plugin.PhysicsBounce.value ? (0f - Plugin.restitution.value) : (-1f));
if (anchoredPosition.x + val3.x > val2.x)
{
anchoredPosition.x = val2.x - val3.x;
velocity.x *= num;
Bounce();
}
else if (anchoredPosition.x - val3.x < 0f - val2.x)
{
anchoredPosition.x = 0f - val2.x + val3.x;
velocity.x *= num;
Bounce();
}
if (anchoredPosition.y + val3.y > val2.y)
{
anchoredPosition.y = val2.y - val3.y;
velocity.y *= num;
Bounce();
}
else if (anchoredPosition.y - val3.y < 0f - val2.y)
{
anchoredPosition.y = 0f - val2.y + val3.y;
velocity.y *= num;
Bounce();
if (Plugin.PhysicsBounce.value && Mathf.Abs(velocity.y) < 40f)
{
velocity.y = 250f;
}
}
rect.anchoredPosition = anchoredPosition;
if (Plugin.BounceOnOthers.value)
{
HandleNyonCollisions();
}
trailTimer += Time.deltaTime;
if (trailTimer >= 0.03f)
{
trailTimer = 0f;
SpawnKawKawTrail(Vector2.op_Implicit(anchoredPosition));
}
}
private void HandleNyonCollisions()
{
//IL_0052: 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_0067: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: 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_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: 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_0121: 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_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: 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)
//IL_014b: 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_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: 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_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Unknown result type (might be due to invalid IL or missing references)
for (int i = 0; i < activeNyons.Count; i++)
{
Nyon nyon = activeNyons[i];
if ((Object)(object)nyon == (Object)(object)this || (Object)(object)nyon == (Object)null || ((Object)nyon).GetInstanceID() < ((Object)this).GetInstanceID())
{
continue;
}
Vector2 val = rect.anchoredPosition - nyon.rect.anchoredPosition;
float num = (rect.sizeDelta.x + nyon.rect.sizeDelta.x) * 0.5f;
float magnitude = ((Vector2)(ref val)).magnitude;
if (magnitude < num && magnitude > 0.0001f)
{
Vector2 val2 = val / magnitude;
float num2 = num - magnitude;
RectTransform obj = rect;
obj.anchoredPosition += val2 * (num2 * 0.5f);
RectTransform obj2 = nyon.rect;
obj2.anchoredPosition -= val2 * (num2 * 0.5f);
Vector2 val3 = velocity - nyon.velocity;
float num3 = Vector2.Dot(val3, val2);
if (num3 < 0f)
{
Vector2 val4 = val2 * num3;
velocity -= val4;
nyon.velocity += val4;
Bounce();
nyon.Bounce();
}
}
}
}
}
internal static class MyPluginInfo
{
public const string PLUGIN_GUID = "com.banana.kawkaw";
public const string PLUGIN_NAME = "Kaw Kaw";
public const string PLUGIN_VERSION = "1.0.0";
}
}