Screen-reader accessibility mod for Melatonin (MelonLoader).
- Spoken menu navigation and option state announcements.
- Contextual tutorial/gameplay cue announcements in gameplay.
- Score-mode start announcements when gameplay begins.
- Tutorial/dialog and popup reading.
- World map navigation support, including fast landmark teleport.
- Full level editor accessibility narration (cursor, tools, advanced menu, timeline tabs).
- Results and stage-end option announcements, including lock-state reasons.
- Credits roll narration while entries scroll.
- Localization for mod-generated messages across all game-supported languages.
- Optional toggles for announcement groups via
MelonPreferences. - A regression-check script for validating speech logs after playtests.
- Title/start screen:
- Press Action (default
Space) to begin. - Press language key (default
Tab) to change language.
- Press Action (default
- General menu navigation:
- Move with
Up/Down. - Confirm with Action (default
Space). - Cancel/back with Cancel (default
Esc).
- Move with
- Map navigation:
- Keyboard:
[and]jump to previous/next landmark. - Keyboard fallback: if Action is bound to brackets, use
F9(previous) andF10(next). - Gamepad:
Action Left/Action Right(commonlyLB/RB) jump between landmarks. - Press
F1to hear map/chapter star summary (total stars collectedandstars still needed to pass). - Open mode menu with Action, then choose mode with
Up/Downand confirm with Action.
- Keyboard:
- Results/stage-end menu:
- Move with
Up/Down. - Confirm with Action.
- Move with
Example flow:
- Use
[or]to pick a nearby map landmark. - Press
Up/Downto choose the mode. - Press Action to start.
F2: Toggle contextual tutorial/gameplay cue announcements on/off (saved immediately to MelonPreferences).F3: Toggle menu position announcements on/off (for example1 of 4, saved immediately to MelonPreferences).F1: On map scenes only, announce chapter/map star totals and how many more stars are needed to pass.F11: Speak context help (What can I press here?) for the current screen.F12: Toggle debug logging on/off.- State is persisted in MelonPreferences and restored on next launch.
Mod-generated announcements are localized to the same language selected in-game. Supported language set matches the game language menu:
- English
- Simplified Chinese
- Traditional Chinese
- Japanese
- Korean
- Vietnamese
- French
- German
- Spanish
- Portuguese
Settings are stored in UserData/MelonPreferences.cfg under category MelatoninAccess.
AnnounceMapHotspots(defaulttrue): map arrival and teleport destination/star lines.AnnounceRhythmCues(defaulttrue): contextual tutorial/gameplay cues (action, direction, and hold/release guidance).- Note: the config key name is legacy (
RhythmCues) but it controls contextual cues. - Can be toggled in-game with
F2.
- Note: the config key name is legacy (
AnnounceMenuPositions(defaulttrue): menu position context (1 of N) across supported menus.- Can be toggled in-game with
F3.
- Can be toggled in-game with
AnnounceTutorialDialog(defaulttrue): tutorial and dialog narration.AnnounceCreditsRoll(defaulttrue): credits title and scrolling names.DebugModeEnabled(defaultfalse): debug logging state used byF12.
dotnet build MelatoninAccess.csprojThe project is configured to auto-copy MelatoninAccess.dll and the cutscene-ad data folder to your game Mods folder after build when ModsPath is valid in MelatoninAccess.csproj.
Create release ZIP (mod + required screen-reader DLLs only):
pwsh -File .\scripts\Build-ReleasePackage.ps1 -Version "v1.1"Package contents:
Mods/MelatoninAccess.dllMods/cutscene-ad/manifest.jsonMods/cutscene-ad/scripts/*.jsonTolk.dllnvdaControllerClient32.dllUserConfig/Loader.cfg(bundled from maintainer install; includes hidden-console setting)
The release ZIP intentionally excludes development docs/tools (for example changelog files and regression test scripts).
- Install MelonLoader for Melatonin:
- Download
MelatoninAccess-v1.1.zip. - Extract/copy all files from the ZIP into your Melatonin game folder (the folder with
Melatonin.exe). - Confirm these files exist:
<Melatonin folder>/Mods/MelatoninAccess.dll<Melatonin folder>/Mods/cutscene-ad/manifest.json<Melatonin folder>/Tolk.dll<Melatonin folder>/nvdaControllerClient32.dll<Melatonin folder>/UserConfig/Loader.cfg
- Start the game and confirm you hear the mod loaded announcement.
Important:
Tolk.dllandnvdaControllerClient32.dllmust be in the main game folder, not inMods.
- A GitHub Actions workflow builds and uploads the release ZIP automatically when a tag like
v1.2is pushed. - The uploaded ZIP uses the same layout as local packaging (
Mods,UserConfig, root dependency DLLs, andMods/cutscene-adtiming data).
- Build:
dotnet build MelatoninAccess.csproj- If auto-copy is not configured, copy:
bin/Debug/net472/MelatoninAccess.dllto<Melatonin folder>/Mods/cutscene-ad/to<Melatonin folder>/Mods/cutscene-ad/libs/x86/Tolk.dllto<Melatonin folder>/libs/x86/nvdaControllerClient32.dllto<Melatonin folder>/
If you like what I do, I would appreciate a coffee: https://buymeacoffee.com/potatophones
- Thanks to luyi for testing the mod and providing fixed Chinese localization strings.
- Thanks to dreamburguer for providing fixed Spanish localization strings.
- Enable debug logs with
F12in-game. - Playtest the areas you changed.
- Run:
pwsh -File .\scripts\Test-SpeechRegression.ps1Useful options:
pwsh -File .\scripts\Test-SpeechRegression.ps1 -LogPath "D:\games\steam\steamapps\common\Melatonin\MelonLoader\Latest.log"
pwsh -File .\scripts\Test-SpeechRegression.ps1 -RequiredPattern "Tutorial\. Press .+ to skip\."Validate that all Loc.cs keys have complete language coverage and matching placeholders:
pwsh -File .\scripts\Test-LocalizationQA.ps1This check runs automatically during release packaging (scripts/Build-ReleasePackage.ps1) unless you pass -SkipLocalizationQa.
Validate cutscene intro/outro timing script files:
pwsh -File .\scripts\Test-CutsceneAdPipeline.ps1Strict/authoring options:
pwsh -File .\scripts\Test-CutsceneAdPipeline.ps1 -StrictCoverage -RequireEntries
pwsh -File .\scripts\Test-CutsceneAdPipeline.ps1 -ValidateLocKeys -LocPath .\Loc.csThis check runs automatically during release packaging (scripts/Build-ReleasePackage.ps1) unless you pass -SkipCutsceneQa.
Reference format and workflow:
docs/cutscene-ad-pipeline.md
Extract Unity assets directly from Melatonin_Data using UnityPy:
python .\scripts\extract_unity_assets.py --output-dir .\artifacts\asset-extractUseful options:
# Fast smoke test (export only a few assets per type)
python .\scripts\extract_unity_assets.py --output-dir .\artifacts\asset-extract-smoke --max-per-type 5
# Metadata only (no binary export)
python .\scripts\extract_unity_assets.py --output-dir .\artifacts\asset-index-only --metadata-only
# Include MonoBehaviour typetree exports (partial, build-dependent)
python .\scripts\extract_unity_assets.py --output-dir .\artifacts\asset-extract-mb --types AudioClip,AnimationClip,Sprite,Texture2D,TextAsset,MonoBehaviourOutputs:
assets.jsonl: one record per indexed object (source file, type, path id, exported files, status).summary.json: aggregate counts by type and source file.errors.log: file-level load issues (if any).
- Melatonin (PC)
- MelonLoader
- Tolk screen reader bridge (
Tolk.dll) available to the mod runtime