Skip to content

feat: add Ren'Py runtime on current main - #273

Draft
akitaSummer wants to merge 334 commits into
mainfrom
renpy-runtime-final
Draft

akitaSummer wants to merge 334 commits into
mainfrom
renpy-runtime-final

Conversation

@akitaSummer

@akitaSummer akitaSummer commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

The mobile provider previously returned NOT_SUPPORTED for Ren’Py. This PR builds the pinned CPython/SDL2/Ren’Py/greenlet runtime and connects it to Aether’s Android/iOS host for cooperative execution, native frames, touch, keys, committed UTF-8 text, pause/resume and normal exit.

PR #273 remains Draft at checked head 25e2782. Both current-head Android APKs and the complete iOS Simulator App built. Actual iOS App/runner installation passed, but XCTest exited 70 before foreground readiness. Android’s existing test installed its fixed older 0ff APK, but launch timed out. Full mobile gameplay has not passed on either platform. No merge or release is requested.

Implementation

  • Apply native lifecycle and cooperative Python patches to the sources actually compiled. Set the tick deadline before Python runs; retain owned callback/configuration storage; bind the host window. Preserve pointer down/up/motion, convert Godot key codes, support committed UTF-8 text, and clean up graphics with the private context current.
  • Android exports and validates the private native/Python payload. The public Java bridge loads engine_api/JNI_OnLoad and binds the real Activity before async Open. The cloud debug package is org.aetherkiri.renpy.debug with Internal/SoftPal disabled.
  • iOS links the genuine device/Simulator framework and checks Python 3.12 payload bytecode on fresh builds and cache hits. Only the three-object mobile adapter is force-loaded. Missing Godot 4.7.2 ARM64 Simulator slices are built from pinned public source, with toolchain/source/template and archive-byte checks. Public dependency overlays address failures observed in actual Apple builds.
  • iOS public caching retains normal NuGet reads and per-port ABI matching. Only completed public package ZIPs are stored after CONTROL/triplet/ABI, member/link, CRC, resource-budget and ZIP64 validation. SDK/source/installed/build trees, logs and credentials are excluded.
  • Acceptance uses the actual app and OS input. It requires executed Ren’Py checkpoints, native RGBA matched to system screenshots, software-keyboard visibility/text, Home pause/resume and normal Quit to the production library. Diagnostic observations preserve launch failures; missing execution cannot produce a passing result.

Checked follow-ups

0ff10e30 places the emulator renderer override before the general Android override, following Godot’s actual first-match behavior. Owner/root/independent reviewer checked genuine original-preset PCK exports and project.binary readback. 9c901dd1 pins that APK’s exact producer/job/head/artifact/ZIP digest/certificate, without changing gameplay gates, timeouts or permissions.

bf22bdd8 permits only verified public GLib 2.84.2#2 regular libexec/gio-launch-desktop plus its necessary directory after the existing identity gates. TOP_LEVEL and all other member restrictions remain intact. Three fresh real vcpkg provider regressions passed cold compilation, identical-byte restore, ABI invalidation, successful archives surviving a later genuine build failure, 29 rejection controls and two ZIP64 positives. The unchanged pinned GLib helper compiled/executed before and after restore; this local test is a Linux helper-package check. Actual Apple producer and consumer reuse subsequently passed, as recorded below.

8be1181d recognizes canonical/versioned Simulator SDK basenames case-insensitively in Siglus and RFVP, preserving explicit target overrides. Three reviewers passed 19 genuine CMake/Ninja generated-command cases, seven other-platform controls and four genuine pre-fix negative cases. Siglus then actually compiled for aarch64-apple-ios-sim on the Apple runner. RFVP Apple Cargo execution was not observed.

0bc1af63 passes Minori’s existing Rust-target interface through scoped host integration. A typed empty cache entry protects automatic selection from the pinned child’s CMP0126 OLD policy; SDK/architecture changes recompute defaults, explicit targets remain supported, and Cargo rules/imported paths are unchanged. Owner/root/independent reviewer each passed 37 real CMake/Ninja configurations, 10 same-directory cache transitions and the genuine old-source negative against the complete unchanged pinned public Minori CMake. The current Apple runner actually compiled aarch64-apple-ios-sim and linked the complete App. Public Minori gitlink remains 7c56b2e7fbe5316d45aa30aedbd02fb5d9ba08c9.

a8b8cf48 adds fixed, versioned startup diagnostics to future actual app execution. Debug mobile requests with the exact acceptance script and run identity record 15 host phases; the iOS report exposes only validated phase fields, bounded counts/file metadata and process state captured before cleanup. Installation is recorded only after checked simctl success; XCTest readiness additionally binds the bundle ID. Missing or malformed diagnostics cannot change the original gameplay result. No raw log text is added to the public report, and the blocked previous artifact is not read or republished. Three reviewers passed genuine Godot 4.7.2 parsing and 51 production-helper checks; focused real filesystem/symlink/child-process regressions passed 12 tests, and existing evidence metrics passed 34 tests. These are host diagnostic checks, not mobile gameplay. The new actual iOS workflow and Android APK workflow were naturally triggered by this checked push.

25e27826 fixes a concrete staging handoff defect: the previous harness wrote the request before an ordinary test-without-building configuration that permitted artifact installation. It now uses documented UseDestinationArtifacts with the real built runner’s bundle identity and verified embedded .xctest destination path, excluding host installation paths. Checked App/runner installation precedes data-container selection and staging. After actual foreground readiness, another simctl query must match the staged canonical directory and dev/inode identity; mismatch fails without restaging. The original overall budget still covers the runner build, and gameplay gates, Swift code, workflows and permissions are unchanged. Owner/root/two independent reviews passed 11 production plist/real filesystem regressions, 12 startup-diagnostic regressions and 34 existing evidence checks. These local checks do not prove Apple execution or establish that the preceding timeout changed the container. New iOS run and new Android APK run were naturally triggered; both APKs and the complete App built, while real acceptance failed as recorded below.

Actual results and deliverables

Current-head results below refer to 25e2782. Packaging, configuration checks and component execution do not establish a playable game.

Target Actual result CI / artifact
Android ARM64 and x86_64 APKs Both completed 433-command host builds, real Minori ABI compilation, signed debug export, private/native Python payload, compiled-manifest, ELF and single-signer v2 checks. Actual PR merge efd7017. Genuine native libraries strictly reuse source-built 1967809 bytes, with 11 lifecycle exports and no missing ELF dependencies. Both new APKs are uninstalled; gameplay NOT_RUN. Build, ARM64 APK, x86_64 APK
Complete ARM64 iOS Simulator App Actual Swift driver, Minori Simulator compilation and whole Xcode App build/link passed; bundled runtime/Python/template bytes were validated, with native/template reuse distinguished from source compilation. Checked simctl installation of the App and genuine Runner both passed. Destination bindings were validated and requests staged. Actual XCTest exited 70 before foreground readiness, checks=[]. Both staged requests remained regular files, but no startup/observer/Ren’Py checkpoints were recorded. The post-ready container identity check, scene, touch, keyboard, Home/resume and Quit were NOT_RUN. This does not establish successful execution of the destination mode or Ren’Py. Build and failed actual acceptance, Simulator App, Evidence
Android existing HVF device test The official action retrieved/validated the fixed 0ff10e3 x86_64 APK. Actual API 35 OS readiness passed at 569.8s; adb install returned rc=0/Success. Original am Status: timeout remains failed; gameplay checks=[]. Diagnostic PID 2772 reached Godot native setup and later exact RESUMED/visible/allDrawn Activity, with no attributable Ren’Py pixels. Passive observation actually took 30.003s (deadline_reached=true), start_ready=false and native RGBA/OS scene=false. Touch, IME, Home and Quit were NOT_RUN. Collector took 0.998s; emulator exit 0 and owned groups absent confirmed cleanup. HWUI warnings do not establish a unique cause. This older APK lacks the new host trace. Failed installed-APK test, Evidence, Fixed input producer
Linux emulator / physical iPhone Existing /dev/kvm mode 0660 has no required read/write access: emulator/install/gameplay NOT_RUN. No ACL/security change was made. Physical iPhone installation needs authorized cloud signing, matching provisioning and a device. Current unsigned-device job 113913294179 was skipped after failed Simulator acceptance. Linux availability, iOS
Actual Apple public-cache producer and consumers The 8be1181 producer completed 136 dependencies and saved 121 strictly validated public archives before its then-unfixed Minori failure. Subsequent full-App builds restored the identical 121 files-provider archives plus 15 NuGet packages; post-build validation reported zero new archives, avoiding duplicate saves. Producer, First full-App consumer, Current consumer
iOS graphics components Three genuinely installed Simulator probe Apps passed Metal/ANGLE EGL pixels, patched SDL 2.0.20 offscreen pixels/resume/context/cleanup and SDL 2.32.10 UIKit Apple OpenGLES host pixels beside isolated MetalANGLE. SDL API pointer/UTF-8 checks are components; they do not prove OS touch/keyboard or Ren’Py gameplay. Actual component execution
Original native source compilation Three-ABI Android and device/Simulator iOS source compilation passed at 1967809. Later strict cache validation is reuse, not fresh native compilation. Android native, iOS native

Current artifact ZIP SHA-256 values from normal GitHub metadata:

  • Android ARM64 (162864068 bytes): cea69612659b510c535c0172f454ec4e9aa4377384f48b64c2cbf78ef349bc4d
  • Android x86_64 (168645110 bytes): 91030965422f8a47f244027aad5da6ae553969bf64f35a4f372a1f0882fb8c44
  • iOS Simulator App (180092772 bytes): 11768207eb4a791ff960409907499996bb6e40459408b7043e0525929eb6f9dc
  • iOS evidence (66696364 bytes): 452b4d42504b5b6e0032746828025704560f9ad85d924961d9e12b6f6c28d40c
  • Android HVF evidence (89210 bytes): 350d90e86f443cf925363759e8971ec7198ecd6d1725053b09e058107f0cac09

These are artifact ZIP metadata digests, not downloaded-byte checks or APK digests. The actually installed older Android APK SHA-256 is 5fa180ea0416bbc2ec4d8f87c58af4bdb1435e93f26917dd8a0021427745b35e. The current actual iOS executable SHA-256 recorded by the harness is e1fa7f205e335280bd72d99b95981c94d437979beadc38c9ddb07acab6cb5146.

Remaining blockers and limits

The user’s playable-mobile goal remains incomplete: neither platform has verified a Ren’Py scene followed by OS touch, software-keyboard text, Home pause/resume and normal Quit. Current XCTest failed before ready; the available terminal console has no specific underlying XCTest error. The source-reviewed destination configuration and actual runner installation passing do not make the mode’s test execution pass.

The new iOS evidence target 11628483408 received exactly one normal download API call and one returned-URL client fetch. The latter failed with URLError/OSError: Tunnel connection failed: 403 Forbidden, delivering no ZIP bytes. The exact target is stopped; actual xcuitest.log/xcresult cannot be read to diagnose exit 70. No retry, alternate endpoint/credentials/runner/Library route or raw-log republication was attempted. Older blocked iOS targets 11625878537/11622645453 and Android targets 11625750523/11613302785 remain stopped. Current Android evidence 11628211707 is metadata-only, not downloaded.

For context, preceding a8b8 acceptance installed the App and reached bound XCTest foreground readiness but timed out waiting for Ren’Py start_ready; both staged requests and all fixed journals were absent at the stored staged path. That observation did not prove container UUID replacement. Current 25e requests remain present, but XCTest exits before launching the observed flow, so it cannot prove the gameplay handoff is repaired.

Continuing iOS diagnosis requires normal authorized cloud access to the current XCTest evidence. Android cloud-target/KVM permissions remain pending; physical iPhone signing/provisioning/device remain unavailable. No paid runner, new fees, permission/security change, user computer, access-limit bypass or new SDK licence acceptance was used. Checked source is pushed, worktree is clean, and PR remains Draft without merge or release.

@yorkyang2333

yorkyang2333 commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

一直不是很清楚为什么要实现renpy,因为renpy本身就是跨平台的,而且只要原作者不对引擎魔改的话游戏跟开源没多大区别,解包/重新打包分发到其他平台非常容易,根本不需要套在模拟器里运行

还是说这是为了避免iOS这边ipa侧载安装麻烦?我猜的,毕竟多一个引擎多一份维护压力,还要随时同步上游release(

@akitaSummer

Copy link
Copy Markdown
Collaborator Author

一直不是很清楚为什么要实现renpy,因为renpy本身就是跨平台的,而且只要原作者不对引擎魔改的话游戏跟开源没多大区别,解包/重新打包分发到其他平台非常容易,根本不需要套在模拟器里运行

还是说这是为了避免iOS这边ipa侧载安装麻烦?我猜的,毕竟多一个引擎多一份维护压力,还要随时同步上游release(

第一个是不是所有用户都会自签,理论上雀食需要一个可以直接导入使用的app
第二个是这个是openai给了个免费dot,想尝试看看dot在云端进行的效果如何
第三个是renpy直接用的sdk,理论上不用那么频繁升级sdk的

刘煜 added 30 commits October 9, 2026 02:06

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants