feat: build profile for The Lewdest House; panoramas as GPU hints, live2d-only init branches, drag/at syntax
CI / frontend (push) Failing after 15s
CI / backend (push) Failing after 33s

The build (fingerprint of its scripts) skips third-party code written against Ren'Py's render API
(colour picker demo, Kinetic Text Tags, cps_preview) and waives its one missing test screen. Converter:
xpan/ypan/matrixtransform/matrixanchor are skipped like other GPU hints, `if renpy.has_live2d()` in an
init block keeps only its else branch, `crop(...)xpos` and `crop (1, 2, 3, 4)` parse, `drag` is a screen
container, `at icon["at"]` becomes a dynamic entry, and the whitelist gains Matrix, Move, absolute and
the no-op helpers. The game now passes the strict check and converts fully (3272 files, 288 MB).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Sonnet 5.5 committed 2026-10-26 04:29:20 +03:00
1 parent 353cd5e49e
commit 6d78b8b847
9 files changed
+94 -10

No files matched your search

+12
View File
@@ -223,3 +223,15 @@ def test_translated_speaker_name_and_capitalised_parameterised_transform():
say = data.modules["t.rpy"][0]["body"][0]
assert say["op"] == "say" and say["what"] == "Hello there"
assert not data.blockers
def test_init_if_has_live2d_keeps_only_the_else_branch_and_crop_call_glued_to_a_property():
data = parse('init:\n if renpy.has_live2d() and persistent.on:\n image a = "live.png"\n else:\n'
' image b = "still.png"\nlabel start:\n show a1 as p:\n crop(1,2,3,4)xpos 5\n return\n')
assert "b" in data.images and "a" not in data.images
assert not any("Оператор сцены" in m for m in data.blockers)
def test_static_atl_line_with_a_spaced_crop_tuple():
data = parse('image plap:\n "base"\n crop (1697,54, 172, 94)\nimage slurp:\n "base"\n crop (1, 2, 3, 4) xanchor 0.5\n')
assert not data.blockers
+11
View File
@@ -235,3 +235,14 @@ def test_atl_pause_with_brackets():
steps = data.atl["t"]["steps"] if "t" in data.atl else data.transforms["t"]
assert not data.blockers
assert [(s["op"], s["t"]) for s in steps] == [("move", 1.0), ("pause", 1.5), ("move", 1.0)]
def test_dynamic_at_value_and_draggable_box():
data = parse('transform spin:\n rotate 5\nscreen s(icon):\n imagebutton:\n idle "a" at icon["at"]\n'
' drag:\n drag_name "box"\n draggable True\n text "x"\n'
'label start:\n call screen s({"at": spin})\n')
audit_ir(data)
require_supported_scripts(data)
body = data.screens["s"]["body"]
assert body[0]["props"]["at"][0]["dyn"]["k"] == "sub"
assert body[1]["w"] == "drag" and "draggable" in body[1]["props"]