Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of NewGamePlus v0.4.3
ScheduleOneNewGamePlus.dll
Decompiled 10 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using FishNet.Object; using HarmonyLib; using MelonLoader; using Microsoft.CodeAnalysis; using ScheduleOne.DevUtilities; using ScheduleOne.Dialogue; using ScheduleOne.Economy; using ScheduleOne.GameTime; using ScheduleOne.Growing; using ScheduleOne.ItemFramework; using ScheduleOne.Law; using ScheduleOne.Levelling; using ScheduleOne.Money; using ScheduleOne.NPCs; using ScheduleOne.NPCs.CharacterClasses; using ScheduleOne.Persistence; using ScheduleOne.PlayerScripts; using ScheduleOne.Product; using ScheduleOne.Properties; using ScheduleOne.Quests; using ScheduleOne.UI.Phone.Messages; using ScheduleOneNewGamePlus; using UnityEngine; using UnityEngine.Events; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(Core), "ScheduleCustomDealer", "1.0.0", "Sean", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ScheduleOneNewGamePlus")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+1f1851894414936c6f1c6268a9a7e81118427a30")] [assembly: AssemblyProduct("ScheduleOneNewGamePlus")] [assembly: AssemblyTitle("ScheduleOneNewGamePlus")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.4.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 ScheduleOneNewGamePlus { public class Core : MelonMod { [HarmonyPatch(typeof(DialogueHandler), "InitializeDialogue", new Type[] { typeof(DialogueContainer) })] public static class DialogueHandler_InitializeDialogue_Patch { public static bool Prefix(DialogueHandler __instance, DialogueContainer container) { DialogueNodeData val = ((IEnumerable<DialogueNodeData>)container.DialogueNodeData).FirstOrDefault((Func<DialogueNodeData, bool>)((DialogueNodeData node) => node.Guid == "49a5e66d-5100-4193-9461-92f0e4a95330")); if (val != null) { MelonLogger.Msg("Found the drug dealer dialogue node!"); val.DialogueText = "That's not funny."; val.DialogueNodeLabel = ""; } return true; } } [HarmonyPatch(typeof(DialogueController_Dan), "ModifyDialogueText")] public static class DialogueController_Dan_ModifyDialogueText_Patch { public static bool Prefix(DialogueController_Dan __instance, string dialogueLabel, string dialogueText) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown MelonLogger.Msg("dumping info: " + dialogueLabel + " - " + dialogueText); if (dialogueText.Contains("not funny")) { ((Component)__instance).GetComponent<DialogueHandler>().NPC.actions.SetCallPoliceBehaviourCrime((Crime)new AttemptingToSell()); ((Component)__instance).GetComponent<DialogueHandler>().NPC.actions.CallPolice_Networked(Player.Local); } return true; } } [HarmonyPatch(typeof(Plant), "Initialize")] public static class Plant_Initialize_Patch { public static bool Prefix(Plant __instance, NetworkObject pot, float growthProgress, float yieldLevel, float qualityLevel) { __instance.BaseQualityLevel = 0.3f; return true; } } [HarmonyPatch(typeof(PenaltyHandler), "ProcessCrimeList")] public static class PenaltyHandler_ProcessCrimeList_Patch { private static void Postfix(ref List<string> __result) { foreach (string item in __result) { MelonLogger.Msg("Penalty String: " + item); } List<string> obj = __result; string text = obj[obj.Count - 1]; MelonLogger.Msg("last string: " + text); Match match = Regex.Match(text, "[-+]?\\d*\\.?\\d+"); if (match.Success && float.TryParse(match.Value, out var result)) { MelonLogger.Msg($"Parsed float: {result}"); float num = result * 10f; string value = MoneyManager.FormatAmount(num, true, false) + " fine"; List<string> obj2 = __result; obj2[obj2.Count - 1] = value; NetworkSingleton<MoneyManager>.Instance.ChangeCashBalance(0f - result * 9f, true, false); } else { MelonLogger.Msg("Failed to parse float."); } } } [HarmonyPatch(typeof(WeedInstance), "ApplyEffectsToPlayer")] public static class WeedInstance_ApplyEffectsToPlayer_Patch { private static void Postfix() { highOnWeed = true; } } [HarmonyPatch(typeof(WeedInstance), "ClearEffectsFromPlayer")] public static class WeedInstance_ClearEffectsFromPlayer_Patch { private static void Postfix() { highOnWeed = false; } } [HarmonyPatch(typeof(MethInstance), "ApplyEffectsToPlayer")] public static class MethInstance_ApplyEffectsToPlayer_Patch { private static void Postfix() { highOnMeth = true; } } [HarmonyPatch(typeof(MethInstance), "ClearEffectsFromPlayer")] public static class MethInstance_ClearEffectsFromPlayer_Patch { private static void Postfix() { highOnMeth = false; } } [HarmonyPatch(typeof(CocaineInstance), "ApplyEffectsToPlayer")] public static class CocaineInstance_ApplyEffectsToPlayer_Patch { private static void Postfix() { highOnCocaine = true; } } [HarmonyPatch(typeof(CocaineInstance), "ClearEffectsFromPlayer")] public static class CocaineInstance_ClearEffectsFromPlayer_Patch { private static void Postfix() { highOnCocaine = false; } } [HarmonyPatch(typeof(Contract), "GetProductListMatch")] public static class Contract_GetProductListMatch_Patch { private static void Postfix(ref float __result) { if (!highOnWeed && !highOnMeth && !highOnCocaine) { MelonLogger.Msg("30% contract penalty for not being high"); __result *= 0.7f; } } } [HarmonyPatch(typeof(Customer), "GetProductEnjoyment")] public static class GetProductEnjoyment_Postfix { private static void Postfix(Customer __instance, ProductDefinition product, EQuality quality, ref float __result) { List<Property> properties = ((PropertyItemDefinition)product).Properties; if (__instance.CustomerData.PreferredProperties.Count == 0) { return; } bool flag = false; foreach (Property preferred in __instance.CustomerData.PreferredProperties) { if ((Object)(object)properties.Find((Property x) => (Object)(object)x == (Object)(object)preferred) != (Object)null) { flag = true; } } if (!flag) { MelonLogger.Msg("Couldn't find a single property the customer likes, failing the check"); __result = -1000f; } else { MelonLogger.Msg("Found at least one property the customer likes, passing the check..."); } } } private bool registered = false; private static bool highOnWeed; private static bool highOnMeth; private static bool highOnCocaine; public override void OnSceneWasInitialized(int buildIndex, string sceneName) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown if (buildIndex == 1) { if ((Object)(object)Singleton<LoadManager>.Instance != (Object)null && !registered) { Singleton<LoadManager>.Instance.onLoadComplete.AddListener(new UnityAction(OnLoadCompleteCb)); } return; } if ((Object)(object)Singleton<LoadManager>.Instance != (Object)null && registered) { Singleton<LoadManager>.Instance.onLoadComplete.RemoveListener(new UnityAction(OnLoadCompleteCb)); } registered = false; } public void OnLoadCompleteCb() { //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown if (registered) { return; } registered = true; LevelManager instance = NetworkSingleton<LevelManager>.Instance; TimeManager instance2 = NetworkSingleton<TimeManager>.Instance; if (instance2.ElapsedDays == 0) { foreach (NPC item in NPCManager.NPCRegistry) { if (item.Inventory.RandomCash) { int num = Random.Range(0, 50); if (num > 0) { CashInstance cashInstance = NetworkSingleton<MoneyManager>.Instance.GetCashInstance((float)num); item.Inventory.InsertItem((ItemInstance)(object)cashInstance, true); } } } } UncleNelson val = Object.FindObjectsOfType<UncleNelson>().FirstOrDefault(); if ((Object)(object)val != (Object)null && instance.XP == 0) { val.SendInitialMessage(); ((NPC)val).MSGConversation.SetIsKnown(false); ((NPC)val).MSGConversation.SendMessageChain(new MessageChain { Messages = new List<string> { "**Developer Note**", "Welcome to NewGamePlus mode! There are a few important differences to keep in mind.", "Customers will expect you to be high when you complete a deal.", "Customers only mess with drugs that have the affects they like.", "You start off at the Hoodlum rank. Good luck, have fun!" } }, 0f, true, true); ((NPC)val).MSGConversation.SetRead(false); } if (instance.XP == 0) { instance.AddXP(1000); } Customer[] array = Object.FindObjectsOfType<Customer>(); Customer[] array2 = array; foreach (Customer val2 in array2) { CustomerData customerData = val2.CustomerData; customerData.CallPoliceChance *= 2f; val2.CustomerData.GuaranteeFirstSampleSuccess = false; } } } }