feat: eval/exec of strings, gallery Replay, callable actions; iNSight and SomethingBetter now pass

- pyparse.ts: parser for expressions and simple statements built at run time, producing
  the sandbox's own IR; backs eval() and exec() (e.g. exec("persistent." + var + " = 0"))
- Replay/EndReplay and renpy.end_replay: the engine stashes the full game state, runs the
  label with the given scope and restores everything when it ends; locked replays are
  insensitive. Save loading shared as applySave()
- Screen actions are callable (MainMenu(confirm=False)())
- jump main_menu_screen is Ren'Py's own label: it opens the player's main menu
- Screens: a closing quote ends the word before a letter ("text"size 15) but not before
  an operator ("a"+b); Text(...) pictures in image blocks
- README: current capabilities and limits of the Ren'Py support

Strict compatibility check on the local collection: Tomie, Twisted-Thoughts, Hooked,
iNSight-of-you and SomethingBetter pass; TheFixer (custom AlphaMask wardrobe, missing
labels) and That_New_Teacher (custom statements, Render API) do not.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Sonnet 5.5 committed 2026-10-25 14:40:36 +03:00
1 parent 3923ee72fb
commit 3ac4f0371f
11 files changed
+448 -36

No files matched your search

+16 -9
View File
@@ -133,16 +133,23 @@ python -m tests.make_sample sample.zip # тестовая игра (из ba
Python игры выполняется в песочнице плеера: свои `def` и `class` (наследование,
`super()`, свойства, замыкания, `lambda`, `*args`/`**kwargs`), `try`/`except`/
`finally`, `raise`, `assert`, `for`/`while … else`, comprehension. ATL: движение
(`linear`/`ease`/`easein`/`easeout`), `pause`, `repeat`, `parallel`, `choice`,
`block`, `on show`/`on hide`, вызов других transform.
`finally`, `raise`, `assert`, `match`, `for`/`while … else`, comprehension, модули
`re`, `copy`, `time`, `datetime`, `collections.defaultdict`, `functools.partial`.
Код, который ждёт игрока (`renpy.input`, `narrator()`, реплики персонажей, `renpy.pause`,
`renpy.display_menu`, `renpy.call_screen`), работает внутри циклов и функций. `eval` и `exec`
строк разбираются своим парсером выражений и простых операторов.
ATL: движение (`linear`/`ease`/`easein`/`easeout`), `pause`, `repeat`, `parallel`, `choice`,
`block`, `on show`/`on hide`/`on hover`, `contains`, `time`, `function`, смена картинок с
`with dissolve`, параметры и вызов других transform, `matrixcolor`, `blur`. Просмотр сцен из
галереи (`Replay`/`EndReplay`).
Экраны игры (`screen`, `call screen`, `show screen`) и их действия — см.
[docs/SCREENS.md](docs/SCREENS.md).
Пока **не** поддерживается: в экранах — `input`, `imagemap`, `mousearea`, `drag`, `side`, в ATL —
`function`, `time`, `contains`, `matrixcolor` и шейдеры,
в Python — специальные методы кроме `__init__`/`__str__`/`__repr__`, генераторы,
`with`, системные модули (`os`, `socket`, …) и картинки, которые игра вычисляет
своими функциями. Такие места перечислены в отчёте конвертации у версии и
останавливают импорт. Игры-«песочницы» на `renpy.ui.*` и `im.*` пока не играбельны.
Пока **не** поддерживается: в экранах — `imagemap`, `mousearea`, `drag`, `side`; шейдеры
(выбрасываются как чисто графические); `AlphaMask` и transform, в теле которого картинка;
в Python — специальные методы кроме `__init__`/`__str__`/`__repr__`, генераторы, `with`,
системные модули (`os`, `socket`, …), а также собственные операторы и внутренности движка
(`renpy.register_statement`, `renpy.Render`). Такие места перечислены в отчёте конвертации
у версии и останавливают импорт.