OKHOTSK — СТАТИЧЕСКИЙ RAW-TILE / SPRITE UI
============================================

Эти строки не являются scenario streams и поэтому отсутствуют в script_work.txt.
Их рисуют фиксированные UI routines напрямую номерами font tiles либо отдельной
сжатой sprite-графикой.

RAW TILE TABLES
---------------
Изученная ROM, PRG offsets без iNES header:
  $3CF69, CPU $CF69, 12 tiles: なまえを いれてください
      -> ВВЕДИТЕ ИМЯ + trailing space
  $3CF75, CPU $CF75, 14 tiles: そうさメモを いれてください
      -> ВВЕДИТЕ ПАРОЛЬ
  $3D5A3, CPU $D5A3, 9 tiles = три фиксированных поля по 3:
      はやい / ふつう / おそい -> БЫС / НОР / МЕД
  $23E3F (bank 8) и $33E3F (bank 12): одинаковая navigation table
      もどる   おわる / すすむ -> НАЗ   КОН / ДАЛ

Почему «КОН», а не «ВЫХОД»:
- первая строка навигации состоит из ДВУХ фиксированных трёхтайловых полей;
- оригинал физически имеет «もどる   おわる»: 3 tiles + 3 spaces + 3 tiles;
- X-координаты курсора также рассчитаны под эти позиции;
- v0.8.5 ошибочно записывал «НАЗ ВЫХОД», сдвигая вторую подпись влево. В игре
  курсор оказывался перед «ХОД» и перекрывал буквы;
- v0.8.6 сохраняет оригинальный layout: «НАЗ   КОН». «КОН» = сокращённое
  «КОНЕЦ», то есть закончить ввод имени/пароля.

Скорость тоже имеет жёсткие поля по 3 tiles, поэтому используются сокращения
«БЫС / НОР / МЕД». Вторая строка навигации имеет 3 tiles: «ДАЛ».


DAKUTEN OVERLAYS В INPUT UI
---------------------------
Японские prompts содержат ...ください. Буква だ там не хранится как отдельный
готовый glyph: descriptor экрана отдельно рисует dakuten tile $7E строкой выше.
Поэтому простой перевод raw tile array оставлял знак над русской буквой:
  PRG $3CF3F : $7E над позицией М в «ВВЕДИТЕ ИМЯ»
  PRG $3CF57 : $7E над позицией О в «ВВЕДИТЕ ПАРОЛЬ»
v0.8.7 меняет оба descriptor bytes на $00 (blank tile).

У wrong-password popup исходный が встречается дважды. Там dakuten тоже вынесен
за пределы общего glyph tile $0D:
  popup tile $05 = top-border tile $04 + dakuten над line1 col6
  popup tile $10 = blank middle tile $0F + dakuten над line2 col2
v0.8.7 заменяет $05->$04 и $10->$0F после построения русского bitmap-а.

POPUP НЕВЕРНОГО ПАРОЛЯ
----------------------
Сообщение
  そうさメモが
  ちがいます。
не использует основной font/scenario stream. Это 64x40 sprite-popup, чей bitmap
загружается из второго graphics stream bank 0.

Структура:
  PRG $04F3-$04F6 : 4-byte graphics header = 82 01 00 00
  PRG $04F7-$062E : PackBits payload, ровно $138 bytes
  unpacked size    : $190 bytes = sprite pattern tiles $00-$18

В OAM у popup шесть текстовых cells на строку. Оригинал повторно использует
один и тот же tile $0D для «が» в обеих строках. Чтобы не переписывать OAM,
русская формулировка специально выбрана с тем же повтором:

  ОШИБКА
  ПАРОЛЯ

В обеих позициях общего tile $0D находится «А».

patch_static_ui_ru.py декодирует этот graphics stream, берёт формы русских
букв из уже вставленного основного RU font и преобразует их в opaque sprite
style popup-а (plane0 = glyph, plane1 = NOT glyph). Затем stream сжимается
обратно С ТОЧНОЙ исходной длиной $138 bytes, потому что сразу после него идёт
следующий graphics stream.

Инструмент:
  python3 tools/patch_static_ui_ru.py game.nes -o patched.nes

В обычном workflow отдельно запускать его не нужно: build_project.py вызывает
patch_static_ui_ru.py автоматически после вставки RU font/direct-lowercase
patch и до text repack.

QA:
- tests/selftest.py проверяет raw tables, fixed navigation layout и bitmap
  «ОШИБКА / ПАРОЛЯ»;
- tests/verify_full_rom.py делает те же проверки на финальной собранной ROM.


INPUT KEYBOARD — v0.8.11 DIRECT RU GLYPHS
------------------------------------------
Отдельный обработчик CPU $CB0A раньше интерпретировал коды 41-54 как японские
озвончённые каны: вычитал $40 и рисовал tile $7E строкой выше. Коды 55-59
аналогично превращались в は-ряд + handakuten tile $7F.

В русском движке эти же значения уже означают прямые строчные буквы:
  41-5F = а-э.
Поэтому v0.8.11 отключает композицию в picker-е: значение идёт прямо в glyph
tile, а overlay остаётся пустым. Это синхронизирует ввод с тем, как те же байты
показываются в обычном диалоговом окне/пароле.

Дополнительно убраны последние остатки японских selectable glyphs:
- исходный код 2E получает mirror glyph «э» (копия tile 5F);
- три верхних позиции 2C/2D/2E переставлены визуально как «э ю я», при этом
  набор кодов пароля НЕ меняется;
- пять special-kana cells, видимых только при вводе имени, заменены кодами
  5A-5E = «ш щ ъ ы ь».

В результате экран имени содержит полный набор строчных русских букв без
dakuten/handakuten, а экран пароля показывает те же русские glyphs, что и
динамически выданный пароль.
