- Game: Blippo+
- Engine: Unity 6000.0.62f1
- Architecture: 64-bit
- Mod Loader: MelonLoader
- Runtime: net35
- Game directory:
I:\SteamLibrary\steamapps\common\Blippo+ - User experience level: Little/None
- User game familiarity: Not at all
- Experience level determined
- Game name and path confirmed
- Game familiarity assessed
- Game directory auto-check completed
- Mod loader selected and installed
- Tolk DLLs in place
- .NET SDK available
- Decompiler tool ready
- Game code decompiled to
decompiled/ - Tutorial/caption texts extracted
- Multilingual support decided
- Project directory set up
- AGENTS.md updated with project-specific values
- First build successful
- Startup speech smoke test passed (user confirmed + log verified)
- Phase: Phase 1 (Core Accessibility Hooks)
- Currently working on: QA-driven interruption fixes (subtitle dedupe, message-load timing/combined utterances, submenu stale-focus filtering); awaiting focused user QA
- Blocked by: Nothing
- Tier 1: Structure overview (singletons, screen flow)
- Tier 1: Input system (action IDs documented)
- Tier 1: UI system (screen/text access patterns documented)
- Tier 2: Game mechanics (as needed per feature)
- Tier 2: Status/feedback systems (signal-loss modal state integrated)
- Tier 2: Event system / Harmony patch points
- Tier 3: Localization system framework
- Tier 3: Tutorial analysis
- Results documented in
docs/game-api.md
-
Mainframework with: -
Localized startup announcement
-
F1where-am-I context speech -
F2repeat-last-announcement hotkey -
F3stop current speech hotkey -
F4speak tuned channel/show hotkey -
F5reload localization override files hotkey -
F6speak previous announcement from history -
F7speak next announcement from history -
F8speak context-specific controls help -
F9speak global inbox summary -
F10speak signal diagnostics (modal state + EVRP/EARCP) -
F12debug toggle speech + debug logger integration -
SystemScreenHandler: -
Announces
SystemScreen.Typetransitions when target screen is active -
Adds queued hints for Program Guide, Tuner Calibration, and Signal Loss contexts
-
Suppresses redundant screen-name speech for menu-driven screens (
Control Menu,Messages,Femtofax) that already provide richer entry announcements -
SignalLossHandler: -
Announces modal transitions (
WARNING,PROMPT,FORCE) -
Announces current
eVRPandeARCPvalues for context -
Announces focused Signal Loss modal actions (
Calibrate,Ignore,OK) with position context -
ProgramGuideHandler: -
Announces focused Program Guide elements
-
Announces row position context (
x of y) for channel row navigation -
Announces contextual labels for top buttons, channel badges, grid items, and full-width items
-
Suppresses non-actionable initial "Program guide focus" line on screen entry
-
Applies short-rate throttling and duplicate suppression to reduce focus speech chatter
-
Uses channel-id row-index fallback when direct row index is unavailable
-
Queues the first focus line on Program Guide entry to reduce collision with screen transition hints
-
TunerCalibrationHandler: -
Announces slider focus with current value and lock/adjust state
-
Announces slider value changes while adjusting
-
Announces confirm/cancel focus states
-
Announces readiness when all tuner values are locked
-
SignalLossHandlerupdate: -
Uses game-provided localized modal message text (
SignalLoss.message) when available -
Falls back to mod localization key only if game text is unavailable
-
BroadcastStatusHandler: -
Announces tuned channel automatically with channel number/call sign
-
Announces current show title on channel tune and show transition in broadcast screen
-
Suppresses immediate post-tune episode chatter to avoid duplicate show interrupts
-
Queues standalone show-change lines instead of interrupting
-
Extends shared suppression windows so info-panel announcements defer after primary channel/show speech
-
BroadcastModeHandler: -
Announces captions on/off state changes
-
Announces data mode on/off state changes
-
Announces broadcast info panel shown/hidden state changes
-
Applies timing suppression so rapid mode toggles do not spam speech
-
Queues mode/status lines so they do not cut channel/show announcements
-
Suppresses info-panel announcements for an extended window after channel/program transitions to prevent interruption of channel/show speech
-
Adds broadcast-screen-entry suppression and shared suppression checks via
BroadcastAnnouncementCoordinator -
Debounces captions/data-mode toggles so rapid flips speak only the final stable state
-
Suppresses rapid duplicate same-state info-panel announcements caused by UI visibility flapping
-
ShowSubtitlesHandler: -
Reads stabilized subtitle lines from
BroadcastDisplay.videoCaptions.textField -
Announces subtitle content only when
ViewerData_v1.current.captionsEnabledis true and captions are visible in broadcast -
Ignores partial typewriter updates by waiting for short text stability before speaking each line
-
Speaks each visible subtitle line once, then waits for caption text to change before speaking again
-
ControlMenuHandler: -
Queues submenu titles and merges them into first actionable focus line (
Title: item, position) -
Announces focused settings/options with position and value context
-
Uses non-interrupt delivery for submenu-entry focus lines to reduce cutoffs
-
Speaks numeric archived-packette entries as explicit labels (
Packette 1, etc.) -
Ignores stale focus objects that do not belong to the active submenu to prevent lines like
Utilities: Utilities -
Skips submenu-title echo combinations when first focus text only repeats the submenu header
-
MessagesHandler: -
Announces focused message entries with read/unread status
-
Announces page navigation controls in message list pages
-
Merges non-content submenu title with first focused item in one line
-
Delays initial list speech until message data settles, then announces one combined entry line (
Messages menu + counts + first message) -
Schedules message subject/body speech with short delay after message-view focus settles
-
Announces message-view navigation focus together with message content in one utterance to reduce interruption by
Back -
Announces message totals/unread summary on screen entry
-
Skips redundant submenu line when entering message content view
-
Announces when a message includes a loadable data packette and reads the linked filename
-
Filters out stale cross-submenu menu-button focus so returning from content view does not announce unrelated controls
-
FemtofaxHandler: -
Announces Femtofax program and navigation button focus
-
Announces Femtofax frame content (subject, author, rating, body)
-
Announces Femtofax program list position when available
-
Merges Femtofax entry summary with first focused item when possible
-
Falls back to queued summary speech when focus is unavailable
-
Keeps short post-content focus suppression to protect body readability
-
ScreenReader: -
Added
SayQueued()helper for explicit non-interrupt speech -
Added short duplicate suppression window to avoid rapid repeat lines
-
Added bounded announcement history with
RepeatPrevious()andRepeatNext()navigation -
ContextHelpService: -
Provides screen-aware control hints for
F8(Program Guide, Broadcast, Control Menu, Messages, Femtofax, Tuner, Packette Load, Credits, Signal Loss) -
Adds Control Menu submenu-aware help variants for Data Manager paging and Factory Reset safety confirmation
-
PacketteLoadHandler: -
Announces packette filename and scan step transitions
-
Announces found-channel milestones during scan
-
Announces unpacking wait state before scan completion
-
Announces actionable packette buttons (
continue,load) with stable focus timing -
CreditsHandler: -
Announces credits controls hint on entry
-
Announces currently visible credits section with section position context
-
DataManagerContentHandler: -
Announces non-focus data content in
Viewer Activity,Packette Log, andConcatenated Logssubmenus -
Re-announces summaries when displayed values change (for example after PREV/NEXT page changes)
-
Exposes shared Data Manager summary building for on-demand context speech
-
NewMessageAlertHandler: -
Watches unread message availability (
ViewerData_v1.current.newMessageAvailable) and announces when new unread inbox messages appear -
InboxSummaryService: -
Builds on-demand total/unread inbox summaries for
F9fromViewerData_v1.current.messagesInInbox -
SignalStatusService: -
Builds on-demand signal diagnostics for
F10usingSignalLoss.currentTypeUpand viewereVRP/eARCPvalues -
WhereAmIService: -
Builds on-demand context announcements from current screen, submenu, and focused item/value/position
-
Adds live broadcast channel/show context when broadcast display has no focused UI item
-
Adds Femtofax program/message context and Packette Load step/channel context on demand
-
Adds Tuner Calibration readiness/focus context and Signal Loss modal/value context on demand
-
Adds Credits section context (title and position), with optional focused element detail
-
Adds Data Manager submenu value summaries in Control Menu contexts
-
Normalizes screen-name punctuation to avoid doubled sentence breaks in
F1output -
Adds explicit factory-reset warning/cancel context in Control Menu where-am-I output
-
BroadcastContextService: -
Shared builder for tuned channel/show announcements, used by
F4andWhereAmIService -
BroadcastAnnouncementCoordinator: -
Shared coordinator that suppresses
Program info shown/hiddenlines during channel/show speech windows -
FactoryResetHandler: -
Detects Control Menu factory reset action via persistent
Button.onClickmethod metadata -
Announces irreversible-warning context on factory reset submenu entry/focus
-
Announces submission and completion cues when factory reset leads into Packette Load
-
Exposes shared factory-reset context detection for where-am-I safety output
-
Build system:
-
Excludes
reference/from compilation so old reference files remain read-only and cannot break builds -
Distribution system:
-
Added
scripts/New-ReleasePackage.ps1to produce release ZIPs with this structure:mods/BlippoAccess.dllTolk.dllnvdaControllerClient64.dllandnvdaControllerClient32.dllREADME.txtwith installation instructions and MelonLoader link
-
Release ZIP naming now follows user-facing format
blippo access <version>.zip(for example tagv1.0->blippo access 1.0.zip) -
Release ZIP now also includes
UserData/Loader.cfgto ship MelonLoader console-hidden defaults for players -
Added GitHub Actions workflow
.github/workflows/release-zip.ymlto auto-build and upload the ZIP on published releases -
Locupdate: -
Supports external per-language override files loaded from
BlippoAccessLocalization/*.txt -
Supports comment lines and escape sequences (
\n,\r,\t,\\,\=) in override files -
Adds runtime
F5reload support for override iteration without restart -
Added documentation and template for translator workflow:
-
docs/localization-overrides.md -
templates/localization/en-us.txt -
Added localization scaffold helper:
-
scripts/Initialize-LocalizationOverrides.ps1 -
Added localization coverage validator:
-
scripts/Test-LocalizationOverrides.ps1
-
Program Guide navigation focus:
-
Move through top buttons (expand/menu/messages/return) and confirm speech includes button position and meaning
-
Navigate channel rows and grid items and confirm
x of ycontext and channel/show labels -
Confirm no doubled punctuation in focused item speech
-
Confirm rapid directional navigation no longer produces unusable speech flooding
-
Toggle expanded/collapsed guide and verify focus announcements stay coherent
-
Tuner Calibration focus/value:
-
Move across all four sliders and confirm property name, value, and lock status are announced
-
Adjust sliders and verify value-change announcements are spoken without excessive spam
-
Confirm "ready to confirm" is announced when all four values lock
-
Focus confirm/cancel buttons and verify correct announcements
-
Regression checks:
-
Screen-transition and signal-loss announcements still behave correctly
-
Trigger signal-loss warning/prompt/force and confirm modal sentence is read in current game language
-
In signal-loss modals, navigate available actions and verify focused button is announced with position (
x of y) -
Switch channels from broadcast/remote controls and confirm automatic channel + show announcements
-
Open Control Menu and navigate settings to verify option/value speech
-
Open Messages and verify list focus, page navigation, and message content speech
-
Trigger a new inbox message (normal gameplay or debug path) and verify one queued
New message availableannouncement -
Open Femtofax and verify program focus, navbar focus, and message content speech
-
Verify Messages/Femtofax entry summaries are spoken once per entry and not repeated excessively
-
Toggle captions/data mode/info panel in broadcast and confirm automatic mode announcements
-
While watching broadcast content with subtitles, enable captions and verify subtitle lines are spoken once per line
-
Disable captions during the same content and verify subtitle lines stop being spoken immediately
-
With captions enabled, verify the same on-screen subtitle line is not repeated while unchanged
-
Enter Control Menu submenus and verify first announcement is combined:
-
Example target pattern: "
Main: Electronic Program Guide, 1 of 6" -
Enter
Utilities,Packette Manager, andData Managerand verify stale lines likeUtilities: UtilitiesorPackette Manager: Packette Managerare no longer spoken -
Open Messages list and Femtofax entry and verify first line is combined title + first focus item when available
-
Open Messages list and verify entry line prefers first message item (not
Menu) when message focus appears immediately after entry -
Open Messages and verify first spoken line is one utterance containing: menu name, total/unread counts, and first message
-
Open a message with Enter and verify message-view focus (for example
Back, 1 of 2) is announced first, then subject/body starts after a short delay -
Open a message and verify one combined utterance includes
Backfocus + message content (with a pause) instead of separate interrupting lines -
In message view, navigate Back/Load Packette and verify controls keep announcing after content auto-read begins
-
Open a message with a data packette and verify packette availability + filename are announced
-
Enter/exit broadcast and switch channels/programs rapidly; confirm
Program info shown/hiddendoes not cut channel/show announcements -
While in broadcast, press
F4and verify immediate channel/show context announcement -
During long speech, press
F3and verify speech stops immediately -
In broadcast with no focused UI object, press
F1and verify where-am-I still reports tuned channel/show -
In Femtofax, press
F1and verify current program/message context is announced when messages are visible -
In Packette Load, press
F1and verify current step status (and channels found when applicable) is announced -
In Tuner Calibration, press
F1and verify calibration readiness plus current slider/button focus context -
In Signal Loss, press
F1and verify current modal message plus EVRP/EARCP values -
In Credits, press
F1and verify current section title/position is announced -
Edit an override file, press
F5, and verify updated strings are used immediately -
Run
pwsh -File scripts/Test-LocalizationOverrides.ps1and verify exit code/report are clean for completed translation sets -
Press
F6repeatedly and verify older announcements are spoken in reverse order -
Press
F7afterF6and verify navigation forward in announcement history -
Press
F8across major screens and verify context-appropriate controls help text -
In Control Menu data submenus, press
F8and verify help mentions previous/next page controls and summary updates -
In Factory Reset submenu, press
F8and verify help includes irreversible warning and cancel/confirm guidance -
Press
F9from non-message screens and verifyMessages: total/unreadsummary is announced -
Press
F10and verify current signal modal state plus EVRP/EARCP values are announced -
Enter Program Guide and verify first focused item line is queued behind entry speech instead of cutting it
-
Confirm new phrasing order is item-first:
-
Example target pattern: "
Get the Facts, message 1 of 5, read" and "View Controls, 4 of 6" -
Verify rapid info-panel and data-mode toggles no longer flood the reader
-
Switch channels/programs rapidly and verify "Program info shown/hidden" does not interrupt channel/show announcements
-
Toggle info panel rapidly in broadcast and verify duplicate same-state announcements (for example repeated "Program info shown") are suppressed
-
In Archived Packettes submenu, verify numeric options are read as
Packette <number> -
Open Packette Load flow and confirm these phases are announced:
-
Scanning subspace, signal acquired, scanning for channels, unpacking, and scan complete
-
During channel scan, confirm found channels are announced with running total
-
On signal-acquired and scan-complete steps, confirm primary button focus is announced once and cleanly
-
Open Viewer Activity and verify data summary announces displayed metrics and updates after PREV/NEXT
-
Open Packette Log/Concatenated Logs and verify minutes/sampled/watched/femtofax percentages are announced
-
In Control Menu data submenus (
Viewer Activity,Packette Log,Concatenated Logs), pressF1and verify where-am-I includes submenu/focus plus current value summary -
Press F1 on several screens and verify where-am-I reports current screen + focused item context
-
Press F1 in Broadcast and other screens and verify no doubled punctuation in screen names (for example no
Broadcast display..) -
Press F2 after key announcements and verify previous speech is replayed
-
Enter Data Manager -> Factory Reset and verify warning/cancel hints and completion announcement behavior
-
In Factory Reset submenu, press
F1and verify where-am-I includes irreversible warning and cancel hint -
Open Credits from both Control Menu and Broadcast contexts
-
Confirm controls hint is announced once on entry and not repeated every frame
-
Let credits auto-scroll and verify section announcements are readable and not over-frequent
-
Use left/right skip and verify section announcement follows the new section
- Add broadcast cursor snap navigation:
[and]to cycle through currently clickable cursor targets during broadcast UI\to activate/click the currently snapped target- Document discovered target order and fallback behavior when no cursor targets are active
- Add beginner-friendly game mechanics guide:
- Create a new docs file explaining major systems (Program Guide, Broadcast, Info Panel, Data Mode, Messages, Femtofax, Packettes, Signal Loss, Tuner) in plain language
- Include explicit explanations of what
Info PanelandData Modedo in practical gameplay - Continue interruption-combining pass:
- Audit Utilities, Packette Manager, Settings, and related submenus for split/interrupting lines
- Merge title/focus and closely related status lines into single utterances where it improves readability
- In-game localization routing is complete, but built-in mod strings are currently authored in English only.
- Non-English localization now supports external override files, but verified translated override packs are not yet authored.
- Localization is mandatory from day one (
Loc.Get()for all speech). - Handler classes follow
[Feature]Handlernaming. - Screen and modal announcements use state-change detection to avoid repeat spam.
- Language detection uses
NobleRobot.LanguageUtility.currentLanguage. - Language support target includes all 16 languages discovered in game assets.
- F1: Where am I (current context)
- F2: Repeat last announcement
- F3: Stop current speech
- F4: Announce tuned channel/show
- F5: Reload localization overrides
- F6: Previous announcement in history
- F7: Next announcement in history
- F8: Context controls help
- F9: Global inbox summary
- F10: Signal diagnostics
- F12: Toggle debug mode
- Review latest user test log with focus on interruption reductions in Messages/Femtofax/Control Menu/Broadcast.
- Validate Packette Load announcements in a live run and tune verbosity if scan events feel too chatty.
- Validate Credits section-title extraction and refine heuristics if a non-header line is spoken.
- Validate Data Manager summary verbosity and shorten phrasing if specific pages are too dense in one announcement.
- Validate
F1in Data Manager submenus and tune phrasing if summary density is too high. - Validate combined menu-entry strings and tune fallback timing constants if lines still split in edge cases.
- Validate delayed message-content timing and tune delay window if body starts too early/late on some machines.
- Validate subtitle timing during active broadcasts and tune stability/dedupe thresholds if lines are too early/late or repeated.
- Implement requested broadcast cursor snap navigation (
[,],\) after decompiled cursor-target mapping review. - Draft beginner-friendly mechanics doc with clear
Info PanelandData Modeexplanations. - Continue submenu utterance-combining pass in Utilities/Packette Manager/Settings.
- Create first GitHub release tag and verify uploaded ZIP asset naming/content from the new release workflow.
- Author and verify non-English override files for high-priority keys via
BlippoAccessLocalization/*.txt. - Validate new F3-F10 hotkeys in live play and tune if conflicts/verbosity issues appear.