feat: converter reads the Phone library's register statement, named stores and generators
`init phone register` becomes a default (the group chat) plus a function of library calls that runs with the other defaults of a new game (phone_register.py). `init/python [early|hide] in some.store` wraps its code in an in_store node and `default some.store.name` may name a store; yield works as an expression (generator functions are marked gen); `import x as y`, `transform -150 name(...)`, `init:` with if/else, `config.special_namespaces` lines, `at` lists and tuples, transforms made by Python functions, `choice` weights that are expressions, `__len__`/`__bool__`, and the whitelist for os, calendar, itertools, pygame_sdl2 and the new runtime. The converter also records the size of every picture it converts (`imageSizes`) so `renpy.image_size` answers without loading. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e94f9b0d9e
commit
83cc7fdd5c
11 files changed
+379
-26
No files matched your search
+7
-1
@@ -71,6 +71,8 @@ def expression(value, depth=0):
|
||||
expression(item, depth + 1)
|
||||
elif kind == "star":
|
||||
ex("v")
|
||||
elif kind == "yield":
|
||||
ex("v", optional=True)
|
||||
elif kind == "lambda":
|
||||
parameters(value.get("params"), depth + 1)
|
||||
ex("body")
|
||||
@@ -127,12 +129,16 @@ def statements(code, depth=0):
|
||||
keys = {"set": ("t", "v"), "aug": ("t", "v"), "eval": ("e",),
|
||||
"if": ("c",), "while": ("c",), "for": ("t", "it"),
|
||||
"del": ("t",), "break": (), "continue": (), "def": (), "class": (),
|
||||
"return": (), "global": (), "nonlocal": (), "try": (), "raise": (), "yield": (), "yield_from": ("v",),
|
||||
"return": (), "global": (), "nonlocal": (), "try": (), "raise": (), "yield": (), "yield_from": ("v",), "in_store": (),
|
||||
"assert": ("c",)}
|
||||
if op not in keys:
|
||||
raise ValueError(f"Неизвестный оператор AST: {op}")
|
||||
for key in keys[op]:
|
||||
expression(s.get(key), depth + 1)
|
||||
if op == "in_store":
|
||||
if not isinstance(s.get("ns"), str) or not all(part.isidentifier() for part in s["ns"].split(".")):
|
||||
raise ValueError("Некорректное имя хранилища")
|
||||
statements(s.get("body"), depth + 1)
|
||||
if op == "if":
|
||||
statements(s.get("then"), depth + 1)
|
||||
statements(s.get("else"), depth + 1)
|
||||
|
||||
Reference in new issue
Block a user