mirror of
https://github.com/imjasonh/nescript
synced 2026-07-11 10:10:49 +00:00
127 lines
4.1 KiB
Text
127 lines
4.1 KiB
Text
|
|
// sha256/entering_state.ne — the interactive typing state.
|
||
|
|
//
|
||
|
|
// Reads controller 1 each frame, moves the keyboard cursor on
|
||
|
|
// D-pad presses, types a character on A, deletes a character on
|
||
|
|
// B, and starts compression on START (or when the cursor is
|
||
|
|
// over the ↵ key and A is pressed). SELECT clears the buffer at
|
||
|
|
// any time so the user can start over.
|
||
|
|
//
|
||
|
|
// If the user doesn't press anything in the first AUTO_DELAY
|
||
|
|
// frames, the handler auto-types DEMO_TEXT ("NES") and
|
||
|
|
// transitions to Computing so the jsnes golden always captures
|
||
|
|
// a fully-rendered hash.
|
||
|
|
|
||
|
|
state Entering {
|
||
|
|
on enter {
|
||
|
|
kb_row = 0
|
||
|
|
kb_col = 0
|
||
|
|
idle_timer = 0
|
||
|
|
debounce = 0
|
||
|
|
blink_timer = 0
|
||
|
|
}
|
||
|
|
|
||
|
|
on frame {
|
||
|
|
// ── Debounce + blink tick ───────────────────────
|
||
|
|
if debounce > 0 {
|
||
|
|
debounce -= 1
|
||
|
|
}
|
||
|
|
blink_timer += 1
|
||
|
|
if blink_timer >= 40 {
|
||
|
|
blink_timer = 0
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── D-pad navigation ────────────────────────────
|
||
|
|
var pressed: u8 = 0
|
||
|
|
if debounce == 0 {
|
||
|
|
if button.left {
|
||
|
|
if kb_col > 0 {
|
||
|
|
kb_col -= 1
|
||
|
|
} else {
|
||
|
|
kb_col = KB_COLS - 1
|
||
|
|
}
|
||
|
|
debounce = 8
|
||
|
|
pressed = 1
|
||
|
|
} else if button.right {
|
||
|
|
kb_col += 1
|
||
|
|
if kb_col >= KB_COLS {
|
||
|
|
kb_col = 0
|
||
|
|
}
|
||
|
|
debounce = 8
|
||
|
|
pressed = 1
|
||
|
|
} else if button.up {
|
||
|
|
if kb_row > 0 {
|
||
|
|
kb_row -= 1
|
||
|
|
} else {
|
||
|
|
kb_row = KB_ROWS - 1
|
||
|
|
}
|
||
|
|
debounce = 8
|
||
|
|
pressed = 1
|
||
|
|
} else if button.down {
|
||
|
|
kb_row += 1
|
||
|
|
if kb_row >= KB_ROWS {
|
||
|
|
kb_row = 0
|
||
|
|
}
|
||
|
|
debounce = 8
|
||
|
|
pressed = 1
|
||
|
|
} else if button.a {
|
||
|
|
// Press the key under the cursor. Backspace
|
||
|
|
// and enter dispatch to their actions; any
|
||
|
|
// other character is appended to `msg`.
|
||
|
|
var ch: u8 = current_key()
|
||
|
|
if ch == KEY_BKSP {
|
||
|
|
input_backspace()
|
||
|
|
} else if ch == KEY_ENTER {
|
||
|
|
if msg_len > 0 {
|
||
|
|
transition Computing
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
input_append(ch)
|
||
|
|
}
|
||
|
|
debounce = 10
|
||
|
|
pressed = 1
|
||
|
|
} else if button.b {
|
||
|
|
input_backspace()
|
||
|
|
debounce = 10
|
||
|
|
pressed = 1
|
||
|
|
} else if button.start {
|
||
|
|
if msg_len > 0 {
|
||
|
|
transition Computing
|
||
|
|
}
|
||
|
|
debounce = 10
|
||
|
|
pressed = 1
|
||
|
|
} else if button.select {
|
||
|
|
input_clear()
|
||
|
|
debounce = 10
|
||
|
|
pressed = 1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Idle / auto-demo ────────────────────────────
|
||
|
|
if pressed == 1 {
|
||
|
|
idle_timer = 0
|
||
|
|
} else {
|
||
|
|
if idle_timer < 255 {
|
||
|
|
idle_timer += 1
|
||
|
|
}
|
||
|
|
if idle_timer == AUTO_DELAY {
|
||
|
|
if msg_len == 0 {
|
||
|
|
// Auto-type "NES" → SHA-256 digest visible
|
||
|
|
// in the headless jsnes golden.
|
||
|
|
input_append(0x4E) // N
|
||
|
|
input_append(0x45) // E
|
||
|
|
input_append(0x53) // S
|
||
|
|
transition Computing
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Render ──────────────────────────────────────
|
||
|
|
// Input buffer takes 16 sprites, cursor 1 (when on).
|
||
|
|
// Well under the 64-sprite OAM budget.
|
||
|
|
draw_input()
|
||
|
|
if blink_timer < 25 {
|
||
|
|
draw_cursor(1)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|