ppi (the sound engine handle) and dir aren't globals in
NumpadMovement.xml's own Lua state - they belong to other plugins -
so toggle_numpad crashed with "attempt to index global 'ppi' (a nil
value)" every time. Dropped the sound calls entirely, kept the spoken
confirmation. Updated the readme to match.
Accelerator(key, text) always sends text as a literal typed command -
it only calls a Lua function if a matching <alias> routes it there
(the pattern GagManager already used correctly). Several bindings
added this session skipped that step and were silently sending
gibberish to the MUD instead of running: Ctrl+S (save_state_func) in
CosmicRage.xml, Ctrl+Alt+J (toggle_jump_to_end) in output_functions.xml,
and Alt+Enter (toggle_numpad) in NumpadMovement.xml. Added the missing
aliases for all three.
Separately, poll_output_focus's jump-to-end was firing repeatedly even
while focus never changed: it compared Alien pointer returns with
"==", which is unreliable for Alien's userdata-wrapped pointers (two
separate calls returning the same real HWND don't reliably compare
equal). Switched to comparing tostring() output instead, which is
address-based. Debug log confirmed SmartAppendToNotepad's own
restore logic was correct throughout - this poll was the sole cause
of the "jumps to end when new text arrives" complaint.
Ports the zMUD/CMUD numpad.set convention: plain numpad for normal
movement, Ctrl+numpad for moving up a level in that direction, and
Ctrl+Alt+numpad for moving down a level, all sent as literal MUD
commands via Accelerator. Alt+Enter toggles the whole set on/off (with
a sound + spoken confirmation) by clearing/restoring the accelerators,
so a disabled numpad types normally instead of doing nothing.
Cleared the numbers/*/-/+ entries in the world's native <keypad> block
since they'd otherwise double-send alongside the new Accelerator-based
bindings - left "." and "/" (hide/inventory) alone since those aren't
part of this feature. Documented the full three-layer key list and the
toggle in the readme.