Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of CasinoTracker v1.0.1
CasinoTracker.dll
Decompiled 3 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using CasinoTracker; using HarmonyLib; using Il2CppScheduleOne.Casino; using Il2CppSystem; using MelonLoader; using MelonLoader.Utils; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using S1API.PhoneApp; using S1API.UI; using UnityEngine; 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: MelonInfo(typeof(MyMod), "CasinoTracker", "1.0.0", "Hideshi", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("CasinoTracker")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("CasinoTracker")] [assembly: AssemblyTitle("CasinoTracker")] [assembly: NeutralResourcesLanguage("en-US")] [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 CasinoTracker { public class BlackjackStats { public int total_plays; public int total_wins; public int total_losses; public int total_pushes; public int total_profit; public int total_spent; public float profit_per_play; private static string SavePath => Path.Combine(MelonEnvironment.ModsDirectory, "CasinoTracker", "BlackjackStats.json"); public static void SaveFromFields() { BlackjackStats blackjackStats = new BlackjackStats { total_plays = BlackJack.total_plays, total_wins = BlackJack.total_wins, total_losses = BlackJack.total_losses, total_pushes = BlackJack.total_pushes, total_profit = BlackJack.total_profit, total_spent = BlackJack.total_spent, profit_per_play = BlackJack.profit_per_play }; string contents = JsonConvert.SerializeObject((object)blackjackStats, (Formatting)1); File.WriteAllText(SavePath, contents); } public static void LoadToFields() { if (File.Exists(SavePath)) { string text = File.ReadAllText(SavePath); BlackjackStats blackjackStats = JsonConvert.DeserializeObject<BlackjackStats>(text); if (blackjackStats != null) { BlackJack.total_plays = blackjackStats.total_plays; BlackJack.total_wins = blackjackStats.total_wins; BlackJack.total_losses = blackjackStats.total_losses; BlackJack.total_pushes = blackjackStats.total_pushes; BlackJack.total_profit = blackjackStats.total_profit; BlackJack.total_spent = blackjackStats.total_spent; BlackJack.profit_per_play = blackjackStats.profit_per_play; } } } } public class BlackJack : MelonMod { [HarmonyPatch(typeof(BlackjackGameController), "GetPayout")] public static class BlackjackGameController_GetPayout_Patch { public static void Postfix(float bet, EPayoutType payout, float __result) { UpdateTracker(((object)(EPayoutType)(ref payout)).ToString(), (int)bet); GamblerApp.UpdateBlackJackStatsText(); } public static void UpdateTracker(string outcome, int BetAmount) { switch (outcome) { case "Win": total_plays++; total_wins++; total_profit += BetAmount * 2 - BetAmount; total_spent += BetAmount; break; case "Push": total_plays++; total_pushes++; total_profit += BetAmount - BetAmount; total_spent += BetAmount; break; case "None": total_plays++; total_losses++; total_profit -= BetAmount; total_spent += BetAmount; break; default: MelonLogger.Warning("Unknown outcome: " + outcome); break; } win_rate = ((total_plays > 0) ? ((float)total_wins / (float)total_plays * 100f) : 0f); win_rate = (float)Math.Round(win_rate, 2); profit_per_play = ((total_plays > 0) ? ((float)total_profit / (float)total_plays) : 0f); profit_per_play = (float)Math.Round(profit_per_play, 2); BlackjackStats.SaveFromFields(); } } public static int total_wins; public static int total_plays; public static int total_losses; public static int total_pushes; public static int total_spent; public static int total_profit; public static float win_rate; public static float profit_per_play; } public class MyMod : MelonMod { public override void OnInitializeMelon() { MelonLogger.Msg("Initialized CasinoTracker."); MelonLogger.Msg("Attempting to load stats from JSON files"); RideTheBusStats.LoadToFields(); BlackjackStats.LoadToFields(); SlotStats.LoadToFields(); } public override void OnDeinitializeMelon() { MelonLogger.Msg("Deinitialized CasinoTracker."); } } public class GamblerApp : PhoneApp { private string iconPath = Path.Combine(MelonEnvironment.ModsDirectory, "CasinoTracker/assets", "app_icon.png"); private static Text slots_total_wins_text; private static Text slots_total_spins_text; private static Text slots_total_losses_text; private static Text slots_total_spent_text; private static Text slots_total_profit_text; private static Text slots_win_rate_text; private static Text slots_profit_per_spin_text; private static Text slots_total_mini_wins_text; private static Text slots_total_small_wins_text; private static Text slots_total_big_wins_text; private static Text slots_total_jackpots_text; private static Text blackjack_total_wins_text; private static Text blackjack_total_pushes_text; private static Text blackjack_total_plays_text; private static Text blackjack_total_losses_text; private static Text blackjack_total_spent_text; private static Text blackjack_total_profit_text; private static Text blackjack_win_rate_text; private static Text blackjack_profit_per_play_text; private static Text rtb_total_plays_text; private static Text rtb_total_spent_text; private static Text rtb_total_profit_text; private static Text rtb_profit_per_play_text; private static Text rtb_times_at_r1_text; private static Text rtb_times_at_r2_text; private static Text rtb_times_at_r3_text; private static Text rtb_times_at_r4_text; protected override string AppName => "GamblerApp"; protected override string AppTitle => "Casino Stats"; protected override string IconLabel => "Casino Stats"; protected override string IconFileName => iconPath; protected override void OnCreated() { ((PhoneApp)this).OnCreated(); MelonLogger.Msg("[GamblerApp] OnCreated called."); } protected override void OnCreatedUI(GameObject container) { //IL_000c: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_0339: Unknown result type (might be due to invalid IL or missing references) //IL_0348: Unknown result type (might be due to invalid IL or missing references) //IL_035c: Unknown result type (might be due to invalid IL or missing references) //IL_037a: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03bb: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03de: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_041f: Unknown result type (might be due to invalid IL or missing references) //IL_043d: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_0460: Unknown result type (might be due to invalid IL or missing references) //IL_047e: Unknown result type (might be due to invalid IL or missing references) //IL_048d: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04bf: Unknown result type (might be due to invalid IL or missing references) //IL_04ce: Unknown result type (might be due to invalid IL or missing references) //IL_04e2: Unknown result type (might be due to invalid IL or missing references) //IL_0500: Unknown result type (might be due to invalid IL or missing references) //IL_050f: Unknown result type (might be due to invalid IL or missing references) //IL_0523: Unknown result type (might be due to invalid IL or missing references) //IL_08c9: Unknown result type (might be due to invalid IL or missing references) //IL_08d8: Unknown result type (might be due to invalid IL or missing references) //IL_08ec: Unknown result type (might be due to invalid IL or missing references) //IL_090a: Unknown result type (might be due to invalid IL or missing references) //IL_0919: Unknown result type (might be due to invalid IL or missing references) //IL_092d: Unknown result type (might be due to invalid IL or missing references) //IL_094b: Unknown result type (might be due to invalid IL or missing references) //IL_095a: Unknown result type (might be due to invalid IL or missing references) //IL_096e: Unknown result type (might be due to invalid IL or missing references) //IL_098c: Unknown result type (might be due to invalid IL or missing references) //IL_099b: Unknown result type (might be due to invalid IL or missing references) //IL_09af: Unknown result type (might be due to invalid IL or missing references) //IL_09cd: Unknown result type (might be due to invalid IL or missing references) //IL_09dc: Unknown result type (might be due to invalid IL or missing references) //IL_09f0: Unknown result type (might be due to invalid IL or missing references) //IL_0a0e: Unknown result type (might be due to invalid IL or missing references) //IL_0a1d: Unknown result type (might be due to invalid IL or missing references) //IL_0a31: Unknown result type (might be due to invalid IL or missing references) //IL_0a4f: Unknown result type (might be due to invalid IL or missing references) //IL_0a5e: Unknown result type (might be due to invalid IL or missing references) //IL_0a72: Unknown result type (might be due to invalid IL or missing references) //IL_0a90: Unknown result type (might be due to invalid IL or missing references) //IL_0a9f: Unknown result type (might be due to invalid IL or missing references) //IL_0ab3: Unknown result type (might be due to invalid IL or missing references) //IL_0ad1: Unknown result type (might be due to invalid IL or missing references) //IL_0ae0: Unknown result type (might be due to invalid IL or missing references) //IL_0af4: Unknown result type (might be due to invalid IL or missing references) //IL_0da7: Unknown result type (might be due to invalid IL or missing references) //IL_0db6: Unknown result type (might be due to invalid IL or missing references) //IL_0dca: Unknown result type (might be due to invalid IL or missing references) //IL_0de8: Unknown result type (might be due to invalid IL or missing references) //IL_0df7: Unknown result type (might be due to invalid IL or missing references) //IL_0e0b: Unknown result type (might be due to invalid IL or missing references) //IL_0e29: Unknown result type (might be due to invalid IL or missing references) //IL_0e38: Unknown result type (might be due to invalid IL or missing references) //IL_0e4c: Unknown result type (might be due to invalid IL or missing references) //IL_0e6a: Unknown result type (might be due to invalid IL or missing references) //IL_0e79: Unknown result type (might be due to invalid IL or missing references) //IL_0e8d: Unknown result type (might be due to invalid IL or missing references) //IL_0eab: Unknown result type (might be due to invalid IL or missing references) //IL_0eba: Unknown result type (might be due to invalid IL or missing references) //IL_0ece: Unknown result type (might be due to invalid IL or missing references) //IL_0eec: Unknown result type (might be due to invalid IL or missing references) //IL_0efb: Unknown result type (might be due to invalid IL or missing references) //IL_0f0f: Unknown result type (might be due to invalid IL or missing references) //IL_0f2d: Unknown result type (might be due to invalid IL or missing references) //IL_0f3c: Unknown result type (might be due to invalid IL or missing references) //IL_0f50: Unknown result type (might be due to invalid IL or missing references) //IL_0f6e: Unknown result type (might be due to invalid IL or missing references) //IL_0f7d: Unknown result type (might be due to invalid IL or missing references) //IL_0f91: Unknown result type (might be due to invalid IL or missing references) //IL_0faf: Unknown result type (might be due to invalid IL or missing references) //IL_0fbe: Unknown result type (might be due to invalid IL or missing references) //IL_0fd2: Unknown result type (might be due to invalid IL or missing references) GameObject val = UIFactory.Panel("Background", container.transform, Color.gray, (Vector2?)null, (Vector2?)null, true); GameObject val2 = UIFactory.Panel("TopBar", val.transform, Color.black, (Vector2?)new Vector2(0f, 0.9f), (Vector2?)new Vector2(1f, 1f), false); GameObject val3 = UIFactory.Panel("FarLeftSeparator", val.transform, Color.black, (Vector2?)new Vector2(0f, 0f), (Vector2?)new Vector2(0.01f, 0.9f), false); GameObject val4 = UIFactory.Panel("LeftSeparator", val.transform, Color.black, (Vector2?)new Vector2(0.32f, 0f), (Vector2?)new Vector2(0.34f, 0.9f), false); GameObject val5 = UIFactory.Panel("RightSeparator", val.transform, Color.black, (Vector2?)new Vector2(0.66f, 0f), (Vector2?)new Vector2(0.68f, 0.9f), false); GameObject val6 = UIFactory.Panel("FarRightSeparator", val.transform, Color.black, (Vector2?)new Vector2(0.99f, 0f), (Vector2?)new Vector2(1f, 0.9f), false); GameObject val7 = UIFactory.Panel("SlotsSection", val.transform, Color.clear, (Vector2?)new Vector2(0.04f, 0f), (Vector2?)new Vector2(0.29f, 1f), false); GameObject val8 = UIFactory.Panel("BlackjackSection", val.transform, Color.clear, (Vector2?)new Vector2(0.37f, 0f), (Vector2?)new Vector2(0.63f, 1f), false); GameObject val9 = UIFactory.Panel("RTBSection", val.transform, Color.clear, (Vector2?)new Vector2(0.71f, 0f), (Vector2?)new Vector2(0.96f, 1f), false); GameObject val10 = UIFactory.Panel("SlotsTitlePanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.34f, 0.8f), (Vector2?)new Vector2(0.66f, 0.85f), false); GameObject val11 = UIFactory.Panel("SlotsStatsTotalWinsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.7f), (Vector2?)new Vector2(0.8f, 0.7f), false); GameObject val12 = UIFactory.Panel("SlotsStatsTotalSpinsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.65f), (Vector2?)new Vector2(0.8f, 0.65f), false); GameObject val13 = UIFactory.Panel("SlotsStatsTotalLossesPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.6f), (Vector2?)new Vector2(0.8f, 0.6f), false); GameObject val14 = UIFactory.Panel("SlotsStatsTotalSpentPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.55f), (Vector2?)new Vector2(0.8f, 0.55f), false); GameObject val15 = UIFactory.Panel("SlotsStatsTotalProfitPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.5f), (Vector2?)new Vector2(0.8f, 0.5f), false); GameObject val16 = UIFactory.Panel("SlotsStatsWinRatePanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.45f), (Vector2?)new Vector2(0.8f, 0.45f), false); GameObject val17 = UIFactory.Panel("SlotsStatsProfitPerSpinPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.4f), (Vector2?)new Vector2(0.8f, 0.4f), false); GameObject val18 = UIFactory.Panel("SlotsStatsTotalMiniWinsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.35f), (Vector2?)new Vector2(0.8f, 0.35f), false); GameObject val19 = UIFactory.Panel("SlotsStatsTotalSmallWinsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.3f), (Vector2?)new Vector2(0.8f, 0.3f), false); GameObject val20 = UIFactory.Panel("SlotsStatsTotalBigWinsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.25f), (Vector2?)new Vector2(0.8f, 0.25f), false); GameObject val21 = UIFactory.Panel("SlotsStatsTotalJackpotsPanel", val7.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.2f), (Vector2?)new Vector2(0.8f, 0.2f), false); slots_total_wins_text = UIFactory.Text("SlotsTotalWinsText", $"Total Wins: {Slots.total_wins}", val11.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_spins_text = UIFactory.Text("SlotsTotalSpinsText", $"Total Spins: {Slots.total_spins}", val12.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_losses_text = UIFactory.Text("SlotsTotalLossesText", $"Total Losses: {Slots.total_losses}", val13.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_spent_text = UIFactory.Text("SlotsTotalSpentText", $"Total Spent: {Slots.total_spent}", val14.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_profit_text = UIFactory.Text("SlotsTotalProfitText", $"Total Profit: {Slots.total_profit}", val15.transform, 20, (TextAnchor)4, (FontStyle)0); slots_win_rate_text = UIFactory.Text("SlotsWinRateText", $"Win Rate: {Slots.win_rate}%", val16.transform, 20, (TextAnchor)4, (FontStyle)0); slots_profit_per_spin_text = UIFactory.Text("SlotsProfitPerSpinText", $"Average Profit/Spin: ${Slots.profit_per_spin}", val17.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_mini_wins_text = UIFactory.Text("SlotsTotalMiniWinsText", $"Total Mini Wins: {Slots.total_mini_wins}", val18.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_small_wins_text = UIFactory.Text("SlotsTotalSmallWinsText", $"Total Small Wins: {Slots.total_small_wins}", val19.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_big_wins_text = UIFactory.Text("SlotsTotalBigWinsText", $"Total Big Wins: {Slots.total_big_wins}", val20.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_jackpots_text = UIFactory.Text("SlotsTotalJackpotsText", $"Total Jackpots: {Slots.total_jackpots}", val21.transform, 20, (TextAnchor)4, (FontStyle)0); slots_total_wins_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_spins_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_losses_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_spent_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_profit_text.horizontalOverflow = (HorizontalWrapMode)1; slots_win_rate_text.horizontalOverflow = (HorizontalWrapMode)1; slots_profit_per_spin_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_mini_wins_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_small_wins_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_big_wins_text.horizontalOverflow = (HorizontalWrapMode)1; slots_total_jackpots_text.horizontalOverflow = (HorizontalWrapMode)1; GameObject val22 = UIFactory.Panel("BlackJackTitlePanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.34f, 0.8f), (Vector2?)new Vector2(0.66f, 0.85f), false); GameObject val23 = UIFactory.Panel("BlackJackStatsTotalWinsPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.7f), (Vector2?)new Vector2(0.8f, 0.7f), false); GameObject val24 = UIFactory.Panel("BlackJackStatsTotalPushesPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.65f), (Vector2?)new Vector2(0.8f, 0.65f), false); GameObject val25 = UIFactory.Panel("BlackJackStatsTotalPlaysPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.6f), (Vector2?)new Vector2(0.8f, 0.6f), false); GameObject val26 = UIFactory.Panel("BlackJackStatsTotalLossesPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.55f), (Vector2?)new Vector2(0.8f, 0.55f), false); GameObject val27 = UIFactory.Panel("BlackJackStatsTotalSpentPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.5f), (Vector2?)new Vector2(0.8f, 0.5f), false); GameObject val28 = UIFactory.Panel("BlackJackStatsTotalProfitPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.45f), (Vector2?)new Vector2(0.8f, 0.45f), false); GameObject val29 = UIFactory.Panel("BlackJackStatsWinRatePanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.4f), (Vector2?)new Vector2(0.8f, 0.4f), false); GameObject val30 = UIFactory.Panel("BlackJackStatsProfitPerPlayPanel", val8.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.35f), (Vector2?)new Vector2(0.8f, 0.35f), false); blackjack_total_wins_text = UIFactory.Text("BlackJackTotalWinsText", $"Total Wins: {BlackJack.total_wins}", val23.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_pushes_text = UIFactory.Text("BlackJackTotalPushesText", $"Total Pushes: {BlackJack.total_pushes}", val24.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_plays_text = UIFactory.Text("BlackJackTotalPlaysText", $"Total Plays: {BlackJack.total_plays}", val25.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_losses_text = UIFactory.Text("BlackJackTotalLossesText", $"Total Losses: {BlackJack.total_losses}", val26.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_spent_text = UIFactory.Text("BlackJackTotalSpentText", $"Total Spent: {BlackJack.total_spent}", val27.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_profit_text = UIFactory.Text("BlackJackTotalProfitText", $"Total Profit: {BlackJack.total_profit}", val28.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_win_rate_text = UIFactory.Text("BlackJackWinRateText", $"Win Rate: {BlackJack.win_rate}%", val29.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_profit_per_play_text = UIFactory.Text("BlackJackProfitPerPlayText", $"Average Profit/Play: ${BlackJack.profit_per_play}", val30.transform, 20, (TextAnchor)4, (FontStyle)0); blackjack_total_wins_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_total_pushes_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_total_plays_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_total_losses_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_total_spent_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_total_profit_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_win_rate_text.horizontalOverflow = (HorizontalWrapMode)1; blackjack_profit_per_play_text.horizontalOverflow = (HorizontalWrapMode)1; GameObject val31 = UIFactory.Panel("SlotsTitlePanel", val9.transform, Color.clear, (Vector2?)new Vector2(0.34f, 0.8f), (Vector2?)new Vector2(0.66f, 0.85f), false); GameObject val32 = UIFactory.Panel("SlotsStatsTotalSpinsPanel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.7f), (Vector2?)new Vector2(0.8f, 0.7f), false); GameObject val33 = UIFactory.Panel("SlotsStatsTotalSpentPanel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.65f), (Vector2?)new Vector2(0.8f, 0.65f), false); GameObject val34 = UIFactory.Panel("SlotsStatsTotalProfitPanel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.6f), (Vector2?)new Vector2(0.8f, 0.6f), false); GameObject val35 = UIFactory.Panel("SlotsStatsProfitPerSpinPanel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.55f), (Vector2?)new Vector2(0.8f, 0.55f), false); GameObject val36 = UIFactory.Panel("SlotsStatsTimesAtR1Panel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.5f), (Vector2?)new Vector2(0.8f, 0.5f), false); GameObject val37 = UIFactory.Panel("SlotsStatsTimesAtR2Panel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.45f), (Vector2?)new Vector2(0.8f, 0.45f), false); GameObject val38 = UIFactory.Panel("SlotsStatsTimesAtR3Panel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.4f), (Vector2?)new Vector2(0.8f, 0.4f), false); GameObject val39 = UIFactory.Panel("SlotsStatsTimesAtR4Panel", val9.transform, Color.clear, (Vector2?)new Vector2(0.2f, 0.35f), (Vector2?)new Vector2(0.8f, 0.35f), false); rtb_total_plays_text = UIFactory.Text("TotalSpinsText", $"Total Spins: {RideTheBus.total_plays}", val32.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_total_spent_text = UIFactory.Text("TotalSpentText", $"Total Spent: {RideTheBus.total_spent}", val33.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_total_profit_text = UIFactory.Text("TotalProfitText", $"Total Profit: {RideTheBus.total_profit}", val34.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_profit_per_play_text = UIFactory.Text("ProfitPerSpinText", $"Average Profit/Play: ${RideTheBus.profit_per_play}", val35.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_times_at_r1_text = UIFactory.Text("TimesAtR1Text", $"Times Finished at R1: {RideTheBus.times_finished_at_r1}", val36.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_times_at_r2_text = UIFactory.Text("TimesAtR2Text", $"Times Finished at R2: {RideTheBus.times_finished_at_r2}", val37.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_times_at_r3_text = UIFactory.Text("TimesAtR3Text", $"Times Finished at R3: {RideTheBus.times_finished_at_r3}", val38.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_times_at_r4_text = UIFactory.Text("TimesAtR4Text", $"Times Finished at R4: {RideTheBus.times_finished_at_r4}", val39.transform, 20, (TextAnchor)4, (FontStyle)0); rtb_total_plays_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_total_spent_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_total_profit_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_profit_per_play_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_times_at_r1_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_times_at_r2_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_times_at_r3_text.horizontalOverflow = (HorizontalWrapMode)1; rtb_times_at_r4_text.horizontalOverflow = (HorizontalWrapMode)1; Text val40 = UIFactory.Text("SlotsTitle", "Slots", val10.transform, 26, (TextAnchor)4, (FontStyle)0); Text val41 = UIFactory.Text("BlackjackTitle", "Blackjack", val22.transform, 23, (TextAnchor)4, (FontStyle)0); Text val42 = UIFactory.Text("RTBTitle", "Ride The Bus", val31.transform, 26, (TextAnchor)4, (FontStyle)0); } public static void UpdateSlotsStatsText() { slots_total_wins_text.text = $"Total Wins: {Slots.total_wins}"; slots_total_spins_text.text = $"Total Spins: {Slots.total_spins}"; slots_total_losses_text.text = $"Total Losses: {Slots.total_losses}"; slots_total_spent_text.text = $"Total Spent: {Slots.total_spent}"; slots_total_profit_text.text = $"Total Profit: {Slots.total_profit}"; slots_win_rate_text.text = $"Win Rate: {Slots.win_rate}%"; slots_profit_per_spin_text.text = $"Average Profit/Spin: ${Slots.profit_per_spin}"; slots_total_mini_wins_text.text = $"Total Mini Wins: {Slots.total_mini_wins}"; slots_total_small_wins_text.text = $"Total Small Wins: {Slots.total_small_wins}"; slots_total_big_wins_text.text = $"Total Big Wins: {Slots.total_big_wins}"; slots_total_jackpots_text.text = $"Total Jackpots: {Slots.total_jackpots}"; } public static void UpdateBlackJackStatsText() { blackjack_total_wins_text.text = $"Total Wins: {BlackJack.total_wins}"; blackjack_total_plays_text.text = $"Total Plays: {BlackJack.total_plays}"; blackjack_total_losses_text.text = $"Total Losses: {BlackJack.total_losses}"; blackjack_total_spent_text.text = $"Total Spent: {BlackJack.total_spent}"; blackjack_total_profit_text.text = $"Total Profit: {BlackJack.total_profit}"; blackjack_win_rate_text.text = $"Win Rate: {BlackJack.win_rate}%"; blackjack_profit_per_play_text.text = $"Average Profit/Play: ${BlackJack.profit_per_play}"; } public static void UpdateRTBStatsText() { rtb_total_plays_text.text = $"Total Plays: {RideTheBus.total_plays}"; rtb_total_spent_text.text = $"Total Spent: {RideTheBus.total_spent}"; rtb_total_profit_text.text = $"Total Profit: {RideTheBus.total_profit}"; rtb_profit_per_play_text.text = $"Average Profit/Play: ${RideTheBus.profit_per_play}"; rtb_times_at_r1_text.text = $"Times Finished at R1: {RideTheBus.times_finished_at_r1}"; rtb_times_at_r2_text.text = $"Times Finished at R2: {RideTheBus.times_finished_at_r2}"; rtb_times_at_r3_text.text = $"Times Finished at R3: {RideTheBus.times_finished_at_r3}"; rtb_times_at_r4_text.text = $"Times Finished at R4: {RideTheBus.times_finished_at_r4}"; } } public class RideTheBusStats { public int total_plays; public int total_spent; public int total_profit; public float profit_per_play; public int times_finished_at_r1; public int times_finished_at_r2; public int times_finished_at_r3; public int times_finished_at_r4; private static string SavePath => Path.Combine(MelonEnvironment.ModsDirectory, "CasinoTracker", "RideTheBusStats.json"); public static void SaveFromFields() { RideTheBusStats rideTheBusStats = new RideTheBusStats { total_plays = RideTheBus.total_plays, total_spent = RideTheBus.total_spent, total_profit = RideTheBus.total_profit, profit_per_play = RideTheBus.profit_per_play, times_finished_at_r1 = RideTheBus.times_finished_at_r1, times_finished_at_r2 = RideTheBus.times_finished_at_r2, times_finished_at_r3 = RideTheBus.times_finished_at_r3, times_finished_at_r4 = RideTheBus.times_finished_at_r4 }; string contents = JsonConvert.SerializeObject((object)rideTheBusStats, (Formatting)1); File.WriteAllText(SavePath, contents); } public static void LoadToFields() { if (File.Exists(SavePath)) { string text = File.ReadAllText(SavePath); RideTheBusStats rideTheBusStats = JsonConvert.DeserializeObject<RideTheBusStats>(text); if (rideTheBusStats != null) { RideTheBus.total_plays = rideTheBusStats.total_plays; RideTheBus.total_spent = rideTheBusStats.total_spent; RideTheBus.total_profit = rideTheBusStats.total_profit; RideTheBus.profit_per_play = rideTheBusStats.profit_per_play; RideTheBus.times_finished_at_r1 = rideTheBusStats.times_finished_at_r1; RideTheBus.times_finished_at_r2 = rideTheBusStats.times_finished_at_r2; RideTheBus.times_finished_at_r3 = rideTheBusStats.times_finished_at_r3; RideTheBus.times_finished_at_r4 = rideTheBusStats.times_finished_at_r4; } } } } public class RideTheBus : MelonMod { [HarmonyPatch(typeof(RTBGameController), "Awake")] public static class RTBGameController_Awake_Patch { public static void Postfix(RTBGameController __instance) { __instance.onLocalPlayerCorrect += Action.op_Implicit((Action)delegate { lastRoundWasWin = true; currentStage++; }); __instance.onLocalPlayerIncorrect += Action.op_Implicit((Action)delegate { lastRoundWasWin = false; }); __instance.onLocalPlayerExitRound += Action.op_Implicit((Action)delegate { lastRoundWasWin = null; }); } } [HarmonyPatch(typeof(RTBGameController), "EndGame")] public static class RTBGameController_EndGame_Patch { public static void Postfix(RTBGameController __instance) { List<int> list = new List<int> { 2, 3, 4, 20 }; int num = (int)__instance.LocalPlayerBet; int num2 = (int)__instance.LocalPlayerBetMultiplier; int payout = 0; if (lastRoundWasWin.GetValueOrDefault()) { payout = num * num2; } else if (!lastRoundWasWin.HasValue) { if (currentStage > 0) { int index = currentStage - 1; payout = num * list[index]; num2 = list[index]; } } else { payout = 0; } UpdateTracker((list.IndexOf(num2) + 1).ToString(), num, payout); GamblerApp.UpdateRTBStatsText(); currentStage = 0; lastRoundWasWin = null; } public static void UpdateTracker(string outcome, int BetAmount, int Payout) { total_plays++; total_spent += BetAmount; total_profit += Payout - BetAmount; switch (outcome) { case "1": times_finished_at_r1++; break; case "2": times_finished_at_r2++; break; case "3": times_finished_at_r3++; break; case "4": times_finished_at_r4++; break; default: MelonLogger.Warning("Unknown outcome/round: " + outcome); break; } profit_per_play = ((total_plays > 0) ? ((float)total_profit / (float)total_plays) : 0f); profit_per_play = (float)Math.Round(profit_per_play, 2); RideTheBusStats.SaveFromFields(); } } public static int total_plays; public static int total_spent; public static int total_profit; public static float win_rate; public static float profit_per_play; public static int times_finished_at_r1; public static int times_finished_at_r2; public static int times_finished_at_r3; public static int times_finished_at_r4; private static bool? lastRoundWasWin; private static int currentStage; } public class SlotStats { public int total_wins; public int total_spins; public int total_losses; public int total_spent; public int total_profit; public float win_rate; public float profit_per_spin; public int total_mini_wins; public int total_small_wins; public int total_big_wins; public int total_jackpots; private static string SavePath => Path.Combine(MelonEnvironment.ModsDirectory, "CasinoTracker", "SlotStats.json"); public static void SaveFromFields() { SlotStats slotStats = new SlotStats { total_wins = Slots.total_wins, total_spins = Slots.total_spins, total_losses = Slots.total_losses, total_spent = Slots.total_spent, total_profit = Slots.total_profit, win_rate = Slots.win_rate, profit_per_spin = Slots.profit_per_spin, total_mini_wins = Slots.total_mini_wins, total_small_wins = Slots.total_small_wins, total_big_wins = Slots.total_big_wins, total_jackpots = Slots.total_jackpots }; MelonLogger.Msg("Attempting to save SlotStats to " + SavePath + "."); string contents = JsonConvert.SerializeObject((object)slotStats, (Formatting)1); File.WriteAllText(SavePath, contents); } public static void LoadToFields() { if (File.Exists(SavePath)) { string text = File.ReadAllText(SavePath); SlotStats slotStats = JsonConvert.DeserializeObject<SlotStats>(text); if (slotStats != null) { Slots.total_spins = slotStats.total_spins; Slots.total_spent = slotStats.total_spent; Slots.total_profit = slotStats.total_profit; Slots.total_wins = slotStats.total_wins; Slots.profit_per_spin = slotStats.profit_per_spin; } } } } public class Slots : MelonMod { [HarmonyPatch(typeof(SlotMachine), "HandleInteracted")] public static class SlotMachine_HandleInteracted_Patch { public static void Postfix(SlotMachine __instance) { total_spins++; } } [HarmonyPatch(typeof(SlotMachine), "EvaluateOutcome")] public static class Slotmachine_EvaluateOutcome_Patch { public static void Postfix(EOutcome __result, SlotMachine __instance) { int currentBetAmount = __instance.currentBetAmount; string outcome = ((object)(EOutcome)(ref __result)).ToString(); UpdateTracker(outcome, currentBetAmount); GamblerApp.UpdateSlotsStatsText(); } public static void UpdateTracker(string outcome, int BetAmount) { switch (outcome) { case "NoWin": total_losses++; total_profit -= BetAmount; total_spent += BetAmount; break; case "MiniWin": total_wins++; total_mini_wins++; total_profit += BetAmount * 2 - BetAmount; total_spent += BetAmount; break; case "SmallWin": total_wins++; total_small_wins++; total_profit += BetAmount * 10 - BetAmount; total_spent += BetAmount; break; case "BigWin": total_wins++; total_big_wins++; total_profit += BetAmount * 25 - BetAmount; total_spent += BetAmount; break; case "Jackpot": total_wins++; total_jackpots++; total_profit += BetAmount * 100 - BetAmount; total_spent += BetAmount; break; default: MelonLogger.Warning("Unknown outcome: " + outcome); break; } win_rate = ((total_spins > 0) ? ((float)total_wins / (float)total_spins * 100f) : 0f); win_rate = (float)Math.Round(win_rate, 2); profit_per_spin = ((total_spins > 0) ? ((float)total_profit / (float)total_spins) : 0f); profit_per_spin = (float)Math.Round(profit_per_spin, 2); SlotStats.SaveFromFields(); } } public static int total_wins; public static int total_spins; public static int total_losses; public static int total_spent; public static int total_profit; public static float win_rate; public static float profit_per_spin; public static int total_mini_wins; public static int total_small_wins; public static int total_big_wins; public static int total_jackpots; } }