Files
pgames-manager/docs/SCREENS.md
T
mrleo1nidandClaude Sonnet 5.5 62ece25902 feat: Ren'Py screens (screen/call screen/show screen) with actions and styles
Converter
- screens.py parses the screen language: containers (fixed, frame, vbox, hbox,
  grid, vpgrid, viewport, button, has), widgets (text, textbutton, imagebutton,
  add, bar ...), if/for/use/transclude, default, python, key, timer, on, inline ATL,
  conditional properties, and decompiled forms (unparenthesised operators,
  glued property values, comma separated actions)
- style statements, call/show/hide screen operators and Python-level
  renpy.show_screen are translated; only screens the game shows are audited,
  unused stock screens no longer block an import; undefined screens do
- ATL values may be computed at run time and transforms take parameters
  (at blink(0.2, 0.3)); blur property

Player
- screens.ts builds the DOM from the IR and rebuilds it on state changes;
  buttons with idle/hover/selected/insensitive states, tooltips, sounds, modal
  screens, timers and keys that survive re-rendering, saved with the save file
- Actions: Jump, Call, Return, SetVariable, Toggle*, SetScreenVariable, Show, Hide,
  ToggleScreen, Function, Play, Notify, If, Language, ShowMenu, OpenURL ...
- Crop/LiveCrop/Solid/Frame/Transform/DynamicDisplayable values, crop property,
  globals(), renpy.variant/change_language/seen_image, transition stubs

Tests: screen parser and runtime (linkedom DOM), screens fixture compiled from
tests/fixtures/screens.rpy. Docs: docs/SCREENS.md.

Twisted-Thoughts now passes the strict compatibility check.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 13:17:11 +03:00

51 lines
4.3 KiB
Markdown
Raw 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"` отбрасываются.
## Ограничения
* Не поддерживаются `input`, `imagemap`/`hotspot`, `mousearea`, `drag`/`draggroup`, `side`,
`matrixcolor`, шейдеры и `im.*`; такие экраны блокируют импорт.
* Экран перестраивается целиком; положение прокрутки сохраняется, фокус и ввод — нет.
* Позиции без точки (`xpos 1`) читаются как доля, а целые больше 1 — как пиксели.
* Фокус с клавиатуры — только Tab и Enter/Space на кнопках.