├── versions.txt
├── .github
├── FUNDING.yml
└── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
├── Tools
└── BiendeoCHLibValidator
│ ├── packages.config
│ ├── App.config
│ ├── IValidator.cs
│ ├── WrapperValidator.cs
│ ├── Properties
│ └── AssemblyInfo.cs
│ ├── BiendeoCHLibValidator.cs
│ └── BiendeoCHLibValidator.csproj
├── .editorconfig
├── BiendeoCHLib
├── Settings
│ ├── IGUIConfigurable.cs
│ ├── GUIConfigurationStyles.cs
│ ├── FormattableColorablePositionableLabel.cs
│ ├── ColorablePositionableLabel.cs
│ ├── KeyBind.cs
│ ├── ColorARGB.cs
│ └── PositionableLabel.cs
├── Patches
│ ├── Attributes
│ │ ├── HarmonyCHPrefix.cs
│ │ ├── HarmonyCHPostfix.cs
│ │ └── HarmonyCHPatch.cs
│ └── PatchBase.cs
├── Wrappers
│ ├── Attributes
│ │ ├── WrapperField.cs
│ │ ├── WrapperEnum.cs
│ │ ├── WrapperProperty.cs
│ │ ├── WrapperConstructor.cs
│ │ └── WrapperMethod.cs
│ ├── Enums.cs
│ ├── SoundEffectsManagerWrapper.cs
│ ├── CountdownWrapper.cs
│ ├── BarrelRollWrapper.cs
│ ├── ComboColorWrapper.cs
│ ├── CameraShakeWrapper.cs
│ ├── HighwayScrollWrapper.cs
│ ├── SpNeckRendererWrapper.cs
│ ├── BaseNoteRendererWrapper.cs
│ ├── BaseNeckControllerWrapper.cs
│ ├── PracticeUIWrapper.cs
│ ├── FrameRateWrapper.cs
│ ├── WrapperBase.cs
│ ├── StarPowerWrapper.cs
│ ├── SongEntryPropertyWrapper.cs
│ ├── PauseMenuWrapper.cs
│ ├── BaseGuitarPlayerWrapper.cs
│ ├── SongSelectWrapper.cs
│ ├── ConfirmationMenuWrapper.cs
│ ├── SongEntryWrapper.cs
│ ├── MoonNoteWrapper.cs
│ ├── SPBarWrapper.cs
│ ├── BassAudioManagerWrapper.cs
│ ├── CHPlayerWrapper.cs
│ ├── SoloCounterWrapper.cs
│ ├── SongDirectoryWrapper.cs
│ ├── ScoreManagerWrapper.cs
│ ├── FadeBehaviourWrapper.cs
│ ├── EndOfSongWrapper.cs
│ ├── MoonChartWrapper.cs
│ ├── MainMenuWrapper.cs
│ ├── INIParserWrapper.cs
│ ├── SongWrapper.cs
│ ├── GameManagerWrapper.cs
│ ├── StarProgressWrapper.cs
│ └── PlayerProfileWrapper.cs
├── Properties
│ └── AssemblyInfo.cs
├── BiendeoCHLib.cs
├── README.md
└── VersionCheck.cs
├── LegacyModLoader
├── LoaderInfo.cs
├── Properties
│ └── AssemblyInfo.cs
├── README.md
└── LegacyModLoader.csproj
├── GigChallenges
├── Challenges
│ ├── ChallengeFactory.cs
│ └── ScoreChallenge.cs
├── Interfaces
│ ├── IChallengeFactory.cs
│ └── IChallenge.cs
├── Properties
│ └── AssemblyInfo.cs
├── ChallengeBar.cs
├── GigChallenges.csproj
└── GigChallenges.cs
├── AccuracyIndicator
├── Components
│ └── DestroyOnSceneChange.cs
├── Properties
│ └── AssemblyInfo.cs
├── README.md
└── AccuracyIndicator.csproj
├── ExtraSongUI
├── Settings
│ └── SongUILabel.cs
├── Properties
│ └── AssemblyInfo.cs
└── ExtraSongUI.csproj
├── PerfectMode
├── Properties
│ └── AssemblyInfo.cs
├── README.md
└── PerfectMode.csproj
├── ComboIndicator
├── Properties
│ └── AssemblyInfo.cs
├── README.md
├── DancingText.cs
├── Settings
│ └── Config.cs
└── ComboIndicator.csproj
├── SplashTextEditor
├── Properties
│ └── AssemblyInfo.cs
├── SplashTextEditor.csproj
├── README.md
└── Settings
│ └── Config.cs
├── .gitattributes
├── appveyor.yml
└── README.md
/versions.txt:
--------------------------------------------------------------------------------
1 | v.23.2.2=1.5.2
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | custom: "https://paypal.me/Biendeo"
4 |
--------------------------------------------------------------------------------
/Tools/BiendeoCHLibValidator/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.cs]
2 |
3 | # CS0649: Field 'StarProgressWrapper.transform2Field' is never assigned to, and will always have its default value null
4 | dotnet_diagnostic.CS0649.severity = silent
5 |
--------------------------------------------------------------------------------
/Tools/BiendeoCHLibValidator/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Settings/IGUIConfigurable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace BiendeoCHLib.Settings {
6 | public interface IGUIConfigurable {
7 | void ConfigureGUI(GUIConfigurationStyles styles);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/Tools/BiendeoCHLibValidator/IValidator.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace BiendeoCHLibValidator {
8 | interface IValidator {
9 | bool AssertWorkingDirectory();
10 | bool Validate();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Patches/Attributes/HarmonyCHPrefix.cs:
--------------------------------------------------------------------------------
1 | using BepInEx.Logging;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace BiendeoCHLib.Patches.Attributes {
11 | public class HarmonyCHPrefix : Attribute {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Patches/Attributes/HarmonyCHPostfix.cs:
--------------------------------------------------------------------------------
1 | using BepInEx.Logging;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace BiendeoCHLib.Patches.Attributes {
11 | public class HarmonyCHPostfix : Attribute {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Attributes/WrapperField.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 | using System.Text;
5 |
6 | namespace BiendeoCHLib.Wrappers.Attributes {
7 | public sealed class WrapperField : Attribute {
8 | public readonly string ObfuscatedName;
9 |
10 | public WrapperField(string obfuscatedName) {
11 | ObfuscatedName = obfuscatedName;
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Attributes/WrapperEnum.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace BiendeoCHLib.Wrappers.Attributes {
8 | public class WrapperEnum : Attribute {
9 | public readonly string ObfuscatedName;
10 |
11 | public WrapperEnum(string obfuscatedName) {
12 | ObfuscatedName = obfuscatedName;
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/LegacyModLoader/LoaderInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Reflection;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace LegacyModLoader {
9 | public class LoaderInfo {
10 | public Assembly Assembly;
11 | public Type LoaderType;
12 | public MethodInfo LoadTweakMethod;
13 | public MethodInfo UnloadTweakMethod;
14 | public object Instance;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Attributes/WrapperProperty.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 | using System.Text;
5 |
6 | namespace BiendeoCHLib.Wrappers.Attributes {
7 | public sealed class WrapperProperty : Attribute {
8 | public readonly string ObfuscatedName;
9 | public readonly BindingFlags BindingFlags;
10 |
11 | public WrapperProperty(string obfuscatedName) {
12 | ObfuscatedName = obfuscatedName;
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Attributes/WrapperConstructor.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 | using System.Text;
5 |
6 | namespace BiendeoCHLib.Wrappers.Attributes {
7 | public sealed class WrapperConstructor : Attribute {
8 | public readonly Type[] Types;
9 |
10 | public WrapperConstructor(Type[] types) {
11 | Types = types;
12 | }
13 |
14 | public WrapperConstructor() {
15 | Types = Array.Empty();
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/GigChallenges/Challenges/ChallengeFactory.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers;
2 | using GigChallenges.Interfaces;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace GigChallenges.Challenges {
10 | public class ChallengeFactory : IChallengeFactory {
11 | public IChallenge CreateChallenge(GameManagerWrapper gameManager) {
12 | return new ScoreChallenge(gameManager);
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/GigChallenges/Interfaces/IChallengeFactory.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace GigChallenges.Interfaces {
9 | interface IChallengeFactory {
10 | ///
11 | /// Creates a challenge given the game state. This should be run once after the game enters the Gameplay scene.
12 | ///
13 | ///
14 | ///
15 | IChallenge CreateChallenge(GameManagerWrapper gameManager);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Settings/GUIConfigurationStyles.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using UnityEngine;
5 |
6 | namespace BiendeoCHLib.Settings {
7 | public class GUIConfigurationStyles {
8 | public GUIStyle LargeLabel;
9 | public GUIStyle SmallLabel;
10 | public GUIStyle Window;
11 | public GUIStyle Toggle;
12 | public GUIStyle Button;
13 | public GUIStyle TextArea;
14 | public GUIStyle TextField;
15 | public GUIStyle Label;
16 | public GUIStyle Box;
17 | public GUIStyle HorizontalSlider;
18 | public GUIStyle HorizontalSliderThumb;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Settings/FormattableColorablePositionableLabel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Xml.Serialization;
5 | using UnityEngine;
6 |
7 | namespace BiendeoCHLib.Settings {
8 | [Serializable]
9 | public class FormattableColorablePositionableLabel : ColorablePositionableLabel {
10 | public string Format;
11 |
12 | public override void ConfigureGUI(GUIConfigurationStyles styles) {
13 | GUILayout.Label("Format:", styles.SmallLabel);
14 | Format = GUILayout.TextField(Format, styles.TextField);
15 | base.ConfigureGUI(styles);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: "[FEATURE] A brief description of the new feature"
5 | labels: enhancement, new tweak suggestion
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Additional context**
17 | Add any other context or screenshots about the feature request here.
18 |
--------------------------------------------------------------------------------
/AccuracyIndicator/Components/DestroyOnSceneChange.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using UnityEngine;
7 | using UnityEngine.SceneManagement;
8 |
9 | namespace AccuracyIndicator.Components {
10 | public class DestroyOnSceneChange : MonoBehaviour {
11 | private bool sceneChanged;
12 |
13 | void Start() {
14 | SceneManager.activeSceneChanged += delegate (Scene _, Scene __) {
15 | sceneChanged = true;
16 | };
17 | }
18 |
19 | void Update() {
20 | if (sceneChanged) {
21 | Destroy(gameObject);
22 | }
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Tools/BiendeoCHLibValidator/WrapperValidator.cs:
--------------------------------------------------------------------------------
1 | using BepInEx.Logging;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace BiendeoCHLibValidator {
9 | ///
10 | /// Validates the wrapper bound fields.
11 | ///
12 | class WrapperValidator : IValidator {
13 | private ManualLogSource logger;
14 | private bool valid;
15 |
16 | public WrapperValidator(ManualLogSource logger) {
17 | this.logger = logger;
18 | valid = true;
19 | }
20 |
21 | public bool AssertWorkingDirectory() {
22 | return true;
23 | }
24 |
25 | public bool Validate() {
26 | return valid;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Enums.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 |
8 | namespace BiendeoCHLib.Wrappers {
9 | [WrapperEnum("\u0312\u0318\u0312\u031C\u030E\u0316\u0315\u030F\u0314\u0314\u031B")]
10 | public enum Difficulty : sbyte {
11 | Easy,
12 | Medium,
13 | Hard,
14 | Expert
15 | }
16 |
17 | [WrapperEnum("\u0311\u0318\u0315\u030D\u0312\u031B\u0313\u030D\u0311\u030F\u0311")]
18 | public enum InstrumentType : sbyte {
19 | None = -1,
20 | Guitar,
21 | Bass,
22 | Rhythm,
23 | GuitarCoop,
24 | GHLGuitar,
25 | GHLBass,
26 | Drums,
27 | Keys,
28 | Band
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/ExtraSongUI/Settings/SongUILabel.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Settings;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using System.Xml.Serialization;
8 | using UnityEngine;
9 |
10 | namespace ExtraSongUI.Settings {
11 | public class SongUILabel : FormattableColorablePositionableLabel {
12 | [XmlIgnore]
13 | public int WindowId = UnityEngine.Random.Range(int.MinValue, int.MaxValue);
14 | public string Name;
15 |
16 | public override void ConfigureGUI(GUIConfigurationStyles styles) {
17 | GUILayout.Label("Name:", styles.SmallLabel);
18 | Name = GUILayout.TextField(Name, styles.TextField);
19 | base.ConfigureGUI(styles);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/SoundEffectsManagerWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Reflection;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 |
9 | namespace BiendeoCHLib.Wrappers {
10 | [Wrapper("\u031C\u0314\u030D\u0313\u0311\u0312\u0311\u0319\u0314\u031A\u030F")]
11 | public struct SoundEffectsManagerWrapper {
12 |
13 | #region Fields
14 |
15 | public static int SomeBool {
16 | get => (int)someBoolField.GetValue(null);
17 | set => someBoolField.SetValue(null, value);
18 | }
19 | [WrapperField("\u030D\u031C\u0313\u030D\u0313\u031B\u0310\u030F\u031A\u0311\u0313")]
20 | private static readonly FieldInfo someBoolField;
21 |
22 | #endregion
23 |
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Patches/PatchBase.cs:
--------------------------------------------------------------------------------
1 | using BepInEx.Logging;
2 | using BiendeoCHLib.Patches.Attributes;
3 | using HarmonyLib;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Text;
10 | using System.Threading.Tasks;
11 |
12 | namespace BiendeoCHLib.Patches {
13 | public abstract class PatchBase {
14 | public static void InitializePatches(Harmony harmony, Assembly assembly, ManualLogSource logger) {
15 | foreach (var type in assembly.GetTypes()) {
16 | var patch = type.GetCustomAttribute();
17 | if (patch != null) {
18 | logger.LogDebug($"Initialising patches with class {type.Name}");
19 | patch.InitializePatch(harmony, type, logger);
20 | }
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Settings/ColorablePositionableLabel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Xml.Serialization;
5 | using UnityEngine;
6 |
7 | namespace BiendeoCHLib.Settings {
8 | [Serializable]
9 | public class ColorablePositionableLabel : PositionableLabel {
10 | public ColorARGB Color;
11 |
12 | public override void ConfigureGUI(GUIConfigurationStyles styles) {
13 | base.ConfigureGUI(styles);
14 | Color.ConfigureGUI(styles);
15 | }
16 |
17 | public override GUIStyle Style => new GUIStyle {
18 | fontSize = Size,
19 | alignment = Alignment,
20 | fontStyle = (Bold ? FontStyle.Bold : FontStyle.Normal) | (Italic ? FontStyle.Italic : FontStyle.Normal),
21 | normal = new GUIStyleState {
22 | textColor = Color.Color
23 | }
24 | };
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/CountdownWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(Countdown))]
16 | public struct CountdownWrapper {
17 | public Countdown Countdown { get; private set; }
18 |
19 | public static CountdownWrapper Wrap(Countdown countdown) => new CountdownWrapper {
20 | Countdown = countdown
21 | };
22 |
23 | public override bool Equals(object obj) => Countdown.Equals(obj);
24 |
25 | public override int GetHashCode() => Countdown.GetHashCode();
26 |
27 | public bool IsNull() => Countdown == null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/BarrelRollWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(BarrelRoll))]
16 | public struct BarrelRollWrapper {
17 | public BarrelRoll BarrelRoll { get; private set; }
18 |
19 | public static BarrelRollWrapper Wrap(BarrelRoll barrelRoll) => new BarrelRollWrapper {
20 | BarrelRoll = barrelRoll
21 | };
22 |
23 | public override bool Equals(object obj) => BarrelRoll.Equals(obj);
24 |
25 | public override int GetHashCode() => BarrelRoll.GetHashCode();
26 |
27 | public bool IsNull() => BarrelRoll == null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/ComboColorWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(ComboColor))]
16 | public struct ComboColorWrapper {
17 | public ComboColor ComboColor { get; private set; }
18 |
19 | public static ComboColorWrapper Wrap(ComboColor comboColor) => new ComboColorWrapper {
20 | ComboColor = comboColor
21 | };
22 |
23 | public override bool Equals(object obj) => ComboColor.Equals(obj);
24 |
25 | public override int GetHashCode() => ComboColor.GetHashCode();
26 |
27 | public bool IsNull() => ComboColor == null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/CameraShakeWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(CameraShake))]
16 | public struct CameraShakeWrapper {
17 | public CameraShake CameraShake { get; private set; }
18 |
19 | public static CameraShakeWrapper Wrap(CameraShake cameraShake) => new CameraShakeWrapper {
20 | CameraShake = cameraShake
21 | };
22 |
23 | public override bool Equals(object obj) => CameraShake.Equals(obj);
24 |
25 | public override int GetHashCode() => CameraShake.GetHashCode();
26 |
27 | public bool IsNull() => CameraShake == null;
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/HighwayScrollWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(HighwayScroll))]
16 | public struct HighwayScrollWrapper {
17 | public HighwayScroll HighwayScroll { get; private set; }
18 |
19 | public static HighwayScrollWrapper Wrap(HighwayScroll highwayScroll) => new HighwayScrollWrapper {
20 | HighwayScroll = highwayScroll
21 | };
22 |
23 | public override bool Equals(object obj) => HighwayScroll.Equals(obj);
24 |
25 | public override int GetHashCode() => HighwayScroll.GetHashCode();
26 |
27 | public bool IsNull() => HighwayScroll == null;
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/SpNeckRendererWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(SpNeckRenderer))]
16 | public struct SpNeckRendererWrapper {
17 | public SpNeckRenderer SpNeckRenderer { get; private set; }
18 |
19 | public static SpNeckRendererWrapper Wrap(SpNeckRenderer spNeckRenderer) => new SpNeckRendererWrapper {
20 | SpNeckRenderer = spNeckRenderer
21 | };
22 |
23 | public override bool Equals(object obj) => SpNeckRenderer.Equals(obj);
24 |
25 | public override int GetHashCode() => SpNeckRenderer.GetHashCode();
26 |
27 | public bool IsNull() => SpNeckRenderer == null;
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/BaseNoteRendererWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(BaseNoteRenderer))]
16 | public struct BaseNoteRendererWrapper {
17 | public BaseNoteRenderer BaseNoteRenderer { get; private set; }
18 |
19 | public static BaseNoteRendererWrapper Wrap(BaseNoteRenderer baseNoteRenderer) => new BaseNoteRendererWrapper {
20 | BaseNoteRenderer = baseNoteRenderer
21 | };
22 |
23 | public override bool Equals(object obj) => BaseNoteRenderer.Equals(obj);
24 |
25 | public override int GetHashCode() => BaseNoteRenderer.GetHashCode();
26 |
27 | public bool IsNull() => BaseNoteRenderer == null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/BaseNeckControllerWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Runtime.CompilerServices;
9 | using System.Security.Cryptography;
10 | using System.Text;
11 | using System.Threading.Tasks;
12 | using UnityEngine;
13 |
14 | namespace BiendeoCHLib.Wrappers {
15 | [Wrapper(typeof(BaseNeckController))]
16 | public struct BaseNeckControllerWrapper {
17 | public BaseNeckController BaseNeckController { get; private set; }
18 |
19 | public static BaseNeckControllerWrapper Wrap(BaseNeckController baseNeckController) => new BaseNeckControllerWrapper {
20 | BaseNeckController = baseNeckController
21 | };
22 |
23 | public override bool Equals(object obj) => BaseNeckController.Equals(obj);
24 |
25 | public override int GetHashCode() => BaseNeckController.GetHashCode();
26 |
27 | public bool IsNull() => BaseNeckController == null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/Attributes/WrapperMethod.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Reflection;
4 | using System.Text;
5 |
6 | namespace BiendeoCHLib.Wrappers.Attributes {
7 | public sealed class WrapperMethod : Attribute {
8 | public readonly string ObfuscatedName;
9 | public readonly Type[] Types;
10 |
11 | public WrapperMethod(string obfuscatedName) {
12 | ObfuscatedName = obfuscatedName;
13 | Types = Array.Empty();
14 | }
15 |
16 | public WrapperMethod(string obfuscatedName, Type[] types) {
17 | ObfuscatedName = obfuscatedName;
18 | Types = types;
19 | }
20 |
21 | public MethodInfo GetMethodInfo(Type type) {
22 | if (Types.Length == 0) {
23 | return type.GetMethod(ObfuscatedName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
24 | } else {
25 | return type.GetMethod(ObfuscatedName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, Types, Array.Empty());
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: "[BUG] A brief description of your bug"
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Environment (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Clone Hero Version [e.g. v0.23.2.2]
29 | - Using the new Clone Hero Launcher [yes or no]
30 | - Tweak version [e.g. v1.1.0.0]
31 | - You can find the tweak version by right clicking on the tweak's DLL, clicking *Properties*, then *Details*, and you should see it under *Product version*.
32 |
33 | **Additional context**
34 | Add any other context about the problem here.
35 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/PracticeUIWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace BiendeoCHLib.Wrappers {
11 | [Wrapper(typeof(PracticeUI))]
12 | public struct PracticeUIWrapper {
13 | public PracticeUI PracticeUI { get; private set; }
14 |
15 | public static PracticeUIWrapper Wrap(PracticeUI practiceUI) => new PracticeUIWrapper {
16 | PracticeUI = practiceUI
17 | };
18 |
19 | public override bool Equals(object obj) => PracticeUI.Equals(obj);
20 |
21 | public override int GetHashCode() => PracticeUI.GetHashCode();
22 |
23 | public bool IsNull() => PracticeUI == null;
24 |
25 | #region Fields
26 |
27 | public float SomeFloat {
28 | get => someFloatField(PracticeUI);
29 | set => someFloatField(PracticeUI) = value;
30 | }
31 | [WrapperField("\u030E\u0316\u030F\u0314\u030E\u0312\u0315\u0317\u0315\u031B\u0316")]
32 | private static readonly AccessTools.FieldRef someFloatField;
33 |
34 | #endregion
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/FrameRateWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 | using TMPro;
10 |
11 | namespace BiendeoCHLib.Wrappers {
12 | [Wrapper(typeof(FrameRate))]
13 | public struct FrameRateWrapper {
14 | public FrameRate FrameRate { get; private set; }
15 |
16 | public static FrameRateWrapper Wrap(FrameRate frameRate) => new FrameRateWrapper {
17 | FrameRate = frameRate
18 | };
19 |
20 | public override bool Equals(object obj) => FrameRate.Equals(obj);
21 |
22 | public override int GetHashCode() => FrameRate.GetHashCode();
23 |
24 | public bool IsNull() => FrameRate == null;
25 |
26 | #region Fields
27 |
28 | public TextMeshProUGUI Text {
29 | get => textField(FrameRate);
30 | set => textField(FrameRate) = value;
31 | }
32 | [WrapperField("\u0318\u030F\u0319\u0310\u0312\u0310\u030E\u0314\u0310\u031A\u0313")]
33 | private static readonly AccessTools.FieldRef textField;
34 |
35 | #endregion
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/WrapperBase.cs:
--------------------------------------------------------------------------------
1 | using BepInEx.Logging;
2 | using BiendeoCHLib.Wrappers.Attributes;
3 | using HarmonyLib;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Reflection;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 | using UnityEngine;
11 |
12 | namespace BiendeoCHLib.Wrappers {
13 | public abstract class WrapperBase {
14 | private static bool initializedWrappers = false;
15 |
16 | public static void InitializeWrappers(ManualLogSource logger) {
17 | if (!initializedWrappers) {
18 | foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) {
19 | var wrapper = type.GetCustomAttribute();
20 | if (wrapper != null) {
21 | logger.LogDebug($"Initialising wrapper {type.Name}");
22 | wrapper.InitializeSingletons(type, logger);
23 | }
24 | }
25 | initializedWrappers = true;
26 | }
27 | }
28 | }
29 |
30 | public static class StringExtensions {
31 | public static string DecodeUnicode(this string s) => string.Join(string.Empty, s.Select(c => (c >= '\u0200' ? $"\\u{(int)c:X4}" : $"{c}")));
32 | public static bool HasObfuscation(this string s) => s.DecodeUnicode() != s;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/BiendeoCHLib/Wrappers/StarPowerWrapper.cs:
--------------------------------------------------------------------------------
1 | using BiendeoCHLib.Wrappers.Attributes;
2 | using HarmonyLib;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Reflection;
7 | using System.Text;
8 | using System.Threading.Tasks;
9 |
10 | namespace BiendeoCHLib.Wrappers {
11 | //TODO: This inherits ChartObject so when that's done, make sure this inherits that.
12 | [Wrapper("\u0311\u0311\u0314\u0317\u0319\u0316\u0312\u030F\u0311\u0315\u0312")]
13 | public struct StarPowerWrapper {
14 | public object StarPower { get; private set; }
15 |
16 | public static StarPowerWrapper Wrap(object starPower) => new StarPowerWrapper {
17 | StarPower = starPower
18 | };
19 |
20 | public override bool Equals(object obj) => StarPower.Equals(obj);
21 |
22 | public override int GetHashCode() => StarPower.GetHashCode();
23 |
24 | public bool IsNull() => StarPower == null;
25 |
26 | #region Fields
27 |
28 | public uint Length {
29 | get => lengthField(StarPower);
30 | set => lengthField(StarPower) = value;
31 | }
32 | [WrapperField("\u031C\u031C\u0312\u0319\u0314\u0312\u0317\u031C\u031C\u031C\u031A")]
33 | private static readonly AccessTools.FieldRef