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;
}
}
}