Files
mrleo1nidandClaude Sonnet 5.5 a8902deaf7
CI / frontend (push) Failing after 19s
CI / backend (push) Failing after 36s
docs: what the Ren'Py player does like Ren'Py (layers, rollback, text tags, preferences)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-27 04:39:48 +03:00

51 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Экраны Ren'Py (screen)
Игры показывают свой интерфейс (HUD, карты-хотспоты, телефон, инвентарь) экранами
`screen`. Конвертер переводит их в IR, плеер строит из IR DOM и пересчитывает его при
каждом изменении состояния. Выражения выполняются в той же песочнице Python, что и сценарий.
* разбор: `backend/app/converter/screens.py` (язык экранов), `rpy_parser.py` (`screen`, `style`,
`call/show/hide screen`), `atl.py` (анимации виджетов);
* плеер: `frontend/src/player/screens.ts`, подключение — в `engine.ts`.
## Что поддерживается
* **Операторы сценария:** `call screen name(args)` (ждёт `Return`, значение в `_return`),
`show screen`, `hide screen`; из Python — `renpy.show_screen`, `renpy.hide_screen`.
* **Контейнеры:** `fixed`, `frame`, `window`, `vbox`, `hbox`, `grid`, `vpgrid`, `viewport`
(прокрутка), `button`, `has`.
* **Элементы:** `text`, `label`, `textbutton`, `imagebutton` (`idle`/`hover`/`insensitive`/`auto`),
`add`, `null`, `bar`/`vbar` (отображение и перетаскивание для `VariableValue`).
* **Управление:** `if`/`elif`/`else`, `showif`, `for`, `use` (в том числе с `transclude`),
`default`, `$` и `python:`, `key`, `timer`, `on "show"`/`"hide"`.
* **Свойства:** размеры, позиции и якоря, отступы, `spacing`, `background`/`foreground`, `crop`,
цвета и шрифты текста, `outlines`, `alpha`, `zoom`, `rotate`, `blur`, `selected`, `sensitive`,
`tooltip` (`GetTooltip()`), `hover_sound`/`activate_sound`, `at` с анимированными transform,
условные свойства (`if` внутри виджета, который только задаёт свойства).
* **Стили:** `style name is parent:` и `style_prefix`; состояния `idle_`/`hover_`/`selected_`/
`insensitive_`. Неизвестные декоративные свойства стилей молча отбрасываются.
* **Действия:** `Jump`, `Call`, `Return`, `SetVariable`, `ToggleVariable`, `SetScreenVariable`,
`ToggleScreenVariable`, `SetDict`, `SetField`, `ToggleField`, `Show`, `Hide`, `ToggleScreen`,
`Function`, `Play`, `Stop`, `Notify`, `If`, `SelectedIf`, `SensitiveIf`, `NullAction`, `Language`,
`ShowMenu` (открывает меню плеера), `OpenURL` (только http/https), `Quit`, `MainMenu`.
* **Изображения-значения:** `Crop`, `LiveCrop`, `Solid`, `Frame`, `Null`, `Transform`,
`DynamicDisplayable`, `Color`.
Стандартные экраны движка (`say`, `choice`, `input`, главное меню, настройки, сохранения, история)
плеер не использует: у него свой интерфейс. `ShowMenu("preferences")` открывает его меню.
## Правила импорта
Экран проверяется только если игра его показывает (`call/show screen`, `Show("name")`,
`renpy.show_screen("name")`, `use name`). Неподдерживаемое внутри такого экрана останавливает
импорт, внутри неиспользуемого (например, стандартного) — нет. Экран, который вызывают, но нигде
не определили, тоже останавливает импорт. Экраны для `variant "touch"`/`"phone"` отбрасываются.
## Ограничения
* Шейдеры (`shader`, `mesh`, `u_*`) не исполняются; про слои экранов (`onlayer`), камеру,
текстовые теги и остальное, что плеер делает как Ren'Py, — `docs/RENPY_PLAYER.md`.
* Экран перестраивается целиком; положение прокрутки сохраняется, фокус и ввод — нет.
* Позиции без точки (`xpos 1`) читаются как доля, а целые больше 1 — как пиксели.
* Фокус с клавиатуры — только Tab и Enter/Space на кнопках.