Decompiled source of Score Attack Local Training v1.1.0

ScoreAttackPlugin.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using CommonAPI;
using CommonAPI.Phone;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Reptile;
using Reptile.Phone;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Playables;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.6", FrameworkDisplayName = ".NET Framework 4.6")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: AssemblyCompany("ScoreAttackPlugin")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("My first plugin")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ScoreAttackPlugin")]
[assembly: AssemblyTitle("ScoreAttackPlugin")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ScoreAttack
{
	public class AppFPSLimit : CustomApp
	{
		public bool LimitFramerate = false;

		public int FpsLimit = 60;

		public int CurrentFps = 60;

		public override bool Available => false;

		public static void Initialize()
		{
			PhoneAPI.RegisterApp<AppFPSLimit>("fps select", (Sprite)null);
		}

		public override void OnAppInit()
		{
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateIconlessTitleBar("FPS Limit", 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("30 fps");
			SimplePhoneButton obj = val;
			((PhoneButton)obj).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(30);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 30! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("40 fps");
			SimplePhoneButton obj2 = val;
			((PhoneButton)obj2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj2).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(40);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 40! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("60 fps");
			SimplePhoneButton obj3 = val;
			((PhoneButton)obj3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj3).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(60);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 60! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("90 fps");
			SimplePhoneButton obj4 = val;
			((PhoneButton)obj4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj4).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(90);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 90! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("120 fps");
			SimplePhoneButton obj5 = val;
			((PhoneButton)obj5).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj5).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(120);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 120! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("144 fps");
			SimplePhoneButton obj6 = val;
			((PhoneButton)obj6).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj6).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(144);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 144! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("240 fps");
			SimplePhoneButton obj7 = val;
			((PhoneButton)obj7).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj7).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(240);
				Core.Instance.UIManager.ShowNotification("FPS Limit has been set to 240! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Unlimited");
			SimplePhoneButton obj8 = val;
			((PhoneButton)obj8).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj8).OnConfirm, (Action)delegate
			{
				SetTargetFrameRate(-1);
				Core.Instance.UIManager.ShowNotification("Your FPS has no limits! Make sure VSync is off for it to go into effect.", Array.Empty<string>());
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		private void SetTargetFrameRate(int frameRate)
		{
			Application.targetFrameRate = frameRate;
			ScoreAttackSaveData.Instance.TargetFrameRate = frameRate;
		}
	}
	public class AppMoveStyle : CustomApp
	{
		private Player player;

		private WorldHandler world;

		private bool coreHasBeenSetup;

		public override bool Available => false;

		public static void Initialize()
		{
			PhoneAPI.RegisterApp<AppMoveStyle>("move styles", (Sprite)null);
		}

		public override void OnAppInit()
		{
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateIconlessTitleBar("Change Style", 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			player = WorldHandler.instance.GetCurrentPlayer();
			world = WorldHandler.instance;
			coreHasBeenSetup = (Object)(object)player != (Object)null && (Object)(object)world != (Object)null;
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Skateboard");
			SimplePhoneButton obj = val;
			((PhoneButton)obj).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj).OnConfirm, (Action)delegate
			{
				if (coreHasBeenSetup)
				{
					SwapStyle((MoveStyle)2);
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Inline Skates");
			SimplePhoneButton obj2 = val;
			((PhoneButton)obj2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj2).OnConfirm, (Action)delegate
			{
				if (coreHasBeenSetup)
				{
					SwapStyle((MoveStyle)3);
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("BMX");
			SimplePhoneButton obj3 = val;
			((PhoneButton)obj3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj3).OnConfirm, (Action)delegate
			{
				if (coreHasBeenSetup)
				{
					SwapStyle((MoveStyle)1);
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		private void SwapStyle(MoveStyle newStyle)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)player != (Object)null)
			{
				Ability val = (Ability)Traverse.Create((object)player).Field("ability").GetValue();
				GrindAbility val2 = (GrindAbility)Traverse.Create((object)player).Field("grindAbility").GetValue();
				WallrunLineAbility val3 = (WallrunLineAbility)Traverse.Create((object)player).Field("wallrunAbility").GetValue();
				player.InitMovement(newStyle);
				if (val == val2)
				{
					player.SwitchToEquippedMovestyle(true, false, true, true);
				}
				else if (val == val3)
				{
					player.SwitchToEquippedMovestyle(true, true, true, true);
				}
				else
				{
					player.SwitchToEquippedMovestyle(true, true, true, true);
				}
			}
		}
	}
	public class AppPolice : CustomApp
	{
		private WantedManager wantedManager;

		public override bool Available => false;

		public static void Initialize()
		{
			PhoneAPI.RegisterApp<AppPolice>("remove police", (Sprite)null);
		}

		public override void OnAppInit()
		{
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateIconlessTitleBar("Wanted Level", 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Remove Police");
			SimplePhoneButton obj = val;
			((PhoneButton)obj).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj).OnConfirm, (Action)delegate
			{
				if (PlayerIsWanted())
				{
					wantedManager.StopPlayerWantedStatus(true);
				}
				Player currentPlayer = WorldHandler.instance.GetCurrentPlayer();
				currentPlayer.ResetHP();
				if (currentPlayer.AmountOfCuffs() > 0)
				{
					currentPlayer.RemoveAllCuffs((CuffMissileLauncher)null);
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Enable Cops");
			SimplePhoneButton obj2 = val;
			((PhoneButton)obj2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj2).OnConfirm, (Action)delegate
			{
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		public void Update()
		{
			wantedManager = WantedManager.instance;
		}

		public bool PlayerIsWanted()
		{
			if ((Object)(object)wantedManager != (Object)null)
			{
				return wantedManager.Wanted;
			}
			return false;
		}

		public void StopWantedStatus()
		{
			if (PlayerIsWanted())
			{
				Debug.Log((object)"Stopping wanted status...");
				wantedManager.StopPlayerWantedStatus(true);
			}
		}
	}
	public class AppScoreAttack : CustomApp
	{
		public static Encounter globalEncounter;

		private PhoneButton goToRespawnButton = null;

		private WantedManager wantedManager;

		public readonly Sprite EncounterIcon = TextureUtility.LoadSprite("encounter.png");

		public override bool Available => false;

		public static void Initialize()
		{
			PhoneAPI.RegisterApp<AppScoreAttack>("score atk", (Sprite)null);
		}

		public override void OnAppInit()
		{
			//IL_011e: 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_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: 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_0191: Unknown result type (might be due to invalid IL or missing references)
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateIconlessTitleBar("Select Length", 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("3 Minutes");
			SimplePhoneButton obj = val;
			((PhoneButton)obj).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj).OnConfirm, (Action)delegate
			{
				//IL_0045: 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_0050: Unknown result type (might be due to invalid IL or missing references)
				Debug.Log((object)"Starting 3 Minute Score Battle...");
				if (BannedMods.IsAdvantageousModLoaded())
				{
					Core.Instance.UIManager.ShowNotification("The score attack app is not compatible with TrickGod!", Array.Empty<string>());
				}
				else
				{
					BattleRefresh();
					Stage currentStage3 = Core.Instance.BaseModule.CurrentStage;
					RespawnPoint respawnPoint3 = ScoreAttackSaveData.Instance.GetRespawnPoint(currentStage3);
					if (respawnPoint3 == null)
					{
						Core.Instance.UIManager.ShowNotification("Please set a respawn point first!", Array.Empty<string>());
					}
					else
					{
						respawnPoint3.ApplyToPlayer(((App)this).MyPhone.player);
						ScoreAttackManager.StartScoreAttack(180f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
						ScoreAttackManager.StartScoreAttack(180f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
					}
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("5 Minutes");
			SimplePhoneButton obj2 = val;
			((PhoneButton)obj2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj2).OnConfirm, (Action)delegate
			{
				//IL_0045: 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_0050: Unknown result type (might be due to invalid IL or missing references)
				Debug.Log((object)"Starting 5 Minute Score Battle...");
				BattleRefresh();
				if (BannedMods.IsAdvantageousModLoaded())
				{
					Core.Instance.UIManager.ShowNotification("The score attack app is not compatible with TrickGod!", Array.Empty<string>());
				}
				else
				{
					Stage currentStage2 = Core.Instance.BaseModule.CurrentStage;
					RespawnPoint respawnPoint2 = ScoreAttackSaveData.Instance.GetRespawnPoint(currentStage2);
					if (respawnPoint2 == null)
					{
						Core.Instance.UIManager.ShowNotification("Please set a respawn point first!", Array.Empty<string>());
					}
					else
					{
						respawnPoint2.ApplyToPlayer(((App)this).MyPhone.player);
						ScoreAttackManager.StartScoreAttack(300f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
						ScoreAttackManager.StartScoreAttack(300f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
					}
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("10 Minutes");
			SimplePhoneButton obj3 = val;
			((PhoneButton)obj3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj3).OnConfirm, (Action)delegate
			{
				//IL_0045: 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_0050: Unknown result type (might be due to invalid IL or missing references)
				Debug.Log((object)"Starting 10 Minute Score Battle...");
				BattleRefresh();
				if (BannedMods.IsAdvantageousModLoaded())
				{
					Core.Instance.UIManager.ShowNotification("The score attack app is not compatible with TrickGod!", Array.Empty<string>());
				}
				else
				{
					Stage currentStage = Core.Instance.BaseModule.CurrentStage;
					RespawnPoint respawnPoint = ScoreAttackSaveData.Instance.GetRespawnPoint(currentStage);
					if (respawnPoint == null)
					{
						Core.Instance.UIManager.ShowNotification("Please set a respawn point first!", Array.Empty<string>());
					}
					else
					{
						respawnPoint.ApplyToPlayer(((App)this).MyPhone.player);
						ScoreAttackManager.StartScoreAttack(600f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
						ScoreAttackManager.StartScoreAttack(600f);
						((App)this).MyPhone.CloseCurrentApp();
						((App)this).MyPhone.TurnOff(false);
					}
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Cancel Run");
			SimplePhoneButton obj4 = val;
			((PhoneButton)obj4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj4).OnConfirm, (Action)delegate
			{
				Debug.Log((object)"Cancelling Active Battle...");
				if (ScoreAttackEncounter.IsScoreAttackActive())
				{
					ScoreAttackEncounter scoreAttackEncounter2 = Object.FindObjectOfType<ScoreAttackEncounter>();
					scoreAttackEncounter2.EndScoreAttack();
					Core.Instance.SaveManager.SaveCurrentSaveSlot();
				}
				else
				{
					Core.Instance.UIManager.ShowNotification("There is no ongoing Score Battle run!", Array.Empty<string>());
				}
			});
			val.LabelUnselectedColor = Color.black;
			val.LabelSelectedColor = Color.red;
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Erase All Your Personal Bests");
			SimplePhoneButton obj5 = val;
			((PhoneButton)obj5).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj5).OnConfirm, (Action)delegate
			{
				Debug.Log((object)"Clearing Personal Bests...");
				ScoreAttackEncounter scoreAttackEncounter = Object.FindObjectOfType<ScoreAttackEncounter>();
				if ((Object)(object)scoreAttackEncounter != (Object)null)
				{
					if (ScoreAttackEncounter.IsScoreAttackActive())
					{
						Debug.LogError((object)"Can't clear PB during a battle!");
						Core.Instance.UIManager.ShowNotification("You are in a run! Cancel the run to clear your personal bests.", Array.Empty<string>());
					}
					else
					{
						scoreAttackEncounter.ClearPersonalBest();
						Core.Instance.UIManager.ShowNotification("Personal bests have been erased.", Array.Empty<string>());
					}
				}
				else
				{
					Debug.LogError((object)"ScoreAttackEncounter instance not found!");
				}
			});
			val.LabelUnselectedColor = Color.black;
			val.LabelSelectedColor = Color.red;
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		public static void InitializeEncounter()
		{
			globalEncounter = Object.FindObjectOfType<Encounter>();
			if ((Object)(object)globalEncounter == (Object)null)
			{
				Debug.LogError((object)"Error: Encounter object not found!");
			}
		}

		public static void BattleRefresh()
		{
			Player currentPlayer = WorldHandler.instance.GetCurrentPlayer();
			currentPlayer.boostCharge = currentPlayer.maxBoostCharge;
			Debug.Log((object)"Respawning Pickups...");
			Object.FindObjectsOfType<Pickup>().Where(delegate(Pickup pickup)
			{
				//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_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Invalid comparison between Unknown and I4
				PickUpType pickupType = pickup.pickupType;
				bool flag = (int)pickupType <= 1;
				return flag && (Object)(object)pickup.pickupObject != (Object)null;
			}).ToList()
				.ForEach(delegate(Pickup boost)
				{
					boost.SetPickupActive(true);
				});
			Debug.Log((object)"Restoring Vending Machines...");
			List<VendingMachine> list = (from vending in Object.FindObjectsOfType<VendingMachine>()
				where vending.rewardCount > 0
				select vending).ToList();
			foreach (VendingMachine item in list)
			{
				if (item.dropCount > 0)
				{
					item.dropCount = 0;
				}
			}
			foreach (VendingMachine item2 in list)
			{
				if (item2.rewardCount > 0)
				{
					item2.rewardCount = 0;
				}
			}
			foreach (VendingMachine item3 in list)
			{
				if (item3.firstHit)
				{
					item3.firstHit = false;
				}
			}
		}
	}
	public class AppScoreAttackOffline : CustomApp
	{
		private static Sprite IconSprite;

		private PhoneButton goToRespawnButton = null;

		private WantedManager wantedManager;

		public static void Initialize()
		{
			IconSprite = TextureUtility.LoadSprite(Path.Combine(ScoreAttackPlugin.Instance.Directory, "scoreIcon.png"));
			PhoneAPI.RegisterApp<AppScoreAttackOffline>("score atk", IconSprite);
		}

		public void UpdateGoToRespawnButton()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			Stage currentStage = Core.Instance.BaseModule.CurrentStage;
			RespawnPoint respawnPoint = ScoreAttackSaveData.Instance.GetRespawnPoint(currentStage);
			if (respawnPoint == null)
			{
				if (base.ScrollView.HasButton(goToRespawnButton))
				{
					base.ScrollView.RemoveButton(goToRespawnButton);
				}
			}
			else if (!base.ScrollView.HasButton(goToRespawnButton))
			{
				base.ScrollView.AddButton(goToRespawnButton);
			}
		}

		public override void OnAppEnable()
		{
			((App)this).OnAppEnable();
			UpdateGoToRespawnButton();
		}

		public override void OnAppInit()
		{
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateTitleBar("Score Attack", IconSprite, 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton("Start a Run...");
			SimplePhoneButton obj = val;
			((PhoneButton)obj).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj).OnConfirm, (Action)delegate
			{
				((App)this).MyPhone.OpenApp(typeof(AppScoreAttack));
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Go to Stage...");
			SimplePhoneButton obj2 = val;
			((PhoneButton)obj2).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj2).OnConfirm, (Action)delegate
			{
				((App)this).MyPhone.OpenApp(typeof(AppScoreAttackStageSelect));
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Change Style...");
			SimplePhoneButton obj3 = val;
			((PhoneButton)obj3).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj3).OnConfirm, (Action)delegate
			{
				((App)this).MyPhone.OpenApp(typeof(AppMoveStyle));
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Refill Boost");
			SimplePhoneButton obj4 = val;
			((PhoneButton)obj4).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj4).OnConfirm, (Action)delegate
			{
				Player currentPlayer2 = WorldHandler.instance.GetCurrentPlayer();
				currentPlayer2.boostCharge = currentPlayer2.maxBoostCharge;
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Reset Capsules");
			SimplePhoneButton obj5 = val;
			((PhoneButton)obj5).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj5).OnConfirm, (Action)delegate
			{
				Debug.Log((object)"Respawning Pickups...");
				Object.FindObjectsOfType<Pickup>().Where(delegate(Pickup pickup)
				{
					//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_0007: Unknown result type (might be due to invalid IL or missing references)
					//IL_0009: Invalid comparison between Unknown and I4
					PickUpType pickupType = pickup.pickupType;
					bool flag = (int)pickupType <= 1;
					return flag && (Object)(object)pickup.pickupObject != (Object)null;
				}).ToList()
					.ForEach(delegate(Pickup boost)
					{
						boost.SetPickupActive(true);
					});
				Debug.Log((object)"Restoring Vending Machines...");
				List<VendingMachine> list = (from vending in Object.FindObjectsOfType<VendingMachine>()
					where vending.rewardCount > 0
					select vending).ToList();
				foreach (VendingMachine item in list)
				{
					if (item.dropCount > 0)
					{
						item.dropCount = 0;
					}
				}
				foreach (VendingMachine item2 in list)
				{
					if (item2.rewardCount > 0)
					{
						item2.rewardCount = 0;
					}
				}
				foreach (VendingMachine item3 in list)
				{
					if (item3.firstHit)
					{
						item3.firstHit = false;
					}
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Reset Cops");
			SimplePhoneButton obj6 = val;
			((PhoneButton)obj6).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj6).OnConfirm, (Action)delegate
			{
				if (PlayerIsWanted())
				{
					wantedManager.StopPlayerWantedStatus(true);
				}
				Player currentPlayer = WorldHandler.instance.GetCurrentPlayer();
				currentPlayer.ResetHP();
				if (currentPlayer.AmountOfCuffs() > 0)
				{
					currentPlayer.RemoveAllCuffs((CuffMissileLauncher)null);
				}
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = PhoneUIUtility.CreateSimpleButton("Set Respawn");
			SimplePhoneButton obj7 = val;
			((PhoneButton)obj7).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj7).OnConfirm, (Action)delegate
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				Stage currentStage2 = Core.Instance.BaseModule.CurrentStage;
				Vector3 position = ((Component)((App)this).MyPhone.player).transform.position;
				Quaternion rotation = ((Component)((App)this).MyPhone.player).transform.rotation;
				bool usingEquippedMovestyle = ((App)this).MyPhone.player.usingEquippedMovestyle;
				ScoreAttackSaveData.Instance.SetRespawnPoint(currentStage2, position, rotation, usingEquippedMovestyle);
				UpdateGoToRespawnButton();
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
			goToRespawnButton = (PhoneButton)(object)PhoneUIUtility.CreateSimpleButton("Go to Respawn");
			PhoneButton obj8 = goToRespawnButton;
			obj8.OnConfirm = (Action)Delegate.Combine(obj8.OnConfirm, (Action)delegate
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				Stage currentStage = Core.Instance.BaseModule.CurrentStage;
				ScoreAttackSaveData.Instance.GetRespawnPoint(currentStage)?.ApplyToPlayer(((App)this).MyPhone.player);
			});
			val = PhoneUIUtility.CreateSimpleButton("Set FPS Limit...");
			SimplePhoneButton obj9 = val;
			((PhoneButton)obj9).OnConfirm = (Action)Delegate.Combine(((PhoneButton)obj9).OnConfirm, (Action)delegate
			{
				((App)this).MyPhone.OpenApp(typeof(AppFPSLimit));
			});
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		public void Update()
		{
			wantedManager = WantedManager.instance;
		}

		public bool PlayerIsWanted()
		{
			if ((Object)(object)wantedManager != (Object)null)
			{
				return wantedManager.Wanted;
			}
			return false;
		}

		public void StopWantedStatus()
		{
			if (PlayerIsWanted())
			{
				wantedManager.StopPlayerWantedStatus(true);
			}
		}
	}
	public class AppScoreAttackStageSelect : CustomApp
	{
		public override bool Available => false;

		public static void Initialize()
		{
			PhoneAPI.RegisterApp<AppScoreAttackStageSelect>("stage select", (Sprite)null);
		}

		public override void OnAppInit()
		{
			((CustomApp)this).OnAppInit();
			((CustomApp)this).CreateIconlessTitleBar("Stage Select", 80f);
			base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f);
			SimplePhoneButton val = CreateStageButton("Hideout", (Stage)5);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Versum Hill", (Stage)4);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Millennium Square", (Stage)11);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Brink Terminal", (Stage)12);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Millennium Mall", (Stage)6);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Mataan", (Stage)7);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Pyramid Island", (Stage)9);
			base.ScrollView.AddButton((PhoneButton)(object)val);
			val = CreateStageButton("Police Station", (Stage)8);
			base.ScrollView.AddButton((PhoneButton)(object)val);
		}

		private SimplePhoneButton CreateStageButton(string label, Stage stage)
		{
			//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)
			SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton(label);
			((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				Core.Instance.BaseModule.StageManager.ExitCurrentStage(stage, (Stage)(-1));
			});
			return val;
		}
	}
	public class BannedMods : BaseUnityPlugin
	{
		private void Awake()
		{
			if (IsAdvantageousModLoaded())
			{
				Core.Instance.UIManager.ShowNotification("The score attack app is not compatible with TrickGod!", Array.Empty<string>());
			}
		}

		public static bool IsAdvantageousModLoaded()
		{
			return Chainloader.PluginInfos.ContainsKey("TrickGod");
		}
	}
	public class RespawnPoint
	{
		public Vector3 Position = Vector3.zero;

		public Quaternion Rotation = Quaternion.identity;

		public bool Gear = false;

		public RespawnPoint(Vector3 position, Quaternion rotation, bool gear)
		{
			//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_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			Position = position;
			Rotation = rotation;
			Gear = gear;
		}

		public void ApplyToPlayer(Player player)
		{
			//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)
			WorldHandler.instance.PlacePlayerAt(player, Position, Rotation, true);
			player.SwitchToEquippedMovestyle(Gear, false, true, true);
		}
	}
	public class ScoreAttackEncounter : Encounter
	{
		public float timeLimit = 40f;

		public float ScoreGot;

		private float timeLimitTimer;

		private CultureInfo cultureInfo;

		private float personalBestScore = 0f;

		private float displayBestScore = 0f;

		private float countdownTimer = 3f;

		private bool isCountdownFinished = false;

		private bool isNewBestDisplayed = false;

		private static bool isScoreAttackActive;

		private Stage currentStage;

		public override void InitSceneObject()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			cultureInfo = CultureInfo.CurrentCulture;
			base.makeUnavailableDuringEncounter = (GameObject[])(object)new GameObject[0];
			base.introSequence = null;
			base.currentCheckpoint = -1;
			base.OnIntro = new UnityEvent();
			base.OnStart = new UnityEvent();
			base.OnOutro = new UnityEvent();
			base.OnCompleted = new UnityEvent();
			base.OnFailed = new UnityEvent();
			base.stopWantedOnStart = false;
			((Encounter)this).InitSceneObject();
		}

		public override void StartMainEvent()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			currentStage = Core.Instance.BaseModule.CurrentStage;
			base.player.grindAbility.trickTimer = 0f;
			isScoreAttackActive = true;
			base.player.score = 0f;
			ScoreGot = 0f;
			isCountdownFinished = false;
			countdownTimer = 3f;
			personalBestScore = ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).GetPersonalBest(timeLimit);
			if (personalBestScore == -1f)
			{
				personalBestScore = 0f;
				ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).SetPersonalBest(timeLimit, personalBestScore);
			}
			((Encounter)this).StartMainEvent();
		}

		public override void UpdateMainEvent()
		{
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			float scoreGot = ScoreGot;
			if (base.player.IsBusyWithSequence())
			{
				return;
			}
			if (!isCountdownFinished)
			{
				countdownTimer -= Core.dt;
				string text = Mathf.CeilToInt(countdownTimer).ToString();
				GameplayUI gameplay = Core.Instance.UIManager.gameplay;
				((TMP_Text)gameplay.timeLimitLabel).text = text + "...";
				if (countdownTimer <= 0f)
				{
					isCountdownFinished = true;
					timeLimitTimer = timeLimit;
					base.player.score = 0f;
					base.player.baseScore = 0f;
					base.player.scoreMultiplier = 0f;
				}
				return;
			}
			timeLimitTimer -= Core.dt;
			if (timeLimitTimer < 0f)
			{
				Core.Instance.AudioManager.PlaySfxUI((SfxCollectionID)19, (AudioClipID)680, 0f);
				isScoreAttackActive = false;
				timeLimitTimer = 0f;
			}
			ScoreGot = base.player.score + base.player.baseScore * base.player.scoreMultiplier;
			SetScoreUI();
			if (ScoreGot > personalBestScore)
			{
				personalBestScore = ScoreGot;
				ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).SetPersonalBest(timeLimit, personalBestScore);
				Core.Instance.SaveManager.SaveCurrentSaveSlot();
			}
			Core.Instance.SaveManager.SaveCurrentSaveSlot();
			if (personalBestScore != ScoreGot)
			{
				displayBestScore = personalBestScore;
			}
			else
			{
				displayBestScore = 0f;
			}
			if (timeLimitTimer > 0f)
			{
				((Encounter)this).UpdateMainEvent();
			}
			else
			{
				((Encounter)this).SetEncounterState((EncounterState)5);
			}
		}

		public void SetScoreUI()
		{
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			GameplayUI gameplay = Core.Instance.UIManager.gameplay;
			gameplay.challengeGroup.SetActive(true);
			if (!isCountdownFinished)
			{
				if (!isScoreAttackActive)
				{
					((TMP_Text)gameplay.timeLimitLabel).text = "";
					((TMP_Text)gameplay.targetScoreLabel).text = "";
					((TMP_Text)gameplay.totalScoreLabel).text = "";
					((TMP_Text)gameplay.targetScoreTitleLabel).text = "";
					((TMP_Text)gameplay.totalScoreTitleLabel).text = "";
				}
				else
				{
					((TMP_Text)gameplay.timeLimitLabel).text = Mathf.CeilToInt(countdownTimer).ToString();
					((TMP_Text)gameplay.targetScoreLabel).text = "";
					((TMP_Text)gameplay.totalScoreLabel).text = "";
					((TMP_Text)gameplay.targetScoreTitleLabel).text = "";
					((TMP_Text)gameplay.totalScoreTitleLabel).text = "";
				}
				isNewBestDisplayed = false;
				return;
			}
			string text = NiceTimerString(timeLimitTimer);
			((TMP_Text)gameplay.timeLimitLabel).text = text;
			if (ScoreGot > personalBestScore)
			{
				personalBestScore = ScoreGot;
				isNewBestDisplayed = true;
				ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).SetPersonalBest(timeLimit, personalBestScore);
				Core.Instance.SaveManager.SaveCurrentSaveSlot();
			}
			if (isNewBestDisplayed)
			{
				((TMP_Text)gameplay.targetScoreLabel).text = "New Best!";
			}
			else
			{
				((TMP_Text)gameplay.targetScoreLabel).text = FormattingUtility.FormatPlayerScore(cultureInfo, personalBestScore);
			}
			((TMP_Text)gameplay.totalScoreLabel).text = FormattingUtility.FormatPlayerScore(cultureInfo, ScoreGot);
			((TMP_Text)gameplay.targetScoreTitleLabel).text = "Personal Best:";
			((TMP_Text)gameplay.totalScoreTitleLabel).text = timeLimit / 60f + " Min. Score:";
		}

		public void EndScoreAttack()
		{
			//IL_0008: 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)
			personalBestScore = ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).GetPersonalBest(timeLimit);
			if (ScoreGot > personalBestScore)
			{
				personalBestScore = ScoreGot;
				ScoreAttackSaveData.Instance.GetOrCreatePersonalBest(currentStage).SetPersonalBest(timeLimit, personalBestScore);
			}
			Core.Instance.SaveManager.SaveCurrentSaveSlot();
			isScoreAttackActive = false;
			countdownTimer = 0f;
			isCountdownFinished = false;
			TurnOffScoreUI();
			((Encounter)this).SetEncounterState((EncounterState)6);
		}

		public void TurnOffScoreUI()
		{
			GameplayUI gameplay = Core.Instance.UIManager.gameplay;
			gameplay.challengeGroup.SetActive(false);
			((TMP_Text)gameplay.timeLimitLabel).text = "";
			((TMP_Text)gameplay.targetScoreLabel).text = "";
			((TMP_Text)gameplay.totalScoreLabel).text = "";
			((TMP_Text)gameplay.targetScoreTitleLabel).text = "";
			((TMP_Text)gameplay.totalScoreTitleLabel).text = "";
		}

		private string NiceTimerString(float timer)
		{
			string text = timer.ToString();
			int num = ((int)timer).ToString().Length + 3;
			if (text.Length > num)
			{
				text = text.Remove(num);
			}
			if (timer == 0f)
			{
				text = "0.00";
			}
			return text;
		}

		public override void EnterEncounterState(EncounterState setState)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Invalid comparison between Unknown and I4
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			if ((int)setState == 0 || (int)setState == 2 || (int)setState == 1)
			{
				TurnOffScoreUI();
			}
			else
			{
				SetScoreUI();
			}
			((Encounter)this).EnterEncounterState(setState);
		}

		public override void ReadFromData()
		{
		}

		public override void WriteToData()
		{
		}

		public static bool IsScoreAttackActive()
		{
			return isScoreAttackActive;
		}

		public void ClearPersonalBest()
		{
			foreach (ScoreAttackSaveData.PersonalBest value in ScoreAttackSaveData.Instance.PersonalBestByStage.Values)
			{
				value.PersonalBestByTimeLimit.Clear();
			}
			Core.Instance.SaveManager.SaveCurrentSaveSlot();
			Core.Instance.UIManager.ShowNotification("All personal bests have been erased.", Array.Empty<string>());
		}

		public override void SetEncounterState(EncounterState setState)
		{
			//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)
			//IL_0019: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected I4, but got Unknown
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Invalid comparison between Unknown and I4
			base.stateTimer = 0f;
			base.state = setState;
			EncounterState state = base.state;
			EncounterState val = state;
			switch ((int)val)
			{
			case 0:
				((Encounter)this).EnterEncounterState((EncounterState)0);
				if ((Object)(object)WorldHandler.instance.currentEncounter == (Object)(object)this)
				{
					WorldHandler.instance.MakeStuffAvailableAgainCauseEncounterOver();
				}
				if ((Object)(object)base.player.phone != (Object)null)
				{
					base.player.phone.AllowPhone(true, true, false);
				}
				break;
			case 1:
				((Encounter)this).EnterEncounterState((EncounterState)1);
				break;
			case 2:
				if ((int)((GameplayEvent)this).openOn == 1 && ((GameplayEvent)this).requirement != 0)
				{
					WorldHandler.instance.ResetRequiredREP();
				}
				((GameplayEvent)this).requirement = 0;
				((Encounter)this).EnterEncounterState((EncounterState)2);
				base.shownOpening = true;
				break;
			case 3:
				WorldHandler.instance.StartEncounter((Encounter)(object)this);
				base.currentlyActive = true;
				((Encounter)this).ChangeSkybox(true);
				base.player.phone.AllowPhone(base.allowPhone, true, false);
				((Encounter)this).EnterEncounterState((EncounterState)3);
				((Encounter)this).SetEncounterState((EncounterState)4);
				SequenceHandler.instance.LetPlayerExitSequence();
				((AProgressable)this).WriteToData();
				break;
			case 4:
				((Encounter)this).EnterEncounterState((EncounterState)4);
				((Encounter)this).StartMainEvent();
				break;
			case 5:
				base.win = true;
				((Encounter)this).EnterEncounterState((EncounterState)5);
				break;
			case 6:
				((Encounter)this).EnterEncounterState((EncounterState)6);
				break;
			case 7:
				((Encounter)this).EnterEncounterState((EncounterState)7);
				if ((Object)(object)WorldHandler.instance.currentEncounter == (Object)(object)this)
				{
					WorldHandler.instance.MakeStuffAvailableAgainCauseEncounterOver();
				}
				((Encounter)this).SetEncounterState((EncounterState)0);
				((Encounter)this).Complete((PlayableDirector)null);
				break;
			case 8:
				((Encounter)this).EnterEncounterState((EncounterState)8);
				((Encounter)this).Fail((PlayableDirector)null);
				if (base.restartImmediatelyOnFail)
				{
					((Encounter)this).ActivateEncounterInstantIntro();
					break;
				}
				if ((Object)(object)WorldHandler.instance.currentEncounter == (Object)(object)this)
				{
					WorldHandler.instance.MakeStuffAvailableAgainCauseEncounterOver();
				}
				((Encounter)this).SetEncounterState((EncounterState)0);
				break;
			}
		}
	}
	public static class ScoreAttackManager
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static StageInitializationDelegate <0>__OnStagePreInitialization;
		}

		public static ScoreAttackEncounter Encounter;

		private const string UID = "ea696dc2-28cb-46c4-abfa-4193199b7e98";

		internal static void Initialize()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			//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_0021: Expected O, but got Unknown
			StageInitializationDelegate onStagePreInitialization = StageAPI.OnStagePreInitialization;
			object obj = <>O.<0>__OnStagePreInitialization;
			if (obj == null)
			{
				StageInitializationDelegate val = OnStagePreInitialization;
				<>O.<0>__OnStagePreInitialization = val;
				obj = (object)val;
			}
			StageAPI.OnStagePreInitialization = (StageInitializationDelegate)Delegate.Combine((Delegate?)(object)onStagePreInitialization, (Delegate?)obj);
		}

		private static void OnStagePreInitialization(Stage newStage, Stage previousStage)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			GameObject val = new GameObject("Score Attack Encounter");
			Encounter = val.AddComponent<ScoreAttackEncounter>();
			((AProgressable)Encounter).uid = "ea696dc2-28cb-46c4-abfa-4193199b7e98";
		}

		public static void StartScoreAttack(float timeLimit)
		{
			Encounter.timeLimit = timeLimit;
			((Encounter)Encounter).ActivateEncounter();
		}
	}
	[BepInPlugin("ScoreAttackPlugin", "ScoreAttackPlugin", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ScoreAttackPlugin : BaseUnityPlugin
	{
		private const string CommonAPIGUID = "CommonAPI";

		public static ScoreAttackPlugin Instance { get; private set; }

		public string Directory => Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);

		private void Awake()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			Instance = this;
			new ScoreAttackSaveData();
			AppScoreAttackOffline.Initialize();
			AppScoreAttackStageSelect.Initialize();
			AppScoreAttack.Initialize();
			AppFPSLimit.Initialize();
			ScoreAttackManager.Initialize();
			AppMoveStyle.Initialize();
			Harmony val = new Harmony("ScoreAttackPlugin");
			val.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin ScoreAttackPlugin is loaded!");
		}
	}
	public class ScoreAttackSaveData : CustomSaveData
	{
		public class PersonalBest
		{
			public Dictionary<float, float> PersonalBestByTimeLimit = new Dictionary<float, float>();

			public float GetPersonalBest(float timeLimit)
			{
				if (PersonalBestByTimeLimit.TryGetValue(timeLimit, out var value))
				{
					return value;
				}
				return -1f;
			}

			public void SetPersonalBest(float timeLimit, float best)
			{
				PersonalBestByTimeLimit[timeLimit] = best;
			}
		}

		private readonly Dictionary<Stage, RespawnPoint> respawnPoints = new Dictionary<Stage, RespawnPoint>();

		public Dictionary<Stage, PersonalBest> PersonalBestByStage = new Dictionary<Stage, PersonalBest>();

		public static ScoreAttackSaveData Instance { get; private set; }

		public int TargetFrameRate { get; set; }

		public PersonalBest GetOrCreatePersonalBest(Stage stage)
		{
			//IL_0007: 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)
			if (PersonalBestByStage.TryGetValue(stage, out var value))
			{
				return value;
			}
			value = new PersonalBest();
			PersonalBestByStage[stage] = value;
			return value;
		}

		public ScoreAttackSaveData()
			: base("ScoreAttackPlugin", "{0}.data")
		{
			Instance = this;
		}

		public void SetRespawnPoint(Stage stage, Vector3 position, Quaternion rotation, bool gear)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			RespawnPoint value = new RespawnPoint(position, rotation, gear);
			respawnPoints[stage] = value;
			Core.Instance.SaveManager.SaveCurrentSaveSlot();
		}

		public RespawnPoint GetRespawnPoint(Stage stage)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			if (respawnPoints.TryGetValue(stage, out var value))
			{
				return value;
			}
			return null;
		}

		public override void Initialize()
		{
			respawnPoints.Clear();
		}

		public override void Read(BinaryReader reader)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: 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_00bd: 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)
			byte b = reader.ReadByte();
			int num = reader.ReadInt32();
			Vector3 position = default(Vector3);
			Quaternion rotation = default(Quaternion);
			for (int i = 0; i < num; i++)
			{
				Stage key = (Stage)reader.ReadInt32();
				float num2 = reader.ReadSingle();
				float num3 = reader.ReadSingle();
				float num4 = reader.ReadSingle();
				float num5 = reader.ReadSingle();
				float num6 = reader.ReadSingle();
				float num7 = reader.ReadSingle();
				float num8 = reader.ReadSingle();
				bool gear = reader.ReadBoolean();
				((Vector3)(ref position))..ctor(num2, num3, num4);
				((Quaternion)(ref rotation))..ctor(num5, num6, num7, num8);
				RespawnPoint value = new RespawnPoint(position, rotation, gear);
				respawnPoints[key] = value;
			}
			int num9 = reader.ReadInt32();
			for (int j = 0; j < num9; j++)
			{
				Stage key2 = (Stage)reader.ReadInt32();
				PersonalBest personalBest = new PersonalBest();
				int num10 = reader.ReadInt32();
				for (int k = 0; k < num10; k++)
				{
					float timeLimit = reader.ReadSingle();
					float best = reader.ReadSingle();
					personalBest.SetPersonalBest(timeLimit, best);
				}
				PersonalBestByStage[key2] = personalBest;
			}
			if (reader.BaseStream.Position < reader.BaseStream.Length)
			{
				TargetFrameRate = reader.ReadInt32();
				if (TargetFrameRate != -1)
				{
					Application.targetFrameRate = TargetFrameRate;
				}
			}
			else
			{
				TargetFrameRate = 60;
				Application.targetFrameRate = TargetFrameRate;
			}
		}

		public override void Write(BinaryWriter writer)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected I4, but got Unknown
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Expected I4, but got Unknown
			writer.Write((byte)0);
			writer.Write(respawnPoints.Count);
			foreach (KeyValuePair<Stage, RespawnPoint> respawnPoint in respawnPoints)
			{
				writer.Write((int)respawnPoint.Key);
				RespawnPoint value = respawnPoint.Value;
				writer.Write(value.Position.x);
				writer.Write(value.Position.y);
				writer.Write(value.Position.z);
				writer.Write(value.Rotation.x);
				writer.Write(value.Rotation.y);
				writer.Write(value.Rotation.z);
				writer.Write(value.Rotation.w);
				writer.Write(value.Gear);
			}
			writer.Write(PersonalBestByStage.Count);
			foreach (KeyValuePair<Stage, PersonalBest> item in PersonalBestByStage)
			{
				writer.Write((int)item.Key);
				PersonalBest value2 = item.Value;
				writer.Write(value2.PersonalBestByTimeLimit.Count);
				foreach (KeyValuePair<float, float> item2 in value2.PersonalBestByTimeLimit)
				{
					writer.Write(item2.Key);
					writer.Write(item2.Value);
				}
			}
			writer.Write(TargetFrameRate);
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "ScoreAttackPlugin";

		public const string PLUGIN_NAME = "ScoreAttackPlugin";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace ScoreAttack.Patches
{
	[HarmonyPatch(typeof(Player))]
	internal static class CornerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("LandCombo")]
		private static void LandCombo_Prefix(Player __instance)
		{
			Encounter currentEncounter = WorldHandler.instance.currentEncounter;
			if (__instance.IsComboing() && (Object)(object)currentEncounter != (Object)null && currentEncounter is ScoreAttackEncounter)
			{
				__instance.ClearMultipliersDone();
			}
		}
	}
	[HarmonyPatch(typeof(NPC))]
	internal static class NPCPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("SetAvailable")]
		private static bool SetAvailable_Prefix(bool set, NPC __instance)
		{
			Encounter currentEncounter = WorldHandler.instance.currentEncounter;
			if (!set && (Object)(object)currentEncounter != (Object)null && currentEncounter is ScoreAttackEncounter && ((GameplayEvent)__instance).available)
			{
				((GameplayEvent)__instance).available = false;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Phone))]
	internal static class PhonePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("PushNotification")]
		private static bool PushNotification_Prefix(App app)
		{
			Encounter currentEncounter = WorldHandler.instance.currentEncounter;
			if (((object)app).GetType().Name == "AppEncounters" && (Object)(object)currentEncounter != (Object)null && currentEncounter is ScoreAttackEncounter)
			{
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Player))]
	internal static class PlayerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("EndGraffitiMode")]
		private static void EndGraffitiMode_Prefix(ref Encounter __state)
		{
			Encounter currentEncounter = WorldHandler.instance.currentEncounter;
			if (currentEncounter is ScoreAttackEncounter)
			{
				__state = currentEncounter;
				WorldHandler.instance.currentEncounter = null;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("EndGraffitiMode")]
		private static void EndGraffitiMode_Postfix(ref Encounter __state)
		{
			if ((Object)(object)__state != (Object)null)
			{
				WorldHandler.instance.currentEncounter = __state;
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}