A MelonLoader mod for Schedule I that supports both Mono (beta) and IL2CPP (production) builds.
Adjust the cooldown timer between customer deals:
-
Cooldown Multiplier: Scale deal cooldowns from instant (0.0x) to double (2.0x)
- 0.0 = Instant deals (no cooldown)
- 0.5 = Half cooldown (180 seconds)
- 1.0 = Vanilla behavior (360 seconds)
- 2.0 = Harder mode (720 seconds)
-
Debug Logging: Choose logging verbosity
- None = Silent operation
- Console = MelonLoader console logs only
- Toast = Console + in-game notifications
Hot Reload: Settings changes apply immediately without restarting the game.
Mod Manager: Configure settings through the Schedule I Mod Manager under the "Economy" category.
Track multiple customer cooldowns simultaneously with a live countdown UI:
- Multi-Customer Tracking: Displays all customers currently on cooldown in a single window
- Live Countdown Timers: Real-time countdown for each customer (updates every frame)
- Draggable Window: Click and drag the window to reposition it anywhere on screen
- Persistent Position: Window position saves to config and persists across game sessions
- Toggle Visibility: Press
[(default) to show/hide the tracker window - Auto-Cleanup: Expired cooldowns automatically remove from the list
- Sorted Display: Customers sorted by remaining time (shortest first)
- Scrollable List: Handles any number of customers with automatic scrolling
UI Configuration (via UserData/MelonPreferences.cfg or Mod Manager):
CooldownWindowX/Y: Window position (automatically saved when dragging)ShowCooldownWindow: Window visibility stateToggleWindowKey: Keybind to toggle window (default:[left bracket)
Known Limitations:
- Dialog refresh: If you're in a customer dialog when their cooldown expires, you must exit and re-enter the dialog to see the offer become available. The tracker window will show the correct state, but the in-dialog button won't update automatically.
- Multi-target build system (Mono + IL2CPP)
- xUnit test project with FluentAssertions
- Testable business logic separation
- Harmony patching examples
Improve the in-game console experience with:
-
Command History: Navigate recent commands with arrow keys (Up/Down)
- Persistent history across game sessions
- Configurable history size
-
Autocomplete Support: Tab completion for commands and parameters
- Command name completion
- Parameter suggestions based on available options
- Smart context-aware suggestions
- Download the latest release
- Extract to
<Schedule I>/Mods/folder - Launch the game
- .NET 6.0 SDK
- .NET Framework 4.7.2 Developer Pack
- Rider IDE or Visual Studio
- WSL Ubuntu (recommended)
- Schedule I with MelonLoader 0.7.1 installed
-
Install MelonLoader on Schedule I:
- Download MelonLoader 0.7.1 from Thunderstore
- Run the installer and point it to your game directory
- Launch the game once to generate unhollowed assemblies
-
Verify game namespaces (important!):
- Switch to beta "alternate" branch in Steam for Mono build
- Download dnSpy
- Open
<game>/Schedule I_Data/Managed/Assembly-CSharp.dll - Verify the root namespace (guide assumes
ScheduleOne) - Update
usingstatements in code if different
-
Clone and setup:
cd ~/projects git clone <your-repo> cd schedule-i-mod chmod +x scripts/*.sh
-
Create local configuration (stores machine-specific paths, gitignored for safety):
cp local.config.md.example local.config.md # Edit local.config.md and update game directory path -
Setup game assembly references (REQUIRED before building):
For IL2CPP (main/production branch):
./scripts/setup-refs.sh "<GAME_DIR>"Example:
./scripts/setup-refs.sh "/mnt/c/SteamLibrary/steamapps/common/Schedule I"For Mono (beta "alternate" branch):
- Switch branch in Steam (Properties → Betas → "alternate")
- Run game once
- Run setup script again:
./scripts/setup-refs.sh "<GAME_DIR>"Note: Replace
<GAME_DIR>with your Schedule I installation path (seelocal.config.md). Common locations:/mnt/c/Program Files (x86)/Steam/steamapps/common/Schedule I/mnt/c/SteamLibrary/steamapps/common/Schedule I- Use
find /mnt -name "Schedule I" -type d 2>/dev/nullto locate it
-
Build:
./scripts/build.sh
-
Deploy and test:
# For IL2CPP (default) ./scripts/deploy.sh "<GAME_DIR>" il2cpp # For Mono ./scripts/deploy.sh "<GAME_DIR>" mono
- Edit code in
src/ - Run
./scripts/build.sh - Run
./scripts/deploy.sh "<game_dir>" il2cpp - Launch game and check MelonLoader console
- Check
<game>/MelonLoader/Latest.logfor detailed output
To test Mono branch:
- Steam: Schedule I → Properties → Betas → Select "alternate"
- Run game once to regenerate assemblies
- Re-run
./scripts/setup-refs.sh "<game_dir>" - Build and deploy with
monoparameter
To return to IL2CPP:
- Steam: Schedule I → Properties → Betas → "None"
- Build and deploy with
il2cppparameter (or omit for default)
Settings are stored in: <Schedule I>/UserData/MelonPreferences.cfg
Economy Category Settings:
DealCooldownMultiplier(float, default: 1.0) - Scales customer deal cooldownsDebugLogLevel(enum, default: None) - Controls debug logging verbosity
Edit the file manually or use the Schedule I Mod Manager for a GUI. Changes apply immediately without restarting the game.
- Namespaces must be verified with dnSpy before building
- Toast notifications (in-game messages) not yet implemented - currently logs to console as fallback
- Based on S1 Modding Wiki
- Powered by MelonLoader 0.7.1 and HarmonyX