Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/scripts/initialize-private-runtime-submodules.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ git submodule update --init --recursive --depth 1 \
packages/psdfile \
packages/ruffle \
packages/xsystem4 \
packages/xsystem35 \
packages/system3 \
packages/rfvp \
packages/tjs2Decompiler

Expand Down
39 changes: 33 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ jobs:
git submodule update --init --depth 1 packages/AetherKrkr
git submodule update --init --depth 1 packages/AetherMAGES
git submodule update --init --depth 1 packages/ruffle
git submodule update --init --recursive --depth 1 packages/xsystem4
git submodule update --init --recursive --depth 1 packages/xsystem4 packages/xsystem35 packages/system3

- name: Set application release version
if: env.AETHERKIRI_RELEASE_VERSION != ''
Expand Down Expand Up @@ -449,7 +449,7 @@ jobs:
git submodule update --init --depth 1 packages/AetherMAGES
git submodule update --init --depth 1 packages/rfvp
git submodule update --init --depth 1 packages/ruffle
git submodule update --init --recursive --depth 1 packages/xsystem4
git submodule update --init --recursive --depth 1 packages/xsystem4 packages/xsystem35 packages/system3

- name: Set application release version
if: env.AETHERKIRI_RELEASE_VERSION != ''
Expand Down Expand Up @@ -737,7 +737,10 @@ jobs:
persist-credentials: false

- name: Test Mac App Store nested signing
run: python3 -m unittest discover -s tests/python -p test_macos_app_store_signing.py -v
run: |
python3 -m unittest discover -s tests/python -p test_macos_app_store_signing.py -v
python3 -m unittest discover -s tests/python -p test_runtime_submodule_initialization.py -v
python3 -m unittest discover -s tests/python -p test_ctest_inventory.py -v

- name: Initialize private runtime submodules
if: env.AETHERKIRI_WITH_INTERNAL == 'true'
Expand Down Expand Up @@ -787,7 +790,7 @@ jobs:
git submodule update --init --depth 1 packages/AetherMAGES
git submodule update --init --depth 1 packages/rfvp
git submodule update --init --depth 1 packages/ruffle
git submodule update --init --recursive --depth 1 packages/xsystem4
git submodule update --init --recursive --depth 1 packages/xsystem4 packages/xsystem35 packages/system3

- name: Set application release version
if: env.AETHERKIRI_RELEASE_VERSION != ''
Expand Down Expand Up @@ -958,6 +961,8 @@ jobs:
-D BUILD_TOOLS=ON \
-D BUILD_ENGINE_API=OFF \
-D BUILD_GODOT_EXTENSION=OFF \
-D AETHERKIRI_BUILD_YURIS_CORE_TESTS=ON \
-D AETHERKIRI_BUILD_YURIS_PROVIDER_TESTS=ON \
-D VCPKG_MANIFEST_INSTALL=OFF \
-D VCPKG_INSTALLED_DIR="${GITHUB_WORKSPACE}/out/macos/debug/vcpkg_installed" \
-D CMAKE_C_COMPILER_LAUNCHER=ccache \
Expand All @@ -972,6 +977,27 @@ jobs:

cmake --build "$test_build_dir" --parallel 4
ctest --test-dir "$test_build_dir" --show-only=human
inventory_file="${RUNNER_TEMP}/aetherkiri-test-inventory.json"
ctest --test-dir "$test_build_dir" --show-only=json-v1 > "$inventory_file"
required_suites=(
--require-executable siglus-runtime-jpeg
--require-executable mages-runtime-provider
--require-executable mages-host-events
--require-executable aether_xsystem35_embedded_midi_contract
)
if [[ "$AETHERKIRI_WITH_INTERNAL" == "true" ]]; then
required_suites+=(
--require-executable aetherinternal-artemis-storage-tests
--require-executable engine-api-diagnostics
--require-executable advhd-runtime-tests
--require-executable advhd-registration-tests
--require-executable aether_yuris_compiled_tests
--require-executable aether_yuris_provider_tests
--require-executable bgi-runtime-vm
--require-executable bgi-runtime-provider
)
fi
python3 tools/check_ctest_inventory.py "$inventory_file" "${required_suites[@]}"
ctest \
--test-dir "$test_build_dir" \
--output-on-failure \
Expand Down Expand Up @@ -1130,7 +1156,7 @@ jobs:
git submodule update --init --depth 1 packages/AetherKrkr
git submodule update --init --depth 1 packages/AetherMAGES
git submodule update --init --depth 1 packages/ruffle
git submodule update --init --recursive --depth 1 packages/xsystem4
git submodule update --init --recursive --depth 1 packages/xsystem4 packages/xsystem35 packages/system3

- name: Verify private runtime packages
if: env.AETHERKIRI_WITH_INTERNAL == 'true'
Expand Down Expand Up @@ -1257,7 +1283,8 @@ jobs:
LD_LIBRARY_PATH: ${{ github.workspace }}/apps/godot_app/bin/linux/debug
run: |
python3 -m unittest discover -s tests/python -p test_renpy_host.py
for test in video_library_folders video_library_ui video_import_permissions flash_library tyrano_library tyrano_asar renpy_library xsystem4_library rfvp_import; do
python3 -m unittest discover -s tests/python -p test_runtime_submodule_initialization.py -v
for test in video_library_folders video_library_ui video_import_permissions flash_library tyrano_library tyrano_asar renpy_library xsystem4_library xsystem35_library system3_library rfvp_import; do
timeout 60 "$GODOT_BIN" --headless --path apps/godot_app \
--script "res://tests/${test}_test.gd" \
2>&1 | tee "$RUNNER_TEMP/${test}.log"
Expand Down
8 changes: 8 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,11 @@
path = packages/xsystem4
url = https://github.com/AetherKiri/xsystem4.git
branch = aether
[submodule "packages/xsystem35"]
path = packages/xsystem35
url = https://github.com/AetherKiri/xsystem35-sdl2.git
branch = aether
[submodule "packages/system3"]
path = packages/system3
url = https://github.com/AetherKiri/system3-sdl2.git
branch = aether
29 changes: 26 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ option(AETHERKIRI_ENABLE_RFVP "build the experimental native FVP runtime (requir
option(BUILD_GPU_BRIDGE "build legacy external GPU bridge renderer" OFF)
option(AETHERKIRI_ENABLE_ONSCRIPTER
"enable the bundled OnscripterYuri runtime" ON)
option(AETHERKIRI_ENABLE_SYSTEM3
"enable the native AliceSoft System 1/2/3 runtime" ON)
option(AETHERKIRI_ENABLE_XSYSTEM35
"enable the native AliceSoft System 3.5/3.9 runtime" ON)
option(AETHERKIRI_ENABLE_XSYSTEM4
"enable the native AliceSoft System 4 runtime" ON)
option(AETHERKIRI_ENABLE_SIGLUS
Expand Down Expand Up @@ -148,6 +152,12 @@ set(AETHERKIRI_INTERNAL_DIR
set(AETHERKIRI_ONSCRIPTERYURI_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/packages/OnscripterYuri"
CACHE PATH "path to an OnscripterYuri runtime checkout")
set(AETHERKIRI_SYSTEM3_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/packages/system3"
CACHE PATH "path to a system3 runtime checkout")
set(AETHERKIRI_XSYSTEM35_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/packages/xsystem35"
CACHE PATH "path to an xsystem35 runtime checkout")
set(AETHERKIRI_XSYSTEM4_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/packages/xsystem4"
CACHE PATH "path to an xsystem4 runtime checkout")
Expand Down Expand Up @@ -297,6 +307,10 @@ if(IOS AND AETHERKIRI_INTERNAL_ENABLED AND AETHERKIRI_ENABLE_CODE_OBFUSCATION)
endif()

set(AETHERKIRI_BUILD_NATIVE_ONSCRIPTER_TESTS OFF)
set(AETHERKIRI_BUILD_NATIVE_RUNTIME_TESTS OFF)
if(ENABLE_TESTS AND NOT (IOS OR ANDROID OR WEB OR EMSCRIPTEN))
set(AETHERKIRI_BUILD_NATIVE_RUNTIME_TESTS ON)
endif()
if(ENABLE_TESTS AND AETHERKIRI_ENABLE_ONSCRIPTER AND
NOT (IOS OR ANDROID OR WEB OR EMSCRIPTEN))
# The provider contract links the real ONS runtime and runtime registry.
Expand All @@ -309,7 +323,7 @@ endif()
# krkr2core/krkr2plugin linkage; the Godot extension host links the glue and
# installs its engine_legacy_* surface into engine_api through the legacy
# services table (Phase 2d link flip — engine_api itself never links it).
if(BUILD_ENGINE_API OR AETHERKIRI_BUILD_NATIVE_ONSCRIPTER_TESTS OR AETHERKIRI_ENABLE_RFVP)
if(BUILD_ENGINE_API OR AETHERKIRI_BUILD_NATIVE_RUNTIME_TESTS OR AETHERKIRI_ENABLE_RFVP)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/krkr2_runtime)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/abi)
endif()
Expand All @@ -319,7 +333,15 @@ if(AETHERKIRI_ENABLE_ONSCRIPTER AND
(BUILD_GODOT_EXTENSION OR AETHERKIRI_BUILD_NATIVE_ONSCRIPTER_TESTS))
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/onscripter_runtime)
endif()
if(AETHERKIRI_ENABLE_XSYSTEM4 AND BUILD_GODOT_EXTENSION AND
if(AETHERKIRI_ENABLE_SYSTEM3 AND (BUILD_GODOT_EXTENSION OR ENABLE_TESTS) AND
(APPLE OR ANDROID OR UNIX) AND NOT (WEB OR EMSCRIPTEN))
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/system3_runtime)
endif()
if(AETHERKIRI_ENABLE_XSYSTEM35 AND (BUILD_GODOT_EXTENSION OR ENABLE_TESTS) AND
(APPLE OR ANDROID OR UNIX) AND NOT (WEB OR EMSCRIPTEN))
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/xsystem35_runtime)
endif()
if(AETHERKIRI_ENABLE_XSYSTEM4 AND (BUILD_GODOT_EXTENSION OR ENABLE_TESTS) AND
(APPLE OR ANDROID OR UNIX) AND NOT (WEB OR EMSCRIPTEN))
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/xsystem4_runtime)
endif()
Expand All @@ -328,7 +350,8 @@ if(AETHERKIRI_ENABLE_SIGLUS AND BUILD_GODOT_EXTENSION AND
# Web stays excluded until the wasm host path is designed (phase 5).
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/bridge/siglus_runtime)
endif()
if(AETHERKIRI_ENABLE_MAGES AND BUILD_GODOT_EXTENSION AND
if(AETHERKIRI_ENABLE_MAGES AND
(BUILD_GODOT_EXTENSION OR AETHERKIRI_BUILD_NATIVE_RUNTIME_TESTS) AND
NOT (WEB OR EMSCRIPTEN))
# The MAGES. runtime renders offscreen inside the embedded impacto host
# library (compiled from the packages/AetherMAGES submodule). Built on
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ Godot App Shell
├─ OnsRuntime ───────── OnscripterYuri
├─ SiglusRuntime ────── siglus_rs
├─ System4 Runtime ──── xsystem4 (AliceSoft)
├─ System35 Runtime ─── xsystem35 (AliceSoft)
├─ System3 Runtime ──── system3-sdl2 (AliceSoft System 1–3)
├─ Artemis Runtime ──── Artemis (private package)
├─ CatSystem2 Runtime ─ CatSystem2 (private package)
├─ BGI Runtime ──────── BGI / Ethornell (private package)
Expand Down Expand Up @@ -74,6 +76,11 @@ and **Debug CPU** is a diagnostic fallback only.
- Experimental TyranoScript browser-project playback from the visual-novel
library on macOS, iOS/iPadOS and Android, with isolated saves and virtual keys. See the
[prototype scope and tests](bridge/tyrano_runtime/README.md).
- Native AliceSoft System 3.5/3.9 playback via xsystem35, with ALD directory
import, Chinese/Japanese text and optional virtual keys. See the [native host and tested games](bridge/xsystem35_runtime/README.md).
- Native AliceSoft System 1–3 DAT playback via system3-sdl2, preserving translated
game IDs, UTF-8 and font configuration, with Shift-JIS for original Japanese games.
Virtual keys default off. See the [native host and validation](bridge/system3_runtime/README.md).
- Native AliceSoft System 4 playback via the bundled xsystem4 runtime, with
directory import, Chinese/Japanese text, audio, movies and optional virtual keys.
See the [native host and validation](bridge/xsystem4_runtime/README.md).
Expand Down
4 changes: 4 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ Godot App Shell
├─ OnsRuntime ───────── OnscripterYuri
├─ SiglusRuntime ────── siglus_rs
├─ System4 Runtime ──── xsystem4(AliceSoft)
├─ System35 Runtime ─── xsystem35(AliceSoft)
├─ System3 Runtime ──── system3-sdl2(AliceSoft System 1–3)
├─ Artemis Runtime ──── Artemis(私有 package)
├─ CatSystem2 Runtime ─ CatSystem2(私有 package)
├─ BGI Runtime ──────── BGI / Ethornell(私有 package)
Expand Down Expand Up @@ -64,6 +66,8 @@ Godot App Shell
不覆盖已有本地存档。游戏目录只读时使用按游戏隔离的应用存储。
- 覆盖 macOS、iOS/iPadOS、Android、Web 与 Linux 的导出配置。
- 独立的 Flash 分类,使用原生 Ruffle 播放,支持声音、键鼠、触摸以及视觉小说的虚拟按钮。
- 通过内置 xsystem35 原生运行 AliceSoft System 3.5/3.9 游戏,支持 ALD 目录导入、中日文和可选虚拟按键。参见[原生宿主与游戏测试范围](bridge/xsystem35_runtime/README.md)。
- 通过内置 system3-sdl2 原生运行 AliceSoft System 1–3 DAT 游戏,沿用汉化包游戏 ID、UTF-8 编码与字体配置,日文版默认 Shift-JIS,虚拟按键默认关闭。参见[原生宿主与验证范围](bridge/system3_runtime/README.md)。
- 通过内置 xsystem4 原生运行 AliceSoft System 4 游戏,支持目录导入、中日文字体、音频、视频和可选虚拟按键。参见[原生宿主与验证范围](bridge/xsystem4_runtime/README.md)。
- macOS、iOS/iPadOS 和 Android 原型支持从视觉小说库运行 TyranoScript 网页项目,提供独立存档和虚拟按键。
支持范围与验证方法见 [接入说明](bridge/tyrano_runtime/README.md)。
Expand Down
2 changes: 1 addition & 1 deletion apps/godot_app/scripts/game_input_mapping.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ static func input_surface_size(
content_size: Vector2,
requested_surface: Vector2
) -> Vector2:
if runtime_kind in ["advhd", "minori", "onscripter", "rfvp", "siglus", "softpal", "xsystem4", "yuris"]:
if runtime_kind in ["advhd", "minori", "onscripter", "rfvp", "siglus", "softpal", "xsystem4", "xsystem35", "system3", "yuris"]:
return content_size
if requested_surface.x > 0.0 and requested_surface.y > 0.0:
return requested_surface
Expand Down
2 changes: 2 additions & 0 deletions apps/godot_app/scripts/game_launch_entry.gd
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ const DIRECTORY_RUNTIME_KINDS := [
"tyranoscript",
"wa2",
"xsystem4",
"xsystem35",
"system3",
]
const YURIS_USER_STARTUP_CANDIDATES := [
# The stock YU-RIS package enters through this script. It owns the
Expand Down
14 changes: 14 additions & 0 deletions apps/godot_app/scripts/game_metadata.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ const RUNTIME_TYRANO := "tyranoscript"
const RUNTIME_RENPY := "renpy"
const RUNTIME_MAGES := "mages"
const RUNTIME_XSYSTEM4 := "xsystem4"
const RUNTIME_XSYSTEM35 := "xsystem35"
const RUNTIME_SYSTEM3 := "system3"
const RUNTIME_YURIS := "yuris"

static func inspect(path: String) -> Dictionary:
Expand Down Expand Up @@ -61,6 +63,12 @@ static func inspect(path: String) -> Dictionary:
elif (files.has("system40.ini") or files.has("alicestart.ini")) and _has_extension(files, "ain"):
result.engine = RUNTIME_XSYSTEM4
result.signals.append("system4-ain-ini")
elif _has_suffix(files, "sa.ald") or files.has("adisk.ald"):
result.engine = RUNTIME_XSYSTEM35
result.signals.append("system35-scenario-ald")
elif (files.has("adisk.dat") or files.has("gdisk.dat") or files.has("agame.dat") or files.has("adisk.pat")) and (files.has("acg.dat") or files.has("gcg.dat")):
result.engine = RUNTIME_SYSTEM3
result.signals.append("system3-dat")
elif not hcb.is_empty():
result.engine = RUNTIME_RFVP
result.signals.append("fvp-hcb")
Expand Down Expand Up @@ -408,3 +416,9 @@ static func _unique_nonempty(values: PackedStringArray) -> PackedStringArray:
seen[normalized] = true
result.append(normalized)
return result

static func _has_suffix(files: PackedStringArray, suffix: String) -> bool:
for name in files:
if name.ends_with(suffix):
return true
return false
24 changes: 21 additions & 3 deletions apps/godot_app/scripts/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -2076,6 +2076,8 @@ const RUNTIME_CATSYSTEM2 := "catsystem2"
const RUNTIME_SIGLUS := "siglus"
const RUNTIME_RENPY := "renpy"
const RUNTIME_XSYSTEM4 := "xsystem4"
const RUNTIME_XSYSTEM35 := "xsystem35"
const RUNTIME_SYSTEM3 := "system3"
const RUNTIME_WA2 := "wa2"
const RUNTIME_BGI := "bgi"
const RUNTIME_ADVHD := "advhd"
Expand Down Expand Up @@ -9654,7 +9656,7 @@ func _game_launch_entry_label(game: Dictionary) -> String:
func _can_configure_launch_file(game: Dictionary) -> bool:
return OS.get_name() != "Web" \
and not builtin_demo.is_game(game) \
and _game_runtime_kind(String(game.get("path", ""))) not in [RUNTIME_ONSCRIPTER, RUNTIME_XSYSTEM4] \
and _game_runtime_kind(String(game.get("path", ""))) not in [RUNTIME_ONSCRIPTER, RUNTIME_XSYSTEM4, RUNTIME_XSYSTEM35, RUNTIME_SYSTEM3] \
and String(game.get("type", "Directory")).to_lower() == "directory"

func _set_launch_file_for_selected() -> void:
Expand Down Expand Up @@ -12489,6 +12491,8 @@ func _switch_runtime_player(runtime_kind: String) -> bool:
RUNTIME_BGI,
RUNTIME_MAGES,
RUNTIME_XSYSTEM4,
RUNTIME_XSYSTEM35,
RUNTIME_SYSTEM3,
RUNTIME_YURIS,
RUNTIME_ADVHD,
]:
Expand Down Expand Up @@ -12525,7 +12529,11 @@ func _switch_runtime_player(runtime_kind: String) -> bool:
diagnostic_session.finish()
diagnostic_session.start(player, selected_backend)
_append_log("Runtime selected: %s" % (
"AliceSoft System 4"
"AliceSoft System 1/2/3"
if normalized == RUNTIME_SYSTEM3
else "AliceSoft System 3.5/3.9"
if normalized == RUNTIME_XSYSTEM35
else "AliceSoft System 4"
if normalized == RUNTIME_XSYSTEM4
else "YU-RIS"
if normalized == RUNTIME_YURIS
Expand Down Expand Up @@ -13212,6 +13220,8 @@ func _ensure_player_initialized() -> bool:
RUNTIME_BGI,
RUNTIME_MAGES,
RUNTIME_XSYSTEM4,
RUNTIME_XSYSTEM35,
RUNTIME_SYSTEM3,
RUNTIME_YURIS,
RUNTIME_ADVHD,
]:
Expand All @@ -13228,7 +13238,11 @@ func _ensure_player_initialized() -> bool:
return false

_append_log("%s engine initialized." % (
"AliceSoft System 4"
"AliceSoft System 1/2/3"
if current_player_runtime_kind == RUNTIME_SYSTEM3
else "AliceSoft System 3.5/3.9"
if current_player_runtime_kind == RUNTIME_XSYSTEM35
else "AliceSoft System 4"
if current_player_runtime_kind == RUNTIME_XSYSTEM4
else "YU-RIS" if current_player_runtime_kind == RUNTIME_YURIS
else "OnscripterYuri"
Expand Down Expand Up @@ -15932,6 +15946,10 @@ func _renderer_summary(renderer: String) -> String:
var summary := selected_backend
if renderer.contains("backend=onscripter_yuri"):
summary = "OnscripterYuri (Godot Texture)"
elif renderer.contains("backend=system3"):
summary = "System 1/2/3 (Godot Texture)"
elif renderer.contains("backend=xsystem35"):
summary = "System 3.5/3.9 (Godot Texture)"
elif renderer.contains("backend=xsystem4"):
summary = "System 4 (Godot Texture)"
elif renderer.contains("backend=godot_native"):
Expand Down
Loading
Loading