Releases: EarthboundPromoter/Words-of-Power-II
Release list
0.7.0
Five sessions of work: the tooltip system learns sections, the combat voice finishes its compression pass, and a new scanner joins the keyboard.
Added
- Home and End step through the last-spoken tooltip one section at a time — health, status effects, cooldowns, resistances, and so on. Works after a D detail or any tooltip page, in play, in shops, and in the character sheet; every new page starts back at the top.
- Y speaks the enemies who can hit you this turn — the game's own Show Threatening Enemies key: cycle nearest first, Shift reverses, Alt pins. Follows your attention like every scan.
- Ctrl + any scan key (I, U, N, O, Y) speaks a range digest: one summary by spell range, nearest bracket first — "Range 3: 2 Goblins, Bat."
- Unit reads gain a Cooldowns line — abilities currently cooling down, "Cooldowns: Fire Breath 2t" — absent when everything is ready.
- When a control effect eats your turn, the report says so: "Turn lost to Frozen." — so a doubled-up round reads as two turns, not one.
- The turn-end coda: when a turn changed your shields or a control effect, the last thing spoken is where you stand — "2 shields.", "Still stunned, 2 turns left." Silent when nothing about you changed. New setting
coda_enabled(default on). HP is deliberately not in the coda for now — every hit already speaks inline with its amount; press F for your totals. - The Wardrobe is fully voiced, locked outfits speak their unlock path (never their hidden names), and the Escape-menu row says its name.
- Chasm tiles name their type everywhere tiles speak: lava, water, swamp.
- New setting
terse_labels(default off): drops the "Jumped to:" and "Component:" prefixes.
Changed
- Unit reads are reordered for listening: name, health, shields, status effects, cooldowns, resistances, movement, and tags come first; the long spell and passive text comes last, where skipping it is free.
- Rift crafting previews (Prospective Equipment) read one gear piece at a time instead of one long comma run-on.
- Shield blocks compress: one line per attacker and spell — "blocked 4 hits, 8 Holy each" — ending with the shields-left count. Blocked hits name their attacker.
- Ambient deaths group into one line; enemy area spells name each target once with all its damage together.
- A creature that transforms says so: "killed, became Wild Man" rides the kill line. Necromancy speaks in one breath: "killed Goblin (10,4), 9 Dark, raised as Ally Skeletal Goblin."
- Your army fading out after a clear says "Allies vanished." — not a roll call of deaths that never happened.
- Self-damage and retaliation from your own cast now speak inside the cast's report, after its cause.
- The once-per-crossing HP warnings retire; hits speak their amounts inline as they land, and F reads your totals on demand.
Fixed
- Enemy shield breaks no longer double-speak: the compressed blocked line is the one voice; the stepwise "shield broken, N remaining" echoes are gone.
- Pressing R before clearing your first realm crashed the game; it now says "No rerolls."
- Mutator parameter submenus spoke raw formatting code; they now speak the game's own labels.
- Repeat-casting a melee spell was silent on the first targeting step; the tile now speaks every time.
Removed
- The
threat_enumeration_legacyandwizard_hp_readoutsettings (superseded — see Y scan and the inline hit narration). - Look-mode and targeting unit summaries no longer append on-death effects; those speak in the unit's full detail, one D press away.
Full detail in CHANGELOG.md.
0.6.5
Compatibility and speech update.
Game compatibility
- Compatible with the current game beta, including the new Q recast key and the reworked Artificer's Rod. Works on the main branch too — one build for both.
New speech
- Q recast announces where the aim lands, same wording and AoE warnings as aiming manually.
- Zone spells announce their tiles on cast — "Wall of Flame: 7 tiles, (3,2) to (9,2)." — and zone tiles speak on cursor-over, with turns left in Look mode.
- Silent HP drains speak as resulting state: "Furnace Hound (13,13) Necrosis: HP 25 of 25." Slimes narrate their splits: "healed 1, then split: new slime at (7,1)."
- Artificer's Rod and Chalice triggers narrate, each effect named to its component. Charge refunds name their spells. Component max-HP grants speak the game's line.
- Custom game setup is fully voiced: mutator catalog, active list, every add and removal, parameter submenus, paging.
Combat narration
- Kill lines group hits from one source into "3 hits, 2 Holy each." One death speaks one "killed." Repeat casts by one unit read as one unit. Allies keep their Ally prefix in mixed groups. Duplicate coordinates read as counted forms.
- Units spawned by on-death splits and triggered effects speak as spawns, attributed to what caused them.
- Auto-pickup walks run quiet; the end-of-walk summary stays.
- Large fights compose narration in milliseconds — long summoner turns no longer stall speech.
Settings
- New: wizard_hp_readout (default off), artificer_component_names (default on).
Full detail in CHANGELOG.md.
0.6.3 — Pathfinder
The P key headlines this release: scan anything, press P, hear the route. No cursor to place, no pin to set — scan, listen, keep scanning. And for anyone picking up the game fresh, TUTORIAL.md is the new guided tour, from your first scan to your first deploy.
Added
Pwith no cursor up speaks the path to the last spoken scan result — no pin set, no cursor moved. Scan, hear a target, P for the route, keep scanning.Pwith a cursor up names what it pathed to: "path to cursor" in Look mode, "path to aim" while aiming a spell, "path to destination" for teleports.- One word per referent: scanned things are targets, Look's cursor is the cursor, a spell's is the aim — scans mid-aim say "From aim", not "From target".
- Continue Run greets you with a briefing: realm, HP, shields, SP, active statuses, adjacent enemies with directions, ally count, and what remains.
- Blood Bullet says "Obstructed by X" when the shot won't reach the aim — the first unit in the path, allies included. Blessed Blood's pass-through is respected.
- Shop and crafting screens name still-active filters when they open — filters survive menu round trips, so a shortened list now says why.
Jjoined the spoken keybind reference (Shift+/), including that it moves your aim while a spell is up.- TUTORIAL.md: a new-player guide to the game and the mod, from first scan to first deploy. Linked at the top of the README.
Fixed
Pno longer says "already at target" after leaving Look mode or casting without moving.- Summoned allies whose time runs out are "expired", not "died" — a kill the game never showed.
- Enter while in Look mode says "Cancelled" (it closes the cursor, same as Escape) instead of the false "look: can't target self".
- Item pickups and on-death warnings speak markup as words ("50 HP", not "bracket 50 HP colon heal bracket").
- Minion self-heals are tagged Ally, matching their spawn announcements.
- Deploy-screen tiles say the coordinate right after the unit's name, not glued to its last ability.
Install: download the zip, extract, and copy the screen_reader folder into Rift Wizard 3/mods/ — full steps, including first-time enabling, in the README.
0.6.0 — Good Looking
Spring look headlines this release — and a milestone rides with it: every screen in the game now speaks.
Returning players: one key moved. The axis jump is now Ctrl+Shift+direction; bare Ctrl+direction became the spring look. TRANSITION.md walks all the changes in learning order.
Added
- Death line names the killer — direct hit, lingering effect with its source, or your own spell. The fatal turn's events now narrate at the death screen.
- Game-over screen announces its choice: the message-log key opens the combat log, any other key continues to the slideshow. Speech-review keys (
Z,[,]) are safe there. - Save Preferences and Mods menus speak: toggle states, mod positions, enable/disable and load-order moves (Shift+Up/Down), and the upload picker.
- Combat log lines speak as words, not raw color markup, and each unit is tagged ally or enemy as its color shows (a berserk ally announces as enemy).
- Spring look: hold
Ctrl+directionto step a temporary look cursor (add Shift to jump); release Ctrl to return. Enter or V mid-peek keeps Look mode; a spell hotkey aims there. - Axis jumps speak the span they crossed: "4 floor east, Imp". New settings:
jump_count_open_space(default false),jump_compass(true),jump_landing_first(false). - Blocked cursor moves at the map boundary say "Edge" on every fresh press — single steps included — in look, targeting, and deploy.
- Shop and combat-log search boxes speak:
Qfocuses, the result count speaks live as you type,Enterkeeps the filter,Escapeclears it,Down arrowreads back the query. - New setting
search_key_echo(default false): speak each character typed into a search box. - Frame heartbeat probe (diagnostic): the debug log records frame gaps over 50ms, a per-minute summary, and garbage-collector pauses. Setting
frame_probe_enabled(default false). - Object census (diagnostic): every five minutes the debug log records object counts and growth, briefly stalling the game. Setting
frame_probe_census(default false). - New setting
deploy_scan_routing(default true): set false to keep the deploy cursor parked while scanning;Jjumps to the last spoken result,Shift+Jreturns. - New setting
key_trace_enabled(default false): logs key timing and diagonal-chord decisions to the local debug log, for diagnosing control bugs.
Changed
- Spell listings: metadata reordered for the unrefined. Name first, then cost, then everything else, on every shop screen. The four parts are independently composable now; configs for the cultivated will follow in due course. This one's for you, Chaosbringer216 and company.
- The axis jump is now
Ctrl+Shift+direction; bareCtrl+directionis the spring-look step. Numpad jump chords are unsupported — NumLock strips Shift from numpad presses. - Jump receipts speak before the landing (
jump_landing_firstrestores the old order); Shift+move landings name the tile's contents, not the full read. D on arrival for detail. - Latched threat overlay tokens say "safe" instead of "clear", matching the T query's "Threatened"/"Safe".
- Tooltip page counter ("2 of 5") moved from the start of each page to the end (player feedback).
Fixed
- Ally attack range now speaks, as reach not threat: examine +
Tanswers "You're in its reach";Alt+Tlatches with reach wording. Berserk or charmed allies flip to threat wording. - Grouped bonus readouts now say "spells and equipment gain…", matching the game's text — these bonuses apply to gear too.
- Multi-line descriptions (spells, upgrades, equipment) now pause at line breaks everywhere they're spoken, instead of running together.
- Keeping a search with Enter now reads the first result after the count; it was previously never spoken.
- The combat log line reader now follows the filtered view while a search is active.
- Examine +
Ton a hostile now answers for your square ("Threatens you"/"Can't hit you"); it was testing the enemy's own tile (field report 2026-07-08, yujin0986).
Install: download the zip, extract, and copy the screen_reader folder into Rift Wizard 3/mods/ — full steps, including first-time enabling, in the README.
v0.5.1 — hotfix: the mouse no longer hijacks the overlays
Fixed
- The mouse no longer hijacks overlays and examine during keyboard play. The
game quietly used the physical mouse position as its attention point: heldL
drew line of sight from the tile under the pointer (wherever it happened to
rest), held highlight keys examined that tile every frame — narrowing the threat
overlay to whatever unit the mouse sat on, with no keyboard way out — and any
pointer drift moved the Look cursor. Now whichever device acted last owns the
attention point: any keypress mutes the mouse; a mouse click or wheel wakes it
(the waking click only wakes — the next one acts). Mouse motion alone never
takes control, so desk bumps and screen-reader pointer routing can't steal it.
With the keyboard in charge, heldLdraws from the deploy target, your
Look/targeting cursor (a handy visual cursor tracker), or your wizard. New
settingmouse_attention_arbitration(default true); set false for fully
native mouse behavior.
v0.5.0 — The Cursor Update
Returning players: TRANSITION.md walks these changes in
learning order, quick start first.
Added
-
Shift + Tab reverse target cycling while targeting, walking, or looking —
the game's Tab cycle stepped backward, same voice and "N of M" counter. A fresh
press starts from the far end of the list, so in walk mode it jumps straight to
the rifts. Requested by Neurrone. -
Setup step required: Steam silently reserves Shift + Tab for its in-game
overlay and the game never receives the chord — even though the overlay never
visibly opens in Rift Wizard 3. Disable the overlay for this game (Rift Wizard 3
Properties, General tab, uncheck "Enable the Steam Overlay while in-game") or
reverse cycling cannot work. Every other Shift chord is unaffected. Steps in
the README. -
New setting
speak_pickup_effects(default true): set false to trim Ruby Heart
and Memory Orb cursor reads to name-only. Walk-on shrines always speak their
effect. -
Two-arrow diagonal chording. Press two orthogonal arrows as one gesture —
Up+Right is northeast — for a single diagonal step; add Shift for the 4-tile
diagonal. No modifier, both hands or one, and it follows your movement
rebinds. A lone press still steps normally (it waits one imperceptible frame
for a partner). Held arrows keep the game's native auto-walk untouched. -
Ctrl + direction: the axis jump. Skim the cursor along a line until what
you'd hear changes — across open floor to the next unit, item, wall, or
cloud, in one keypress. Speaks the landing tile, then the distance
("6 east"; "Edge" when the map ends the run). Either Ctrl, and it composes
with everything: Ctrl+arrow straight, Ctrl+pair diagonal, Ctrl+numpad free.
By default the jump stops at every unit; the newjump_coalesce_units
setting (default off) strides same-name clusters instead. Cursor modes only
— your wizard never jumps. -
Pins: the mark grows into a pin list on K. Alt+K pins or unpins the
last spoken target — or, with nothing spoken, bookmarks the tile you're on
or looking at (the deploy cursor works too, and the pin carries into the
level). K cycles your pins in category blocks — enemies, allies, landmarks,
bookmarks — nearest first within each block, with a count header on a fresh
cycle; Shift+K reverses and Ctrl+K jumps block to block. Alt+K on a
just-cycled pin unpins it. Pins live per level, follow their unit, and
announce deaths and collected landmarks. The newest or last-cycled pin is
the focused pin: it carries the per-turn guidance line ("North to Wolf,
12 HP."), and Shift+P re-announces its full path. New setting
pin_speak_all(default off) speaks every pin's update line each turn. -
Scans route the cursor. In Look mode, deploy, and pure-teleport
targeting (Blink and kin — Translocation spells with no area to aim), every
scan and pin-cycle press also parks the cursor on the result it just spoke:
the scan line is the announcement, T and D answer for that tile
immediately, and Enter acts on it — the missing mouse-flick. A cycle keeps
measuring from where it started, so repeated presses walk outward instead
of chasing the cursor. While aiming any other spell the cursor is your
tuned aim and scans leave it alone. -
J: jump to the last spoken result. From normal play, J opens Look mode
right on the last thing a scan or pin cycle spoke; while aiming, J moves
the aim there deliberately (any spell). If it died or was collected since
it spoke, J says "gone" and stays put — it never asserts stale truth.
Shift+J bounces back to where the cursor was before the jump. J and Y had
been freed by the scan-key move; J is now the bridge. -
Overlay latches: Alt+L and Alt+T. The game's hold-to-see overlays,
pinned: latch line of sight or threat and it stays active — the overlay
keeps drawing (like holding the key), and every cursor step gains a short
tag: "in sight" / "out of sight", "threatened" / "clear". Latched from
normal play, line of sight follows you as you move; latched from Look,
aiming, or deploy, it watches from that tile — a deploy latch carries
into the level with you. Examine an enemy first and Alt+T latches just
that enemy's reach ("Latched: Night Hag's threat"). One latch at a time,
same chord releases, F reports what's latched, and holding the real key
still works and takes over while held. New settinglatch_visual_overlay
(default on) controls the drawn half; the spoken tags work either way.
Changed
- The global threat query now answers "Threatened" or "Safe" — nothing
more. The old readout listed every threatening enemy with counts and
directions, but the game itself shows threat as an anonymous red zone and
gates who threatens behind examining each enemy one at a time. The old
report assembled a tactical summary no sighted player ever got in one
glance — you were overserved — and computing it was the freeze players
felt pressing T on crowded levels. The new answer reads the game's own
threat zone (built once per turn, shared with the held-T overlay), so it's
instant after the first press of a turn. Who-threatens is unchanged where
it always lived: examine an enemy and press T ("Threatens you" / "Can't
hit you") — with scans now parking the cursor, that loop is three
keypresses. The old readout survives verbatim under a new setting,
threat_enumeration_legacy(default off), as a time capsule: it will be
removed in a future release, so if you rely on it, say so. - The "From destination" scan qualifier now follows the routing rule —
spoken only for teleports whose target is truly a destination. It used to
key on the bare Translocation tag, which mislabeled Disperse's area aim as
a destination. - Alt+scan marking is now the pin toggle. The one-mark-at-a-time limit is
gone; Alt + I / N / O / U pin without replacing what you marked before, and
scan lines say "pinned" where they said "marked". If you relied on marking
to auto-replace, unpin with a second Alt+K on the old target. - Right Ctrl no longer means diagonal — Ctrl now means one thing, either
side. The RCtrl+arrow diagonal and its AltGr synonym are retired, replaced
by two-arrow chording; the mod never distinguishes left from right Ctrl
again. Bare Ctrl (either one) cancels speech; Ctrl chords are the axis jump
(see Added). Hard switch, no legacy setting. - Shift + arrow now speaks the landing tile plus a short "Crossed:" summary
of everything the cursor skimmed past — units, props, clouds, walls, chasms,
and floor, grouped with counts ("Crossed: 2 floors, web") — instead of
reading all four tiles in sequence. Floor counts so the distance never needs
arithmetic. A move stopped short by the map edge appends "Edge"; a move
pinned at the edge says "Edge" instead of nothing. Applies in Look,
targeting, walking, and deploy, straight or diagonal, arrows or numpad. - The scan keys moved onto the game's own highlight keys — the key that
lights a category on screen is now the key that speaks it. Enemy scan: J is
now I (Highlight Enemies). Ally scan: Y is now U (Highlight Allies).
Landmark scan: Q is now O (Highlight Objects). Tap to scan, hold to show
the tiles; the pairing follows your rebinds — rebind Highlight Enemies and
the enemy scan moves with it. N (spawners) and X (hazards) are unchanged;
they have no game highlight. The Alt+key toggle moved with the scans
(Alt + I / N / O / U). Q and Y are now unbound, reserved for upcoming
features; J was given its new job as the cursor jump (see Added). This is
a hard switch with no legacy-keys setting — the old letters simply stop
answering.
Fixed
- Shift + numpad now actually moves 4 tiles — when NVDA isn't running. A
Windows keyboard legacy ("fake shift") strips Shift from NumLock-on numpad
presses at the driver level, below every application — so the game's own
Shift+numpad move silently stepped one tile, for every player, screen
reader or none. The mod now recognizes the stripped chord's signature and
performs the 4-tile move itself, with the same landing-plus-crossed voice.
KNOWN LIMIT, verified by event capture: with NVDA running, NVDA's keyboard
hook consumes the numpad keypress outright and nothing reaches the game to
repair — use the arrow gestures (Shift+arrow, Shift+pair), which are
immune. NumLock stays on either way; NVDA's NumLock-off review keys are
untouched. - Ctrl speech cancel actually works now — and either Ctrl does it. A
modifier guard swallowed the press before the cancel branch could ever run —
dead code since it shipped, masked by NVDA's own control-interrupt: the
synth went quiet, but the mod's queued lines kept arriving afterward. Cancel
now also clears the mod's speech queue and pending HP announcements, and
scan cycling survives a mid-cycle cancel. - Walk-on props (Ruby Heart, Memory Orb, and the three walk-on shrines) now read
their description in Look mode and the targeting brief, matching the game's
examine panel, which shows it on mere cursor-over. Reported by Neurrone. - Units no longer hide the prop or cloud beneath them: the targeting brief, the
Tab-cycle read, and Look mode's portal branch all spoke the unit and dropped
what it stood on. All three now speak what's beneath, threat-first. Reported
by Neurrone.
v0.3.4 - shrine descriptions and grouped bonus lines
Two fixes from the field-report batch:
-
Shrine tooltips at rift selection now read the shrine's description instead of its name alone - "Shrine of Knowledge. Sacrifice a component to learn a random spell that shares a tag with it..." Stocked shops read their item list, matching the game's own examine panel. (Reported by yujin0986.)
-
Bonus lines are grouped under one prefix per source: "Blood spells gain 50% Minion Health, 50% Damage, 1 Max Charges, 2 Range, 3 Minion Damage" instead of five separate "Blood spells gain..." sentences. Applies everywhere bonuses are read - crafting, character sheet, shops, tooltips. No bonus is dropped. (Reported by ahicks.)
Both shipped on test-pinned output - tell us how they actually sound in your ears.
Install: unzip into the game's mods folder as before, replacing the old screen_reader folder. Settings and logs are untouched.
v0.3.3 - the crafting screen reads the Attributes block
Hotfix: the crafting screen now reads an item's full examine panel, including the "Attributes:" stat block (10 Damage, 2 Duration, and the like) that the crafting reader never spoke. Gear whose numbers live only in that block - Ghost Slippers' minion health and damage, for example - was silent about them entirely. Blueprint rows and the mid-craft review key now read the same body the character sheet already reads.
Thanks to yujin0986 for the report.
Install: unzip into the game's mods folder as before, replacing the old screen_reader folder. Settings and logs are untouched.
v0.3.2 - the slowdown fixed, targeting from the engine's own footprint
The 0.3.1 slowdown is fixed. 0.3.1 shipped a settings.ini that ran every player with the mod's internal diagnostics on: per-event disk writes plus capture instruments whose cost climbs steeply in crowded fights. 0.3.2 stops shipping settings.ini (the mod generates one with correct defaults on first run) and turns the five diagnostic flags off in your existing file automatically - once, in place, with every other setting you may have customized left untouched. No manual steps.
Spell targeting follows the game's own footprint. The "Within AoE" census reads the same engine source that paints the targeting tiles, so every true area spell reports - beams, cones, and linked-group spells like Mass Melt's chain - with allies listed first. Single-tile spells no longer produce false "Within AoE" warnings. Linked-group spells name their chain. Invalid targets give their reason at the cursor ("No line of sight.", "No target.", "Tile occupied."), and "Out of range." comes from the game's own range circle for every spell.
Logging is tamed. The new debug_log setting (default: standard) keeps the log to what you did and what was spoken, plus startup and errors; verbose restores the full internals for bug reports. The console echo that measurably delayed busy turns is off by default. The logs folder now caps itself at 25 MB, deleting the oldest archives first - logs that piled up before 0.3.2 count toward the cap, so a large folder shrinks on first launch (copy anything you want to keep before updating).
Also in this release: Look mode names your own auras covering the examined tile; rift previews mark component rewards ("Component: Flame Blade Fragment"); Tab with no valid targets says "No targets"; canceled auto-pickup walks announce "Auto-pickup stopped."; the final auto-pickup item lands inside the batch summary; Memory Orb pickups match the summary's wording; and a performance sentinel logs any turn that takes 100ms or more, so a slow session documents itself.
The composer speech pipeline (direct-action digest, crisis lines, ambient narration, equipment narration) is now the default speech engine - 0.3.1 installs were already running it.
Full details in CHANGELOG.md.
v0.3.1 - line-of-sight announcements restored
Hotfix release.
"X appears" announcements are back. They had been silent on every normally-entered level since the RW3 port began — the enemy-enters-view tracker only armed itself on levels that already contained the wizard at load time, which is true after loading a save and false on every ordinary rift transition. The tracker now arms the moment the wizard lands, so enemies walking into view announce on every level.
Terrain changes update who is in view. When a wall melts (or appears) while everyone stands still, revealed or hidden enemies are re-checked immediately — before, the check only ran when a unit moved, so an enemy behind a melted wall stayed silent until something else stirred.
Cloud arrivals no longer announce a cloud that never landed. A new cloud that fails to displace the cloud already on its tile is discarded by the game; the arrival summary used to announce it anyway.
Under the hood, this release completes the world-state capture layer: terrain, tile flavor (lava/swamp/water chasms, wall skins), cloud lifecycles, props and rifts, and the Chronomancer trial clock are now all recorded internally with their causes. That is groundwork for upcoming speech work; the fixes above are its first fruit.
Settings carry forward untouched from 0.3.0 and 0.2.x.