Preserve reviewed input-copy candidate and reconcile P23-02 acceptance ledger
This commit is contained in:
@@ -1,5 +1,12 @@
|
||||
# 原本全実装に向けた作業計画 2026年10月改訂
|
||||
|
||||
## P23-02 現着手・次に閉じる1件(r337、2026-10-12)
|
||||
|
||||
P23-02着手中。制作r32と選定済み実装親r274/library275は保持。最新未選定・未採用候補r333/library334は、親r326の在庫入力キー整列と経路コピーだけをnative化。未捕捉std確保例外をビルド前に修復。bridge1/link1、SDKcompile0、既存stage再利用。局所4工程404/0、Runtime150候補105808bytes・評価後11411840bytes原golden全文一致。S6 24/0、両whole15/0、after647全11487732bytes原oracle全文一致を独立有限受理。単一隣接観測1037100→1010883us(約2.5279%短縮)だが約1.01秒停止が残り安定性能・50ms/P95/D10は未受入。r204再構築は既非採用のため再実装なし。原9横断8はすべて未受入、Windows C08/X8のみblock、手動Ctrl保持wheel/左ボタン保持dragは延期・未達・非免除。正式9/着手19/予定60、30パッケージ/88成果、部分点なし、今回正式完了追加0。
|
||||
|
||||
全17条件・対象版・不足条件の現在authorityは `artifacts/original-completion-2026-10-02/p23-02-current-progress-disposition-r337.json`。詳細と保存証拠は `execution/CURRENT_NATIVE_INPUT_COPY_R332_R337.md`。依存P08/P22。過去の候補版に関する後続記載は履歴であり、最新対象版の受入証拠へ無条件転用しない。
|
||||
|
||||
|
||||
## P23-02 現着手・次に閉じる1件(2026-10-12・r318証拠統合)
|
||||
|
||||
P23-02断面操作性は着手中・次に閉じる1件。30パッケージ/88成果、正式9/着手19/予定60、部分点なし。原17条件C01-C09/X1-X8は未受入、Windows C08/X8だけブロック。制作r32と実装親r274/library275を保持、r302/library303は未採用・選定保留。Guest一括候補r313-r02/library314-r02も隔離未採用・未選定。r315はliteral原Guestのclass_nameだけ除去した独立oracleとの局所53記録、原S3の18メソッド、692/0、全606268bytesの独立decode/roundtrip・型付き156比較を有限受理。pureのaccepted/rejected/ranked、4decisionと7fallbackの全状態・callback/通知順・所有を比較した。raw ordered fieldの直接oracle比較と任意custom override/一般再入は未認定。r317は候補原S6 24/0とbaseline whole15/0・全11487732bytes原oracle一致後、driverの空AssertionErrorで停止。原因は未特定、candidate未実行・pair不成立、所有2PID終了/全復元を確認。r317-r02のラベル追加による容量条件脱落と旧engine3件数を事前拒否・engine0で保存。r317-r03は容量条件とengine1件数へ修復し成功済phaseを再利用し候補whole1engineだけ続行、15/0・全11487732bytes原oracle一致・strict/private/所有終了/両stage復元を有限受理。同期時間1090007usは候補単発観測のみ、隣接pair/安定利益/50ms/P95/D10を認定しない。build/library複製/stageclone/全172追加0。旧詳細と版付き証拠はr316 matrixとcheckpointを保持。正式完了追加0。次は同候補の代表負荷時間を基に、50ms未達を解消する必要な関連変更をまとめる。正確な最終版で必須全172、P95/D10、通常OS/x3/終了/小画面、同一Windows配布版実機と原17条件を受入する。手動入力2件は延期・未達・免除なし。
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# P00〜P03 進捗台帳への証拠統合
|
||||
|
||||
## P23-02 現着手・次に閉じる1件(r337、2026-10-12)
|
||||
|
||||
P23-02着手中。制作r32と選定済み実装親r274/library275は保持。最新未選定・未採用候補r333/library334は、親r326の在庫入力キー整列と経路コピーだけをnative化。未捕捉std確保例外をビルド前に修復。bridge1/link1、SDKcompile0、既存stage再利用。局所4工程404/0、Runtime150候補105808bytes・評価後11411840bytes原golden全文一致。S6 24/0、両whole15/0、after647全11487732bytes原oracle全文一致を独立有限受理。単一隣接観測1037100→1010883us(約2.5279%短縮)だが約1.01秒停止が残り安定性能・50ms/P95/D10は未受入。r204再構築は既非採用のため再実装なし。原9横断8はすべて未受入、Windows C08/X8のみblock、手動Ctrl保持wheel/左ボタン保持dragは延期・未達・非免除。正式9/着手19/予定60、30パッケージ/88成果、部分点なし、今回正式完了追加0。
|
||||
|
||||
全17条件・対象版・不足条件の現在authorityは `artifacts/original-completion-2026-10-02/p23-02-current-progress-disposition-r337.json`。詳細と保存証拠は `execution/CURRENT_NATIVE_INPUT_COPY_R332_R337.md`。依存P08/P22。過去の候補版に関する後続記載は履歴であり、最新対象版の受入証拠へ無条件転用しない。
|
||||
|
||||
|
||||
## P23-02 現着手・次に閉じる1件(2026-10-12・r318証拠統合)
|
||||
|
||||
P23-02断面操作性は着手中・次に閉じる1件。30パッケージ/88成果、正式9/着手19/予定60、部分点なし。原17条件C01-C09/X1-X8は未受入、Windows C08/X8だけブロック。制作r32と実装親r274/library275を保持、r302/library303は未採用・選定保留。Guest一括候補r313-r02/library314-r02も隔離未採用・未選定。r315はliteral原Guestのclass_nameだけ除去した独立oracleとの局所53記録、原S3の18メソッド、692/0、全606268bytesの独立decode/roundtrip・型付き156比較を有限受理。pureのaccepted/rejected/ranked、4decisionと7fallbackの全状態・callback/通知順・所有を比較した。raw ordered fieldの直接oracle比較と任意custom override/一般再入は未認定。r317は候補原S6 24/0とbaseline whole15/0・全11487732bytes原oracle一致後、driverの空AssertionErrorで停止。原因は未特定、candidate未実行・pair不成立、所有2PID終了/全復元を確認。r317-r02のラベル追加による容量条件脱落と旧engine3件数を事前拒否・engine0で保存。r317-r03は容量条件とengine1件数へ修復し成功済phaseを再利用し候補whole1engineだけ続行、15/0・全11487732bytes原oracle一致・strict/private/所有終了/両stage復元を有限受理。同期時間1090007usは候補単発観測のみ、隣接pair/安定利益/50ms/P95/D10を認定しない。build/library複製/stageclone/全172追加0。旧詳細と版付き証拠はr316 matrixとcheckpointを保持。正式完了追加0。次は同候補の代表負荷時間を基に、50ms未達を解消する必要な関連変更をまとめる。正確な最終版で必須全172、P95/D10、通常OS/x3/終了/小画面、同一Windows配布版実機と原17条件を受入する。手動入力2件は延期・未達・免除なし。
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+56
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"plan": [
|
||||
[
|
||||
"compile-062",
|
||||
[
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"-c",
|
||||
"-std=c++17",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Werror",
|
||||
"-fexceptions",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-O3",
|
||||
"-fPIC",
|
||||
"-DMACOS_ENABLED",
|
||||
"-DUNIX_ENABLED",
|
||||
"-DTHREADS_ENABLED",
|
||||
"-DDEBUG_ENABLED",
|
||||
"-DNDEBUG",
|
||||
"-DGDEXTENSION",
|
||||
"-I/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
|
||||
]
|
||||
],
|
||||
[
|
||||
"link",
|
||||
[
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-Wl,-S",
|
||||
"-Wl,-x",
|
||||
"-Wl,-dead_strip",
|
||||
"-shared",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"pid": 47216,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"-c",
|
||||
"-std=c++17",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Werror",
|
||||
"-fexceptions",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-O3",
|
||||
"-fPIC",
|
||||
"-DMACOS_ENABLED",
|
||||
"-DUNIX_ENABLED",
|
||||
"-DTHREADS_ENABLED",
|
||||
"-DDEBUG_ENABLED",
|
||||
"-DNDEBUG",
|
||||
"-DGDEXTENSION",
|
||||
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
|
||||
],
|
||||
"pgid": 47216,
|
||||
"ended_utc": "2026-10-12T04:27:09.188321+00:00",
|
||||
"exit_code": 0,
|
||||
"duration_seconds": 1.9507496249999994,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47216,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"remaining": [],
|
||||
"cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"pid": 47216,
|
||||
"owner_pid": 47179,
|
||||
"pgid": 47216,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"-c",
|
||||
"-std=c++17",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Werror",
|
||||
"-fexceptions",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-O3",
|
||||
"-fPIC",
|
||||
"-DMACOS_ENABLED",
|
||||
"-DUNIX_ENABLED",
|
||||
"-DTHREADS_ENABLED",
|
||||
"-DDEBUG_ENABLED",
|
||||
"-DNDEBUG",
|
||||
"-DGDEXTENSION",
|
||||
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:27:07.271137+00:00",
|
||||
"initial_members": [
|
||||
{
|
||||
"pid": 47216,
|
||||
"ppid": 47179,
|
||||
"pgid": 47216,
|
||||
"args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os -c -std=c++17 -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include -Wall -Wextra -Werror -fexceptions -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -O3 -fPIC -DMACOS_ENABLED -DUNIX_ENABLED -DTHREADS_ENABLED -DDEBUG_ENABLED -DNDEBUG -DGDEXTENSION -I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
|
||||
}
|
||||
],
|
||||
"owned_new_session": true
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "compile-062",
|
||||
"result": {
|
||||
"pid": 47216,
|
||||
"exit_code": 0,
|
||||
"timed_out": false,
|
||||
"error_lines": [],
|
||||
"duration_seconds": 1.9510925420000005
|
||||
},
|
||||
"capture": {
|
||||
"passed": true,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47216,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"cleanup_errors": [],
|
||||
"all_captured_ended": true,
|
||||
"foreign_process_or_group_signals": 0
|
||||
},
|
||||
"full_input_inventory_before_verified": true,
|
||||
"full_input_inventory_after_verified": true,
|
||||
"post_input_error": null
|
||||
}
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"passed": true,
|
||||
"error": null,
|
||||
"phases": [
|
||||
{
|
||||
"name": "compile-062",
|
||||
"result": {
|
||||
"pid": 47216,
|
||||
"exit_code": 0,
|
||||
"timed_out": false,
|
||||
"error_lines": [],
|
||||
"duration_seconds": 1.9510925420000005
|
||||
},
|
||||
"capture": {
|
||||
"passed": true,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47216,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"cleanup_errors": [],
|
||||
"all_captured_ended": true,
|
||||
"foreign_process_or_group_signals": 0
|
||||
},
|
||||
"full_input_inventory_before_verified": true,
|
||||
"full_input_inventory_after_verified": true,
|
||||
"post_input_error": null
|
||||
},
|
||||
{
|
||||
"name": "link",
|
||||
"result": {
|
||||
"pid": 47241,
|
||||
"exit_code": 0,
|
||||
"timed_out": false,
|
||||
"error_lines": [],
|
||||
"duration_seconds": 0.30894625
|
||||
},
|
||||
"capture": {
|
||||
"passed": true,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47241,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"cleanup_errors": [],
|
||||
"all_captured_ended": true,
|
||||
"foreign_process_or_group_signals": 0
|
||||
},
|
||||
"full_input_inventory_before_verified": true,
|
||||
"full_input_inventory_after_verified": true,
|
||||
"post_input_error": null
|
||||
}
|
||||
],
|
||||
"cleanup": [
|
||||
[
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47216,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47241,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
]
|
||||
],
|
||||
"cleanup_errors": [],
|
||||
"binary_checks": {
|
||||
"file": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib: Mach-O 64-bit dynamically linked shared library arm64\n",
|
||||
"arch": "arm64\n",
|
||||
"dependencies": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib:\n\t/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib (compatibility version 0.0.0, current version 0.0.0)\n\t/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 2100.43.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1356.0.0)\n",
|
||||
"exports": "0000000000000828 T _tree_numeric_core_init\n"
|
||||
},
|
||||
"object": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"bytes": 387120,
|
||||
"sha256": "34457a4ccc7746d1ed9dda2e7638eef7dc432e2e5ee13329fe1b347c8907b232"
|
||||
},
|
||||
"library": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
|
||||
"bytes": 433744,
|
||||
"sha256": "39f8ed73f077d15037d85b9cb53f38389c032a36dea7ff04348e5ef05c736907"
|
||||
},
|
||||
"original_inputs_preserved": true,
|
||||
"bridge_compilations": 1,
|
||||
"link_attempts": 1,
|
||||
"spawned_children": [
|
||||
{
|
||||
"phase": "compile-062",
|
||||
"pid": 47216,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"-c",
|
||||
"-std=c++17",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
|
||||
"-isystem",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
|
||||
"-Wall",
|
||||
"-Wextra",
|
||||
"-Werror",
|
||||
"-fexceptions",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-O3",
|
||||
"-fPIC",
|
||||
"-DMACOS_ENABLED",
|
||||
"-DUNIX_ENABLED",
|
||||
"-DTHREADS_ENABLED",
|
||||
"-DDEBUG_ENABLED",
|
||||
"-DNDEBUG",
|
||||
"-DGDEXTENSION",
|
||||
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"phase": "link",
|
||||
"pid": 47241,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-Wl,-S",
|
||||
"-Wl,-x",
|
||||
"-Wl,-dead_strip",
|
||||
"-shared",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
|
||||
]
|
||||
}
|
||||
],
|
||||
"SDK_compilations": 0,
|
||||
"SDK_archive_reused": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a",
|
||||
"bytes": 2284912,
|
||||
"sha256": "4d54f0980c3f445f3013cddb859135b619f28a91205fc8b9fbc9d10bc76c52c3"
|
||||
},
|
||||
"SDK_archive_rebuilt": false,
|
||||
"old_bridge_object_reused": false,
|
||||
"Godot_loaded": false,
|
||||
"selected": false,
|
||||
"unit_accepted": false,
|
||||
"performance_accepted": false,
|
||||
"limits": [
|
||||
"Exact r333 Guest batch bridge one-object compile and link to authenticated unchanged r133 SDK archive only; no SDK recompilation, Godot load, protocol, performance or unit acceptance."
|
||||
]
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+35
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"pid": 47241,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-Wl,-S",
|
||||
"-Wl,-x",
|
||||
"-Wl,-dead_strip",
|
||||
"-shared",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
|
||||
],
|
||||
"pgid": 47241,
|
||||
"ended_utc": "2026-10-12T04:27:09.948383+00:00",
|
||||
"exit_code": 0,
|
||||
"duration_seconds": 0.30862637499999934,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47241,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"remaining": [],
|
||||
"cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"pid": 47241,
|
||||
"owner_pid": 47179,
|
||||
"pgid": 47241,
|
||||
"argv": [
|
||||
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
|
||||
"-o",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
|
||||
"-arch",
|
||||
"arm64",
|
||||
"-isysroot",
|
||||
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
|
||||
"-fvisibility=hidden",
|
||||
"-Wl,-S",
|
||||
"-Wl,-x",
|
||||
"-Wl,-dead_strip",
|
||||
"-shared",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:27:09.672403+00:00",
|
||||
"initial_members": [
|
||||
{
|
||||
"pid": 47241,
|
||||
"ppid": 47179,
|
||||
"pgid": 47241,
|
||||
"args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -Wl,-S -Wl,-x -Wl,-dead_strip -shared /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
|
||||
}
|
||||
],
|
||||
"owned_new_session": true
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "link",
|
||||
"result": {
|
||||
"pid": 47241,
|
||||
"exit_code": 0,
|
||||
"timed_out": false,
|
||||
"error_lines": [],
|
||||
"duration_seconds": 0.30894625
|
||||
},
|
||||
"capture": {
|
||||
"passed": true,
|
||||
"cleanup": [
|
||||
{
|
||||
"attempt": 0,
|
||||
"pgid": 47241,
|
||||
"members_before": [],
|
||||
"group_signal": null,
|
||||
"tracked_parent_signal": null
|
||||
}
|
||||
],
|
||||
"cleanup_errors": [],
|
||||
"all_captured_ended": true,
|
||||
"foreign_process_or_group_signals": 0
|
||||
},
|
||||
"full_input_inventory_before_verified": true,
|
||||
"full_input_inventory_after_verified": true,
|
||||
"post_input_error": null
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+58
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"plan_id": "P23-02",
|
||||
"status": "uncompiled_implementation_candidate",
|
||||
"parent": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/input.json",
|
||||
"bytes": 3185,
|
||||
"sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254"
|
||||
},
|
||||
"contract": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-work-contract-r332.json",
|
||||
"bytes": 2058,
|
||||
"sha256": "33a6555addd3471f2f00f35659e3f4e69f7fa26598755f8af6b0deabbf8932c5"
|
||||
},
|
||||
"candidate_pins": {
|
||||
"scripts/guest_service.gd": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/guest_service.gd",
|
||||
"bytes": 62505,
|
||||
"sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e"
|
||||
},
|
||||
"scripts/simulation_runtime.gd": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/simulation_runtime.gd",
|
||||
"bytes": 612068,
|
||||
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
|
||||
},
|
||||
"source/guest_candidate_batch.inc": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/guest_candidate_batch.inc",
|
||||
"bytes": 28222,
|
||||
"sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9"
|
||||
},
|
||||
"source/tree_core.hpp": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_core.hpp",
|
||||
"bytes": 3467,
|
||||
"sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1"
|
||||
},
|
||||
"source/tree_numeric_core.cpp": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp",
|
||||
"bytes": 57762,
|
||||
"sha256": "d948b9c2033fd9f2ad8b85a1d5ed51fd431eb78b68b3634dc020df104712ad11"
|
||||
}
|
||||
},
|
||||
"original_method_sources": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/scripts/world/path_service.gd",
|
||||
"bytes": 132925,
|
||||
"sha256": "6b7f4e989ea9b09495f814d8ecb294028d10794005966414bf52640e122b0d17"
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/autoload/simulation_runtime.gd",
|
||||
"bytes": 612068,
|
||||
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
|
||||
}
|
||||
],
|
||||
"selected": false,
|
||||
"adopted": false,
|
||||
"unit_accepted": false,
|
||||
"performance_accepted": false,
|
||||
"formal_completed_added": 0
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"plan_id": "P23-02",
|
||||
"status": "uncompiled_implementation_candidate",
|
||||
"parent": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/input.json",
|
||||
"bytes": 3185,
|
||||
"sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254"
|
||||
},
|
||||
"contract": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-work-contract-r332.json",
|
||||
"bytes": 2058,
|
||||
"sha256": "33a6555addd3471f2f00f35659e3f4e69f7fa26598755f8af6b0deabbf8932c5"
|
||||
},
|
||||
"candidate_pins": {
|
||||
"scripts/guest_service.gd": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/guest_service.gd",
|
||||
"bytes": 62505,
|
||||
"sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e"
|
||||
},
|
||||
"scripts/simulation_runtime.gd": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/simulation_runtime.gd",
|
||||
"bytes": 612068,
|
||||
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
|
||||
},
|
||||
"source/guest_candidate_batch.inc": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/guest_candidate_batch.inc",
|
||||
"bytes": 28222,
|
||||
"sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9"
|
||||
},
|
||||
"source/tree_core.hpp": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_core.hpp",
|
||||
"bytes": 3467,
|
||||
"sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1"
|
||||
},
|
||||
"source/tree_numeric_core.cpp": {
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp",
|
||||
"bytes": 58156,
|
||||
"sha256": "5957fab6cdef5f44ef69cbfaa1685c5eba2aefcab7d6fb7b8bf383e54386aa01"
|
||||
}
|
||||
},
|
||||
"original_method_sources": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/scripts/world/path_service.gd",
|
||||
"bytes": 132925,
|
||||
"sha256": "6b7f4e989ea9b09495f814d8ecb294028d10794005966414bf52640e122b0d17"
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/autoload/simulation_runtime.gd",
|
||||
"bytes": 612068,
|
||||
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
|
||||
}
|
||||
],
|
||||
"selected": false,
|
||||
"adopted": false,
|
||||
"unit_accepted": false,
|
||||
"performance_accepted": false,
|
||||
"formal_completed_added": 0,
|
||||
"precompile_allocation_guard_repair": [
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source-before-allocation-guard.cpp",
|
||||
"bytes": 57762,
|
||||
"sha256": "d948b9c2033fd9f2ad8b85a1d5ed51fd431eb78b68b3634dc020df104712ad11"
|
||||
},
|
||||
{
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/input-before-allocation-guard.json",
|
||||
"bytes": 3183,
|
||||
"sha256": "5004a1b7d0d250a4e32107e88673c296df9a9291ba74424d36be61a7bfa62117"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+395
@@ -0,0 +1,395 @@
|
||||
private:
|
||||
// This scope owns names only for one call. It retains no guest, candidate,
|
||||
// callback, result, cache or saved simulation state across calls.
|
||||
struct GuestBatchKey {
|
||||
const StringName name;
|
||||
const String text;
|
||||
explicit GuestBatchKey(const char *s):name(s,false),text(name) {}
|
||||
};
|
||||
// Immutable key objects belong to one public batch call only. No guest,
|
||||
// dictionary, callback, cached value or name survives that call.
|
||||
struct GuestBatchNames {
|
||||
const GuestBatchKey k_empty{""};
|
||||
const GuestBatchKey k_ADULT_NOT_VERIFIED{"ADULT_NOT_VERIFIED"};
|
||||
const GuestBatchKey k_CANNOT_PAY{"CANNOT_PAY"};
|
||||
const GuestBatchKey k_CONTENT_FILTERED{"CONTENT_FILTERED"};
|
||||
const GuestBatchKey k_ETA_AFTER_EXIT{"ETA_AFTER_EXIT"};
|
||||
const GuestBatchKey k_FACILITY_CLOSED{"FACILITY_CLOSED"};
|
||||
const GuestBatchKey k_FORBIDDEN_GUEST_TAG{"FORBIDDEN_GUEST_TAG"};
|
||||
const GuestBatchKey k_GUEST_TYPE_NOT_ALLOWED{"GUEST_TYPE_NOT_ALLOWED"};
|
||||
const GuestBatchKey k_ILLEGALITY_REFUSED{"ILLEGALITY_REFUSED"};
|
||||
const GuestBatchKey k_INVALID_NEED_MAP{"INVALID_NEED_MAP"};
|
||||
const GuestBatchKey k_MISSING_INPUTS{"MISSING_INPUTS"};
|
||||
const GuestBatchKey k_MISSING_PERMISSION{"MISSING_PERMISSION"};
|
||||
const GuestBatchKey k_QUALITY_TOO_LOW{"QUALITY_TOO_LOW"};
|
||||
const GuestBatchKey k_RISK_REFUSED{"RISK_REFUSED"};
|
||||
const GuestBatchKey k_UNREACHABLE{"UNREACHABLE"};
|
||||
const GuestBatchKey k_WAIT_HARD_LIMIT{"WAIT_HARD_LIMIT"};
|
||||
const GuestBatchKey k_absolute_minute{"absolute_minute"};
|
||||
const GuestBatchKey k_accepted{"accepted"};
|
||||
const GuestBatchKey k_addiction_by_tag{"addiction_by_tag"};
|
||||
const GuestBatchKey k_adult{"adult"};
|
||||
const GuestBatchKey k_adult_content_enabled{"adult_content_enabled"};
|
||||
const GuestBatchKey k_adult_only{"adult_only"};
|
||||
const GuestBatchKey k_adult_verified{"adult_verified"};
|
||||
const GuestBatchKey k_allow_credit{"allow_credit"};
|
||||
const GuestBatchKey k_allowed_guest_types{"allowed_guest_types"};
|
||||
const GuestBatchKey k_credit_allowed{"credit_allowed"};
|
||||
const GuestBatchKey k_credit_limit_gold{"credit_limit_gold"};
|
||||
const GuestBatchKey k_current_minute{"current_minute"};
|
||||
const GuestBatchKey k_debt_gold{"debt_gold"};
|
||||
const GuestBatchKey k_discretionary{"discretionary"};
|
||||
const GuestBatchKey k_entertainment{"entertainment"};
|
||||
const GuestBatchKey k_estimated_total_gold{"estimated_total_gold"};
|
||||
const GuestBatchKey k_exit_reason{"exit_reason"};
|
||||
const GuestBatchKey k_exit_threshold{"exit_threshold"};
|
||||
const GuestBatchKey k_expected_quality{"expected_quality"};
|
||||
const GuestBatchKey k_expected_wait{"expected_wait"};
|
||||
const GuestBatchKey k_facility_id{"facility_id"};
|
||||
const GuestBatchKey k_facility_tags{"facility_tags"};
|
||||
const GuestBatchKey k_forbidden_guest_tags{"forbidden_guest_tags"};
|
||||
const GuestBatchKey k_frugal{"frugal"};
|
||||
const GuestBatchKey k_gambling{"gambling"};
|
||||
const GuestBatchKey k_get_definition{"get_definition"};
|
||||
const GuestBatchKey k_get_guest{"get_guest"};
|
||||
const GuestBatchKey k_group_fit{"group_fit"};
|
||||
const GuestBatchKey k_guest_type_id{"guest_type_id"};
|
||||
const GuestBatchKey k_hunger{"hunger"};
|
||||
const GuestBatchKey k_hygiene{"hygiene"};
|
||||
const GuestBatchKey k_illegal_level{"illegal_level"};
|
||||
const GuestBatchKey k_inputs_available{"inputs_available"};
|
||||
const GuestBatchKey k_instance_id{"instance_id"};
|
||||
const GuestBatchKey k_intimacy{"intimacy"};
|
||||
const GuestBatchKey k_is_open{"is_open"};
|
||||
const GuestBatchKey k_legal_permission_override{"legal_permission_override"};
|
||||
const GuestBatchKey k_legal_sensitivity{"legal_sensitivity"};
|
||||
const GuestBatchKey k_leisure{"leisure"};
|
||||
const GuestBatchKey k_medical{"medical"};
|
||||
const GuestBatchKey k_minimum_quality{"minimum_quality"};
|
||||
const GuestBatchKey k_need_effects{"need_effects"};
|
||||
const GuestBatchKey k_need_priority{"need_priority"};
|
||||
const GuestBatchKey k_need_relief{"need_relief"};
|
||||
const GuestBatchKey k_needs{"needs"};
|
||||
const GuestBatchKey k_novelty{"novelty"};
|
||||
const GuestBatchKey k_ok{"ok"};
|
||||
const GuestBatchKey k_open{"open"};
|
||||
const GuestBatchKey k_open_at_arrival{"open_at_arrival"};
|
||||
const GuestBatchKey k_ordered{"ordered"};
|
||||
const GuestBatchKey k_planned_exit_at{"planned_exit_at"};
|
||||
const GuestBatchKey k_preference{"preference"};
|
||||
const GuestBatchKey k_preference_weights{"preference_weights"};
|
||||
const GuestBatchKey k_price_burden{"price_burden"};
|
||||
const GuestBatchKey k_price_gold{"price_gold"};
|
||||
const GuestBatchKey k_quality{"quality"};
|
||||
const GuestBatchKey k_quoted_price{"quoted_price"};
|
||||
const GuestBatchKey k_ranked{"ranked"};
|
||||
const GuestBatchKey k_reachable{"reachable"};
|
||||
const GuestBatchKey k_reason{"reason"};
|
||||
const GuestBatchKey k_rejected{"rejected"};
|
||||
const GuestBatchKey k_repetition_penalty{"repetition_penalty"};
|
||||
const GuestBatchKey k_required_guest_tags{"required_guest_tags"};
|
||||
const GuestBatchKey k_requires_adult_verified{"requires_adult_verified"};
|
||||
const GuestBatchKey k_respect_survival_reserve{"respect_survival_reserve"};
|
||||
const GuestBatchKey k_risk{"risk"};
|
||||
const GuestBatchKey k_risk_level{"risk_level"};
|
||||
const GuestBatchKey k_risk_sensitivity{"risk_sensitivity"};
|
||||
const GuestBatchKey k_risk_tolerance{"risk_tolerance"};
|
||||
const GuestBatchKey k_service_category{"service_category"};
|
||||
const GuestBatchKey k_sleep{"sleep"};
|
||||
const GuestBatchKey k_spendthrift{"spendthrift"};
|
||||
const GuestBatchKey k_supported{"supported"};
|
||||
const GuestBatchKey k_tags{"tags"};
|
||||
const GuestBatchKey k_tourism{"tourism"};
|
||||
const GuestBatchKey k_travel_minutes{"travel_minutes"};
|
||||
const GuestBatchKey k_urgency{"urgency"};
|
||||
const GuestBatchKey k_utility{"utility"};
|
||||
const GuestBatchKey k_utility_terms{"utility_terms"};
|
||||
const GuestBatchKey k_visited_facility_ids{"visited_facility_ids"};
|
||||
const GuestBatchKey k_wait_hard_limit{"wait_hard_limit"};
|
||||
const GuestBatchKey k_wait_minutes{"wait_minutes"};
|
||||
const GuestBatchKey k_wallet_gold{"wallet_gold"};
|
||||
Variant value(const Dictionary &d,const GuestBatchKey &k,const Variant &fallback=Variant()) {
|
||||
if(d.has(k.name)) return d[k.name];
|
||||
return d.has(k.text) ? d[k.text] : fallback;
|
||||
}
|
||||
bool has(const Dictionary &d,const GuestBatchKey &k) { return d.has(k.name) || d.has(k.text); }
|
||||
int64_t integer(const Dictionary &d,const GuestBatchKey &k,int64_t fallback=0) { return value(d,k,fallback); }
|
||||
bool flag(const Dictionary &d,const GuestBatchKey &k,bool fallback=false) {
|
||||
const Variant v=value(d,k,fallback);
|
||||
return v.get_type()==Variant::INT ? int64_t(v)!=0 : bool(v);
|
||||
}
|
||||
};
|
||||
struct GuestBatchRow {
|
||||
Dictionary candidate,relief;
|
||||
StringName id;
|
||||
String id_text;
|
||||
bool need_map_valid=true;
|
||||
int64_t priority=0,utility=0,urgency=0,travel=0;
|
||||
};
|
||||
struct GuestBatchFacilityOrder {
|
||||
bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const { return a.id_text < b.id_text; }
|
||||
};
|
||||
struct GuestBatchRankOrder {
|
||||
bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const {
|
||||
if(a.priority!=b.priority) return a.priority>b.priority;
|
||||
if(a.utility!=b.utility) return a.utility>b.utility;
|
||||
if(a.urgency!=b.urgency) return a.urgency>b.urgency;
|
||||
if(a.travel!=b.travel) return a.travel<b.travel;
|
||||
return a.id_text<b.id_text;
|
||||
}
|
||||
};
|
||||
static int64_t guest_sub(int64_t a,int64_t b) {
|
||||
return the_tree_native::signed_add(a,the_tree_native::signed_add(~b,1));
|
||||
}
|
||||
static int64_t guest_clamp(int64_t x,int64_t low,int64_t high) {
|
||||
return std::min<int64_t>(std::max<int64_t>(x,low),high);
|
||||
}
|
||||
static bool guest_name_value(const Variant &v) {
|
||||
return v.get_type()==Variant::STRING || v.get_type()==Variant::STRING_NAME;
|
||||
}
|
||||
static bool guest_names_supported(const Variant &v) {
|
||||
// The original name helper ignores non-arrays, but converting unusual
|
||||
// array elements is deliberately left to the original GDScript path.
|
||||
if(v.get_type()!=Variant::ARRAY) return true;
|
||||
const Array a=v;
|
||||
for(int64_t i=0;i<a.size();++i) if(!guest_name_value(a[i])) return false;
|
||||
return true;
|
||||
}
|
||||
static Array guest_names(const Variant &v) {
|
||||
Array out;
|
||||
if(v.get_type()!=Variant::ARRAY) return out;
|
||||
const Array a=v;
|
||||
for(int64_t i=0;i<a.size();++i) {
|
||||
const StringName name=a[i];
|
||||
if(!name.is_empty() && !out.has(name)) out.append(name);
|
||||
}
|
||||
// Membership is unordered. Preference additions below use this same
|
||||
// lexical ordering as GuestDefinition's sorted unique name helper.
|
||||
std::vector<String> ordered;
|
||||
for(int64_t i=0;i<out.size();++i) { const StringName name=out[i]; ordered.emplace_back(String(name)); }
|
||||
SortArray<String> sorter;
|
||||
if(!ordered.empty()) sorter.sort(ordered.data(),ordered.size());
|
||||
out.clear();for(const String &s:ordered) out.append(StringName(s));
|
||||
return out;
|
||||
}
|
||||
static bool guest_normalize_need(GuestBatchNames &n,const Variant &v,Dictionary &out) {
|
||||
if(v.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary source=v;
|
||||
if(source.size()>6) return false;
|
||||
const Array keys=source.keys();
|
||||
for(int64_t i=0;i<keys.size();++i) {
|
||||
if(!guest_name_value(keys[i])) return false;
|
||||
const StringName k=keys[i];
|
||||
bool valid=false;
|
||||
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) if(k==s->name) {valid=true;break;}
|
||||
if(!valid || out.has(k) || source[keys[i]].get_type()!=Variant::INT) return false;
|
||||
out[k]=source[keys[i]];
|
||||
}
|
||||
return true;
|
||||
}
|
||||
static bool guest_candidate_supported(GuestBatchNames &n,const Dictionary &d) {
|
||||
// Adding canonical/result StringName keys to a typed dictionary can
|
||||
// invoke conversion/error semantics; that entire domain stays original.
|
||||
if(d.is_typed()) return false;
|
||||
for(const GuestBatchKey *s: {&n.k_travel_minutes,&n.k_wait_minutes,&n.k_expected_wait,&n.k_wait_hard_limit,&n.k_risk_level,&n.k_risk,&n.k_illegal_level,&n.k_expected_quality,&n.k_quality,&n.k_minimum_quality,&n.k_estimated_total_gold,&n.k_price_gold,&n.k_quoted_price,&n.k_need_priority,&n.k_preference,&n.k_novelty,&n.k_group_fit,&n.k_price_burden,&n.k_risk_sensitivity,&n.k_repetition_penalty,&n.k_urgency})
|
||||
if(n.has(d,*s) && n.value(d,*s).get_type()!=Variant::INT) return false;
|
||||
for(const GuestBatchKey *s: {&n.k_inputs_available,&n.k_adult_only,&n.k_requires_adult_verified,&n.k_is_open,&n.k_open,&n.k_open_at_arrival,&n.k_reachable,&n.k_credit_allowed,&n.k_allow_credit,&n.k_discretionary,&n.k_respect_survival_reserve,&n.k_legal_permission_override,&n.k_ok}) {
|
||||
if(!n.has(d,*s)) continue;
|
||||
const Variant::Type t=n.value(d,*s).get_type();
|
||||
if(t!=Variant::BOOL && t!=Variant::INT) return false;
|
||||
}
|
||||
for(const GuestBatchKey *s: {&n.k_facility_id,&n.k_instance_id,&n.k_service_category}) if(n.has(d,*s) && !guest_name_value(n.value(d,*s))) return false;
|
||||
for(const GuestBatchKey *s: {&n.k_required_guest_tags,&n.k_forbidden_guest_tags,&n.k_allowed_guest_types,&n.k_facility_tags,&n.k_tags}) if(!guest_names_supported(n.value(d,*s,Array()))) return false;
|
||||
return true;
|
||||
}
|
||||
static int64_t guest_price(GuestBatchNames &n,const Dictionary &c) {
|
||||
return std::max<int64_t>(int64_t(n.value(c,n.k_estimated_total_gold,n.value(c,n.k_price_gold,n.value(c,n.k_quoted_price,int64_t(0))))),0);
|
||||
}
|
||||
static bool guest_discretionary(GuestBatchNames &n,const Dictionary &c) {
|
||||
if(n.flag(c,n.k_discretionary)) return true;
|
||||
const StringName category=n.value(c,n.k_service_category,n.k_empty.name);
|
||||
for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_intimacy,&n.k_tourism}) if(category==s->name) return true;
|
||||
const Array tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array())));
|
||||
for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_adult,&n.k_intimacy}) if(tags.has(s->name)) return true;
|
||||
return false;
|
||||
}
|
||||
static StringName guest_rejection(GuestBatchNames &n,const GuestBatchRow &row,
|
||||
const Dictionary &context,const StringName &type,const Array &tags,bool adult,
|
||||
int64_t planned_exit,int64_t decision_minute,int64_t cash,int64_t credit,
|
||||
int64_t reserve,int64_t tolerance,int64_t legal,int64_t minimum) {
|
||||
const Dictionary &c=row.candidate;
|
||||
if(!row.need_map_valid) return n.k_INVALID_NEED_MAP.name;
|
||||
if(!n.flag(c,n.k_inputs_available,true)) return n.k_MISSING_INPUTS.name;
|
||||
if(n.flag(c,n.k_adult_only,n.flag(c,n.k_requires_adult_verified))) {
|
||||
if(!adult) return n.k_ADULT_NOT_VERIFIED.name;
|
||||
if(!n.flag(context,n.k_adult_content_enabled,true)) return n.k_CONTENT_FILTERED.name;
|
||||
}
|
||||
const Array required=guest_names(n.value(c,n.k_required_guest_tags,Array()));
|
||||
for(int64_t i=0;i<required.size();++i) if(!tags.has(required[i])) return n.k_MISSING_PERMISSION.name;
|
||||
const Array forbidden=guest_names(n.value(c,n.k_forbidden_guest_tags,Array()));
|
||||
for(int64_t i=0;i<forbidden.size();++i) if(tags.has(forbidden[i])) return n.k_FORBIDDEN_GUEST_TAG.name;
|
||||
const Array allowed=guest_names(n.value(c,n.k_allowed_guest_types,Array()));
|
||||
if(!allowed.is_empty() && !allowed.has(type)) return n.k_GUEST_TYPE_NOT_ALLOWED.name;
|
||||
if(!n.flag(c,n.k_is_open,n.flag(c,n.k_open,true)) && !n.flag(c,n.k_open_at_arrival)) return n.k_FACILITY_CLOSED.name;
|
||||
if(!n.flag(c,n.k_reachable,true)) return n.k_UNREACHABLE.name;
|
||||
const int64_t travel=std::max<int64_t>(n.integer(c,n.k_travel_minutes),0);
|
||||
if(decision_minute>=0 && the_tree_native::signed_add(decision_minute,travel)>planned_exit) return n.k_ETA_AFTER_EXIT.name;
|
||||
const int64_t price=guest_price(n,c);
|
||||
const int64_t available=n.flag(c,n.k_respect_survival_reserve,guest_discretionary(n,c)) ? std::max<int64_t>(guest_sub(cash,reserve),0) : cash;
|
||||
if(price>available && (!n.flag(c,n.k_credit_allowed,n.flag(c,n.k_allow_credit)) || guest_sub(price,available)>credit)) return n.k_CANNOT_PAY.name;
|
||||
const int64_t wait=std::max<int64_t>(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0);
|
||||
const int64_t hard=std::max<int64_t>(int64_t(n.value(c,n.k_wait_hard_limit,n.value(context,n.k_wait_hard_limit,int64_t(120)))),0);
|
||||
if(wait>=hard) return n.k_WAIT_HARD_LIMIT.name;
|
||||
const int64_t risk=guest_clamp(int64_t(n.value(c,n.k_risk_level,n.value(c,n.k_risk,int64_t(0)))),0,100);
|
||||
if(risk>tolerance) return n.k_RISK_REFUSED.name;
|
||||
if(guest_clamp(n.integer(c,n.k_illegal_level),0,100)>guest_sub(100,legal) && !n.flag(c,n.k_legal_permission_override)) return n.k_ILLEGALITY_REFUSED.name;
|
||||
const int64_t quality=guest_clamp(int64_t(n.value(c,n.k_expected_quality,n.value(c,n.k_quality,int64_t(0)))),0,100);
|
||||
if(quality<guest_clamp(n.integer(c,n.k_minimum_quality,minimum),0,100)) return n.k_QUALITY_TOO_LOW.name;
|
||||
return n.k_empty.name;
|
||||
}
|
||||
static void guest_evaluate(GuestBatchNames &n,GuestBatchRow &row,const Dictionary &needs,
|
||||
const Dictionary &weights,const Array &visited,int64_t cash,int64_t credit,int64_t tolerance) {
|
||||
const Dictionary &c=row.candidate;
|
||||
int64_t relief=0,default_urgency=0,priority=0;
|
||||
const Variant raw_relief=n.value(c,n.k_need_relief,int64_t(0));
|
||||
if(raw_relief.get_type()==Variant::INT) relief=std::max<int64_t>(int64_t(raw_relief),0);
|
||||
else if(raw_relief.get_type()==Variant::DICTIONARY) {
|
||||
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) {
|
||||
const int64_t effect=row.relief.get(s->name,int64_t(0));
|
||||
const int64_t need=needs[s->name];
|
||||
relief=std::max<int64_t>(relief,signed_product(std::max<int64_t>(effect,0),need)/100);
|
||||
if(effect>0) {
|
||||
default_urgency=std::max<int64_t>(default_urgency,need);
|
||||
if(s->name==n.k_hunger.name || s->name==n.k_sleep.name || s->name==n.k_leisure.name || s->name==n.k_intimacy.name) priority=std::max<int64_t>(priority,need);
|
||||
}
|
||||
}
|
||||
}
|
||||
int64_t default_preference=0;
|
||||
const Array facility_tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array())));
|
||||
for(int64_t i=0;i<facility_tags.size();++i) default_preference=the_tree_native::signed_add(default_preference,int64_t(weights.get(facility_tags[i],int64_t(0))));
|
||||
const int64_t preference=n.integer(c,n.k_preference,default_preference);
|
||||
const int64_t quality=n.value(c,n.k_expected_quality,n.value(c,n.k_quality,int64_t(0)));
|
||||
const bool seen=visited.has(row.id);
|
||||
const int64_t novelty=n.integer(c,n.k_novelty,seen?0:10),group=n.integer(c,n.k_group_fit);
|
||||
const int64_t power=std::max<int64_t>(the_tree_native::signed_add(cash,credit),1);
|
||||
const int64_t numerator=guest_sub(the_tree_native::signed_add(signed_product(guest_price(n,c),100),power),1);
|
||||
const int64_t burden=n.integer(c,n.k_price_burden,guest_clamp(numerator/power,0,100));
|
||||
const int64_t travel=std::max<int64_t>(n.integer(c,n.k_travel_minutes),0);
|
||||
const int64_t wait=std::max<int64_t>(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0);
|
||||
const int64_t risk=std::max<int64_t>(int64_t(n.value(c,n.k_risk,n.value(c,n.k_risk_level,int64_t(0)))),0);
|
||||
const int64_t sensitivity=std::max<int64_t>(n.integer(c,n.k_risk_sensitivity,the_tree_native::signed_add(guest_sub(100,tolerance),24)/25),0);
|
||||
const int64_t repetition=n.integer(c,n.k_repetition_penalty,seen?10:0);
|
||||
int64_t utility=signed_product(relief,8);
|
||||
utility=the_tree_native::signed_add(utility,signed_product(preference,5));
|
||||
utility=the_tree_native::signed_add(utility,signed_product(quality,3));
|
||||
utility=the_tree_native::signed_add(utility,signed_product(novelty,2));
|
||||
utility=the_tree_native::signed_add(utility,signed_product(group,2));
|
||||
utility=guest_sub(utility,signed_product(burden,5));
|
||||
utility=guest_sub(utility,signed_product(travel,2));
|
||||
utility=guest_sub(utility,signed_product(wait,3));
|
||||
utility=guest_sub(utility,signed_product(risk,sensitivity));
|
||||
utility=guest_sub(utility,repetition);
|
||||
Dictionary result=c.duplicate(true);
|
||||
result[n.k_facility_id.name]=row.id;result[n.k_need_priority.name]=priority;
|
||||
result[n.k_utility.name]=utility;result[n.k_urgency.name]=n.integer(c,n.k_urgency,default_urgency);result[n.k_travel_minutes.name]=travel;
|
||||
Dictionary terms;
|
||||
terms[n.k_need_relief.name]=relief;terms[n.k_preference.name]=preference;terms[n.k_expected_quality.name]=quality;
|
||||
terms[n.k_novelty.name]=novelty;terms[n.k_group_fit.name]=group;terms[n.k_price_burden.name]=burden;
|
||||
terms[n.k_travel_minutes.name]=travel;terms[n.k_wait_minutes.name]=wait;terms[n.k_risk.name]=risk;
|
||||
terms[n.k_risk_sensitivity.name]=sensitivity;terms[n.k_repetition_penalty.name]=repetition;
|
||||
result[n.k_utility_terms.name]=terms;
|
||||
row.candidate=result;row.priority=priority;row.utility=utility;row.urgency=result[n.k_urgency.name];row.travel=travel;
|
||||
}
|
||||
public:
|
||||
Dictionary guest_candidate_batch(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) {
|
||||
// No owner/input mutation occurs in the entire implementation. A failed
|
||||
// new standard-container allocation cannot escape the native boundary
|
||||
// or publish a partially built result. Engine-internal allocation failure
|
||||
// is not claimed to be covered by these standard C++ exception catches.
|
||||
Dictionary unsupported;unsupported[StringName("supported",false)]=false;
|
||||
try { return guest_candidate_batch_impl(owner,guest_id,facilities,context); }
|
||||
catch(const std::bad_alloc &) { return unsupported; }
|
||||
catch(const std::length_error &) { return unsupported; }
|
||||
}
|
||||
private:
|
||||
Dictionary guest_candidate_batch_impl(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) {
|
||||
GuestBatchNames n;const ProjectionNames p;
|
||||
Dictionary unsupported;unsupported[n.k_supported.name]=false;
|
||||
if(!builtin(p,owner,"res://scripts/guest/guest_service.gd")) return unsupported;
|
||||
// No caller callback is invoked during preflight or computation. Callback
|
||||
// contexts use original extraction/evaluation/decision in their entirety.
|
||||
const Array context_keys=context.keys();
|
||||
for(int64_t i=0;i<context_keys.size();++i) {
|
||||
if(!guest_name_value(context_keys[i])) return unsupported;
|
||||
const StringName k=context_keys[i];
|
||||
if(k!=n.k_absolute_minute.name && k!=n.k_wait_hard_limit.name && k!=n.k_adult_content_enabled.name && k!=n.k_exit_threshold.name && k!=n.k_exit_reason.name) return unsupported;
|
||||
}
|
||||
for(const GuestBatchKey *s: {&n.k_absolute_minute,&n.k_wait_hard_limit,&n.k_exit_threshold}) if(n.has(context,*s) && n.value(context,*s).get_type()!=Variant::INT) return unsupported;
|
||||
if(n.has(context,n.k_adult_content_enabled) && n.value(context,n.k_adult_content_enabled).get_type()!=Variant::BOOL && n.value(context,n.k_adult_content_enabled).get_type()!=Variant::INT) return unsupported;
|
||||
if(n.has(context,n.k_exit_reason) && !guest_name_value(n.value(context,n.k_exit_reason))) return unsupported;
|
||||
Object *guest=owner->call(n.k_get_guest.name,guest_id);
|
||||
if(!builtin(p,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
|
||||
const Variant typev=guest->get(n.k_guest_type_id.name);
|
||||
if(!guest_name_value(typev)) return unsupported;
|
||||
const StringName type=typev;
|
||||
Object *definition=owner->call(n.k_get_definition.name,type);
|
||||
if(!builtin(p,definition,"res://scripts/guest/guest_definition.gd")) return unsupported;
|
||||
for(const GuestBatchKey *s: {&n.k_wallet_gold,&n.k_credit_limit_gold,&n.k_debt_gold,&n.k_planned_exit_at}) if(guest->get(s->name).get_type()!=Variant::INT) return unsupported;
|
||||
for(const GuestBatchKey *s: {&n.k_risk_tolerance,&n.k_legal_sensitivity,&n.k_minimum_quality}) if(definition->get(s->name).get_type()!=Variant::INT) return unsupported;
|
||||
if(definition->get(n.k_adult_verified.name).get_type()!=Variant::BOOL || owner->get(n.k_current_minute.name).get_type()!=Variant::INT) return unsupported;
|
||||
if(guest->get(n.k_needs.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_addiction_by_tag.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_visited_facility_ids.name).get_type()!=Variant::ARRAY || definition->get(n.k_tags.name).get_type()!=Variant::ARRAY || definition->get(n.k_preference_weights.name).get_type()!=Variant::DICTIONARY) return unsupported;
|
||||
const Dictionary needs=guest->get(n.k_needs.name),addiction=guest->get(n.k_addiction_by_tag.name),weights=definition->get(n.k_preference_weights.name);
|
||||
const Array visited=guest->get(n.k_visited_facility_ids.name),tags=definition->get(n.k_tags.name);
|
||||
if(!guest_names_supported(visited) || !guest_names_supported(tags)) return unsupported;
|
||||
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) if(!needs.has(s->name) || needs[s->name].get_type()!=Variant::INT) return unsupported;
|
||||
const Array addiction_values=addiction.values(),weight_values=weights.values();
|
||||
int64_t max_addiction=0;
|
||||
for(int64_t i=0;i<addiction_values.size();++i) {if(addiction_values[i].get_type()!=Variant::INT) return unsupported;max_addiction=std::max<int64_t>(max_addiction,int64_t(addiction_values[i]));}
|
||||
for(int64_t i=0;i<weight_values.size();++i) if(weight_values[i].get_type()!=Variant::INT) return unsupported;
|
||||
// Finish checking all potentially converted input fields before creating
|
||||
// outputs. All getters above are the fixed builtin pure getters.
|
||||
for(int64_t i=0;i<facilities.size();++i) if(facilities[i].get_type()==Variant::DICTIONARY && !guest_candidate_supported(n,Dictionary(facilities[i]))) return unsupported;
|
||||
std::vector<GuestBatchRow> ordered;
|
||||
for(int64_t i=0;i<facilities.size();++i) {
|
||||
if(facilities[i].get_type()!=Variant::DICTIONARY) continue;
|
||||
const Dictionary raw=facilities[i];
|
||||
const StringName id=n.value(raw,n.k_facility_id,n.value(raw,n.k_instance_id,n.k_empty.name));
|
||||
if(id.is_empty()) continue;
|
||||
GuestBatchRow row;row.id=id;row.id_text=String(id);row.candidate=raw.duplicate(true);row.candidate[n.k_facility_id.name]=id;
|
||||
for(const GuestBatchKey *s: {&n.k_need_relief,&n.k_need_effects}) {
|
||||
if(!n.has(row.candidate,*s)) continue;
|
||||
const Variant v=n.value(row.candidate,*s);
|
||||
if(s->name==n.k_need_relief.name && v.get_type()==Variant::INT) continue;
|
||||
Dictionary normalized;
|
||||
if(!guest_normalize_need(n,v,normalized)) {row.need_map_valid=false;break;}
|
||||
if(s->name==n.k_need_relief.name) row.relief=normalized;
|
||||
}
|
||||
ordered.push_back(row);
|
||||
}
|
||||
SortArray<GuestBatchRow,GuestBatchFacilityOrder> facility_sort;
|
||||
if(!ordered.empty()) facility_sort.sort(ordered.data(),ordered.size());
|
||||
const int64_t cash=guest->get(n.k_wallet_gold.name);
|
||||
const int64_t credit=std::max<int64_t>(guest_sub(guest->get(n.k_credit_limit_gold.name),guest->get(n.k_debt_gold.name)),0);
|
||||
int64_t reserve=0;
|
||||
if(max_addiction<75) reserve=tags.has(n.k_spendthrift.name) ? cash/10 : (tags.has(n.k_frugal.name) ? cash/2 : signed_product(cash,3)/10);
|
||||
const int64_t tolerance=definition->get(n.k_risk_tolerance.name);
|
||||
const int64_t minute=n.integer(context,n.k_absolute_minute,owner->get(n.k_current_minute.name));
|
||||
TypedArray<Dictionary> raw_ordered,accepted,rejected,ranked;
|
||||
std::vector<GuestBatchRow> rank_rows;
|
||||
for(GuestBatchRow &row:ordered) {
|
||||
raw_ordered.append(row.candidate);
|
||||
const StringName reason=guest_rejection(n,row,context,type,tags,definition->get(n.k_adult_verified.name),guest->get(n.k_planned_exit_at.name),minute,cash,credit,reserve,tolerance,definition->get(n.k_legal_sensitivity.name),definition->get(n.k_minimum_quality.name));
|
||||
if(!reason.is_empty()) {Dictionary failure;failure[n.k_facility_id.name]=row.id_text;failure[n.k_reason.name]=String(reason);rejected.append(failure);continue;}
|
||||
accepted.append(row.candidate);
|
||||
guest_evaluate(n,row,needs,weights,visited,cash,credit,tolerance);
|
||||
if(n.flag(row.candidate,n.k_ok,true)) rank_rows.push_back(row);
|
||||
}
|
||||
SortArray<GuestBatchRow,GuestBatchRankOrder> rank_sort;
|
||||
if(!rank_rows.empty()) rank_sort.sort(rank_rows.data(),rank_rows.size());
|
||||
for(const GuestBatchRow &row:rank_rows) ranked.append(row.candidate);
|
||||
Dictionary result;result[n.k_supported.name]=true;result[n.k_ordered.name]=raw_ordered;
|
||||
result[n.k_accepted.name]=accepted;result[n.k_rejected.name]=rejected;result[n.k_ranked.name]=ranked;
|
||||
return result;
|
||||
}
|
||||
|
||||
public:
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
#pragma once
|
||||
// Standalone numeric prototype; not connected to Godot or production.
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <queue>
|
||||
#include <functional>
|
||||
#include <utility>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
namespace the_tree_native {
|
||||
using I = std::int64_t;
|
||||
struct Edge { I neighbor, cost; };
|
||||
struct Result {
|
||||
std::string status = "usable";
|
||||
std::vector<I> costs, parents, discovered, parent_discovered, settled;
|
||||
};
|
||||
I signed_add(I a, I b) {
|
||||
const auto sum = static_cast<std::uint64_t>(a) + static_cast<std::uint64_t>(b);
|
||||
if (sum <= static_cast<std::uint64_t>(std::numeric_limits<I>::max())) return static_cast<I>(sum);
|
||||
return std::numeric_limits<I>::min() + static_cast<I>(sum - (std::uint64_t(1) << 63));
|
||||
}
|
||||
template <typename EdgeProvider>
|
||||
Result search(I n, I start, const std::vector<I>& goals, EdgeProvider&& edge_provider) {
|
||||
Result r;
|
||||
if (start < 0 || start >= n) { r.status = "unusable"; return r; }
|
||||
r.costs.assign(n, std::numeric_limits<I>::max());
|
||||
r.parents.assign(n, -1);
|
||||
std::vector<unsigned char> finalized(n, 0), pending(n, 0);
|
||||
bool unknown_goal = false;
|
||||
I remaining = 0;
|
||||
for (I goal : goals) {
|
||||
if (goal < 0 || goal >= n) { unknown_goal = true; continue; }
|
||||
if (!pending[goal]) { pending[goal] = 1; ++remaining; }
|
||||
}
|
||||
r.costs[start] = 0; r.discovered.push_back(start);
|
||||
// Positive edges cannot enqueue another node at this entry cost.
|
||||
// Lexicographic (cost,index) ordering preserves the old sorted cost buckets.
|
||||
using Entry=std::pair<I,I>;
|
||||
std::priority_queue<Entry,std::vector<Entry>,std::greater<Entry>> frontier;
|
||||
frontier.emplace(0,start);
|
||||
while (!frontier.empty()) {
|
||||
const auto entry=frontier.top();frontier.pop();
|
||||
const I entry_cost=entry.first,current=entry.second;
|
||||
{
|
||||
if (finalized[current] || entry_cost != r.costs[current]) continue;
|
||||
finalized[current] = 1;
|
||||
r.settled.push_back(current);
|
||||
if (pending[current]) { pending[current] = 0; --remaining; }
|
||||
if (!remaining && !unknown_goal) return r;
|
||||
for (const Edge& edge : edge_provider(current)) {
|
||||
if (edge.cost <= 0) { r.status = "unusable"; return r; }
|
||||
const I neighbor = edge.neighbor;
|
||||
if (neighbor < 0 || neighbor >= n) { r.status = "unusable"; return r; }
|
||||
const I cost = signed_add(r.costs[current], edge.cost);
|
||||
if (cost < r.costs[current]) { r.status = "wrapped"; return r; }
|
||||
const I known = r.costs[neighbor];
|
||||
const bool better_parent = cost == known && r.parents[neighbor] >= 0 && current < r.parents[neighbor];
|
||||
if (cost > known || (cost == known && !better_parent)) continue;
|
||||
if (r.parents[neighbor] < 0) {
|
||||
r.parent_discovered.push_back(neighbor);
|
||||
if (neighbor != start) r.discovered.push_back(neighbor);
|
||||
}
|
||||
r.parents[neighbor] = current;
|
||||
r.costs[neighbor] = cost;
|
||||
if (finalized[neighbor]) r.settled.erase(std::remove(r.settled.begin(), r.settled.end(), neighbor), r.settled.end());
|
||||
finalized[neighbor] = 0;
|
||||
frontier.emplace(cost,neighbor);
|
||||
}
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
} // namespace the_tree_native
|
||||
+895
@@ -0,0 +1,895 @@
|
||||
// Isolated, uncompiled bridge prototype. No production registration or integration yet.
|
||||
#include "tree_core.hpp"
|
||||
#include <cmath>
|
||||
#include <array>
|
||||
#include <new>
|
||||
#include <stdexcept>
|
||||
#include <godot_cpp/templates/sort_array.hpp>
|
||||
#include <godot_cpp/classes/ref_counted.hpp>
|
||||
#include <godot_cpp/classes/object.hpp>
|
||||
#include <godot_cpp/variant/vector3i.hpp>
|
||||
#include <godot_cpp/core/class_db.hpp>
|
||||
#include <godot_cpp/godot.hpp>
|
||||
#include <godot_cpp/variant/array.hpp>
|
||||
#include <godot_cpp/variant/callable.hpp>
|
||||
#include <godot_cpp/variant/dictionary.hpp>
|
||||
#include <godot_cpp/variant/packed_int64_array.hpp>
|
||||
#include <godot_cpp/variant/typed_array.hpp>
|
||||
#include <godot_cpp/variant/utility_functions.hpp>
|
||||
|
||||
using namespace godot;
|
||||
using the_tree_native::I;
|
||||
using the_tree_native::Edge;
|
||||
|
||||
class TheTreeNumericCore : public RefCounted {
|
||||
GDCLASS(TheTreeNumericCore, RefCounted)
|
||||
protected:
|
||||
static void _bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("performance_record_sample", "owner", "metric_id", "duration_us"), &TheTreeNumericCore::performance_record_sample);
|
||||
ClassDB::bind_method(D_METHOD("guest_candidate_batch", "owner", "guest_id", "facilities", "context"), &TheTreeNumericCore::guest_candidate_batch);
|
||||
ClassDB::bind_method(D_METHOD("guest_tree_edge_rows", "path", "current", "layers", "access"), &TheTreeNumericCore::guest_tree_edge_rows);
|
||||
ClassDB::bind_method(D_METHOD("search", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search);
|
||||
ClassDB::bind_method(D_METHOD("search_cached", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search_cached);
|
||||
ClassDB::bind_method(D_METHOD("clear_edge_cache"), &TheTreeNumericCore::clear_edge_cache);
|
||||
ClassDB::bind_method(D_METHOD("nearest_guest_access", "path", "start", "goals", "fallback_target", "layers", "access", "ticks"), &TheTreeNumericCore::nearest_guest_access);
|
||||
ClassDB::bind_method(D_METHOD("project_guest_candidates", "runtime", "guest_id", "open_state", "degraded_state", "movement_scale", "stair_credit", "orthogonal_cost", "ticks"), &TheTreeNumericCore::project_guest_candidates);
|
||||
}
|
||||
private:
|
||||
// Cache belongs to this instance and one caller-owned graph workspace.
|
||||
// No reuse after cells, indices, filters or edge values change: the caller
|
||||
// must clear it or release this core. The original search never uses it.
|
||||
std::map<I, std::vector<Edge>> cached_edges;
|
||||
// Per-public-call immutable names. No static/global lifetime, cached
|
||||
// object values, script dispatch result or profile; recursive calls own
|
||||
// separate scopes. Destruction precedes leaving the engine call.
|
||||
struct ProjectionNames {
|
||||
const StringName k_ACCESS_LAYER_DENIED{"ACCESS_LAYER_DENIED",false};
|
||||
const StringName k_CONNECTOR{"CONNECTOR",false};
|
||||
const StringName k_GOAL_NOT_PASSABLE{"GOAL_NOT_PASSABLE",false};
|
||||
const StringName k_GOAL_TEMPORARILY_BLOCKED{"GOAL_TEMPORARILY_BLOCKED",false};
|
||||
const StringName k_GOAL_UNREACHABLE{"GOAL_UNREACHABLE",false};
|
||||
const StringName k_OK{"OK",false};
|
||||
const StringName k_START_NOT_PASSABLE{"START_NOT_PASSABLE",false};
|
||||
const StringName k_START_TEMPORARILY_BLOCKED{"START_TEMPORARILY_BLOCKED",false};
|
||||
const StringName k__build_guest_query_tree_compact{"_build_guest_query_tree_compact",false};
|
||||
const StringName k__cache_key{"_cache_key",false};
|
||||
const StringName k__cell_traffic{"_cell_traffic",false};
|
||||
const StringName k__copy_path{"_copy_path",false};
|
||||
const StringName k__diagnose_no_route_reason{"_diagnose_no_route_reason",false};
|
||||
const StringName k__find_facility_access_path{"_find_facility_access_path",false};
|
||||
const StringName k__find_path_internal{"_find_path_internal",false};
|
||||
const StringName k__guest_access_batch_can_select{"_guest_access_batch_can_select",false};
|
||||
const StringName k__guest_batch_has_permitted_layer_crossing{"_guest_batch_has_permitted_layer_crossing",false};
|
||||
const StringName k__guest_has_checked_in{"_guest_has_checked_in",false};
|
||||
const StringName k__guest_step_connector_memo{"_guest_step_connector_memo",false};
|
||||
const StringName k__guest_tree_arithmetic_wrapped{"_guest_tree_arithmetic_wrapped",false};
|
||||
const StringName k__guest_tree_reconstruct_path{"_guest_tree_reconstruct_path",false};
|
||||
const StringName k__need_relief_for_facility_tags{"_need_relief_for_facility_tags",false};
|
||||
const StringName k__passable_cells{"_passable_cells",false};
|
||||
const StringName k__path_cache{"_path_cache",false};
|
||||
const StringName k__query_batch{"_query_batch",false};
|
||||
const StringName k__route_failure{"_route_failure",false};
|
||||
const StringName k__service_category_for_tags{"_service_category_for_tags",false};
|
||||
const StringName k__sorted_name_keys{"_sorted_name_keys",false};
|
||||
const StringName k_arithmetic_wrapped{"arithmetic_wrapped",false};
|
||||
const StringName k_available_quantity{"available_quantity",false};
|
||||
const StringName k_base_quality{"base_quality",false};
|
||||
const StringName k_base_service_minutes{"base_service_minutes",false};
|
||||
const StringName k_begin_guest_path_query_batch{"begin_guest_path_query_batch",false};
|
||||
const StringName k_cache_misses{"cache_misses",false};
|
||||
const StringName k_calculate_guest_batch_path_cost{"calculate_guest_batch_path_cost",false};
|
||||
const StringName k_candidates{"candidates",false};
|
||||
const StringName k_capacity{"capacity",false};
|
||||
const StringName k_compact{"compact",false};
|
||||
const StringName k_cost{"cost",false};
|
||||
const StringName k_cost_values{"cost_values",false};
|
||||
const StringName k_costs{"costs",false};
|
||||
const StringName k_current_cell{"current_cell",false};
|
||||
const StringName k_definition_id{"definition_id",false};
|
||||
const StringName k_definition_registry{"definition_registry",false};
|
||||
const StringName k_elevators{"elevators",false};
|
||||
const StringName k_end_guest_path_query_batch{"end_guest_path_query_batch",false};
|
||||
const StringName k_entrance{"entrance",false};
|
||||
const StringName k_estimated_total_gold{"estimated_total_gold",false};
|
||||
const StringName k_expected_quality{"expected_quality",false};
|
||||
const StringName k_expected_wait{"expected_wait",false};
|
||||
const StringName k_facility_id{"facility_id",false};
|
||||
const StringName k_facility_service{"facility_service",false};
|
||||
const StringName k_facility_tags{"facility_tags",false};
|
||||
const StringName k_get_connector{"get_connector",false};
|
||||
const StringName k_get_facility{"get_facility",false};
|
||||
const StringName k_get_facility_business_price{"get_facility_business_price",false};
|
||||
const StringName k_get_guest{"get_guest",false};
|
||||
const StringName k_get_instances{"get_instances",false};
|
||||
const StringName k_get_step_connector{"get_step_connector",false};
|
||||
const StringName k_graph_revision{"graph_revision",false};
|
||||
const StringName k_group_fit{"group_fit",false};
|
||||
const StringName k_guest_service{"guest_service",false};
|
||||
const StringName k_illegal_level{"illegal_level",false};
|
||||
const StringName k_indices{"indices",false};
|
||||
const StringName k_inputs_available{"inputs_available",false};
|
||||
const StringName k_instance_id{"instance_id",false};
|
||||
const StringName k_inventory_inputs{"inventory_inputs",false};
|
||||
const StringName k_inventory_service{"inventory_service",false};
|
||||
const StringName k_is_open{"is_open",false};
|
||||
const StringName k_last_error{"last_error",false};
|
||||
const StringName k_last_no_route_reason{"last_no_route_reason",false};
|
||||
const StringName k_last_path_cost{"last_path_cost",false};
|
||||
const StringName k_local_inventory_id{"local_inventory_id",false};
|
||||
const StringName k_movement_type{"movement_type",false};
|
||||
const StringName k_need_relief{"need_relief",false};
|
||||
const StringName k_occupied_cells{"occupied_cells",false};
|
||||
const StringName k_origin{"origin",false};
|
||||
const StringName k_owns_connector{"owns_connector",false};
|
||||
const StringName k_path{"path",false};
|
||||
const StringName k_path_handle{"path_handle",false};
|
||||
const StringName k_path_query_measured{"path_query_measured",false};
|
||||
const StringName k_path_service{"path_service",false};
|
||||
const StringName k_queue_entries{"queue_entries",false};
|
||||
const StringName k_reachable{"reachable",false};
|
||||
const StringName k_ready{"ready",false};
|
||||
const StringName k_resource_path{"resource_path",false};
|
||||
const StringName k_risk_level{"risk_level",false};
|
||||
const StringName k_service_category{"service_category",false};
|
||||
const StringName k_settled{"settled",false};
|
||||
const StringName k_staff_only{"staff_only",false};
|
||||
const StringName k_start{"start",false};
|
||||
const StringName k_state{"state",false};
|
||||
const StringName k_supported{"supported",false};
|
||||
const StringName k_tags{"tags",false};
|
||||
const StringName k_tagproj_hunger{"hunger",false};
|
||||
const StringName k_tagproj_sleep{"sleep",false};
|
||||
const StringName k_tagproj_hygiene{"hygiene",false};
|
||||
const StringName k_tagproj_medical{"medical",false};
|
||||
const StringName k_tagproj_leisure{"leisure",false};
|
||||
const StringName k_tagproj_intimacy{"intimacy",false};
|
||||
const StringName k_tagproj_dining{"dining",false};
|
||||
const StringName k_tagproj_lodging{"lodging",false};
|
||||
const StringName k_tagproj_social{"social",false};
|
||||
const StringName k_tagproj_bath{"bath",false};
|
||||
const StringName k_tagproj_wellness{"wellness",false};
|
||||
const StringName k_tagproj_adult_only{"adult_only",false};
|
||||
const StringName k_tagproj_restricted_service{"restricted_service",false};
|
||||
const StringName k_tagproj_food{"food",false};
|
||||
const StringName k_tagproj_service{"service",false};
|
||||
const StringName k_target_cell{"target_cell",false};
|
||||
const StringName k_targets{"targets",false};
|
||||
const StringName k_temporary_block{"temporary_block",false};
|
||||
const StringName k_travel_minutes{"travel_minutes",false};
|
||||
const StringName k_tree{"tree",false};
|
||||
const StringName k_usable{"usable",false};
|
||||
};
|
||||
public:
|
||||
// Whole builtin integer record operation. No retained sample values or time
|
||||
// suppression. Unsupported data returns before any caller-owned mutation.
|
||||
Dictionary performance_record_sample(Object *owner, const StringName &metric, int64_t duration) {
|
||||
const StringName supported("supported",false), report_key("report",false);
|
||||
Dictionary unsupported; unsupported[supported]=false;
|
||||
Object *script=owner ? owner->get_script() : nullptr;
|
||||
if (!script || String(script->get(StringName("resource_path",false))) != "res://scripts/core/performance_budget.gd" || metric==StringName() || duration<0) return unsupported;
|
||||
const StringName samples_key("_samples",false), ordered_key("_ordered_samples",false), bytes_key("_ordered_sample_bytes",false), integer_key("_integer_window_bytes",false), totals_key("_totals",false), counts_key("_sample_counts",false), budgets_key("_budgets",false);
|
||||
const Variant sv=owner->get(samples_key), ov=owner->get(ordered_key), bv=owner->get(bytes_key), iv=owner->get(integer_key), tv=owner->get(totals_key), cv=owner->get(counts_key), uv=owner->get(budgets_key), capacityv=owner->get(StringName("sample_capacity",false));
|
||||
if (sv.get_type()!=Variant::DICTIONARY || ov.get_type()!=Variant::DICTIONARY || bv.get_type()!=Variant::DICTIONARY || iv.get_type()!=Variant::DICTIONARY || tv.get_type()!=Variant::DICTIONARY || cv.get_type()!=Variant::DICTIONARY || uv.get_type()!=Variant::DICTIONARY || capacityv.get_type()!=Variant::INT) return unsupported;
|
||||
Dictionary samples=sv, orders=ov, rawbytes=bv, integers=iv, totals=tv, counts=cv, budgets=uv;
|
||||
if (samples.is_read_only() || orders.is_read_only() || rawbytes.is_read_only() || integers.is_read_only() || totals.is_read_only() || counts.is_read_only()) return unsupported;
|
||||
const std::array<Dictionary,7> maps{samples,orders,rawbytes,integers,totals,counts,budgets};
|
||||
for (size_t i=0;i<maps.size();++i) for (size_t j=i+1;j<maps.size();++j)
|
||||
if (UtilityFunctions::is_same(maps[i],maps[j])) return unsupported;
|
||||
const bool existing=samples.has(metric);
|
||||
Variant rawv=samples.get(metric,Array());
|
||||
if (rawv.get_type()!=Variant::ARRAY) return unsupported;
|
||||
Array values=rawv;
|
||||
if (values.is_read_only()) return unsupported;
|
||||
for (int64_t i=0;i<values.size();++i) if (values[i].get_type()!=Variant::INT) return unsupported;
|
||||
Variant totalv=totals.get(metric,0), countv=counts.get(metric,0), budgetv=budgets.get(metric,Dictionary());
|
||||
if (totalv.get_type()!=Variant::INT || countv.get_type()!=Variant::INT || budgetv.get_type()!=Variant::DICTIONARY) return unsupported;
|
||||
Dictionary budget=budgetv;
|
||||
for (const Dictionary &map: maps) if (UtilityFunctions::is_same(budget,map)) return unsupported;
|
||||
const StringName aggregation_key("aggregation",false), limit_key("limit_us",false);
|
||||
Variant aggregationv=budget.get(aggregation_key,1), limitv=budget.get(limit_key,0);
|
||||
if (aggregationv.get_type()!=Variant::INT || limitv.get_type()!=Variant::INT) return unsupported;
|
||||
// One exact byte snapshot serves both builtin validation helpers inside
|
||||
// this call; there are no external calls between their original checks.
|
||||
PackedByteArray before=UtilityFunctions::var_to_bytes(values);
|
||||
TypedArray<int64_t> ordered;
|
||||
Variant savedbytes=rawbytes.get(metric,PackedByteArray());
|
||||
bool reuse=existing && orders.has(metric) && savedbytes.get_type()==Variant::PACKED_BYTE_ARRAY && PackedByteArray(savedbytes)==before;
|
||||
if (reuse) {
|
||||
Variant orderv=orders[metric];
|
||||
if (orderv.get_type()!=Variant::ARRAY) return unsupported;
|
||||
Array prior=orderv;
|
||||
if (prior.is_read_only() || !prior.is_typed() || prior.get_typed_builtin()!=Variant::INT || prior.size()!=values.size()) return unsupported;
|
||||
ordered=prior;
|
||||
} else {
|
||||
for (int64_t i=0;i<values.size();++i) ordered.append(values[i]);
|
||||
ordered.sort();
|
||||
}
|
||||
// Guards completed: mutations preserve raw and reused ordered aliases.
|
||||
if (!existing) samples[metric]=values;
|
||||
integers[metric]=before;
|
||||
if (!reuse) { orders[metric]=ordered; rawbytes[metric]=before; }
|
||||
values.append(duration);
|
||||
ordered.insert(ordered.bsearch(duration),duration);
|
||||
if (values.size()>int64_t(capacityv)) {
|
||||
Variant removed=values.pop_front();
|
||||
ordered.remove_at(ordered.bsearch(removed));
|
||||
}
|
||||
PackedByteArray after=UtilityFunctions::var_to_bytes(values);
|
||||
rawbytes[metric]=after; integers[metric]=after;
|
||||
const int64_t lifetime_total=the_tree_native::signed_add(int64_t(totalv),duration);
|
||||
const int64_t lifetime_count=the_tree_native::signed_add(int64_t(countv),1);
|
||||
totals[metric]=lifetime_total; counts[metric]=lifetime_count;
|
||||
const int64_t average=lifetime_count>0 ? lifetime_total/lifetime_count : 0;
|
||||
const int64_t maximum=ordered.is_empty() ? 0 : std::max<int64_t>(0,int64_t(ordered[ordered.size()-1]));
|
||||
int64_t p95=0;
|
||||
if (!ordered.is_empty()) {
|
||||
const int64_t index=std::max<int64_t>(the_tree_native::signed_add(the_tree_native::signed_add(signed_product(95,ordered.size()),99)/100,-1),0);
|
||||
p95=ordered[std::min<int64_t>(index,ordered.size()-1)];
|
||||
}
|
||||
const int64_t aggregation=aggregationv, limit=limitv;
|
||||
// Original default match is P95, including unknown aggregation values.
|
||||
const int64_t measured=aggregation==0 ? average : (aggregation==2 ? maximum : p95);
|
||||
Dictionary report;
|
||||
report[StringName("metric_id",false)]=metric;
|
||||
report[StringName("window_sample_count",false)]=values.size();
|
||||
report[StringName("lifetime_sample_count",false)]=lifetime_count;
|
||||
report[StringName("average_us",false)]=average;
|
||||
report[StringName("p95_us",false)]=p95;
|
||||
report[StringName("maximum_us",false)]=maximum;
|
||||
report[aggregation_key]=aggregation;
|
||||
report[StringName("measured_us",false)]=measured;
|
||||
report[limit_key]=limit;
|
||||
report[StringName("budget_exceeded",false)]=limit>0 && measured>limit;
|
||||
Dictionary result; result[supported]=true; result[report_key]=report; return result;
|
||||
}
|
||||
#include "guest_candidate_batch.inc"
|
||||
void clear_edge_cache() { cached_edges.clear(); }
|
||||
Dictionary search(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider) {
|
||||
return search_impl(cells, indices, start_index, goals, edge_provider, false);
|
||||
}
|
||||
Dictionary search_cached(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider) {
|
||||
return search_impl(cells, indices, start_index, goals, edge_provider, true);
|
||||
}
|
||||
// One ordered projection, with no new persistent ownership/cache. Only
|
||||
// builtin pure getters and the already guarded sole budget observer qualify.
|
||||
Dictionary project_guest_candidates(Object *runtime, const StringName &guest_id,
|
||||
int64_t open_state, int64_t degraded_state, int64_t movement_scale,
|
||||
int64_t stair_credit, int64_t orthogonal_cost, const Callable &ticks) {
|
||||
const ProjectionNames n;
|
||||
Dictionary unsupported;
|
||||
unsupported[n.k_supported] = false;
|
||||
if (!builtin(n,runtime, "res://autoload/simulation_runtime.gd") || !ticks.is_valid()) return unsupported;
|
||||
Object *path = runtime->get(n.k_path_service);
|
||||
Object *elevators = runtime->get(n.k_elevators);
|
||||
Object *facilities = runtime->get(n.k_facility_service);
|
||||
Object *definitions = runtime->get(n.k_definition_registry);
|
||||
Object *inventory = runtime->get(n.k_inventory_service);
|
||||
Object *guests = runtime->get(n.k_guest_service);
|
||||
if (!builtin(n,path,"res://scripts/world/path_service.gd") ||
|
||||
!builtin(n,elevators,"res://scripts/transport/elevator_service.gd") ||
|
||||
!builtin(n,facilities,"res://scripts/facility/facility_service.gd") ||
|
||||
!builtin(n,definitions,"res://scripts/core/definition_registry.gd") ||
|
||||
!builtin(n,inventory,"res://scripts/inventory/inventory_service.gd") ||
|
||||
!builtin(n,guests,"res://scripts/guest/guest_service.gd") ||
|
||||
!static_cast<bool>(runtime->call(n.k__guest_access_batch_can_select))) return unsupported;
|
||||
Object *guest = guests->call(n.k_get_guest,guest_id);
|
||||
Array candidates;
|
||||
if (!guest) {
|
||||
Dictionary result; result[n.k_supported] = true;
|
||||
result[n.k_candidates] = candidates; return result;
|
||||
}
|
||||
if (!builtin(n,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
|
||||
const Array initial = facilities->call(n.k_get_instances);
|
||||
// Preflight is read-only: default registry/get_instances have no public
|
||||
// error/counter effects. Custom resources retain the original whole loop.
|
||||
for (int64_t i=0;i<initial.size();++i) {
|
||||
Object *facility = initial[i];
|
||||
if (!builtin(n,facility,"res://scripts/facility/facility_instance.gd")) return unsupported;
|
||||
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
|
||||
if (definition && !builtin(n,definition,"res://scripts/data/facility_definition.gd")) return unsupported;
|
||||
}
|
||||
Array goals;
|
||||
for (int64_t i=0;i<initial.size();++i) goals.append_array(facility_access_cells(n,path,initial[i]));
|
||||
const Vector3i start = guest->get(n.k_current_cell);
|
||||
path->call(n.k_begin_guest_path_query_batch,start,goals);
|
||||
const Array ordered = facilities->call(n.k_get_instances);
|
||||
TypedArray<int64_t> layers; layers.push_back(0); layers.push_back(1);
|
||||
TypedArray<StringName> access_ids;
|
||||
for (int64_t i=0;i<ordered.size();++i) {
|
||||
Object *facility = ordered[i];
|
||||
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
|
||||
if (!definition) continue;
|
||||
const Array tags = definition->get(n.k_tags);
|
||||
if (tags.has(n.k_staff_only)) continue;
|
||||
if (tags.has(n.k_entrance) && static_cast<bool>(runtime->call(n.k__guest_has_checked_in,guest))) continue;
|
||||
bool has_inputs = true;
|
||||
const Dictionary inputs = definition->get(n.k_inventory_inputs);
|
||||
const Array items = sorted_builtin_input_names(n,runtime,inputs);
|
||||
for (int64_t j=0;j<items.size();++j) {
|
||||
const int64_t quantity = inventory->call(n.k_available_quantity,facility->get(n.k_local_inventory_id),items[j]);
|
||||
if (quantity < static_cast<int64_t>(inputs[items[j]])) {has_inputs=false;break;}
|
||||
}
|
||||
if (!has_inputs) {
|
||||
Dictionary row;row[n.k_facility_id]=facility->get(n.k_instance_id);
|
||||
row[n.k_inputs_available]=false;candidates.push_back(row);continue;
|
||||
}
|
||||
const Array destinations = facility_access_cells(n,path,facility);
|
||||
Dictionary route = nearest_guest_access_impl(n,path,start,destinations,facility->get(n.k_origin),layers,access_ids,ticks);
|
||||
if (static_cast<bool>(route.get(n.k_supported,false))) route.erase(n.k_supported);
|
||||
else route = Dictionary(runtime->call(n.k__find_facility_access_path,start,facility));
|
||||
const Array walk = route.get(n.k_path,Array());
|
||||
const bool plain_tag_relief = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
|
||||
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
|
||||
const Dictionary relief = plain_tag_relief ? builtin_tag_relief(n,tags) :
|
||||
Dictionary(runtime->call(n.k__need_relief_for_facility_tags,tags));
|
||||
Dictionary row;
|
||||
row[n.k_facility_id]=facility->get(n.k_instance_id);
|
||||
row[n.k_facility_tags]=tags.duplicate();
|
||||
const int64_t state = facility->get(n.k_state);
|
||||
row[n.k_is_open]=(state==open_state || state==degraded_state);
|
||||
row[n.k_reachable]=route.get(n.k_reachable,false);
|
||||
row[n.k_travel_minutes]=guest_path_minutes(n,path,elevators,walk,movement_scale,stair_credit,orthogonal_cost);
|
||||
const Array queue = facility->get(n.k_queue_entries);
|
||||
const int64_t capacity = facility->get(n.k_capacity);
|
||||
row[n.k_expected_wait]=signed_product(queue.size(),facility->get(n.k_base_service_minutes))/std::max<int64_t>(capacity,1);
|
||||
row[n.k_estimated_total_gold]=runtime->call(n.k_get_facility_business_price,facility);
|
||||
const int64_t quality = facility->get(n.k_base_quality);
|
||||
row[n.k_expected_quality]=std::max<int64_t>(0,std::min<int64_t>(quality,100));
|
||||
row[n.k_need_relief]=relief;
|
||||
row[n.k_risk_level]=int64_t(0);row[n.k_illegal_level]=int64_t(0);
|
||||
row[n.k_group_fit]=signed_product(std::min<int64_t>(capacity,4),5);
|
||||
// Recheck at the original call position: preceding price/observer
|
||||
// callbacks must retain a replaced/custom runtime's original call.
|
||||
const bool plain_tag_category = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
|
||||
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
|
||||
row[n.k_service_category]=plain_tag_category ? Variant(builtin_tag_category(n,tags)) :
|
||||
runtime->call(n.k__service_category_for_tags,tags);
|
||||
Dictionary handle;handle[n.k_target_cell]=route.get(n.k_target_cell,guest->get(n.k_current_cell));
|
||||
handle[n.k_graph_revision]=path->get(n.k_graph_revision);
|
||||
row[n.k_path_handle]=handle;candidates.push_back(row);
|
||||
}
|
||||
path->call(n.k_end_guest_path_query_batch);
|
||||
Dictionary result;result[n.k_supported]=true;result[n.k_candidates]=candidates;return result;
|
||||
}
|
||||
private:
|
||||
// Direct translation of the two pure builtin tag methods. Fresh result,
|
||||
// original insertion/branch order, no retained definition/tag memo.
|
||||
static Dictionary builtin_tag_relief(const ProjectionNames &n,const Array &tags) {
|
||||
Dictionary relief;
|
||||
relief[n.k_tagproj_hunger]=int64_t(0);relief[n.k_tagproj_sleep]=int64_t(0);
|
||||
relief[n.k_tagproj_hygiene]=int64_t(0);relief[n.k_tagproj_medical]=int64_t(0);
|
||||
relief[n.k_tagproj_leisure]=int64_t(0);relief[n.k_tagproj_intimacy]=int64_t(0);
|
||||
if(tags.has(n.k_tagproj_dining)) {relief[n.k_tagproj_hunger]=int64_t(80);relief[n.k_tagproj_leisure]=int64_t(10);}
|
||||
if(tags.has(n.k_tagproj_lodging)) {relief[n.k_tagproj_sleep]=int64_t(90);relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),10);}
|
||||
if(tags.has(n.k_tagproj_social)||tags.has(n.k_tagproj_leisure)) relief[n.k_tagproj_leisure]=std::max<int64_t>(int64_t(relief[n.k_tagproj_leisure]),40);
|
||||
if(tags.has(n.k_tagproj_hygiene)||tags.has(n.k_tagproj_bath)) relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),80);
|
||||
if(tags.has(n.k_tagproj_medical)) relief[n.k_tagproj_medical]=int64_t(90);
|
||||
else if(tags.has(n.k_tagproj_wellness)) relief[n.k_tagproj_medical]=std::max<int64_t>(int64_t(relief[n.k_tagproj_medical]),20);
|
||||
if(tags.has(n.k_tagproj_adult_only)||tags.has(n.k_tagproj_restricted_service)) relief[n.k_tagproj_intimacy]=int64_t(80);
|
||||
return relief;
|
||||
}
|
||||
static StringName builtin_tag_category(const ProjectionNames &n,const Array &tags) {
|
||||
if(tags.has(n.k_tagproj_dining))return n.k_tagproj_food;
|
||||
if(tags.has(n.k_tagproj_lodging))return n.k_tagproj_lodging;
|
||||
if(tags.has(n.k_tagproj_social))return n.k_tagproj_leisure;
|
||||
return n.k_tagproj_service;
|
||||
}
|
||||
static bool builtin(const ProjectionNames &n,Object *object,const char *resource) {
|
||||
if (!object) return false;Object *script=object->get_script();
|
||||
return script && String(script->get(n.k_resource_path))==resource;
|
||||
}
|
||||
// Exact builtin cache-key spelling. No normalized/reordered profile and no
|
||||
// persistent cache; String lengths count Unicode codepoints as GDScript does.
|
||||
static String cache_key_suffix(const ProjectionNames &n,Object *path, const TypedArray<int64_t> &layers,
|
||||
const TypedArray<StringName> &access) {
|
||||
String layer_text, access_text;
|
||||
for (int64_t i=0; i<layers.size(); ++i) {
|
||||
if (i) layer_text += ",";
|
||||
layer_text += String::num_int64(static_cast<int64_t>(layers[i]));
|
||||
}
|
||||
for (int64_t i=0; i<access.size(); ++i) {
|
||||
if (i) access_text += ",";
|
||||
const String value = String(static_cast<StringName>(access[i]));
|
||||
access_text += String::num_int64(value.length()) + ":" + value;
|
||||
}
|
||||
return String("|L:") + layer_text + "|A:" + access_text + "|R:" +
|
||||
String::num_int64(static_cast<int64_t>(path->get(n.k_graph_revision)));
|
||||
}
|
||||
static String cache_key_with_suffix(const Vector3i &start, const Vector3i &goal,
|
||||
const String &suffix) {
|
||||
return String::num_int64(start.x) + "," + String::num_int64(start.y) + "," +
|
||||
String::num_int64(start.z) + ">" + String::num_int64(goal.x) + "," +
|
||||
String::num_int64(goal.y) + "," + String::num_int64(goal.z) + suffix;
|
||||
}
|
||||
static int64_t signed_product(int64_t a,int64_t b) {
|
||||
const uint64_t product=static_cast<uint64_t>(a)*static_cast<uint64_t>(b);
|
||||
if (product<=static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) return static_cast<int64_t>(product);
|
||||
return std::numeric_limits<int64_t>::min()+static_cast<int64_t>(product-(uint64_t(1)<<63));
|
||||
}
|
||||
static Array facility_access_cells(const ProjectionNames &n,Object *path,Object *facility) {
|
||||
const Dictionary passable=path->get(n.k__passable_cells);
|
||||
Array occupied=Array(facility->get(n.k_occupied_cells)).duplicate();
|
||||
if (occupied.is_empty()) occupied.push_back(facility->get(n.k_origin));
|
||||
Dictionary unique;
|
||||
for (int64_t i=0;i<occupied.size();++i) {
|
||||
const Vector3i cell=occupied[i];
|
||||
for (int32_t dx : {-1,1}) {
|
||||
// Match GDScript's Vector3i conversion after int64 addition.
|
||||
const Vector3i candidate(int64_t(cell.x)+dx,cell.y,cell.z);
|
||||
if (passable.has(candidate)) unique[candidate]=true;
|
||||
}
|
||||
}
|
||||
const Vector3i origin=facility->get(n.k_origin);if(passable.has(origin)) unique[origin]=true;
|
||||
const Array keys=unique.keys();std::vector<Vector3i> sorted;sorted.reserve(keys.size());
|
||||
for (int64_t i=0;i<keys.size();++i) sorted.push_back(keys[i]);
|
||||
std::sort(sorted.begin(),sorted.end(),[](const Vector3i &a,const Vector3i &b){
|
||||
if(a.z!=b.z)return a.z<b.z;if(a.y!=b.y)return a.y<b.y;return a.x<b.x;
|
||||
});
|
||||
Array result;for(const Vector3i &cell:sorted)result.push_back(cell);return result;
|
||||
}
|
||||
static int64_t guest_path_minutes(const ProjectionNames &n,Object *path,Object *elevators,const Array &route,
|
||||
int64_t movement_scale,int64_t stair_credit,int64_t orthogonal_cost) {
|
||||
Dictionary memo=path->get(n.k__guest_step_connector_memo);
|
||||
// Route-local only. Reuse an ownership result only after an actual
|
||||
// BOOL return and a typed cached step; no script callback occurs on a
|
||||
// repeated typed memo hit. A miss/conversion/custom script keeps calls.
|
||||
const bool builtin_pair = builtin(n,path,"res://scripts/world/path_service.gd") &&
|
||||
builtin(n,elevators,"res://scripts/transport/elevator_service.gd");
|
||||
bool ownership_valid = false;
|
||||
bool ownership_value = false;
|
||||
StringName ownership_connector;
|
||||
for(int64_t i=1;i<route.size();++i) {
|
||||
const Vector3i from=route[i-1],to=route[i];
|
||||
const Dictionary destinations=memo.get(from,Dictionary());
|
||||
StringName connector;
|
||||
const bool memo_hit = destinations.has(to);
|
||||
const bool typed_memo_hit = memo_hit && destinations[to].get_type() == Variant::STRING_NAME;
|
||||
if(memo_hit)connector=destinations[to];
|
||||
else {TypedArray<StringName> access;connector=path->call(n.k_get_step_connector,from,to,access);}
|
||||
bool special;
|
||||
if (builtin_pair && typed_memo_hit && ownership_valid && connector == ownership_connector) {
|
||||
special = ownership_value;
|
||||
} else {
|
||||
const Variant owned = elevators->call(n.k_owns_connector,connector);
|
||||
special = static_cast<bool>(owned);
|
||||
ownership_valid = builtin_pair && typed_memo_hit && owned.get_type() == Variant::BOOL;
|
||||
ownership_value = special;
|
||||
ownership_connector = connector;
|
||||
}
|
||||
if(!special && String(connector).begins_with("infra.connector:") && from.x==to.x && from.z==to.z &&
|
||||
std::abs(int64_t(from.y)-int64_t(to.y))==1) {
|
||||
const Dictionary detail=path->call(n.k_get_connector,connector);
|
||||
special=detail.get(n.k_movement_type,StringName())==Variant(n.k_CONNECTOR) &&
|
||||
static_cast<int64_t>(detail.get(n.k_cost,int64_t(0)))==150 && stair_credit>movement_scale;
|
||||
}
|
||||
if(special) {
|
||||
const int64_t cost=path->call(n.k_calculate_guest_batch_path_cost,route[0],route[route.size()-1],route);
|
||||
return static_cast<int64_t>(std::ceil(static_cast<double>(cost)/static_cast<double>(orthogonal_cost)));
|
||||
}
|
||||
}
|
||||
return std::max<int64_t>(route.size()-1,0);
|
||||
}
|
||||
public:
|
||||
|
||||
// Stateless translation of the builtin nearest access query. The caller
|
||||
// supplies the existing typed default profile and the real Time callable.
|
||||
// Public cache publication, failure diagnostics and fallback stay ordered.
|
||||
Dictionary nearest_guest_access(Object *path, const Vector3i &start,
|
||||
const Array &goals, const Vector3i &fallback_target,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
|
||||
const Callable &ticks) {
|
||||
const ProjectionNames n;
|
||||
return nearest_guest_access_impl(n,path,start,goals,fallback_target,layers,access,ticks);
|
||||
}
|
||||
private:
|
||||
Dictionary nearest_guest_access_impl(const ProjectionNames &n,Object *path, const Vector3i &start,
|
||||
const Array &goals, const Vector3i &fallback_target,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
|
||||
const Callable &ticks) {
|
||||
Dictionary unsupported;
|
||||
unsupported[n.k_supported] = false;
|
||||
if (!path || !ticks.is_valid() || goals.is_empty()) return unsupported;
|
||||
Object *script = path->get_script();
|
||||
if (!script || String(script->get(n.k_resource_path)) != "res://scripts/world/path_service.gd") return unsupported;
|
||||
Dictionary batch = path->get(n.k__query_batch);
|
||||
if (batch.is_empty() || start != static_cast<Vector3i>(batch[n.k_start])) return unsupported;
|
||||
const Dictionary passable = path->get(n.k__passable_cells);
|
||||
if (!passable.has(start) || blocked(n,path, start) || !layers.has(start.z)) return unsupported;
|
||||
const Dictionary targets = batch[n.k_targets];
|
||||
Dictionary cache = path->get(n.k__path_cache);
|
||||
// Exact builtin validation loop has no callback before ticks.call().
|
||||
// Build the unchanged profile/revision suffix lazily at the first key.
|
||||
String key_suffix;
|
||||
bool key_suffix_ready = false;
|
||||
for (int64_t j = 0; j < goals.size(); ++j) {
|
||||
if (goals[j].get_type() != Variant::VECTOR3I) return unsupported;
|
||||
const Vector3i cell = goals[j];
|
||||
if (!targets.has(cell)) {
|
||||
const bool searchable = passable.has(cell) && layers.has(cell.z) && !blocked(n,path, cell);
|
||||
if (searchable && (start.z == cell.z || static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, cell, layers, access)))) return unsupported;
|
||||
}
|
||||
if (!key_suffix_ready) {
|
||||
key_suffix = cache_key_suffix(n,path, layers, access);
|
||||
key_suffix_ready = true;
|
||||
}
|
||||
const String key = cache_key_with_suffix(start, cell, key_suffix);
|
||||
if (cache.has(key)) return unsupported;
|
||||
}
|
||||
const int64_t started = ticks.call();
|
||||
if (!static_cast<bool>(batch[n.k_ready])) {
|
||||
batch[n.k_tree] = path->call(n.k__build_guest_query_tree_compact, start, targets, layers, access);
|
||||
batch[n.k_arithmetic_wrapped] = path->get(n.k__guest_tree_arithmetic_wrapped);
|
||||
batch[n.k_ready] = true;
|
||||
}
|
||||
const Dictionary tree = batch[n.k_tree];
|
||||
if (!static_cast<bool>(tree.get(n.k_usable, false)) || static_cast<bool>(batch.get(n.k_arithmetic_wrapped, false))) return unsupported;
|
||||
Vector3i best_cell = fallback_target;
|
||||
bool found = false;
|
||||
int64_t best_cost = 0;
|
||||
const Dictionary settled = tree[n.k_settled];
|
||||
bool cost_view_ready=false,compact_cost_view=false;
|
||||
Dictionary cost_indices,cost_dictionary;
|
||||
PackedInt64Array cost_values;
|
||||
for (int64_t j = 0; j < goals.size(); ++j) {
|
||||
const Vector3i cell = goals[j];
|
||||
if (!targets.has(cell) || !settled.has(cell)) continue;
|
||||
// No callback occurs between these original numeric cost reads.
|
||||
// Initialize lazily at the first eligible goal, and retain nothing
|
||||
// past this call or reuse after the subsequent route callbacks.
|
||||
if (!cost_view_ready) {
|
||||
compact_cost_view=tree.get(n.k_compact,false);
|
||||
if(compact_cost_view) {cost_indices=tree[n.k_indices];cost_values=tree[n.k_cost_values];}
|
||||
else cost_dictionary=tree[n.k_costs];
|
||||
cost_view_ready=true;
|
||||
}
|
||||
int64_t cost=0;
|
||||
if(compact_cost_view) {
|
||||
if(!cost_indices.has(cell)) return unsupported;
|
||||
const int64_t index=cost_indices[cell];
|
||||
if(index<0 || index>=cost_values.size()) return unsupported;
|
||||
cost=cost_values[index];
|
||||
} else {
|
||||
if(!cost_dictionary.has(cell)) return unsupported;
|
||||
cost=cost_dictionary[cell];
|
||||
}
|
||||
if (!found || cost < best_cost) {
|
||||
found = true;
|
||||
best_cost = cost;
|
||||
best_cell = cell;
|
||||
}
|
||||
}
|
||||
TypedArray<Vector3i> best_path;
|
||||
if (found) {
|
||||
best_path = resolve_ready_guest_point(n,path, start, best_cell, tree, layers, access);
|
||||
if (best_path.is_empty()) return unsupported;
|
||||
}
|
||||
if (!goals.is_empty() && (!found || goals[goals.size() - 1] != Variant(best_cell))) {
|
||||
resolve_ready_guest_point(n,path, start, goals[goals.size() - 1], tree, layers, access);
|
||||
}
|
||||
const int64_t elapsed = the_tree_native::signed_add(static_cast<int64_t>(ticks.call()), the_tree_native::signed_add(~started, 1));
|
||||
path->emit_signal(n.k_path_query_measured, std::max<int64_t>(elapsed, 0));
|
||||
Dictionary result;
|
||||
result[n.k_supported] = true;
|
||||
result[n.k_reachable] = found;
|
||||
result[n.k_path] = best_path;
|
||||
result[n.k_target_cell] = best_cell;
|
||||
return result;
|
||||
}
|
||||
private:
|
||||
// Only StringName keys qualify. Conversion-sensitive and custom runtime
|
||||
// cases retain the original script sorter. No owner values are retained.
|
||||
static Array sorted_builtin_input_names(const ProjectionNames &n,Object *runtime,const Dictionary &inputs) {
|
||||
auto original=[&]() -> Array {return runtime->call(n.k__sorted_name_keys,inputs);};
|
||||
if(!builtin(n,runtime,"res://autoload/simulation_runtime.gd")) return original();
|
||||
const Array keys=inputs.keys();
|
||||
for(int64_t i=0;i<keys.size();++i)
|
||||
if(keys[i].get_type()!=Variant::STRING_NAME) return original();
|
||||
// New standard-library allocation remains behind the same pure fallback.
|
||||
// Nothing caller-owned changes before this block completes.
|
||||
try {
|
||||
std::vector<std::pair<String,StringName>> rows;
|
||||
rows.reserve(keys.size());
|
||||
for(int64_t i=0;i<keys.size();++i) {
|
||||
const StringName name=keys[i];rows.emplace_back(String(name),name);
|
||||
}
|
||||
// String ordering is the same engine operator used by the script.
|
||||
std::sort(rows.begin(),rows.end(),[](const auto &a,const auto &b){return a.first<b.first;});
|
||||
TypedArray<StringName> result;
|
||||
for(const auto &row:rows) result.push_back(row.second);
|
||||
return result;
|
||||
} catch(const std::bad_alloc &) {return original();}
|
||||
catch(const std::length_error &) {return original();}
|
||||
}
|
||||
// Fresh writable typed output, matching the builtin append loop. Check
|
||||
// the script at this original call position, after any route callbacks.
|
||||
static Variant copy_builtin_guest_route(const ProjectionNames &n,Object *path,const TypedArray<Vector3i> &route) {
|
||||
if(!builtin(n,path,"res://scripts/world/path_service.gd")) return path->call(n.k__copy_path,route);
|
||||
TypedArray<Vector3i> copied;
|
||||
for(int64_t i=0;i<route.size();++i) copied.push_back(route[i]);
|
||||
return copied;
|
||||
}
|
||||
static bool blocked(const ProjectionNames &n,Object *path, const Vector3i &cell) {
|
||||
const Dictionary traffic_map = path->get(n.k__cell_traffic);
|
||||
const Dictionary traffic = traffic_map.get(cell, Dictionary());
|
||||
return !traffic.is_empty() && static_cast<bool>(traffic[n.k_temporary_block]);
|
||||
}
|
||||
static bool tree_has_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
|
||||
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
|
||||
const Dictionary values = tree[n.k_costs];
|
||||
return values.has(cell);
|
||||
}
|
||||
const Dictionary indices = tree[n.k_indices];
|
||||
if (!indices.has(cell)) return false;
|
||||
const int64_t index = indices[cell];
|
||||
const PackedInt64Array values = tree[n.k_cost_values];
|
||||
return index >= 0 && index < values.size();
|
||||
}
|
||||
static int64_t tree_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
|
||||
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
|
||||
const Dictionary values = tree[n.k_costs];
|
||||
return static_cast<int64_t>(values[cell]);
|
||||
}
|
||||
const Dictionary indices = tree[n.k_indices];
|
||||
const PackedInt64Array values = tree[n.k_cost_values];
|
||||
return values[static_cast<int64_t>(indices[cell])];
|
||||
}
|
||||
static TypedArray<Vector3i> resolve_ready_guest_point(const ProjectionNames &n,Object *path,
|
||||
const Vector3i &start, const Vector3i &goal, const Dictionary &tree,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access) {
|
||||
const Dictionary passable = path->get(n.k__passable_cells);
|
||||
if (!passable.has(start)) return path->call(n.k__route_failure, n.k_START_NOT_PASSABLE);
|
||||
if (!passable.has(goal)) return path->call(n.k__route_failure, n.k_GOAL_NOT_PASSABLE);
|
||||
if (!layers.has(start.z) || !layers.has(goal.z)) return path->call(n.k__route_failure, n.k_ACCESS_LAYER_DENIED);
|
||||
if (blocked(n,path, start)) return path->call(n.k__route_failure, n.k_START_TEMPORARILY_BLOCKED);
|
||||
if (blocked(n,path, goal)) return path->call(n.k__route_failure, n.k_GOAL_TEMPORARILY_BLOCKED);
|
||||
// ticks/tree callbacks may have changed the script or revision. Recheck
|
||||
// at this original call position and never reuse the pre-tick suffix.
|
||||
const String key = builtin(n,path,"res://scripts/world/path_service.gd") ?
|
||||
cache_key_with_suffix(start, goal, cache_key_suffix(n,path, layers, access)) :
|
||||
String(path->call(n.k__cache_key, start, goal, layers, access));
|
||||
Dictionary cache = path->get(n.k__path_cache);
|
||||
const Dictionary batch = path->get(n.k__query_batch);
|
||||
const Dictionary targets = batch[n.k_targets];
|
||||
if (cache.has(key) || !targets.has(goal)) return path->call(n.k__find_path_internal, start, goal);
|
||||
path->set(n.k_cache_misses, the_tree_native::signed_add(static_cast<int64_t>(path->get(n.k_cache_misses)), 1));
|
||||
if (start.z != goal.z && !static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, goal, layers, access))) return path->call(n.k__route_failure, n.k_GOAL_UNREACHABLE);
|
||||
TypedArray<Vector3i> route;
|
||||
const Dictionary settled = tree[n.k_settled];
|
||||
if (start == goal) route.push_back(start);
|
||||
else if (settled.has(goal)) route = Array(path->call(n.k__guest_tree_reconstruct_path, tree, goal));
|
||||
if (route.is_empty()) return path->call(n.k__route_failure, path->call(n.k__diagnose_no_route_reason, start, goal, layers, access));
|
||||
cache[key] = copy_builtin_guest_route(n,path,route);
|
||||
path->set(n.k_last_no_route_reason, n.k_OK);
|
||||
path->set(n.k_last_path_cost, tree_cost(n,tree, goal));
|
||||
path->set(n.k_last_error, String(""));
|
||||
return route;
|
||||
}
|
||||
public:
|
||||
private:
|
||||
// One existing builtin provider operation, with no new value cache. Only
|
||||
// connector-free WALK rows qualify; unsupported cases call the old provider.
|
||||
// All work stays private until the original final shared[current] assignment.
|
||||
struct WalkEdgeNames {
|
||||
const StringName resource_path{"resource_path",false}, constants_method{"get_script_constant_map",false};
|
||||
const StringName front{"FRONT",false}, back{"BACK",false}, walk{"MOVEMENT_WALK",false};
|
||||
const StringName base{"ORTHOGONAL_MOVE_COST",false}, congestion{"CONGESTION_COST_PER_EXCESS",false};
|
||||
const StringName workspace{"_guest_tree_workspace",false}, edges{"edges",false}, indices{"indices",false};
|
||||
const StringName adjacency{"_adjacency",false}, traffic{"_cell_traffic",false}, vertical{"_vertical_walk_requires_connector",false};
|
||||
const StringName to{"to",false}, connector{"connector_id",false}, access{"access_id",false}, movement{"movement_type",false};
|
||||
const StringName base_cost{"base_cost",false}, cost{"cost",false}, temporary{"temporary_block",false};
|
||||
const StringName dynamic{"dynamic_cost",false}, density{"current_density",false}, capacity{"base_capacity",false};
|
||||
const StringName provider{"_guest_tree_shared_edges",false};
|
||||
};
|
||||
struct WalkEdgeContext {
|
||||
Object *path=nullptr;
|
||||
int64_t front=0, back=0, base=0, congestion=0;
|
||||
StringName walk;
|
||||
};
|
||||
static bool walk_edge_context(const WalkEdgeNames &n,Object *path,const Array &layers,
|
||||
const Array &access,WalkEdgeContext &context) {
|
||||
if (!path || layers.size()!=2 || !access.is_empty() ||
|
||||
layers[0].get_type()!=Variant::INT || layers[1].get_type()!=Variant::INT) return false;
|
||||
Object *script=path->get_script();
|
||||
if (!script || String(script->get(n.resource_path))!="res://scripts/world/path_service.gd" ||
|
||||
!script->has_method(n.constants_method)) return false;
|
||||
const Variant value=script->call(n.constants_method);
|
||||
if (value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary constants=value;
|
||||
for (const StringName &key : {n.front,n.back,n.base,n.congestion})
|
||||
if (constants.get(key,Variant()).get_type()!=Variant::INT) return false;
|
||||
if (constants.get(n.walk,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
int64_t(layers[0])!=int64_t(constants[n.front]) ||
|
||||
int64_t(layers[1])!=int64_t(constants[n.back])) return false;
|
||||
context.path=path;context.front=constants[n.front];context.back=constants[n.back];
|
||||
context.base=constants[n.base];context.congestion=constants[n.congestion];context.walk=constants[n.walk];
|
||||
return true;
|
||||
}
|
||||
static bool builtin_walk_edge_rows(const WalkEdgeNames &n,const WalkEdgeContext &context,
|
||||
const Vector3i ¤t,Array &rows) {
|
||||
if (!context.path) return false;
|
||||
const Variant workspace_value=context.path->get(n.workspace);
|
||||
if (workspace_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary workspace=workspace_value;
|
||||
const Variant shared_value=workspace.get(n.edges,Variant());
|
||||
if (shared_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
Dictionary shared=shared_value;
|
||||
// Original cached-row branch precedes readonly and all other state reads.
|
||||
if (shared.has(current)) {
|
||||
const Variant cached=shared[current];
|
||||
if (cached.get_type()!=Variant::ARRAY) return false;
|
||||
rows=cached;return true;
|
||||
}
|
||||
if (shared.is_read_only()) return false;
|
||||
const Variant indices_value=workspace.get(n.indices,Variant()), adjacency_value=context.path->get(n.adjacency);
|
||||
const Variant traffic_value=context.path->get(n.traffic), vertical_value=context.path->get(n.vertical);
|
||||
if (indices_value.get_type()!=Variant::DICTIONARY || adjacency_value.get_type()!=Variant::DICTIONARY ||
|
||||
traffic_value.get_type()!=Variant::DICTIONARY || vertical_value.get_type()!=Variant::BOOL) return false;
|
||||
const Dictionary indices=indices_value, adjacency=adjacency_value, traffic=traffic_value;
|
||||
const Variant raw_value=adjacency.get(current,Array());
|
||||
if (raw_value.get_type()!=Variant::ARRAY) return false;
|
||||
const Array raw=raw_value;Array result;
|
||||
for (int64_t i=0;i<raw.size();++i) {
|
||||
if (raw[i].get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary edge=raw[i];
|
||||
if (edge.get(n.to,Variant()).get_type()!=Variant::VECTOR3I) return false;
|
||||
const Vector3i neighbor=edge[n.to];
|
||||
if (neighbor.z!=context.front && neighbor.z!=context.back) continue;
|
||||
const Variant row_value=traffic.get(neighbor,Dictionary());
|
||||
if (row_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary row=row_value;
|
||||
if (!row.is_empty()) {
|
||||
if (row.get(n.temporary,Variant()).get_type()!=Variant::BOOL) return false;
|
||||
if (bool(row[n.temporary])) continue;
|
||||
}
|
||||
// Preserve old method for every connector/access/other movement row.
|
||||
if (edge.get(n.connector,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
edge.get(n.access,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
edge.get(n.movement,Variant()).get_type()!=Variant::STRING_NAME) return false;
|
||||
const StringName connector=edge[n.connector], access=edge[n.access], movement=edge[n.movement];
|
||||
if (!connector.is_empty() || !access.is_empty() || movement!=context.walk) return false;
|
||||
if (bool(vertical_value) && current.y!=neighbor.y) continue;
|
||||
const Variant base=edge.get(n.base_cost,edge.get(n.cost,context.base));
|
||||
if (base.get_type()!=Variant::INT) return false;
|
||||
int64_t dynamic=0;
|
||||
if (!row.is_empty()) {
|
||||
for (const StringName &key : {n.dynamic,n.density,n.capacity})
|
||||
if (row.get(key,Variant()).get_type()!=Variant::INT) return false;
|
||||
const int64_t excess=the_tree_native::signed_add(int64_t(row[n.density]),
|
||||
the_tree_native::signed_add(~int64_t(row[n.capacity]),1));
|
||||
dynamic=the_tree_native::signed_add(int64_t(row[n.dynamic]),
|
||||
signed_product(excess>0?excess:0,context.congestion));
|
||||
}
|
||||
const int64_t cost=the_tree_native::signed_add(int64_t(base),dynamic);
|
||||
Array pair;pair.push_back(neighbor);pair.push_back(cost);result.push_back(pair);
|
||||
// Same short circuit and first invalid prefix as the original method.
|
||||
if (cost<=0 || !indices.has(neighbor)) break;
|
||||
}
|
||||
shared[current]=result;rows=result;return true;
|
||||
}
|
||||
public:
|
||||
Dictionary guest_tree_edge_rows(Object *path,const Vector3i ¤t,const Array &layers,const Array &access) {
|
||||
const WalkEdgeNames names;WalkEdgeContext context;Array rows;
|
||||
Dictionary result;const StringName supported{"supported",false}, row_key{"rows",false};
|
||||
result[supported]=false;
|
||||
if (!walk_edge_context(names,path,layers,access,context) ||
|
||||
!builtin_walk_edge_rows(names,context,current,rows)) return result;
|
||||
result[supported]=true;result[row_key]=rows;return result;
|
||||
}
|
||||
private:
|
||||
Dictionary search_impl(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider, bool use_edge_cache) {
|
||||
Dictionary output;
|
||||
output[StringName("status")] = String("unusable");
|
||||
if (start_index < 0 || start_index >= cells.size() || !edge_provider.is_valid()) return output;
|
||||
try {
|
||||
std::vector<I> goal_indices;
|
||||
const Array goal_keys = goals.keys();
|
||||
for (I j = 0; j < goal_keys.size(); ++j)
|
||||
goal_indices.push_back(static_cast<I>(indices.get(goal_keys[j], I(-1))));
|
||||
Array arguments;
|
||||
arguments.resize(1);
|
||||
const WalkEdgeNames walk_names;WalkEdgeContext walk_context;
|
||||
if (edge_provider.get_method()==walk_names.provider && edge_provider.get_argument_count()==1 &&
|
||||
edge_provider.get_bound_arguments_count()==2 && edge_provider.get_unbound_arguments_count()==0) {
|
||||
const Array bound=edge_provider.get_bound_arguments();
|
||||
if (bound.size()==2 && bound[0].get_type()==Variant::ARRAY && bound[1].get_type()==Variant::ARRAY)
|
||||
walk_edge_context(walk_names,edge_provider.get_object(),bound[0],bound[1],walk_context);
|
||||
}
|
||||
// Call the original bound Godot edge method only when the search expands a node.
|
||||
// Preserve its lazy cache population, filter ordering and first invalid row.
|
||||
auto original_edges = [&](I current) {
|
||||
arguments[0] = cells[current];
|
||||
Array fused;bool fused_supported=false;
|
||||
if (cells[current].get_type()==Variant::VECTOR3I) {
|
||||
const Vector3i cell=cells[current];
|
||||
fused_supported=builtin_walk_edge_rows(walk_names,walk_context,cell,fused);
|
||||
}
|
||||
const Variant value = fused_supported ? Variant(fused) : edge_provider.callv(arguments);
|
||||
if (value.get_type() != Variant::ARRAY) return std::vector<Edge>{{-1, 0}};
|
||||
const Array rows = value;
|
||||
std::vector<Edge> result;
|
||||
result.reserve(rows.size());
|
||||
for (I j = 0; j < rows.size(); ++j) {
|
||||
if (rows[j].get_type() != Variant::ARRAY) { result.push_back({-1, 0}); break; }
|
||||
const Array row = rows[j];
|
||||
if (row.size() != 2 || row[1].get_type() != Variant::INT) {
|
||||
result.push_back({-1, 0}); break;
|
||||
}
|
||||
const I cost = static_cast<I>(row[1]);
|
||||
// Nonpositive cost is rejected before requesting the neighbor index.
|
||||
if (cost <= 0) { result.push_back({-1, cost}); break; }
|
||||
const I neighbor = static_cast<I>(indices.get(row[0], I(-1)));
|
||||
result.push_back({neighbor, cost});
|
||||
if (neighbor < 0) break;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
// Borrow cached rows only during the pure numeric edge loop.
|
||||
// No engine callback runs while that borrowed vector is traversed.
|
||||
std::vector<Edge> converted;
|
||||
auto edges = [&](I current) -> const std::vector<Edge>& {
|
||||
if (use_edge_cache) {
|
||||
const auto found = cached_edges.find(current);
|
||||
if (found != cached_edges.end()) return found->second;
|
||||
}
|
||||
converted = original_edges(current);
|
||||
// Preserve the returned conversion even if a reentrant provider
|
||||
// populated this cache key first. Never substitute its row here.
|
||||
if (use_edge_cache) cached_edges.emplace(current, converted);
|
||||
return converted;
|
||||
};
|
||||
const auto result = the_tree_native::search(cells.size(), start_index, goal_indices, edges);
|
||||
output[StringName("status")] = String(result.status.c_str());
|
||||
if (result.status != "usable") return output;
|
||||
PackedInt64Array costs, parents;
|
||||
if (costs.resize(result.costs.size()) != OK || parents.resize(result.parents.size()) != OK) {
|
||||
output[StringName("status")] = String("unusable");
|
||||
return output;
|
||||
}
|
||||
// Newly resized, private packed arrays own their writable storage.
|
||||
// A provider may shrink caller cells. Preserve the old written
|
||||
// prefix and resize-created zero tail, not the whole native vector.
|
||||
const I written_count=cells.size();
|
||||
if(written_count<=static_cast<I>(result.costs.size())) {
|
||||
std::copy_n(result.costs.begin(),written_count,costs.ptrw());
|
||||
std::copy_n(result.parents.begin(),written_count,parents.ptrw());
|
||||
} else {
|
||||
// Keep the original unsupported-growth path unchanged.
|
||||
for (I j=0;j<cells.size();++j) {costs.set(j,result.costs[j]);parents.set(j,result.parents[j]);}
|
||||
}
|
||||
TypedArray<int64_t> discovered, parent_discovered;
|
||||
for (I j : result.discovered) discovered.push_back(j);
|
||||
for (I j : result.parent_discovered) parent_discovered.push_back(j);
|
||||
Dictionary settled;
|
||||
for (I j : result.settled) settled[cells[j]] = true;
|
||||
output[StringName("cost_values")] = costs;
|
||||
output[StringName("parent_indices")] = parents;
|
||||
output[StringName("discovered")] = discovered;
|
||||
output[StringName("parent_discovered")] = parent_discovered;
|
||||
output[StringName("settled")] = settled;
|
||||
return output;
|
||||
} catch (const std::exception &) {
|
||||
output = Dictionary();
|
||||
output[StringName("status")] = String("unusable");
|
||||
return output;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void initialize_tree_numeric_core(ModuleInitializationLevel level) {
|
||||
if (level == MODULE_INITIALIZATION_LEVEL_SCENE) GDREGISTER_CLASS(TheTreeNumericCore);
|
||||
}
|
||||
void uninitialize_tree_numeric_core(ModuleInitializationLevel) {}
|
||||
|
||||
extern "C" {
|
||||
GDExtensionBool GDE_EXPORT tree_numeric_core_init(GDExtensionInterfaceGetProcAddress get_proc,
|
||||
GDExtensionClassLibraryPtr library, GDExtensionInitialization *initialization) {
|
||||
GDExtensionBinding::InitObject init(get_proc, library, initialization);
|
||||
init.register_initializer(initialize_tree_numeric_core);
|
||||
init.register_terminator(uninitialize_tree_numeric_core);
|
||||
init.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
return init.init();
|
||||
}
|
||||
}
|
||||
+888
@@ -0,0 +1,888 @@
|
||||
// Isolated, uncompiled bridge prototype. No production registration or integration yet.
|
||||
#include "tree_core.hpp"
|
||||
#include <cmath>
|
||||
#include <array>
|
||||
#include <new>
|
||||
#include <godot_cpp/templates/sort_array.hpp>
|
||||
#include <godot_cpp/classes/ref_counted.hpp>
|
||||
#include <godot_cpp/classes/object.hpp>
|
||||
#include <godot_cpp/variant/vector3i.hpp>
|
||||
#include <godot_cpp/core/class_db.hpp>
|
||||
#include <godot_cpp/godot.hpp>
|
||||
#include <godot_cpp/variant/array.hpp>
|
||||
#include <godot_cpp/variant/callable.hpp>
|
||||
#include <godot_cpp/variant/dictionary.hpp>
|
||||
#include <godot_cpp/variant/packed_int64_array.hpp>
|
||||
#include <godot_cpp/variant/typed_array.hpp>
|
||||
#include <godot_cpp/variant/utility_functions.hpp>
|
||||
|
||||
using namespace godot;
|
||||
using the_tree_native::I;
|
||||
using the_tree_native::Edge;
|
||||
|
||||
class TheTreeNumericCore : public RefCounted {
|
||||
GDCLASS(TheTreeNumericCore, RefCounted)
|
||||
protected:
|
||||
static void _bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("performance_record_sample", "owner", "metric_id", "duration_us"), &TheTreeNumericCore::performance_record_sample);
|
||||
ClassDB::bind_method(D_METHOD("guest_candidate_batch", "owner", "guest_id", "facilities", "context"), &TheTreeNumericCore::guest_candidate_batch);
|
||||
ClassDB::bind_method(D_METHOD("guest_tree_edge_rows", "path", "current", "layers", "access"), &TheTreeNumericCore::guest_tree_edge_rows);
|
||||
ClassDB::bind_method(D_METHOD("search", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search);
|
||||
ClassDB::bind_method(D_METHOD("search_cached", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search_cached);
|
||||
ClassDB::bind_method(D_METHOD("clear_edge_cache"), &TheTreeNumericCore::clear_edge_cache);
|
||||
ClassDB::bind_method(D_METHOD("nearest_guest_access", "path", "start", "goals", "fallback_target", "layers", "access", "ticks"), &TheTreeNumericCore::nearest_guest_access);
|
||||
ClassDB::bind_method(D_METHOD("project_guest_candidates", "runtime", "guest_id", "open_state", "degraded_state", "movement_scale", "stair_credit", "orthogonal_cost", "ticks"), &TheTreeNumericCore::project_guest_candidates);
|
||||
}
|
||||
private:
|
||||
// Cache belongs to this instance and one caller-owned graph workspace.
|
||||
// No reuse after cells, indices, filters or edge values change: the caller
|
||||
// must clear it or release this core. The original search never uses it.
|
||||
std::map<I, std::vector<Edge>> cached_edges;
|
||||
// Per-public-call immutable names. No static/global lifetime, cached
|
||||
// object values, script dispatch result or profile; recursive calls own
|
||||
// separate scopes. Destruction precedes leaving the engine call.
|
||||
struct ProjectionNames {
|
||||
const StringName k_ACCESS_LAYER_DENIED{"ACCESS_LAYER_DENIED",false};
|
||||
const StringName k_CONNECTOR{"CONNECTOR",false};
|
||||
const StringName k_GOAL_NOT_PASSABLE{"GOAL_NOT_PASSABLE",false};
|
||||
const StringName k_GOAL_TEMPORARILY_BLOCKED{"GOAL_TEMPORARILY_BLOCKED",false};
|
||||
const StringName k_GOAL_UNREACHABLE{"GOAL_UNREACHABLE",false};
|
||||
const StringName k_OK{"OK",false};
|
||||
const StringName k_START_NOT_PASSABLE{"START_NOT_PASSABLE",false};
|
||||
const StringName k_START_TEMPORARILY_BLOCKED{"START_TEMPORARILY_BLOCKED",false};
|
||||
const StringName k__build_guest_query_tree_compact{"_build_guest_query_tree_compact",false};
|
||||
const StringName k__cache_key{"_cache_key",false};
|
||||
const StringName k__cell_traffic{"_cell_traffic",false};
|
||||
const StringName k__copy_path{"_copy_path",false};
|
||||
const StringName k__diagnose_no_route_reason{"_diagnose_no_route_reason",false};
|
||||
const StringName k__find_facility_access_path{"_find_facility_access_path",false};
|
||||
const StringName k__find_path_internal{"_find_path_internal",false};
|
||||
const StringName k__guest_access_batch_can_select{"_guest_access_batch_can_select",false};
|
||||
const StringName k__guest_batch_has_permitted_layer_crossing{"_guest_batch_has_permitted_layer_crossing",false};
|
||||
const StringName k__guest_has_checked_in{"_guest_has_checked_in",false};
|
||||
const StringName k__guest_step_connector_memo{"_guest_step_connector_memo",false};
|
||||
const StringName k__guest_tree_arithmetic_wrapped{"_guest_tree_arithmetic_wrapped",false};
|
||||
const StringName k__guest_tree_reconstruct_path{"_guest_tree_reconstruct_path",false};
|
||||
const StringName k__need_relief_for_facility_tags{"_need_relief_for_facility_tags",false};
|
||||
const StringName k__passable_cells{"_passable_cells",false};
|
||||
const StringName k__path_cache{"_path_cache",false};
|
||||
const StringName k__query_batch{"_query_batch",false};
|
||||
const StringName k__route_failure{"_route_failure",false};
|
||||
const StringName k__service_category_for_tags{"_service_category_for_tags",false};
|
||||
const StringName k__sorted_name_keys{"_sorted_name_keys",false};
|
||||
const StringName k_arithmetic_wrapped{"arithmetic_wrapped",false};
|
||||
const StringName k_available_quantity{"available_quantity",false};
|
||||
const StringName k_base_quality{"base_quality",false};
|
||||
const StringName k_base_service_minutes{"base_service_minutes",false};
|
||||
const StringName k_begin_guest_path_query_batch{"begin_guest_path_query_batch",false};
|
||||
const StringName k_cache_misses{"cache_misses",false};
|
||||
const StringName k_calculate_guest_batch_path_cost{"calculate_guest_batch_path_cost",false};
|
||||
const StringName k_candidates{"candidates",false};
|
||||
const StringName k_capacity{"capacity",false};
|
||||
const StringName k_compact{"compact",false};
|
||||
const StringName k_cost{"cost",false};
|
||||
const StringName k_cost_values{"cost_values",false};
|
||||
const StringName k_costs{"costs",false};
|
||||
const StringName k_current_cell{"current_cell",false};
|
||||
const StringName k_definition_id{"definition_id",false};
|
||||
const StringName k_definition_registry{"definition_registry",false};
|
||||
const StringName k_elevators{"elevators",false};
|
||||
const StringName k_end_guest_path_query_batch{"end_guest_path_query_batch",false};
|
||||
const StringName k_entrance{"entrance",false};
|
||||
const StringName k_estimated_total_gold{"estimated_total_gold",false};
|
||||
const StringName k_expected_quality{"expected_quality",false};
|
||||
const StringName k_expected_wait{"expected_wait",false};
|
||||
const StringName k_facility_id{"facility_id",false};
|
||||
const StringName k_facility_service{"facility_service",false};
|
||||
const StringName k_facility_tags{"facility_tags",false};
|
||||
const StringName k_get_connector{"get_connector",false};
|
||||
const StringName k_get_facility{"get_facility",false};
|
||||
const StringName k_get_facility_business_price{"get_facility_business_price",false};
|
||||
const StringName k_get_guest{"get_guest",false};
|
||||
const StringName k_get_instances{"get_instances",false};
|
||||
const StringName k_get_step_connector{"get_step_connector",false};
|
||||
const StringName k_graph_revision{"graph_revision",false};
|
||||
const StringName k_group_fit{"group_fit",false};
|
||||
const StringName k_guest_service{"guest_service",false};
|
||||
const StringName k_illegal_level{"illegal_level",false};
|
||||
const StringName k_indices{"indices",false};
|
||||
const StringName k_inputs_available{"inputs_available",false};
|
||||
const StringName k_instance_id{"instance_id",false};
|
||||
const StringName k_inventory_inputs{"inventory_inputs",false};
|
||||
const StringName k_inventory_service{"inventory_service",false};
|
||||
const StringName k_is_open{"is_open",false};
|
||||
const StringName k_last_error{"last_error",false};
|
||||
const StringName k_last_no_route_reason{"last_no_route_reason",false};
|
||||
const StringName k_last_path_cost{"last_path_cost",false};
|
||||
const StringName k_local_inventory_id{"local_inventory_id",false};
|
||||
const StringName k_movement_type{"movement_type",false};
|
||||
const StringName k_need_relief{"need_relief",false};
|
||||
const StringName k_occupied_cells{"occupied_cells",false};
|
||||
const StringName k_origin{"origin",false};
|
||||
const StringName k_owns_connector{"owns_connector",false};
|
||||
const StringName k_path{"path",false};
|
||||
const StringName k_path_handle{"path_handle",false};
|
||||
const StringName k_path_query_measured{"path_query_measured",false};
|
||||
const StringName k_path_service{"path_service",false};
|
||||
const StringName k_queue_entries{"queue_entries",false};
|
||||
const StringName k_reachable{"reachable",false};
|
||||
const StringName k_ready{"ready",false};
|
||||
const StringName k_resource_path{"resource_path",false};
|
||||
const StringName k_risk_level{"risk_level",false};
|
||||
const StringName k_service_category{"service_category",false};
|
||||
const StringName k_settled{"settled",false};
|
||||
const StringName k_staff_only{"staff_only",false};
|
||||
const StringName k_start{"start",false};
|
||||
const StringName k_state{"state",false};
|
||||
const StringName k_supported{"supported",false};
|
||||
const StringName k_tags{"tags",false};
|
||||
const StringName k_tagproj_hunger{"hunger",false};
|
||||
const StringName k_tagproj_sleep{"sleep",false};
|
||||
const StringName k_tagproj_hygiene{"hygiene",false};
|
||||
const StringName k_tagproj_medical{"medical",false};
|
||||
const StringName k_tagproj_leisure{"leisure",false};
|
||||
const StringName k_tagproj_intimacy{"intimacy",false};
|
||||
const StringName k_tagproj_dining{"dining",false};
|
||||
const StringName k_tagproj_lodging{"lodging",false};
|
||||
const StringName k_tagproj_social{"social",false};
|
||||
const StringName k_tagproj_bath{"bath",false};
|
||||
const StringName k_tagproj_wellness{"wellness",false};
|
||||
const StringName k_tagproj_adult_only{"adult_only",false};
|
||||
const StringName k_tagproj_restricted_service{"restricted_service",false};
|
||||
const StringName k_tagproj_food{"food",false};
|
||||
const StringName k_tagproj_service{"service",false};
|
||||
const StringName k_target_cell{"target_cell",false};
|
||||
const StringName k_targets{"targets",false};
|
||||
const StringName k_temporary_block{"temporary_block",false};
|
||||
const StringName k_travel_minutes{"travel_minutes",false};
|
||||
const StringName k_tree{"tree",false};
|
||||
const StringName k_usable{"usable",false};
|
||||
};
|
||||
public:
|
||||
// Whole builtin integer record operation. No retained sample values or time
|
||||
// suppression. Unsupported data returns before any caller-owned mutation.
|
||||
Dictionary performance_record_sample(Object *owner, const StringName &metric, int64_t duration) {
|
||||
const StringName supported("supported",false), report_key("report",false);
|
||||
Dictionary unsupported; unsupported[supported]=false;
|
||||
Object *script=owner ? owner->get_script() : nullptr;
|
||||
if (!script || String(script->get(StringName("resource_path",false))) != "res://scripts/core/performance_budget.gd" || metric==StringName() || duration<0) return unsupported;
|
||||
const StringName samples_key("_samples",false), ordered_key("_ordered_samples",false), bytes_key("_ordered_sample_bytes",false), integer_key("_integer_window_bytes",false), totals_key("_totals",false), counts_key("_sample_counts",false), budgets_key("_budgets",false);
|
||||
const Variant sv=owner->get(samples_key), ov=owner->get(ordered_key), bv=owner->get(bytes_key), iv=owner->get(integer_key), tv=owner->get(totals_key), cv=owner->get(counts_key), uv=owner->get(budgets_key), capacityv=owner->get(StringName("sample_capacity",false));
|
||||
if (sv.get_type()!=Variant::DICTIONARY || ov.get_type()!=Variant::DICTIONARY || bv.get_type()!=Variant::DICTIONARY || iv.get_type()!=Variant::DICTIONARY || tv.get_type()!=Variant::DICTIONARY || cv.get_type()!=Variant::DICTIONARY || uv.get_type()!=Variant::DICTIONARY || capacityv.get_type()!=Variant::INT) return unsupported;
|
||||
Dictionary samples=sv, orders=ov, rawbytes=bv, integers=iv, totals=tv, counts=cv, budgets=uv;
|
||||
if (samples.is_read_only() || orders.is_read_only() || rawbytes.is_read_only() || integers.is_read_only() || totals.is_read_only() || counts.is_read_only()) return unsupported;
|
||||
const std::array<Dictionary,7> maps{samples,orders,rawbytes,integers,totals,counts,budgets};
|
||||
for (size_t i=0;i<maps.size();++i) for (size_t j=i+1;j<maps.size();++j)
|
||||
if (UtilityFunctions::is_same(maps[i],maps[j])) return unsupported;
|
||||
const bool existing=samples.has(metric);
|
||||
Variant rawv=samples.get(metric,Array());
|
||||
if (rawv.get_type()!=Variant::ARRAY) return unsupported;
|
||||
Array values=rawv;
|
||||
if (values.is_read_only()) return unsupported;
|
||||
for (int64_t i=0;i<values.size();++i) if (values[i].get_type()!=Variant::INT) return unsupported;
|
||||
Variant totalv=totals.get(metric,0), countv=counts.get(metric,0), budgetv=budgets.get(metric,Dictionary());
|
||||
if (totalv.get_type()!=Variant::INT || countv.get_type()!=Variant::INT || budgetv.get_type()!=Variant::DICTIONARY) return unsupported;
|
||||
Dictionary budget=budgetv;
|
||||
for (const Dictionary &map: maps) if (UtilityFunctions::is_same(budget,map)) return unsupported;
|
||||
const StringName aggregation_key("aggregation",false), limit_key("limit_us",false);
|
||||
Variant aggregationv=budget.get(aggregation_key,1), limitv=budget.get(limit_key,0);
|
||||
if (aggregationv.get_type()!=Variant::INT || limitv.get_type()!=Variant::INT) return unsupported;
|
||||
// One exact byte snapshot serves both builtin validation helpers inside
|
||||
// this call; there are no external calls between their original checks.
|
||||
PackedByteArray before=UtilityFunctions::var_to_bytes(values);
|
||||
TypedArray<int64_t> ordered;
|
||||
Variant savedbytes=rawbytes.get(metric,PackedByteArray());
|
||||
bool reuse=existing && orders.has(metric) && savedbytes.get_type()==Variant::PACKED_BYTE_ARRAY && PackedByteArray(savedbytes)==before;
|
||||
if (reuse) {
|
||||
Variant orderv=orders[metric];
|
||||
if (orderv.get_type()!=Variant::ARRAY) return unsupported;
|
||||
Array prior=orderv;
|
||||
if (prior.is_read_only() || !prior.is_typed() || prior.get_typed_builtin()!=Variant::INT || prior.size()!=values.size()) return unsupported;
|
||||
ordered=prior;
|
||||
} else {
|
||||
for (int64_t i=0;i<values.size();++i) ordered.append(values[i]);
|
||||
ordered.sort();
|
||||
}
|
||||
// Guards completed: mutations preserve raw and reused ordered aliases.
|
||||
if (!existing) samples[metric]=values;
|
||||
integers[metric]=before;
|
||||
if (!reuse) { orders[metric]=ordered; rawbytes[metric]=before; }
|
||||
values.append(duration);
|
||||
ordered.insert(ordered.bsearch(duration),duration);
|
||||
if (values.size()>int64_t(capacityv)) {
|
||||
Variant removed=values.pop_front();
|
||||
ordered.remove_at(ordered.bsearch(removed));
|
||||
}
|
||||
PackedByteArray after=UtilityFunctions::var_to_bytes(values);
|
||||
rawbytes[metric]=after; integers[metric]=after;
|
||||
const int64_t lifetime_total=the_tree_native::signed_add(int64_t(totalv),duration);
|
||||
const int64_t lifetime_count=the_tree_native::signed_add(int64_t(countv),1);
|
||||
totals[metric]=lifetime_total; counts[metric]=lifetime_count;
|
||||
const int64_t average=lifetime_count>0 ? lifetime_total/lifetime_count : 0;
|
||||
const int64_t maximum=ordered.is_empty() ? 0 : std::max<int64_t>(0,int64_t(ordered[ordered.size()-1]));
|
||||
int64_t p95=0;
|
||||
if (!ordered.is_empty()) {
|
||||
const int64_t index=std::max<int64_t>(the_tree_native::signed_add(the_tree_native::signed_add(signed_product(95,ordered.size()),99)/100,-1),0);
|
||||
p95=ordered[std::min<int64_t>(index,ordered.size()-1)];
|
||||
}
|
||||
const int64_t aggregation=aggregationv, limit=limitv;
|
||||
// Original default match is P95, including unknown aggregation values.
|
||||
const int64_t measured=aggregation==0 ? average : (aggregation==2 ? maximum : p95);
|
||||
Dictionary report;
|
||||
report[StringName("metric_id",false)]=metric;
|
||||
report[StringName("window_sample_count",false)]=values.size();
|
||||
report[StringName("lifetime_sample_count",false)]=lifetime_count;
|
||||
report[StringName("average_us",false)]=average;
|
||||
report[StringName("p95_us",false)]=p95;
|
||||
report[StringName("maximum_us",false)]=maximum;
|
||||
report[aggregation_key]=aggregation;
|
||||
report[StringName("measured_us",false)]=measured;
|
||||
report[limit_key]=limit;
|
||||
report[StringName("budget_exceeded",false)]=limit>0 && measured>limit;
|
||||
Dictionary result; result[supported]=true; result[report_key]=report; return result;
|
||||
}
|
||||
#include "guest_candidate_batch.inc"
|
||||
void clear_edge_cache() { cached_edges.clear(); }
|
||||
Dictionary search(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider) {
|
||||
return search_impl(cells, indices, start_index, goals, edge_provider, false);
|
||||
}
|
||||
Dictionary search_cached(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider) {
|
||||
return search_impl(cells, indices, start_index, goals, edge_provider, true);
|
||||
}
|
||||
// One ordered projection, with no new persistent ownership/cache. Only
|
||||
// builtin pure getters and the already guarded sole budget observer qualify.
|
||||
Dictionary project_guest_candidates(Object *runtime, const StringName &guest_id,
|
||||
int64_t open_state, int64_t degraded_state, int64_t movement_scale,
|
||||
int64_t stair_credit, int64_t orthogonal_cost, const Callable &ticks) {
|
||||
const ProjectionNames n;
|
||||
Dictionary unsupported;
|
||||
unsupported[n.k_supported] = false;
|
||||
if (!builtin(n,runtime, "res://autoload/simulation_runtime.gd") || !ticks.is_valid()) return unsupported;
|
||||
Object *path = runtime->get(n.k_path_service);
|
||||
Object *elevators = runtime->get(n.k_elevators);
|
||||
Object *facilities = runtime->get(n.k_facility_service);
|
||||
Object *definitions = runtime->get(n.k_definition_registry);
|
||||
Object *inventory = runtime->get(n.k_inventory_service);
|
||||
Object *guests = runtime->get(n.k_guest_service);
|
||||
if (!builtin(n,path,"res://scripts/world/path_service.gd") ||
|
||||
!builtin(n,elevators,"res://scripts/transport/elevator_service.gd") ||
|
||||
!builtin(n,facilities,"res://scripts/facility/facility_service.gd") ||
|
||||
!builtin(n,definitions,"res://scripts/core/definition_registry.gd") ||
|
||||
!builtin(n,inventory,"res://scripts/inventory/inventory_service.gd") ||
|
||||
!builtin(n,guests,"res://scripts/guest/guest_service.gd") ||
|
||||
!static_cast<bool>(runtime->call(n.k__guest_access_batch_can_select))) return unsupported;
|
||||
Object *guest = guests->call(n.k_get_guest,guest_id);
|
||||
Array candidates;
|
||||
if (!guest) {
|
||||
Dictionary result; result[n.k_supported] = true;
|
||||
result[n.k_candidates] = candidates; return result;
|
||||
}
|
||||
if (!builtin(n,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
|
||||
const Array initial = facilities->call(n.k_get_instances);
|
||||
// Preflight is read-only: default registry/get_instances have no public
|
||||
// error/counter effects. Custom resources retain the original whole loop.
|
||||
for (int64_t i=0;i<initial.size();++i) {
|
||||
Object *facility = initial[i];
|
||||
if (!builtin(n,facility,"res://scripts/facility/facility_instance.gd")) return unsupported;
|
||||
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
|
||||
if (definition && !builtin(n,definition,"res://scripts/data/facility_definition.gd")) return unsupported;
|
||||
}
|
||||
Array goals;
|
||||
for (int64_t i=0;i<initial.size();++i) goals.append_array(facility_access_cells(n,path,initial[i]));
|
||||
const Vector3i start = guest->get(n.k_current_cell);
|
||||
path->call(n.k_begin_guest_path_query_batch,start,goals);
|
||||
const Array ordered = facilities->call(n.k_get_instances);
|
||||
TypedArray<int64_t> layers; layers.push_back(0); layers.push_back(1);
|
||||
TypedArray<StringName> access_ids;
|
||||
for (int64_t i=0;i<ordered.size();++i) {
|
||||
Object *facility = ordered[i];
|
||||
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
|
||||
if (!definition) continue;
|
||||
const Array tags = definition->get(n.k_tags);
|
||||
if (tags.has(n.k_staff_only)) continue;
|
||||
if (tags.has(n.k_entrance) && static_cast<bool>(runtime->call(n.k__guest_has_checked_in,guest))) continue;
|
||||
bool has_inputs = true;
|
||||
const Dictionary inputs = definition->get(n.k_inventory_inputs);
|
||||
const Array items = sorted_builtin_input_names(n,runtime,inputs);
|
||||
for (int64_t j=0;j<items.size();++j) {
|
||||
const int64_t quantity = inventory->call(n.k_available_quantity,facility->get(n.k_local_inventory_id),items[j]);
|
||||
if (quantity < static_cast<int64_t>(inputs[items[j]])) {has_inputs=false;break;}
|
||||
}
|
||||
if (!has_inputs) {
|
||||
Dictionary row;row[n.k_facility_id]=facility->get(n.k_instance_id);
|
||||
row[n.k_inputs_available]=false;candidates.push_back(row);continue;
|
||||
}
|
||||
const Array destinations = facility_access_cells(n,path,facility);
|
||||
Dictionary route = nearest_guest_access_impl(n,path,start,destinations,facility->get(n.k_origin),layers,access_ids,ticks);
|
||||
if (static_cast<bool>(route.get(n.k_supported,false))) route.erase(n.k_supported);
|
||||
else route = Dictionary(runtime->call(n.k__find_facility_access_path,start,facility));
|
||||
const Array walk = route.get(n.k_path,Array());
|
||||
const bool plain_tag_relief = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
|
||||
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
|
||||
const Dictionary relief = plain_tag_relief ? builtin_tag_relief(n,tags) :
|
||||
Dictionary(runtime->call(n.k__need_relief_for_facility_tags,tags));
|
||||
Dictionary row;
|
||||
row[n.k_facility_id]=facility->get(n.k_instance_id);
|
||||
row[n.k_facility_tags]=tags.duplicate();
|
||||
const int64_t state = facility->get(n.k_state);
|
||||
row[n.k_is_open]=(state==open_state || state==degraded_state);
|
||||
row[n.k_reachable]=route.get(n.k_reachable,false);
|
||||
row[n.k_travel_minutes]=guest_path_minutes(n,path,elevators,walk,movement_scale,stair_credit,orthogonal_cost);
|
||||
const Array queue = facility->get(n.k_queue_entries);
|
||||
const int64_t capacity = facility->get(n.k_capacity);
|
||||
row[n.k_expected_wait]=signed_product(queue.size(),facility->get(n.k_base_service_minutes))/std::max<int64_t>(capacity,1);
|
||||
row[n.k_estimated_total_gold]=runtime->call(n.k_get_facility_business_price,facility);
|
||||
const int64_t quality = facility->get(n.k_base_quality);
|
||||
row[n.k_expected_quality]=std::max<int64_t>(0,std::min<int64_t>(quality,100));
|
||||
row[n.k_need_relief]=relief;
|
||||
row[n.k_risk_level]=int64_t(0);row[n.k_illegal_level]=int64_t(0);
|
||||
row[n.k_group_fit]=signed_product(std::min<int64_t>(capacity,4),5);
|
||||
// Recheck at the original call position: preceding price/observer
|
||||
// callbacks must retain a replaced/custom runtime's original call.
|
||||
const bool plain_tag_category = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
|
||||
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
|
||||
row[n.k_service_category]=plain_tag_category ? Variant(builtin_tag_category(n,tags)) :
|
||||
runtime->call(n.k__service_category_for_tags,tags);
|
||||
Dictionary handle;handle[n.k_target_cell]=route.get(n.k_target_cell,guest->get(n.k_current_cell));
|
||||
handle[n.k_graph_revision]=path->get(n.k_graph_revision);
|
||||
row[n.k_path_handle]=handle;candidates.push_back(row);
|
||||
}
|
||||
path->call(n.k_end_guest_path_query_batch);
|
||||
Dictionary result;result[n.k_supported]=true;result[n.k_candidates]=candidates;return result;
|
||||
}
|
||||
private:
|
||||
// Direct translation of the two pure builtin tag methods. Fresh result,
|
||||
// original insertion/branch order, no retained definition/tag memo.
|
||||
static Dictionary builtin_tag_relief(const ProjectionNames &n,const Array &tags) {
|
||||
Dictionary relief;
|
||||
relief[n.k_tagproj_hunger]=int64_t(0);relief[n.k_tagproj_sleep]=int64_t(0);
|
||||
relief[n.k_tagproj_hygiene]=int64_t(0);relief[n.k_tagproj_medical]=int64_t(0);
|
||||
relief[n.k_tagproj_leisure]=int64_t(0);relief[n.k_tagproj_intimacy]=int64_t(0);
|
||||
if(tags.has(n.k_tagproj_dining)) {relief[n.k_tagproj_hunger]=int64_t(80);relief[n.k_tagproj_leisure]=int64_t(10);}
|
||||
if(tags.has(n.k_tagproj_lodging)) {relief[n.k_tagproj_sleep]=int64_t(90);relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),10);}
|
||||
if(tags.has(n.k_tagproj_social)||tags.has(n.k_tagproj_leisure)) relief[n.k_tagproj_leisure]=std::max<int64_t>(int64_t(relief[n.k_tagproj_leisure]),40);
|
||||
if(tags.has(n.k_tagproj_hygiene)||tags.has(n.k_tagproj_bath)) relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),80);
|
||||
if(tags.has(n.k_tagproj_medical)) relief[n.k_tagproj_medical]=int64_t(90);
|
||||
else if(tags.has(n.k_tagproj_wellness)) relief[n.k_tagproj_medical]=std::max<int64_t>(int64_t(relief[n.k_tagproj_medical]),20);
|
||||
if(tags.has(n.k_tagproj_adult_only)||tags.has(n.k_tagproj_restricted_service)) relief[n.k_tagproj_intimacy]=int64_t(80);
|
||||
return relief;
|
||||
}
|
||||
static StringName builtin_tag_category(const ProjectionNames &n,const Array &tags) {
|
||||
if(tags.has(n.k_tagproj_dining))return n.k_tagproj_food;
|
||||
if(tags.has(n.k_tagproj_lodging))return n.k_tagproj_lodging;
|
||||
if(tags.has(n.k_tagproj_social))return n.k_tagproj_leisure;
|
||||
return n.k_tagproj_service;
|
||||
}
|
||||
static bool builtin(const ProjectionNames &n,Object *object,const char *resource) {
|
||||
if (!object) return false;Object *script=object->get_script();
|
||||
return script && String(script->get(n.k_resource_path))==resource;
|
||||
}
|
||||
// Exact builtin cache-key spelling. No normalized/reordered profile and no
|
||||
// persistent cache; String lengths count Unicode codepoints as GDScript does.
|
||||
static String cache_key_suffix(const ProjectionNames &n,Object *path, const TypedArray<int64_t> &layers,
|
||||
const TypedArray<StringName> &access) {
|
||||
String layer_text, access_text;
|
||||
for (int64_t i=0; i<layers.size(); ++i) {
|
||||
if (i) layer_text += ",";
|
||||
layer_text += String::num_int64(static_cast<int64_t>(layers[i]));
|
||||
}
|
||||
for (int64_t i=0; i<access.size(); ++i) {
|
||||
if (i) access_text += ",";
|
||||
const String value = String(static_cast<StringName>(access[i]));
|
||||
access_text += String::num_int64(value.length()) + ":" + value;
|
||||
}
|
||||
return String("|L:") + layer_text + "|A:" + access_text + "|R:" +
|
||||
String::num_int64(static_cast<int64_t>(path->get(n.k_graph_revision)));
|
||||
}
|
||||
static String cache_key_with_suffix(const Vector3i &start, const Vector3i &goal,
|
||||
const String &suffix) {
|
||||
return String::num_int64(start.x) + "," + String::num_int64(start.y) + "," +
|
||||
String::num_int64(start.z) + ">" + String::num_int64(goal.x) + "," +
|
||||
String::num_int64(goal.y) + "," + String::num_int64(goal.z) + suffix;
|
||||
}
|
||||
static int64_t signed_product(int64_t a,int64_t b) {
|
||||
const uint64_t product=static_cast<uint64_t>(a)*static_cast<uint64_t>(b);
|
||||
if (product<=static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) return static_cast<int64_t>(product);
|
||||
return std::numeric_limits<int64_t>::min()+static_cast<int64_t>(product-(uint64_t(1)<<63));
|
||||
}
|
||||
static Array facility_access_cells(const ProjectionNames &n,Object *path,Object *facility) {
|
||||
const Dictionary passable=path->get(n.k__passable_cells);
|
||||
Array occupied=Array(facility->get(n.k_occupied_cells)).duplicate();
|
||||
if (occupied.is_empty()) occupied.push_back(facility->get(n.k_origin));
|
||||
Dictionary unique;
|
||||
for (int64_t i=0;i<occupied.size();++i) {
|
||||
const Vector3i cell=occupied[i];
|
||||
for (int32_t dx : {-1,1}) {
|
||||
// Match GDScript's Vector3i conversion after int64 addition.
|
||||
const Vector3i candidate(int64_t(cell.x)+dx,cell.y,cell.z);
|
||||
if (passable.has(candidate)) unique[candidate]=true;
|
||||
}
|
||||
}
|
||||
const Vector3i origin=facility->get(n.k_origin);if(passable.has(origin)) unique[origin]=true;
|
||||
const Array keys=unique.keys();std::vector<Vector3i> sorted;sorted.reserve(keys.size());
|
||||
for (int64_t i=0;i<keys.size();++i) sorted.push_back(keys[i]);
|
||||
std::sort(sorted.begin(),sorted.end(),[](const Vector3i &a,const Vector3i &b){
|
||||
if(a.z!=b.z)return a.z<b.z;if(a.y!=b.y)return a.y<b.y;return a.x<b.x;
|
||||
});
|
||||
Array result;for(const Vector3i &cell:sorted)result.push_back(cell);return result;
|
||||
}
|
||||
static int64_t guest_path_minutes(const ProjectionNames &n,Object *path,Object *elevators,const Array &route,
|
||||
int64_t movement_scale,int64_t stair_credit,int64_t orthogonal_cost) {
|
||||
Dictionary memo=path->get(n.k__guest_step_connector_memo);
|
||||
// Route-local only. Reuse an ownership result only after an actual
|
||||
// BOOL return and a typed cached step; no script callback occurs on a
|
||||
// repeated typed memo hit. A miss/conversion/custom script keeps calls.
|
||||
const bool builtin_pair = builtin(n,path,"res://scripts/world/path_service.gd") &&
|
||||
builtin(n,elevators,"res://scripts/transport/elevator_service.gd");
|
||||
bool ownership_valid = false;
|
||||
bool ownership_value = false;
|
||||
StringName ownership_connector;
|
||||
for(int64_t i=1;i<route.size();++i) {
|
||||
const Vector3i from=route[i-1],to=route[i];
|
||||
const Dictionary destinations=memo.get(from,Dictionary());
|
||||
StringName connector;
|
||||
const bool memo_hit = destinations.has(to);
|
||||
const bool typed_memo_hit = memo_hit && destinations[to].get_type() == Variant::STRING_NAME;
|
||||
if(memo_hit)connector=destinations[to];
|
||||
else {TypedArray<StringName> access;connector=path->call(n.k_get_step_connector,from,to,access);}
|
||||
bool special;
|
||||
if (builtin_pair && typed_memo_hit && ownership_valid && connector == ownership_connector) {
|
||||
special = ownership_value;
|
||||
} else {
|
||||
const Variant owned = elevators->call(n.k_owns_connector,connector);
|
||||
special = static_cast<bool>(owned);
|
||||
ownership_valid = builtin_pair && typed_memo_hit && owned.get_type() == Variant::BOOL;
|
||||
ownership_value = special;
|
||||
ownership_connector = connector;
|
||||
}
|
||||
if(!special && String(connector).begins_with("infra.connector:") && from.x==to.x && from.z==to.z &&
|
||||
std::abs(int64_t(from.y)-int64_t(to.y))==1) {
|
||||
const Dictionary detail=path->call(n.k_get_connector,connector);
|
||||
special=detail.get(n.k_movement_type,StringName())==Variant(n.k_CONNECTOR) &&
|
||||
static_cast<int64_t>(detail.get(n.k_cost,int64_t(0)))==150 && stair_credit>movement_scale;
|
||||
}
|
||||
if(special) {
|
||||
const int64_t cost=path->call(n.k_calculate_guest_batch_path_cost,route[0],route[route.size()-1],route);
|
||||
return static_cast<int64_t>(std::ceil(static_cast<double>(cost)/static_cast<double>(orthogonal_cost)));
|
||||
}
|
||||
}
|
||||
return std::max<int64_t>(route.size()-1,0);
|
||||
}
|
||||
public:
|
||||
|
||||
// Stateless translation of the builtin nearest access query. The caller
|
||||
// supplies the existing typed default profile and the real Time callable.
|
||||
// Public cache publication, failure diagnostics and fallback stay ordered.
|
||||
Dictionary nearest_guest_access(Object *path, const Vector3i &start,
|
||||
const Array &goals, const Vector3i &fallback_target,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
|
||||
const Callable &ticks) {
|
||||
const ProjectionNames n;
|
||||
return nearest_guest_access_impl(n,path,start,goals,fallback_target,layers,access,ticks);
|
||||
}
|
||||
private:
|
||||
Dictionary nearest_guest_access_impl(const ProjectionNames &n,Object *path, const Vector3i &start,
|
||||
const Array &goals, const Vector3i &fallback_target,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
|
||||
const Callable &ticks) {
|
||||
Dictionary unsupported;
|
||||
unsupported[n.k_supported] = false;
|
||||
if (!path || !ticks.is_valid() || goals.is_empty()) return unsupported;
|
||||
Object *script = path->get_script();
|
||||
if (!script || String(script->get(n.k_resource_path)) != "res://scripts/world/path_service.gd") return unsupported;
|
||||
Dictionary batch = path->get(n.k__query_batch);
|
||||
if (batch.is_empty() || start != static_cast<Vector3i>(batch[n.k_start])) return unsupported;
|
||||
const Dictionary passable = path->get(n.k__passable_cells);
|
||||
if (!passable.has(start) || blocked(n,path, start) || !layers.has(start.z)) return unsupported;
|
||||
const Dictionary targets = batch[n.k_targets];
|
||||
Dictionary cache = path->get(n.k__path_cache);
|
||||
// Exact builtin validation loop has no callback before ticks.call().
|
||||
// Build the unchanged profile/revision suffix lazily at the first key.
|
||||
String key_suffix;
|
||||
bool key_suffix_ready = false;
|
||||
for (int64_t j = 0; j < goals.size(); ++j) {
|
||||
if (goals[j].get_type() != Variant::VECTOR3I) return unsupported;
|
||||
const Vector3i cell = goals[j];
|
||||
if (!targets.has(cell)) {
|
||||
const bool searchable = passable.has(cell) && layers.has(cell.z) && !blocked(n,path, cell);
|
||||
if (searchable && (start.z == cell.z || static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, cell, layers, access)))) return unsupported;
|
||||
}
|
||||
if (!key_suffix_ready) {
|
||||
key_suffix = cache_key_suffix(n,path, layers, access);
|
||||
key_suffix_ready = true;
|
||||
}
|
||||
const String key = cache_key_with_suffix(start, cell, key_suffix);
|
||||
if (cache.has(key)) return unsupported;
|
||||
}
|
||||
const int64_t started = ticks.call();
|
||||
if (!static_cast<bool>(batch[n.k_ready])) {
|
||||
batch[n.k_tree] = path->call(n.k__build_guest_query_tree_compact, start, targets, layers, access);
|
||||
batch[n.k_arithmetic_wrapped] = path->get(n.k__guest_tree_arithmetic_wrapped);
|
||||
batch[n.k_ready] = true;
|
||||
}
|
||||
const Dictionary tree = batch[n.k_tree];
|
||||
if (!static_cast<bool>(tree.get(n.k_usable, false)) || static_cast<bool>(batch.get(n.k_arithmetic_wrapped, false))) return unsupported;
|
||||
Vector3i best_cell = fallback_target;
|
||||
bool found = false;
|
||||
int64_t best_cost = 0;
|
||||
const Dictionary settled = tree[n.k_settled];
|
||||
bool cost_view_ready=false,compact_cost_view=false;
|
||||
Dictionary cost_indices,cost_dictionary;
|
||||
PackedInt64Array cost_values;
|
||||
for (int64_t j = 0; j < goals.size(); ++j) {
|
||||
const Vector3i cell = goals[j];
|
||||
if (!targets.has(cell) || !settled.has(cell)) continue;
|
||||
// No callback occurs between these original numeric cost reads.
|
||||
// Initialize lazily at the first eligible goal, and retain nothing
|
||||
// past this call or reuse after the subsequent route callbacks.
|
||||
if (!cost_view_ready) {
|
||||
compact_cost_view=tree.get(n.k_compact,false);
|
||||
if(compact_cost_view) {cost_indices=tree[n.k_indices];cost_values=tree[n.k_cost_values];}
|
||||
else cost_dictionary=tree[n.k_costs];
|
||||
cost_view_ready=true;
|
||||
}
|
||||
int64_t cost=0;
|
||||
if(compact_cost_view) {
|
||||
if(!cost_indices.has(cell)) return unsupported;
|
||||
const int64_t index=cost_indices[cell];
|
||||
if(index<0 || index>=cost_values.size()) return unsupported;
|
||||
cost=cost_values[index];
|
||||
} else {
|
||||
if(!cost_dictionary.has(cell)) return unsupported;
|
||||
cost=cost_dictionary[cell];
|
||||
}
|
||||
if (!found || cost < best_cost) {
|
||||
found = true;
|
||||
best_cost = cost;
|
||||
best_cell = cell;
|
||||
}
|
||||
}
|
||||
TypedArray<Vector3i> best_path;
|
||||
if (found) {
|
||||
best_path = resolve_ready_guest_point(n,path, start, best_cell, tree, layers, access);
|
||||
if (best_path.is_empty()) return unsupported;
|
||||
}
|
||||
if (!goals.is_empty() && (!found || goals[goals.size() - 1] != Variant(best_cell))) {
|
||||
resolve_ready_guest_point(n,path, start, goals[goals.size() - 1], tree, layers, access);
|
||||
}
|
||||
const int64_t elapsed = the_tree_native::signed_add(static_cast<int64_t>(ticks.call()), the_tree_native::signed_add(~started, 1));
|
||||
path->emit_signal(n.k_path_query_measured, std::max<int64_t>(elapsed, 0));
|
||||
Dictionary result;
|
||||
result[n.k_supported] = true;
|
||||
result[n.k_reachable] = found;
|
||||
result[n.k_path] = best_path;
|
||||
result[n.k_target_cell] = best_cell;
|
||||
return result;
|
||||
}
|
||||
private:
|
||||
// Only StringName keys qualify. Conversion-sensitive and custom runtime
|
||||
// cases retain the original script sorter. No owner values are retained.
|
||||
static Array sorted_builtin_input_names(const ProjectionNames &n,Object *runtime,const Dictionary &inputs) {
|
||||
auto original=[&]() -> Array {return runtime->call(n.k__sorted_name_keys,inputs);};
|
||||
if(!builtin(n,runtime,"res://autoload/simulation_runtime.gd")) return original();
|
||||
const Array keys=inputs.keys();
|
||||
std::vector<std::pair<String,StringName>> rows;
|
||||
rows.reserve(keys.size());
|
||||
for(int64_t i=0;i<keys.size();++i) {
|
||||
if(keys[i].get_type()!=Variant::STRING_NAME) return original();
|
||||
const StringName name=keys[i];rows.emplace_back(String(name),name);
|
||||
}
|
||||
// String ordering is the same engine operator used by the script.
|
||||
std::sort(rows.begin(),rows.end(),[](const auto &a,const auto &b){return a.first<b.first;});
|
||||
TypedArray<StringName> result;
|
||||
for(const auto &row:rows) result.push_back(row.second);
|
||||
return result;
|
||||
}
|
||||
// Fresh writable typed output, matching the builtin append loop. Check
|
||||
// the script at this original call position, after any route callbacks.
|
||||
static Variant copy_builtin_guest_route(const ProjectionNames &n,Object *path,const TypedArray<Vector3i> &route) {
|
||||
if(!builtin(n,path,"res://scripts/world/path_service.gd")) return path->call(n.k__copy_path,route);
|
||||
TypedArray<Vector3i> copied;
|
||||
for(int64_t i=0;i<route.size();++i) copied.push_back(route[i]);
|
||||
return copied;
|
||||
}
|
||||
static bool blocked(const ProjectionNames &n,Object *path, const Vector3i &cell) {
|
||||
const Dictionary traffic_map = path->get(n.k__cell_traffic);
|
||||
const Dictionary traffic = traffic_map.get(cell, Dictionary());
|
||||
return !traffic.is_empty() && static_cast<bool>(traffic[n.k_temporary_block]);
|
||||
}
|
||||
static bool tree_has_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
|
||||
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
|
||||
const Dictionary values = tree[n.k_costs];
|
||||
return values.has(cell);
|
||||
}
|
||||
const Dictionary indices = tree[n.k_indices];
|
||||
if (!indices.has(cell)) return false;
|
||||
const int64_t index = indices[cell];
|
||||
const PackedInt64Array values = tree[n.k_cost_values];
|
||||
return index >= 0 && index < values.size();
|
||||
}
|
||||
static int64_t tree_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
|
||||
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
|
||||
const Dictionary values = tree[n.k_costs];
|
||||
return static_cast<int64_t>(values[cell]);
|
||||
}
|
||||
const Dictionary indices = tree[n.k_indices];
|
||||
const PackedInt64Array values = tree[n.k_cost_values];
|
||||
return values[static_cast<int64_t>(indices[cell])];
|
||||
}
|
||||
static TypedArray<Vector3i> resolve_ready_guest_point(const ProjectionNames &n,Object *path,
|
||||
const Vector3i &start, const Vector3i &goal, const Dictionary &tree,
|
||||
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access) {
|
||||
const Dictionary passable = path->get(n.k__passable_cells);
|
||||
if (!passable.has(start)) return path->call(n.k__route_failure, n.k_START_NOT_PASSABLE);
|
||||
if (!passable.has(goal)) return path->call(n.k__route_failure, n.k_GOAL_NOT_PASSABLE);
|
||||
if (!layers.has(start.z) || !layers.has(goal.z)) return path->call(n.k__route_failure, n.k_ACCESS_LAYER_DENIED);
|
||||
if (blocked(n,path, start)) return path->call(n.k__route_failure, n.k_START_TEMPORARILY_BLOCKED);
|
||||
if (blocked(n,path, goal)) return path->call(n.k__route_failure, n.k_GOAL_TEMPORARILY_BLOCKED);
|
||||
// ticks/tree callbacks may have changed the script or revision. Recheck
|
||||
// at this original call position and never reuse the pre-tick suffix.
|
||||
const String key = builtin(n,path,"res://scripts/world/path_service.gd") ?
|
||||
cache_key_with_suffix(start, goal, cache_key_suffix(n,path, layers, access)) :
|
||||
String(path->call(n.k__cache_key, start, goal, layers, access));
|
||||
Dictionary cache = path->get(n.k__path_cache);
|
||||
const Dictionary batch = path->get(n.k__query_batch);
|
||||
const Dictionary targets = batch[n.k_targets];
|
||||
if (cache.has(key) || !targets.has(goal)) return path->call(n.k__find_path_internal, start, goal);
|
||||
path->set(n.k_cache_misses, the_tree_native::signed_add(static_cast<int64_t>(path->get(n.k_cache_misses)), 1));
|
||||
if (start.z != goal.z && !static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, goal, layers, access))) return path->call(n.k__route_failure, n.k_GOAL_UNREACHABLE);
|
||||
TypedArray<Vector3i> route;
|
||||
const Dictionary settled = tree[n.k_settled];
|
||||
if (start == goal) route.push_back(start);
|
||||
else if (settled.has(goal)) route = Array(path->call(n.k__guest_tree_reconstruct_path, tree, goal));
|
||||
if (route.is_empty()) return path->call(n.k__route_failure, path->call(n.k__diagnose_no_route_reason, start, goal, layers, access));
|
||||
cache[key] = copy_builtin_guest_route(n,path,route);
|
||||
path->set(n.k_last_no_route_reason, n.k_OK);
|
||||
path->set(n.k_last_path_cost, tree_cost(n,tree, goal));
|
||||
path->set(n.k_last_error, String(""));
|
||||
return route;
|
||||
}
|
||||
public:
|
||||
private:
|
||||
// One existing builtin provider operation, with no new value cache. Only
|
||||
// connector-free WALK rows qualify; unsupported cases call the old provider.
|
||||
// All work stays private until the original final shared[current] assignment.
|
||||
struct WalkEdgeNames {
|
||||
const StringName resource_path{"resource_path",false}, constants_method{"get_script_constant_map",false};
|
||||
const StringName front{"FRONT",false}, back{"BACK",false}, walk{"MOVEMENT_WALK",false};
|
||||
const StringName base{"ORTHOGONAL_MOVE_COST",false}, congestion{"CONGESTION_COST_PER_EXCESS",false};
|
||||
const StringName workspace{"_guest_tree_workspace",false}, edges{"edges",false}, indices{"indices",false};
|
||||
const StringName adjacency{"_adjacency",false}, traffic{"_cell_traffic",false}, vertical{"_vertical_walk_requires_connector",false};
|
||||
const StringName to{"to",false}, connector{"connector_id",false}, access{"access_id",false}, movement{"movement_type",false};
|
||||
const StringName base_cost{"base_cost",false}, cost{"cost",false}, temporary{"temporary_block",false};
|
||||
const StringName dynamic{"dynamic_cost",false}, density{"current_density",false}, capacity{"base_capacity",false};
|
||||
const StringName provider{"_guest_tree_shared_edges",false};
|
||||
};
|
||||
struct WalkEdgeContext {
|
||||
Object *path=nullptr;
|
||||
int64_t front=0, back=0, base=0, congestion=0;
|
||||
StringName walk;
|
||||
};
|
||||
static bool walk_edge_context(const WalkEdgeNames &n,Object *path,const Array &layers,
|
||||
const Array &access,WalkEdgeContext &context) {
|
||||
if (!path || layers.size()!=2 || !access.is_empty() ||
|
||||
layers[0].get_type()!=Variant::INT || layers[1].get_type()!=Variant::INT) return false;
|
||||
Object *script=path->get_script();
|
||||
if (!script || String(script->get(n.resource_path))!="res://scripts/world/path_service.gd" ||
|
||||
!script->has_method(n.constants_method)) return false;
|
||||
const Variant value=script->call(n.constants_method);
|
||||
if (value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary constants=value;
|
||||
for (const StringName &key : {n.front,n.back,n.base,n.congestion})
|
||||
if (constants.get(key,Variant()).get_type()!=Variant::INT) return false;
|
||||
if (constants.get(n.walk,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
int64_t(layers[0])!=int64_t(constants[n.front]) ||
|
||||
int64_t(layers[1])!=int64_t(constants[n.back])) return false;
|
||||
context.path=path;context.front=constants[n.front];context.back=constants[n.back];
|
||||
context.base=constants[n.base];context.congestion=constants[n.congestion];context.walk=constants[n.walk];
|
||||
return true;
|
||||
}
|
||||
static bool builtin_walk_edge_rows(const WalkEdgeNames &n,const WalkEdgeContext &context,
|
||||
const Vector3i ¤t,Array &rows) {
|
||||
if (!context.path) return false;
|
||||
const Variant workspace_value=context.path->get(n.workspace);
|
||||
if (workspace_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary workspace=workspace_value;
|
||||
const Variant shared_value=workspace.get(n.edges,Variant());
|
||||
if (shared_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
Dictionary shared=shared_value;
|
||||
// Original cached-row branch precedes readonly and all other state reads.
|
||||
if (shared.has(current)) {
|
||||
const Variant cached=shared[current];
|
||||
if (cached.get_type()!=Variant::ARRAY) return false;
|
||||
rows=cached;return true;
|
||||
}
|
||||
if (shared.is_read_only()) return false;
|
||||
const Variant indices_value=workspace.get(n.indices,Variant()), adjacency_value=context.path->get(n.adjacency);
|
||||
const Variant traffic_value=context.path->get(n.traffic), vertical_value=context.path->get(n.vertical);
|
||||
if (indices_value.get_type()!=Variant::DICTIONARY || adjacency_value.get_type()!=Variant::DICTIONARY ||
|
||||
traffic_value.get_type()!=Variant::DICTIONARY || vertical_value.get_type()!=Variant::BOOL) return false;
|
||||
const Dictionary indices=indices_value, adjacency=adjacency_value, traffic=traffic_value;
|
||||
const Variant raw_value=adjacency.get(current,Array());
|
||||
if (raw_value.get_type()!=Variant::ARRAY) return false;
|
||||
const Array raw=raw_value;Array result;
|
||||
for (int64_t i=0;i<raw.size();++i) {
|
||||
if (raw[i].get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary edge=raw[i];
|
||||
if (edge.get(n.to,Variant()).get_type()!=Variant::VECTOR3I) return false;
|
||||
const Vector3i neighbor=edge[n.to];
|
||||
if (neighbor.z!=context.front && neighbor.z!=context.back) continue;
|
||||
const Variant row_value=traffic.get(neighbor,Dictionary());
|
||||
if (row_value.get_type()!=Variant::DICTIONARY) return false;
|
||||
const Dictionary row=row_value;
|
||||
if (!row.is_empty()) {
|
||||
if (row.get(n.temporary,Variant()).get_type()!=Variant::BOOL) return false;
|
||||
if (bool(row[n.temporary])) continue;
|
||||
}
|
||||
// Preserve old method for every connector/access/other movement row.
|
||||
if (edge.get(n.connector,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
edge.get(n.access,Variant()).get_type()!=Variant::STRING_NAME ||
|
||||
edge.get(n.movement,Variant()).get_type()!=Variant::STRING_NAME) return false;
|
||||
const StringName connector=edge[n.connector], access=edge[n.access], movement=edge[n.movement];
|
||||
if (!connector.is_empty() || !access.is_empty() || movement!=context.walk) return false;
|
||||
if (bool(vertical_value) && current.y!=neighbor.y) continue;
|
||||
const Variant base=edge.get(n.base_cost,edge.get(n.cost,context.base));
|
||||
if (base.get_type()!=Variant::INT) return false;
|
||||
int64_t dynamic=0;
|
||||
if (!row.is_empty()) {
|
||||
for (const StringName &key : {n.dynamic,n.density,n.capacity})
|
||||
if (row.get(key,Variant()).get_type()!=Variant::INT) return false;
|
||||
const int64_t excess=the_tree_native::signed_add(int64_t(row[n.density]),
|
||||
the_tree_native::signed_add(~int64_t(row[n.capacity]),1));
|
||||
dynamic=the_tree_native::signed_add(int64_t(row[n.dynamic]),
|
||||
signed_product(excess>0?excess:0,context.congestion));
|
||||
}
|
||||
const int64_t cost=the_tree_native::signed_add(int64_t(base),dynamic);
|
||||
Array pair;pair.push_back(neighbor);pair.push_back(cost);result.push_back(pair);
|
||||
// Same short circuit and first invalid prefix as the original method.
|
||||
if (cost<=0 || !indices.has(neighbor)) break;
|
||||
}
|
||||
shared[current]=result;rows=result;return true;
|
||||
}
|
||||
public:
|
||||
Dictionary guest_tree_edge_rows(Object *path,const Vector3i ¤t,const Array &layers,const Array &access) {
|
||||
const WalkEdgeNames names;WalkEdgeContext context;Array rows;
|
||||
Dictionary result;const StringName supported{"supported",false}, row_key{"rows",false};
|
||||
result[supported]=false;
|
||||
if (!walk_edge_context(names,path,layers,access,context) ||
|
||||
!builtin_walk_edge_rows(names,context,current,rows)) return result;
|
||||
result[supported]=true;result[row_key]=rows;return result;
|
||||
}
|
||||
private:
|
||||
Dictionary search_impl(const Array &cells, const Dictionary &indices, I start_index,
|
||||
const Dictionary &goals, const Callable &edge_provider, bool use_edge_cache) {
|
||||
Dictionary output;
|
||||
output[StringName("status")] = String("unusable");
|
||||
if (start_index < 0 || start_index >= cells.size() || !edge_provider.is_valid()) return output;
|
||||
try {
|
||||
std::vector<I> goal_indices;
|
||||
const Array goal_keys = goals.keys();
|
||||
for (I j = 0; j < goal_keys.size(); ++j)
|
||||
goal_indices.push_back(static_cast<I>(indices.get(goal_keys[j], I(-1))));
|
||||
Array arguments;
|
||||
arguments.resize(1);
|
||||
const WalkEdgeNames walk_names;WalkEdgeContext walk_context;
|
||||
if (edge_provider.get_method()==walk_names.provider && edge_provider.get_argument_count()==1 &&
|
||||
edge_provider.get_bound_arguments_count()==2 && edge_provider.get_unbound_arguments_count()==0) {
|
||||
const Array bound=edge_provider.get_bound_arguments();
|
||||
if (bound.size()==2 && bound[0].get_type()==Variant::ARRAY && bound[1].get_type()==Variant::ARRAY)
|
||||
walk_edge_context(walk_names,edge_provider.get_object(),bound[0],bound[1],walk_context);
|
||||
}
|
||||
// Call the original bound Godot edge method only when the search expands a node.
|
||||
// Preserve its lazy cache population, filter ordering and first invalid row.
|
||||
auto original_edges = [&](I current) {
|
||||
arguments[0] = cells[current];
|
||||
Array fused;bool fused_supported=false;
|
||||
if (cells[current].get_type()==Variant::VECTOR3I) {
|
||||
const Vector3i cell=cells[current];
|
||||
fused_supported=builtin_walk_edge_rows(walk_names,walk_context,cell,fused);
|
||||
}
|
||||
const Variant value = fused_supported ? Variant(fused) : edge_provider.callv(arguments);
|
||||
if (value.get_type() != Variant::ARRAY) return std::vector<Edge>{{-1, 0}};
|
||||
const Array rows = value;
|
||||
std::vector<Edge> result;
|
||||
result.reserve(rows.size());
|
||||
for (I j = 0; j < rows.size(); ++j) {
|
||||
if (rows[j].get_type() != Variant::ARRAY) { result.push_back({-1, 0}); break; }
|
||||
const Array row = rows[j];
|
||||
if (row.size() != 2 || row[1].get_type() != Variant::INT) {
|
||||
result.push_back({-1, 0}); break;
|
||||
}
|
||||
const I cost = static_cast<I>(row[1]);
|
||||
// Nonpositive cost is rejected before requesting the neighbor index.
|
||||
if (cost <= 0) { result.push_back({-1, cost}); break; }
|
||||
const I neighbor = static_cast<I>(indices.get(row[0], I(-1)));
|
||||
result.push_back({neighbor, cost});
|
||||
if (neighbor < 0) break;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
// Borrow cached rows only during the pure numeric edge loop.
|
||||
// No engine callback runs while that borrowed vector is traversed.
|
||||
std::vector<Edge> converted;
|
||||
auto edges = [&](I current) -> const std::vector<Edge>& {
|
||||
if (use_edge_cache) {
|
||||
const auto found = cached_edges.find(current);
|
||||
if (found != cached_edges.end()) return found->second;
|
||||
}
|
||||
converted = original_edges(current);
|
||||
// Preserve the returned conversion even if a reentrant provider
|
||||
// populated this cache key first. Never substitute its row here.
|
||||
if (use_edge_cache) cached_edges.emplace(current, converted);
|
||||
return converted;
|
||||
};
|
||||
const auto result = the_tree_native::search(cells.size(), start_index, goal_indices, edges);
|
||||
output[StringName("status")] = String(result.status.c_str());
|
||||
if (result.status != "usable") return output;
|
||||
PackedInt64Array costs, parents;
|
||||
if (costs.resize(result.costs.size()) != OK || parents.resize(result.parents.size()) != OK) {
|
||||
output[StringName("status")] = String("unusable");
|
||||
return output;
|
||||
}
|
||||
// Newly resized, private packed arrays own their writable storage.
|
||||
// A provider may shrink caller cells. Preserve the old written
|
||||
// prefix and resize-created zero tail, not the whole native vector.
|
||||
const I written_count=cells.size();
|
||||
if(written_count<=static_cast<I>(result.costs.size())) {
|
||||
std::copy_n(result.costs.begin(),written_count,costs.ptrw());
|
||||
std::copy_n(result.parents.begin(),written_count,parents.ptrw());
|
||||
} else {
|
||||
// Keep the original unsupported-growth path unchanged.
|
||||
for (I j=0;j<cells.size();++j) {costs.set(j,result.costs[j]);parents.set(j,result.parents[j]);}
|
||||
}
|
||||
TypedArray<int64_t> discovered, parent_discovered;
|
||||
for (I j : result.discovered) discovered.push_back(j);
|
||||
for (I j : result.parent_discovered) parent_discovered.push_back(j);
|
||||
Dictionary settled;
|
||||
for (I j : result.settled) settled[cells[j]] = true;
|
||||
output[StringName("cost_values")] = costs;
|
||||
output[StringName("parent_indices")] = parents;
|
||||
output[StringName("discovered")] = discovered;
|
||||
output[StringName("parent_discovered")] = parent_discovered;
|
||||
output[StringName("settled")] = settled;
|
||||
return output;
|
||||
} catch (const std::exception &) {
|
||||
output = Dictionary();
|
||||
output[StringName("status")] = String("unusable");
|
||||
return output;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void initialize_tree_numeric_core(ModuleInitializationLevel level) {
|
||||
if (level == MODULE_INITIALIZATION_LEVEL_SCENE) GDREGISTER_CLASS(TheTreeNumericCore);
|
||||
}
|
||||
void uninitialize_tree_numeric_core(ModuleInitializationLevel) {}
|
||||
|
||||
extern "C" {
|
||||
GDExtensionBool GDE_EXPORT tree_numeric_core_init(GDExtensionInterfaceGetProcAddress get_proc,
|
||||
GDExtensionClassLibraryPtr library, GDExtensionInitialization *initialization) {
|
||||
GDExtensionBinding::InitObject init(get_proc, library, initialization);
|
||||
init.register_initializer(initialize_tree_numeric_core);
|
||||
init.register_terminator(uninitialize_tree_numeric_core);
|
||||
init.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
|
||||
return init.init();
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+7
@@ -0,0 +1,7 @@
|
||||
[configuration]
|
||||
entry_symbol="tree_numeric_core_init"
|
||||
compatibility_minimum="4.7.2"
|
||||
reloadable=false
|
||||
|
||||
[libraries]
|
||||
macos.arm64="/private/tmp/TheTree-input-copy-r335-3afabc8ef9ee42d0be34994471a451b5/candidate.dylib"
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
[configuration]
|
||||
entry_symbol = "the_tree_numeric_library_init"
|
||||
compatibility_minimum = "4.7.2"
|
||||
reloadable = false
|
||||
|
||||
[libraries]
|
||||
macos.debug.arm64 = "/private/tmp/TheTree-input-copy-r335-3afabc8ef9ee42d0be34994471a451b5/candidate.dylib"
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 13711028791,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
BIN
Binary file not shown.
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"actual_captured_pids": [
|
||||
48850
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48850,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true
|
||||
}
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"pid": 48850,
|
||||
"started_utc": "2026-10-12T04:31:38.713646+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:44.010083+00:00",
|
||||
"wall_seconds": 5.29639375,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "501ad12badba237cbff60cf8d3b93d3efe9392872c76064644592b4473d1ef21",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 8420696875,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:38.713646+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48850,
|
||||
"ppid": 48787,
|
||||
"pgid": 48850,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 13711028791,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 8420696875,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:38.713646+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48850,
|
||||
"ppid": 48787,
|
||||
"pgid": 48850,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
BIN
Binary file not shown.
+15
@@ -0,0 +1,15 @@
|
||||
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys.gd"
|
||||
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
|
||||
func _initialize() -> void:
|
||||
if not Guard.activate(): quit(97); return
|
||||
super._initialize()
|
||||
func run() -> void:
|
||||
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
|
||||
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
|
||||
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
|
||||
available = available and probe != null and probe.has_method(&"project_guest_candidates")
|
||||
probe = null
|
||||
check(available, "exact native guest projection extension registered before diagnostic")
|
||||
if not available: quit(96); return
|
||||
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
|
||||
super.run()
|
||||
BIN
Binary file not shown.
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"Windows_accepted": false,
|
||||
"case_count": 4,
|
||||
"checks": 31,
|
||||
"failures": [],
|
||||
"fixtures": {
|
||||
"bytes": 435,
|
||||
"codec": "zstd",
|
||||
"field_deletions": 0,
|
||||
"file_envelope": false,
|
||||
"full_bytes_roundtrip": true,
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-measurement/fixtures.varbytes.zst",
|
||||
"sha256": "1ac9e053951ac0aee35ec6d9662c21ea3738077b5460612ae72973d67e095ee3",
|
||||
"uncompressed_bytes": 3256,
|
||||
"uncompressed_sha256": "7047978727b451ac7deef043d6126bf732530aca9f8f86377d92cb8ccf28b582"
|
||||
},
|
||||
"passed": true,
|
||||
"performance_accepted": false,
|
||||
"pid": 48850,
|
||||
"unit_accepted": false
|
||||
}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"name": "keys",
|
||||
"result": {
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"pid": 48850,
|
||||
"started_utc": "2026-10-12T04:31:38.713646+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:44.010083+00:00",
|
||||
"wall_seconds": 5.29639375,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "501ad12badba237cbff60cf8d3b93d3efe9392872c76064644592b4473d1ef21",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 8420696875,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:38.713646+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48850,
|
||||
"ppid": 48787,
|
||||
"pgid": 48850,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48850,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 13711028791,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48850,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
},
|
||||
"capture": {
|
||||
"actual_captured_pids": [
|
||||
48850
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48850,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true,
|
||||
"outer_receipt_written": true,
|
||||
"outer_receipt_error": null,
|
||||
"passed": true
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
|
||||
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-startup",
|
||||
"conditions": [
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true
|
||||
],
|
||||
"conditions_checked": 5,
|
||||
"custom_user_dir_name": "TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
|
||||
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
|
||||
"fresh_before_parent_initialize": true,
|
||||
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime/guard-probe",
|
||||
"profile_writes_before_guard": 0,
|
||||
"project_settings_persisted": false,
|
||||
"runtime_settings_only": true,
|
||||
"verified": true
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-pipeline-boundaries-r195.gd"
|
||||
const NEW_CASES := ["name_unicode","name_reverse","string_keys","mixed_keys"]
|
||||
func setup(label: String) -> void:
|
||||
super.setup("ordinary")
|
||||
var d = runtime.definition_registry.get_facility(&"finite.definition")
|
||||
if label == "name_unicode": d.inventory_inputs = {&"猫":0,&"A":0,&"é":0,&"あ":0,&"😀":0}
|
||||
elif label == "name_reverse": d.inventory_inputs = {&"z":0,&"m":0,&"a":0}
|
||||
elif label == "string_keys": d.inventory_inputs = {"z":0,"a":0}
|
||||
else: d.inventory_inputs = {&"z":0,"a":0,&"猫":0}
|
||||
func run() -> void:
|
||||
output=OS.get_environment("THE_TREE_RUNTIME_MONITOR_OUTPUT")
|
||||
runtime=root.get_node("SimulationRuntime");clock=root.get_node("GameClock")
|
||||
var raw := FileAccess.get_file_as_bytes(OS.get_environment("THE_TREE_REPLAY_SNAPSHOT")).decompress(11411840,FileAccess.COMPRESSION_ZSTD)
|
||||
var initial: Dictionary=bytes_to_var(raw)
|
||||
runtime.initialize(clock,root.get_node("GameState"),int(initial[&"systems"][&"runtime"][&"world_seed"]))
|
||||
check(runtime.restore_snapshot(initial),"fixed646 original seed/context restore")
|
||||
core=ClassDB.instantiate(&"TheTreeNumericCore")
|
||||
for label: String in NEW_CASES:
|
||||
setup(label)
|
||||
var before := var_to_bytes(state())
|
||||
var selected := project()
|
||||
var fallback := label.begins_with("custom_") or label=="path_observer"
|
||||
check(bool(selected.get(&"supported",false))==not fallback,label+" actual native domain")
|
||||
if fallback:check(var_to_bytes(state())==before,label+" rejection has no public effects")
|
||||
var got: Array=runtime._project_guest_candidates(&"finite.guest") if fallback else selected[&"candidates"]
|
||||
var after := var_to_bytes(state())
|
||||
var got_bytes := var_to_bytes(got)
|
||||
check(runtime.path_service._query_batch.is_empty(),label+" derived batch released")
|
||||
setup(label)
|
||||
check(var_to_bytes(state())==before,label+" same complete starting state")
|
||||
var expected: Array=runtime._project_guest_candidates_without_native(&"finite.guest")
|
||||
check(var_to_bytes(expected)==got_bytes,label+" complete ordered typed candidates")
|
||||
check(var_to_bytes(state())==after,label+" complete Runtime Path cache errors counters callback count")
|
||||
if label=="stairs150":check(int(got[0][&"travel_minutes"])==2,label+" stairs ceil150/100")
|
||||
elif label=="elevator151":check(int(got[0][&"travel_minutes"])==12,label+" elevator ceil((151+1floor*10minutes*100)/100)")
|
||||
elif label in ["stairs149","foreign150"]:check(int(got[0][&"travel_minutes"])==1,label+" ordinary movement retained")
|
||||
if label=="integer_wrap":check(int(got[0][&"expected_wait"])==9223372036854775805 and int(got[0][&"group_fit"])==-9223372036854775808,label+" signed multiplication wrap")
|
||||
if label=="clamp_low":check(got[0][&"expected_quality"]==0 and got[0][&"group_fit"]==0,label+" zero divisor guard and quality lower clamp")
|
||||
if label=="ordinary":
|
||||
check(got[0][&"expected_quality"]==100,label+" quality upper clamp")
|
||||
var protected_bytes := var_to_bytes(expected)
|
||||
got[0][&"facility_tags"].append(&"mutated");got[0][&"need_relief"].clear();got[0][&"path_handle"].clear()
|
||||
check(var_to_bytes(expected)==protected_bytes and runtime.definition_registry.get_facility(&"finite.definition").tags==[&"rest"],label+" owned returned tags relief and handle")
|
||||
records.append({"case":label,"native_supported":not fallback,"candidates":expected,"observer_calls":calls})
|
||||
core=null
|
||||
var report := {"passed":failures.is_empty(),"checks":checks,"failures":failures,"pid":OS.get_process_id(),"case_count":NEW_CASES.size(),"fixtures":typed("fixtures",records),"unit_accepted":false,"performance_accepted":false,"Windows_accepted":false}
|
||||
report["passed"]=failures.is_empty();report["checks"]=checks;report["failures"]=failures
|
||||
var file := FileAccess.open(output.path_join("report.json"),FileAccess.WRITE)
|
||||
if file==null:quit(98);return
|
||||
file.store_string(JSON.stringify(report,"\t"));file.close()
|
||||
print("Guest pipeline boundaries: %d checks, %d failures"%[checks,failures.size()]);quit(0 if failures.is_empty() else 1)
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 6979193458,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
|
||||
TextServer: Added interface "Dummy"
|
||||
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
|
||||
SDL: Init OK!
|
||||
Using "default" pen tablet driver...
|
||||
|
||||
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
|
||||
CORE API HASH: 2004498165
|
||||
EDITOR API HASH: 1696660745
|
||||
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd
|
||||
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' at thread -1
|
||||
SceneTreeFTI: traversal method DEFAULT
|
||||
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
|
||||
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
|
||||
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
|
||||
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
|
||||
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
|
||||
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
|
||||
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
|
||||
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
|
||||
Loaded system CA certificates
|
||||
PACK_PROFILE_GUARD verified=true
|
||||
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
|
||||
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
|
||||
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
|
||||
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
|
||||
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
|
||||
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
|
||||
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
|
||||
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
|
||||
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
|
||||
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
|
||||
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
|
||||
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
|
||||
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
|
||||
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
|
||||
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
|
||||
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
|
||||
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
|
||||
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
|
||||
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
|
||||
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
|
||||
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
|
||||
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
|
||||
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
|
||||
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
|
||||
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
|
||||
NATIVE_ADAPTER_LIBRARY_REGISTERED
|
||||
Guest batch point fixtures: 257 checks, 0 failures
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"actual_captured_pids": [
|
||||
48835
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48835,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true
|
||||
}
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"pid": 48835,
|
||||
"started_utc": "2026-10-12T04:31:36.026040+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:37.279118+00:00",
|
||||
"wall_seconds": 1.253067208,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "0421417c77aa8e3e402c09222a177085caafc77a8abbd3fc63f34a980e97f925",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 5733207583,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:36.026040+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48835,
|
||||
"ppid": 48787,
|
||||
"pgid": 48835,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 6979193458,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 5733207583,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:36.026040+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48835,
|
||||
"ppid": 48787,
|
||||
"pgid": 48835,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
WorkerThreadPool: 10 threads, 3 max low-priority.
|
||||
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
|
||||
TextServer: Added interface "Dummy"
|
||||
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
|
||||
SDL: Init OK!
|
||||
Using "default" pen tablet driver...
|
||||
|
||||
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
|
||||
CORE API HASH: 2004498165
|
||||
EDITOR API HASH: 1696660745
|
||||
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd
|
||||
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' at thread -1
|
||||
SceneTreeFTI: traversal method DEFAULT
|
||||
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
|
||||
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
|
||||
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
|
||||
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
|
||||
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
|
||||
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
|
||||
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
|
||||
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
|
||||
Loaded system CA certificates
|
||||
PACK_PROFILE_GUARD verified=true
|
||||
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
|
||||
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
|
||||
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
|
||||
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
|
||||
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
|
||||
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
|
||||
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
|
||||
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
|
||||
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
|
||||
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
|
||||
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
|
||||
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
|
||||
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
|
||||
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
|
||||
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
|
||||
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
|
||||
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
|
||||
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
|
||||
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
|
||||
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
|
||||
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
|
||||
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
|
||||
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
|
||||
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
|
||||
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
|
||||
NATIVE_ADAPTER_LIBRARY_REGISTERED
|
||||
Guest batch point fixtures: 257 checks, 0 failures
|
||||
XR: Clearing primary interface
|
||||
XR: Removed interface "Native mobile"
|
||||
XR: Removed interface "OpenXR"
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-access-prewarmed-fixtures-r182.gd"
|
||||
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
|
||||
func _initialize() -> void:
|
||||
if not Guard.activate(): quit(97); return
|
||||
super._initialize()
|
||||
func run() -> void:
|
||||
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
|
||||
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
|
||||
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
|
||||
available = available and probe != null and probe.has_method(&"project_guest_candidates")
|
||||
probe = null
|
||||
check(available, "exact native guest projection extension registered before diagnostic")
|
||||
if not available: quit(96); return
|
||||
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
|
||||
super.run()
|
||||
BIN
Binary file not shown.
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"candidate": "r121 unadopted",
|
||||
"candidate_adopted": false,
|
||||
"case_count": 19,
|
||||
"checks": 257,
|
||||
"failures": [],
|
||||
"fixtures": {
|
||||
"bytes": 1478,
|
||||
"codec": "zstd",
|
||||
"field_deletions": 0,
|
||||
"file_envelope": false,
|
||||
"full_bytes_roundtrip": true,
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-measurement/point-resolution-fixtures.varbytes.zst",
|
||||
"sha256": "9023bf17cee888109eb0b12660a7e527369618abcfab12b71962f8b2495c78de",
|
||||
"uncompressed_bytes": 47820,
|
||||
"uncompressed_sha256": "f769984e106db6834e147c4495b1cbb3f089a2ec19da404f7585303e7ebde077"
|
||||
},
|
||||
"limits": [
|
||||
"Finite differential ready-batch point resolution against original r79 nearest pipeline; no whole647, arbitrary mutation, general callback, wrapping, native lifetime, normal OS or Windows acceptance."
|
||||
],
|
||||
"passed": true,
|
||||
"performance_budget_accepted": false,
|
||||
"pid": 48835,
|
||||
"unit_accepted": false
|
||||
}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"name": "local",
|
||||
"result": {
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"pid": 48835,
|
||||
"started_utc": "2026-10-12T04:31:36.026040+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:37.279118+00:00",
|
||||
"wall_seconds": 1.253067208,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "0421417c77aa8e3e402c09222a177085caafc77a8abbd3fc63f34a980e97f925",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 5733207583,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:36.026040+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48835,
|
||||
"ppid": 48787,
|
||||
"pgid": 48835,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48835,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 6979193458,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48835,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
},
|
||||
"capture": {
|
||||
"actual_captured_pids": [
|
||||
48835
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48835,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true,
|
||||
"outer_receipt_written": true,
|
||||
"outer_receipt_error": null,
|
||||
"passed": true
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
|
||||
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-startup",
|
||||
"conditions": [
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true
|
||||
],
|
||||
"conditions_checked": 5,
|
||||
"custom_user_dir_name": "TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
|
||||
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
|
||||
"fresh_before_parent_initialize": true,
|
||||
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime/guard-probe",
|
||||
"profile_writes_before_guard": 0,
|
||||
"project_settings_persisted": false,
|
||||
"runtime_settings_only": true,
|
||||
"verified": true
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 4237877250,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
|
||||
TextServer: Added interface "Dummy"
|
||||
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
|
||||
SDL: Init OK!
|
||||
Using "default" pen tablet driver...
|
||||
|
||||
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
|
||||
CORE API HASH: 2004498165
|
||||
EDITOR API HASH: 1696660745
|
||||
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd
|
||||
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' at thread -1
|
||||
SceneTreeFTI: traversal method DEFAULT
|
||||
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
|
||||
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
|
||||
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
|
||||
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
|
||||
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
|
||||
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
|
||||
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
|
||||
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
|
||||
Loaded system CA certificates
|
||||
PACK_PROFILE_GUARD verified=true
|
||||
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
|
||||
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
|
||||
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
|
||||
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
|
||||
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
|
||||
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
|
||||
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
|
||||
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
|
||||
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
|
||||
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
|
||||
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
|
||||
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
|
||||
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
|
||||
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
|
||||
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
|
||||
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
|
||||
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
|
||||
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
|
||||
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
|
||||
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
|
||||
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
|
||||
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
|
||||
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
|
||||
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
|
||||
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
|
||||
NATIVE_ADAPTER_LIBRARY_REGISTERED
|
||||
Parent reconstruction boundaries: 93 checks, 0 failures
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"actual_captured_pids": [
|
||||
48803
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48803,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true
|
||||
}
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"pid": 48803,
|
||||
"started_utc": "2026-10-12T04:31:32.755887+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:34.536852+00:00",
|
||||
"wall_seconds": 1.7799485830000004,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "829ba8e177a70ab087c018ee4d2e80d352efa6a4efc99cdc0ecc7669f7be64a0",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 2464118916,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:32.755887+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48803,
|
||||
"ppid": 48787,
|
||||
"pgid": 48803,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 4237877250,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 2464118916,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:32.755887+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48803,
|
||||
"ppid": 48787,
|
||||
"pgid": 48803,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
WorkerThreadPool: 10 threads, 3 max low-priority.
|
||||
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
|
||||
TextServer: Added interface "Dummy"
|
||||
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
|
||||
SDL: Init OK!
|
||||
Using "default" pen tablet driver...
|
||||
|
||||
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
|
||||
CORE API HASH: 2004498165
|
||||
EDITOR API HASH: 1696660745
|
||||
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd
|
||||
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' at thread -1
|
||||
SceneTreeFTI: traversal method DEFAULT
|
||||
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
|
||||
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
|
||||
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
|
||||
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
|
||||
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
|
||||
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
|
||||
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
|
||||
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
|
||||
Loaded system CA certificates
|
||||
PACK_PROFILE_GUARD verified=true
|
||||
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
|
||||
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
|
||||
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
|
||||
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
|
||||
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
|
||||
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
|
||||
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
|
||||
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
|
||||
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
|
||||
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
|
||||
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
|
||||
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
|
||||
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
|
||||
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
|
||||
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
|
||||
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
|
||||
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
|
||||
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
|
||||
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
|
||||
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
|
||||
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
|
||||
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
|
||||
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
|
||||
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
|
||||
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
|
||||
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
|
||||
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
|
||||
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
|
||||
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
|
||||
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
|
||||
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
|
||||
NATIVE_ADAPTER_LIBRARY_REGISTERED
|
||||
Parent reconstruction boundaries: 93 checks, 0 failures
|
||||
XR: Clearing primary interface
|
||||
XR: Removed interface "Native mobile"
|
||||
XR: Removed interface "OpenXR"
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-reconstruction-parent-boundaries-r211.gd"
|
||||
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
|
||||
func _initialize() -> void:
|
||||
if not Guard.activate(): quit(97); return
|
||||
super._initialize()
|
||||
func run() -> void:
|
||||
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
|
||||
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
|
||||
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
|
||||
available = available and probe != null and probe.has_method(&"project_guest_candidates")
|
||||
probe = null
|
||||
check(available, "exact native guest projection extension registered before diagnostic")
|
||||
if not available: quit(96); return
|
||||
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
|
||||
super.run()
|
||||
BIN
Binary file not shown.
+23
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"case_count": 6,
|
||||
"checks": 93,
|
||||
"failures": [],
|
||||
"fixtures": {
|
||||
"bytes": 836,
|
||||
"codec": "zstd",
|
||||
"field_deletions": 0,
|
||||
"file_envelope": false,
|
||||
"full_bytes_roundtrip": true,
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-measurement/parent-fixtures.varbytes.zst",
|
||||
"sha256": "89451d49b00bb0e1df4e1c3e11e599148a5406c45eb58d5c24e026250288c470",
|
||||
"uncompressed_bytes": 10712,
|
||||
"uncompressed_sha256": "cddf529394d1e800c53c0ef51292ab33946ef2421449f0169f5d7220683687dd"
|
||||
},
|
||||
"limits": [
|
||||
"Six synthetic valid or permitted-conversion shapes only. Out-of-range/error-generating malformed inputs and arbitrary reentry remain outside this finite acceptance."
|
||||
],
|
||||
"passed": true,
|
||||
"performance_accepted": false,
|
||||
"pid": 48803,
|
||||
"unit_accepted": false
|
||||
}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"name": "parents",
|
||||
"result": {
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"pid": 48803,
|
||||
"started_utc": "2026-10-12T04:31:32.755887+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:34.536852+00:00",
|
||||
"wall_seconds": 1.7799485830000004,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "829ba8e177a70ab087c018ee4d2e80d352efa6a4efc99cdc0ecc7669f7be64a0",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 2464118916,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:32.755887+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48803,
|
||||
"ppid": 48787,
|
||||
"pgid": 48803,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48803,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 4237877250,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48803,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
},
|
||||
"capture": {
|
||||
"actual_captured_pids": [
|
||||
48803
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48803,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true,
|
||||
"outer_receipt_written": true,
|
||||
"outer_receipt_error": null,
|
||||
"passed": true
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
|
||||
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-startup",
|
||||
"conditions": [
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true
|
||||
],
|
||||
"conditions_checked": 5,
|
||||
"custom_user_dir_name": "TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
|
||||
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
|
||||
"fresh_before_parent_initialize": true,
|
||||
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime/guard-probe",
|
||||
"profile_writes_before_guard": 0,
|
||||
"project_settings_persisted": false,
|
||||
"runtime_settings_only": true,
|
||||
"verified": true
|
||||
}
|
||||
BIN
Binary file not shown.
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 20043365916,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
BIN
Binary file not shown.
+39
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"actual_captured_pids": [
|
||||
48887
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48887,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true
|
||||
}
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
{
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"pid": 48887,
|
||||
"started_utc": "2026-10-12T04:31:45.343072+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:50.344666+00:00",
|
||||
"wall_seconds": 5.001550541,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "15bcd2516627e27cd4a8fc9d12d02dac864c0a6998e6d1298c529161b6724a5d",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 15049963083,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:45.343072+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48887,
|
||||
"ppid": 48787,
|
||||
"pgid": 48887,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 20043365916,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 15049963083,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:45.343072+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48887,
|
||||
"ppid": 48787,
|
||||
"pgid": 48887,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
}
|
||||
BIN
Binary file not shown.
+15
@@ -0,0 +1,15 @@
|
||||
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-pipeline-runtime-r190.gd"
|
||||
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
|
||||
func _initialize() -> void:
|
||||
if not Guard.activate(): quit(97); return
|
||||
super._initialize()
|
||||
func run() -> void:
|
||||
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
|
||||
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
|
||||
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
|
||||
available = available and probe != null and probe.has_method(&"project_guest_candidates")
|
||||
probe = null
|
||||
check(available, "exact native guest projection extension registered before diagnostic")
|
||||
if not available: quit(96); return
|
||||
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
|
||||
super.run()
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"Windows_accepted": false,
|
||||
"after_evaluation": {
|
||||
"bytes": 240032,
|
||||
"codec": "zstd",
|
||||
"field_deletions": 0,
|
||||
"file_envelope": false,
|
||||
"full_bytes_roundtrip": true,
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-measurement/after-evaluation.varbytes.zst",
|
||||
"sha256": "1a88f7ed27d1d32102c6fe3a9533221d2565191712ed15b631190479d1d41505",
|
||||
"uncompressed_bytes": 11411840,
|
||||
"uncompressed_sha256": "c0830afde6ca25d8d36b1d61c4dc32f5161eba93a0e76646724645bd61554606"
|
||||
},
|
||||
"batch_released": true,
|
||||
"candidate_adopted": false,
|
||||
"candidate_count": 150,
|
||||
"candidates": {
|
||||
"bytes": 1498,
|
||||
"codec": "zstd",
|
||||
"field_deletions": 0,
|
||||
"file_envelope": false,
|
||||
"full_bytes_roundtrip": true,
|
||||
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-measurement/candidates.varbytes.zst",
|
||||
"sha256": "d636067f11f70a82ae7d928d2463bc3c2a4107b1d63d1baaed065c8ef93b87d2",
|
||||
"uncompressed_bytes": 105808,
|
||||
"uncompressed_sha256": "3f94a15cb2c508660a2cbdb2558f93be7a1ce50bd6803a0861015d99a6a86a02"
|
||||
},
|
||||
"checks": 23,
|
||||
"failures": [],
|
||||
"guest_id": "diag.guest.101",
|
||||
"limits": [
|
||||
"One selected guest only, no decide or clock progression. No whole647 query reason attribution.",
|
||||
"Inclusive timers overlap and include instrumentation overhead; do not add them or treat them as production performance budgets.",
|
||||
"r38 isolated indexed-edges nearest-access batch; empty derived cache after restore, no Main/UI/OS/x3 acceptance."
|
||||
],
|
||||
"normal_OS_x3_accepted": false,
|
||||
"passed": true,
|
||||
"performance_budget_accepted": false,
|
||||
"pid": 48887,
|
||||
"point_query_cache_misses": 184,
|
||||
"projection_us": 47768,
|
||||
"start_cell": "(-6, -2, 0)",
|
||||
"unit_accepted": false
|
||||
}
|
||||
+185
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"name": "runtime",
|
||||
"result": {
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"pid": 48887,
|
||||
"started_utc": "2026-10-12T04:31:45.343072+00:00",
|
||||
"ended_utc": "2026-10-12T04:31:50.344666+00:00",
|
||||
"wall_seconds": 5.001550541,
|
||||
"exit_code": 0,
|
||||
"helper_exit_code": 0,
|
||||
"timed_out": false,
|
||||
"stdout_sha256": "15bcd2516627e27cd4a8fc9d12d02dac864c0a6998e6d1298c529161b6724a5d",
|
||||
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"error_lines": [],
|
||||
"owned_popen_ended": true,
|
||||
"old_helper_engine_ended": true,
|
||||
"start_receipt_written": true,
|
||||
"end_receipt_written": true,
|
||||
"lifecycle_error": null,
|
||||
"old_helper_lifecycle_error": null,
|
||||
"actual_start_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_STARTED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 15049963083,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"started_utc": "2026-10-12T04:31:45.343072+00:00",
|
||||
"current_process_identity": {
|
||||
"pid": 48887,
|
||||
"ppid": 48787,
|
||||
"pgid": 48887,
|
||||
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
},
|
||||
"live_identity_exact": true,
|
||||
"tracked_child_ended_before_initial_probe": false,
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"actual_end_binding": {
|
||||
"scope": "isolated diagnostic owned child",
|
||||
"event": "ENGINE_ENDED",
|
||||
"actual_pid": 48887,
|
||||
"owner_pid": 48787,
|
||||
"command": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"monotonic_ns": 20043365916,
|
||||
"exit_code": 0,
|
||||
"actual_process_exit_code": 0,
|
||||
"engine_ended": true,
|
||||
"timed_out": false,
|
||||
"lifecycle_error": null,
|
||||
"start_receipt_written": true,
|
||||
"pid": 48887,
|
||||
"argv": [
|
||||
"/Applications/Godot.app/Contents/MacOS/Godot",
|
||||
"--headless",
|
||||
"--path",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
|
||||
"--script",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
|
||||
"--verbose",
|
||||
"--log-file",
|
||||
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
|
||||
],
|
||||
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
|
||||
"signal_scope": "tracked Popen child only; no external group signal"
|
||||
},
|
||||
"strict_native_diagnostics": {
|
||||
"errors": [],
|
||||
"banner_count": 1,
|
||||
"known_unicode_diagnostic_count": 0,
|
||||
"unrecognized_unicode_diagnostic_count": 0,
|
||||
"exit_leak_diagnostic_lines": []
|
||||
},
|
||||
"external_process_or_group_signals": 0,
|
||||
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
|
||||
"adapter_owned_cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"adapter_error": null,
|
||||
"old_helper_bytes_preserved": true,
|
||||
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
|
||||
"explicit_helper_wait_timeouts_preserved": true,
|
||||
"additional_cleanup_wait_timeout_seconds": 5,
|
||||
"additional_cleanup_max_attempts": 3
|
||||
},
|
||||
"capture": {
|
||||
"actual_captured_pids": [
|
||||
48887
|
||||
],
|
||||
"cleanup": [
|
||||
{
|
||||
"pid": 48887,
|
||||
"cleanup": {
|
||||
"owned_child_created": true,
|
||||
"engine_ended": true,
|
||||
"actual_process_exit_code": 0,
|
||||
"attempts": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"kill_attempted": false,
|
||||
"wait_timeout_seconds": 5,
|
||||
"wait_completed": true,
|
||||
"errors": [],
|
||||
"poll_before": 0,
|
||||
"wait_returned_code": 0,
|
||||
"poll_after": 0
|
||||
}
|
||||
],
|
||||
"errors": []
|
||||
},
|
||||
"outer_cleanup_errors": [],
|
||||
"engine_ended": true,
|
||||
"outer_maximum_helper_invocations": 3,
|
||||
"helper_maximum_waits": 3,
|
||||
"per_wait_timeout_seconds": 5,
|
||||
"foreign_process_or_group_signals": 0
|
||||
}
|
||||
],
|
||||
"adapter_exception": null,
|
||||
"all_captured_ended": true,
|
||||
"outer_cleanup_errors": [],
|
||||
"foreign_process_or_group_signals": 0,
|
||||
"all_cleanup_before_outer_receipt": true,
|
||||
"outer_receipt_written": true,
|
||||
"outer_receipt_error": null,
|
||||
"passed": true
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
|
||||
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-startup",
|
||||
"conditions": [
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true
|
||||
],
|
||||
"conditions_checked": 5,
|
||||
"custom_user_dir_name": "TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
|
||||
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
|
||||
"fresh_before_parent_initialize": true,
|
||||
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime/guard-probe",
|
||||
"profile_writes_before_guard": 0,
|
||||
"project_settings_persisted": false,
|
||||
"runtime_settings_only": true,
|
||||
"verified": true
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
# coding: utf-8
|
||||
"""One finite cold native guest projection QA against original Runtime golden; no full regression."""
|
||||
from pathlib import Path
|
||||
import hashlib, importlib.util, json, os, shutil, subprocess, sys, uuid
|
||||
sys.dont_write_bytecode=True
|
||||
R=Path(__file__).resolve().parents[2];A=R/'artifacts/original-completion-2026-10-02'
|
||||
O=A/'p23-02-native-input-copy-local-r335';D=R/'docs/plans/original-completion-2026-10-02'
|
||||
NAMES=['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json']
|
||||
def mod(name,path):
|
||||
s=importlib.util.spec_from_file_location(name,path);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m
|
||||
def unpack(ref):
|
||||
raw=subprocess.run(['/opt/homebrew/bin/zstd','-d','-q','-c',ref['path']],capture_output=True,check=True,timeout=10).stdout
|
||||
assert len(raw)==ref['uncompressed_bytes'] and hashlib.sha256(raw).hexdigest()==ref['uncompressed_sha256']
|
||||
return raw
|
||||
def main():
|
||||
r=mod('impact_runner',R/'tools/run_all_tests.py');outer=mod('impact_owned',r.SUPPORT/'owned_outer.py');plan=r.read(O/'input.json')
|
||||
assert not (O/'execution.json').exists()
|
||||
fixed=plan['pins'];source=r.source_refs(R);player=r.default_player(R);docs={n:r.sha(D/n) for n in NAMES}
|
||||
assert source==plan['source_before'] and player==plan['default_before'] and docs==plan['doc4_before']
|
||||
stage=Path(plan['stage']);parent=Path(plan['parent']);public=(stage/'project.godot').read_bytes()
|
||||
def protect():
|
||||
assert r.source_refs(R)==source and r.default_player(R)==player and {n:r.sha(D/n) for n in NAMES}==docs
|
||||
assert r.inventory(parent,stage=True)==plan['expected_stage'] and r.inventory(stage,stage=True)==plan['expected_stage']
|
||||
assert r.inventory(r.SUPPORT)==plan['support_inventory']
|
||||
for key,q in fixed.items():
|
||||
p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'],key
|
||||
protect()
|
||||
review=r.read(Path(fixed['host_review']['path']))
|
||||
assert not review['blockers'] and review['host_build_accepted']
|
||||
pre=r.read(A/'p23-02-native-input-copy-local-preexecution-independent-review-r335.json')
|
||||
assert pre['execution_allowed'] and not pre['blockers']
|
||||
for group in ('evidence_sha256','canonical_doc4_context_pins'):
|
||||
for q in pre[group].values():
|
||||
p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256']
|
||||
assert r.read(O/'preexecution-root-verification.json')['passed']
|
||||
phases=[];samples=[];error=None;cleanup=[];cleanup_errors=[]
|
||||
try:
|
||||
for spec in plan['specs']:
|
||||
name=spec['name'];protect()
|
||||
assert sum(p.stat().st_size for p in O.rglob('*') if p.is_file())<=16*1048576
|
||||
assert not outer.native.helper['live_engines']() and shutil.disk_usage(A).free >= plan['capacity_floor_bytes']
|
||||
output=O/(name+'-measurement');output.mkdir();ident=uuid.uuid4().hex
|
||||
startup='TheTree-PCK-tests-'+ident+'-impact-startup';profile='TheTree-PCK-tests-'+ident+'-impact-runtime'
|
||||
assert not r.profile_path(startup).exists() and not r.profile_path(profile).exists()
|
||||
env=r.fresh_environment(os.environ)
|
||||
env.update(THE_TREE_PACK_PROFILE_NAME=profile,THE_TREE_PACK_PROFILE_EXPECTED=str(r.profile_path(profile)),THE_TREE_PACK_PROFILE_REPORT=str(O/(name+'-profile.json')),THE_TREE_RUNTIME_MONITOR_OUTPUT=str(output),THE_TREE_REPLAY_SNAPSHOT=fixed['fixture']['path'],THE_TREE_CANDIDATE_ORACLE=fixed['oracle']['path'],THE_TREE_PAIRED_CANDIDATE='r333-library334',THE_TREE_PAIRED_SAMPLE=name)
|
||||
(stage/'project.godot').write_bytes(r.private_project(public,startup));phase=O/name
|
||||
argv=[fixed['engine']['path'],'--headless','--path',str(stage),'--script',fixed['starter_'+name]['path'],'--verbose','--log-file',str(phase/'engine-native.log')]
|
||||
result,capture=outer.run_phase(argv,phase,90,env,now_fn=r.now,dump_fn=r.write,sha_fn=r.sha,live_engines_fn=outer.native.helper['live_engines'])
|
||||
row=dict(name=name,result=result,capture=capture);phases.append(row);r.write(O/(name+'-phase.json'),row)
|
||||
report_path=output/'report.json';report=r.read(report_path) if report_path.exists() else None
|
||||
if report is not None:samples.append(dict(name=name,report=report))
|
||||
assert result is not None and result['exit_code']==0 and not result['error_lines'] and not result['timed_out'] and capture['passed']
|
||||
logs=''.join((phase/n).read_text() for n in ['stdout.log','stderr.log','engine-native.log'])
|
||||
assert 'Orphan StringName:' not in logs and 'unclaimed string names' not in logs
|
||||
assert report and report['passed'] and not report['failures'] and report['pid']==result['pid'] and report['checks']==spec['expected_checks']
|
||||
assert (phase/'stdout.log').read_text().count(spec['label']+'%d checks, 0 failures'%report['checks'])==1
|
||||
assert (phase/'stdout.log').read_text().count('NATIVE_ADAPTER_LIBRARY_REGISTERED')==1
|
||||
r.profile_gate(r.profile_path(profile),O/(name+'-profile.json'),profile)
|
||||
if name=='runtime':
|
||||
golden=r.read(Path(fixed['golden_runtime']['path']))
|
||||
for field in ['candidates','after_evaluation']:assert unpack(report[field])==unpack(golden[field]),field+' full typed golden'
|
||||
assert report['candidate_count']==150 and report['batch_released']
|
||||
else:
|
||||
assert report['case_count']==spec['case_count']
|
||||
unpack(report['fixtures'])
|
||||
assert sum(p.stat().st_size for p in O.rglob('*') if p.is_file())<=16*1048576
|
||||
(stage/'project.godot').write_bytes(public);protect()
|
||||
except BaseException as caught:error=type(caught).__name__+': '+str(caught)
|
||||
finally:
|
||||
cleanup,cleanup_errors=outer.finish_captured(outer.OWNED)
|
||||
if all(q['engine_ended'] is True for q in cleanup):(stage/'project.godot').write_bytes(public)
|
||||
else:cleanup_errors.append('Project restoration refused while owned child remains live')
|
||||
guard_errors=[]
|
||||
try:protect()
|
||||
except BaseException as caught:guard_errors.append(type(caught).__name__+': '+str(caught))
|
||||
passed=error is None and not guard_errors and not cleanup_errors and len(phases)==4 and len(samples)==4
|
||||
r.write(O/'execution.json',dict(passed=passed,error=error,guard_errors=guard_errors,phases=phases,samples=samples,cleanup=cleanup,cleanup_errors=cleanup_errors,input_source_default_doc4_preserved=not guard_errors,candidate_adopted=False,unit_accepted=False,performance_accepted=False,normal_OS_accepted=False,Windows_accepted=False,limitations=['Four finite local QA engines for r333/library334: six parent shapes,19 nearest paths,4 input-key projection shapes and150 Runtime candidates/full evaluation state. Not invalid-index errors, arbitrary reentry, whole647, performance, full172, OS, Windows or adoption.']))
|
||||
print(json.dumps(dict(passed=passed,error=error,guard_errors=guard_errors)),flush=True);return 0 if passed else 1
|
||||
if __name__=='__main__':raise SystemExit(main())
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user