Decompiled source of SkongGamemodes v1.2.0

SkongGamemodes.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using MonoMod.RuntimeDetour;
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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SkongGamemodes")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SkongGamemodes")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("eccc0ef6-90ab-45cb-b3dd-bcf95a22c08d")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.2.0.0")]
namespace SkongGamemodes;

[BepInPlugin("dervorce.hkss.gamemodemanager", "GameModeManager", "1.2.0")]
public class GameModeManagerPlugin : BaseUnityPlugin
{
	public static ManualLogSource LogSrc;

	public static GameModeManagerPlugin Instance { get; private set; }

	public GameModeManager Manager { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null)
		{
			Object.Destroy((Object)(object)this);
			return;
		}
		Instance = this;
		LogSrc = ((BaseUnityPlugin)this).Logger;
		Manager = ((Component)this).gameObject.AddComponent<GameModeManager>();
	}
}
public class GameModeManager : MonoBehaviour
{
	public class GameModeData
	{
		public bool Enabled;

		public string Name;

		public string Description;

		public Color? Color;

		public bool Steel;

		public Sprite Sprite;
	}

	[CompilerGenerated]
	private sealed class <SetupHooksCoroutine>d__14 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public GameModeManager <>4__this;

		private Exception <ex>5__1;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <SetupHooksCoroutine>d__14(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<ex>5__1 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Expected O, but got Unknown
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Expected O, but got Unknown
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				try
				{
					<>4__this._hookClearSaveFile = new Hook((MethodBase)AccessTools.Method(typeof(SaveSlotButton), "OnSubmit", (Type[])null, (Type[])null), (Delegate)new Action<Action<SaveSlotButton, BaseEventData>, SaveSlotButton, BaseEventData>(<>4__this.SaveSlotButton_OnSubmit_Hook));
					<>4__this._hookLoadGame = new Hook((MethodBase)AccessTools.Method(typeof(SaveSlotButton), "ClearSaveFile", (Type[])null, (Type[])null), (Delegate)new Action<Action<SaveSlotButton>, SaveSlotButton>(<>4__this.SaveSlotButton_ClearSaveFile_Hook));
					<>4__this._hookStartGameEventTrigger = new Hook((MethodBase)AccessTools.Method(typeof(StartGameEventTrigger), "OnSubmit", (Type[])null, (Type[])null), (Delegate)new Action<Action<StartGameEventTrigger, BaseEventData>, StartGameEventTrigger, BaseEventData>(<>4__this.StartGameEventTrigger_OnSubmit_Hook));
					SceneManager.sceneLoaded += <>4__this.OnSceneLoaded;
				}
				catch (Exception ex)
				{
					<ex>5__1 = ex;
					GameModeManagerPlugin.LogSrc.LogError((object)$"[Unknown Mode] Hook setup failed: {<ex>5__1}");
				}
				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 int SaveSlotIndex;

	private Hook _hookClearSaveFile;

	private Hook _hookLoadGame;

	private Hook _hookStartGameEventTrigger;

	private GameObject holderObject;

	private readonly List<GameModeData> modes = new List<GameModeData>();

	private bool hooksInitialized = false;

	public static GameModeManager Instance { get; private set; }

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
			return;
		}
		Instance = this;
		Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
	}

	public GameModeData Init(MonoBehaviour parent, string name, string desc, Color? color = null, bool steel = false, Sprite sprite = null)
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		GameModeData gameModeData = new GameModeData
		{
			Name = name,
			Description = desc,
			Color = color,
			Enabled = false,
			Steel = steel,
			Sprite = sprite
		};
		modes.Add(gameModeData);
		holderObject = new GameObject(name + "_Holder");
		Object.DontDestroyOnLoad((Object)(object)holderObject);
		if (!hooksInitialized)
		{
			hooksInitialized = true;
			((MonoBehaviour)this).StartCoroutine(SetupHooksCoroutine());
		}
		return gameModeData;
	}

	[IteratorStateMachine(typeof(<SetupHooksCoroutine>d__14))]
	private IEnumerator SetupHooksCoroutine()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <SetupHooksCoroutine>d__14(0)
		{
			<>4__this = this
		};
	}

	public void Dispose()
	{
		Hook hookLoadGame = _hookLoadGame;
		if (hookLoadGame != null)
		{
			hookLoadGame.Dispose();
		}
		Hook hookClearSaveFile = _hookClearSaveFile;
		if (hookClearSaveFile != null)
		{
			hookClearSaveFile.Dispose();
		}
		Hook hookStartGameEventTrigger = _hookStartGameEventTrigger;
		if (hookStartGameEventTrigger != null)
		{
			hookStartGameEventTrigger.Dispose();
		}
		SceneManager.sceneLoaded -= OnSceneLoaded;
		if ((Object)(object)holderObject != (Object)null)
		{
			Object.Destroy((Object)(object)holderObject);
		}
		modes.Clear();
	}

	private void SaveSlotButton_OnSubmit_Hook(Action<SaveSlotButton, BaseEventData> orig, SaveSlotButton self, BaseEventData eventData)
	{
		SaveSlotIndex = self.SaveSlotIndex;
		foreach (GameModeData mode in modes)
		{
			string text = $"{mode.Name}_{SaveSlotIndex}";
			mode.Enabled = PlayerPrefs.GetInt(text, 0) == 1;
		}
		orig(self, eventData);
	}

	private void StartGameEventTrigger_OnSubmit_Hook(Action<StartGameEventTrigger, BaseEventData> orig, StartGameEventTrigger self, BaseEventData eventData)
	{
		foreach (GameModeData mode in modes)
		{
			string text = $"{mode.Name}_{SaveSlotIndex}";
			if (((Object)self).name == mode.Name + "Button")
			{
				mode.Enabled = true;
				PlayerPrefs.SetInt(text, 1);
			}
			else
			{
				mode.Enabled = false;
				PlayerPrefs.SetInt(text, 0);
			}
		}
		PlayerPrefs.Save();
		orig(self, eventData);
	}

	private void SaveSlotButton_ClearSaveFile_Hook(Action<SaveSlotButton> orig, SaveSlotButton self)
	{
		foreach (GameModeData mode in modes)
		{
			string text = $"{mode.Name}_{self.SaveSlotIndex}";
			PlayerPrefs.SetInt(text, 0);
			mode.Enabled = false;
		}
		PlayerPrefs.Save();
		orig(self);
	}

	private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		if (!(((Scene)(ref scene)).name == "Menu_Title"))
		{
			return;
		}
		MenuScreen playModeMenuScreen = UIManager.instance.playModeMenuScreen;
		MakeScrollable(((Component)playModeMenuScreen).transform);
		foreach (GameModeData mode2 in modes)
		{
			HandleGameModeButton(mode2);
		}
	}

	private void MakeScrollable(Transform playModeMenu)
	{
		//IL_0111: 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_0135: 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_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Expected O, but got Unknown
		Transform val = playModeMenu.Find("Content");
		if (!((Object)(object)val == (Object)null))
		{
			VerticalLayoutGroup component = ((Component)val).GetComponent<VerticalLayoutGroup>();
			if ((Object)(object)component == (Object)null)
			{
				component = ((Component)val).gameObject.AddComponent<VerticalLayoutGroup>();
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false;
				((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).childControlHeight = true;
				((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true;
				((HorizontalOrVerticalLayoutGroup)component).spacing = 5f;
			}
			ContentSizeFitter component2 = ((Component)val).GetComponent<ContentSizeFitter>();
			if ((Object)(object)component2 == (Object)null)
			{
				component2 = ((Component)val).gameObject.AddComponent<ContentSizeFitter>();
				component2.verticalFit = (FitMode)2;
				component2.horizontalFit = (FitMode)0;
			}
			Transform val2 = playModeMenu.Find("Viewport");
			if ((Object)(object)val2 == (Object)null)
			{
				GameObject val3 = new GameObject("Viewport", new Type[2]
				{
					typeof(RectTransform),
					typeof(RectMask2D)
				});
				val3.transform.SetParent(playModeMenu, false);
				val2 = val3.transform;
			}
			RectTransform component3 = ((Component)val2).GetComponent<RectTransform>();
			component3.anchorMin = new Vector2(0f, 0.15f);
			component3.anchorMax = new Vector2(1f, 0.8f);
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			val.SetParent(val2, false);
			ScrollRect val4 = ((Component)playModeMenu).GetComponent<ScrollRect>();
			if ((Object)(object)val4 == (Object)null)
			{
				val4 = ((Component)playModeMenu).gameObject.AddComponent<ScrollRect>();
			}
			val4.content = ((Component)val).GetComponent<RectTransform>();
			val4.viewport = component3;
			val4.horizontal = false;
			val4.vertical = true;
			val4.movementType = (MovementType)2;
			val4.scrollSensitivity = 30f;
		}
	}

	private void HandleGameModeButton(GameModeData modeData)
	{
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Invalid comparison between Unknown and I4
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: Invalid comparison between Unknown and I4
		//IL_020a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0247: Unknown result type (might be due to invalid IL or missing references)
		//IL_0263: Unknown result type (might be due to invalid IL or missing references)
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_0287: Unknown result type (might be due to invalid IL or missing references)
		if (modeData == null)
		{
			return;
		}
		MenuScreen playModeMenuScreen = UIManager.instance.playModeMenuScreen;
		string baseButtonName = (modeData.Steel ? "SteelButton" : "NormalButton");
		Transform val = ((IEnumerable<Transform>)((Component)playModeMenuScreen).GetComponentsInChildren<Transform>(true)).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name == baseButtonName));
		if ((Object)(object)val == (Object)null)
		{
			GameModeManagerPlugin.LogSrc.LogWarning((object)("[" + modeData.Name + "] " + baseButtonName + " not found!"));
			return;
		}
		GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, val.parent);
		((Object)val2).name = modeData.Name + "Button";
		val2.transform.SetSiblingIndex(val.GetSiblingIndex() + 1);
		Text val3 = ((IEnumerable<Text>)val2.GetComponentsInChildren<Text>(true)).FirstOrDefault((Func<Text, bool>)((Text t) => ((Object)t).name == "Text"));
		if ((Object)(object)val3 != (Object)null)
		{
			((Component)val3).gameObject.AddComponent<Localizator>().text = (((int)Language.CurrentLanguage() == 154) ? "." : modeData.Name);
		}
		Text val4 = ((IEnumerable<Text>)val2.GetComponentsInChildren<Text>(true)).FirstOrDefault((Func<Text, bool>)((Text t) => ((Object)t).name == "DescriptionText"));
		if ((Object)(object)val4 != (Object)null)
		{
			((Component)val4).gameObject.AddComponent<Localizator>().text = (((int)Language.CurrentLanguage() == 154) ? "." : modeData.Description);
		}
		Image val5 = ((IEnumerable<Image>)val2.GetComponentsInChildren<Image>(true)).FirstOrDefault((Func<Image, bool>)((Image i) => ((Object)i).name == "Image"));
		if ((Object)(object)val5 != (Object)null)
		{
			if (modeData.Color.HasValue)
			{
				((Graphic)val5).color = modeData.Color.Value;
			}
			if ((Object)(object)modeData.Sprite != (Object)null)
			{
				val5.sprite = modeData.Sprite;
				((Graphic)val5).rectTransform.anchorMin = new Vector2(0f, 0f);
				((Graphic)val5).rectTransform.anchorMax = new Vector2(0.475f, 1f);
				((Graphic)val5).rectTransform.offsetMin = Vector2.zero;
				((Graphic)val5).rectTransform.offsetMax = Vector2.zero;
			}
		}
	}
}
public class Localizator : MonoBehaviour
{
	public string text;

	private Text textComp;

	private void Awake()
	{
		textComp = ((Component)this).GetComponentInChildren<Text>(true);
	}

	private void OnEnable()
	{
		((MonoBehaviour)this).Invoke("ForceText", 0.02f);
	}

	private void ForceText()
	{
		if ((Object)(object)textComp != (Object)null)
		{
			textComp.text = text;
		}
	}
}