Godot 4.7 stable / Windows x64 限定 / 正式 Gua 1.2.0。issue #1 のアクション QA サンプルです。仮素材で実装しています。
荷物を拾い、足場とプレスを越え、緑の配送口へ届けます。基本移動、コンベアを含む運搬、配送口と危険ゲートが近接する複合障害の3ステージです。
DeliveryFactory-windows.zip をフォルダごと展開し、DeliveryFactory.exe を実行してください。Gua の DLL とライセンスも同梱されるため EXE だけを別フォルダへ移動しないでください。
| 操作 | キー |
|---|---|
| 左右移動 | A/D または ←/→ |
| ジャンプ | Space(長押しで高く、離すと上昇を抑える) |
| 近くの荷物の取得/設置 | E(押した瞬間) |
| ポーズ/再開・設定・保存 | Esc または右上の Ⅱ |
タイトルの「配送を開始」から開始します。荷物を配送口へ運ぶと次のステージへ進み、3回配送すると結果画面です。「もう一度プレイ」で同じ seed とバグ設定の新しい周回を開始します。初期状態へのリセットはタイトルに戻ります。seed と個別バグはタイトルで設定できます。通常版のバグ設定はすべて OFF です。
荷物運搬中は移動とジャンプが弱まります。穴を越える足場は上から着地できます。旗を通過して接地するとチェックポイントが確定します。プレスの赤表示と配送口脇の赤ゲートが危険な時間です。停止して安全な周期を待ちましょう。
ポーズ中にセーブ/ロードできます。物理 tick、位置・速度、荷物、チェックポイント、進行、死亡回数、seed、バグ設定、直前入力を保存し、プレイ状態のロード後は一時停止します。ロード前のデータ検証に失敗したら変更しません。保存は一時ファイルから置換します。
日本語/英語と 960×600・1152×720・1440×900 を選択できます。設定は次回起動に持ち越します。標準保存先は %APPDATA%/GuaAction2DFactory、検証では FACTORY_SAVE_DIR に担当専用ディレクトリを指定します。UI は 1152×720 を基準にスケールします。日本語フォント M PLUS 1p は SIL OFL 同梱です。
既存 Godot 4.7 と同版の Windows export template、PowerShell 7、.NET 10 SDK を使用します。ゲームは GDScript のままです。Node.js と自作 JS wire client は現在のテストには使いません。依存キャッシュ・保存先・出力は checkout 内へ分離します。
./scripts/install-gua.ps1
./scripts/verify.ps1
./scripts/run-source-tests.ps1 -Restore # 正式C# APIでsource sceneの固定回帰
./scripts/build-windows.ps1
./scripts/run-exe-smoke.ps1 # 起動・実build-info・同梱DLL/hash検査build/windows/ が配布フォルダ、build/DeliveryFactory-windows.zip が配布 ZIP、output/build-sha256.txt に EXE の SHA256 を出力します。テンプレートが既定場所にない場合、build-windows.ps1 -TemplateDirectory <既存テンプレートフォルダ> を使用します。CI では同じ公式 Godot のハッシュ検証済み配布を専用 runner に取得します。
verify.ps1 は import、32項目の内部モデル検証、source起動 smoke を行います。これはGua UI/E2Eの証拠とは別です。run-source-tests.ps1 は正式 NuGet Gua.Testing.Godot 1.2.0 / Gua.Testing 1.2.0 と NUnit を使用します。GodotSceneTestHost で res://main.tscn を起動し、正式 Locator/guarded UI・入力、Observe、World、仮想時計で開始・保存復元・境界・個別バグ・結果からの再プレイを確認します。TRXと公式APIのJSON添付は output/source-regression-results/ と output/source-regression/ へ保存します。source sceneの検証であり、配布EXEの受入とは呼びません。
build-windows.ps1 は run-exe-smoke.ps1 で実EXEの起動、compiled build-info、同梱DLLの公式addonとのhash一致を検査し、sample-build-manifest.json をZIPへ同梱します。このmanifestは全同梱ファイルのhashと実測Gua identityを記録するサンプル側の記録であり、上流Gua manifestやPlaytest attestationではありません。公開addon ZIPには上流のbuild manifestが含まれないため、固定archive SHA256と実runtimeの get_build_info() を併用します。run-exe-smoke.ps1 単独はエラーログなく終了することも確認します。操作、探索、目標判定、外部接続の保証、Playtestの合格判定は行いません。
CIは gua-tester の setup-godot と link-gua-gdscript-addon(v3.2 commit固定)を使い、Godot4.7/Gua1.2.0を固定します。単体回帰、正式C# source回帰、export、限定配布smokeを別stepにします。Windows hosted editor終了時のnative拡張クラッシュ(0xC0000005)への対処として、importだけ拡張ロードとcacheを分離し、exportには公式recovery modeを使用します。source回帰では正式Guaを有効に戻します。これは根本原因の解消を意味しません。PowerShellからのimport/exportは同じ公式配布のconsole EXEで終了を待ち、nonzero exitを失敗とします。生成EXEの最小SDK smokeは開始UIとmove一回による変位だけを確認します。
テスト用サンプルは公開 Development / remote ON / Debug上限 SDKを明示的に使用します。Gua sourceの通常出荷既定 Shipping/OFFとは異なり、一般配布の安全な既定構成を表すものではありません。起動時に get_build_info() のflavor/remoteEnabled/remotePermissionCeiling/sourceCommitを検査します。Gua sourceは 2e12fb3cfdf822418f349515027d6f620c5ee63b 固定。Release最適化やDLL同梱だけで遠隔可能とは判定しません。port/envでShippingを再有効化しません。Player限定版ではないため、Player権限だけの実行適合は別途未検証です。
最小EXE接続smoke(build後、repo root、.NET10が必要):
$env:FACTORY_PROJECT_DIR = "$pwd"
$env:FACTORY_SMOKE_EXE = "$pwd/build/windows/DeliveryFactory.exe"
$env:NUGET_PACKAGES = "$pwd/.deps/nuget"
$env:DOTNET_CLI_HOME = "$pwd/output/dotnet-home"
$env:DOTNET_GENERATE_ASPNET_CERTIFICATE = 'false'
dotnet test tests/dotnet/Factory.Regression.Tests.csproj --no-restore --filter TestCategory=ExeMigrationSmoke --logger 'trx;LogFileName=exe-smoke.trx' --results-directory output/exe-migration-resultsこのfixtureは専用port18245・保存先でheadless EXEを一つ起動し、正式SDKで接続→通常start→move一回の変位だけを確認し、所有session/processを破棄します。探索・Scenario・予算・Trace/Replay・Playtest cleanup検証を実装しません。実時間hold後の明示releaseでは相関完了がEnqueuedのままtimeoutする現象があり、release/lease/切断時cleanupの保証はこのsmokeの成功に含めません。固定時計source回帰のrelease成功と区別します。
このサンプルはゲーム本体と再現条件・独立した期待値を提供します。配布EXEの launch/attach、Scenario/Environment、探索、予算・中断・cleanup、Trace/Recording/Replay、製品としてのRun/Resultは Gua Playtest側 の責務です。このrepoにはその代替Runnerを追加しません。Playtest未完成部分を独自実装で埋めず、未実行E2Eとして残します。
テスト責務と判定契約 と Playtest接続情報・独立期待値 を参照してください。過去のEXE試行は PRの証拠対応 に分離し、現在のsource回帰やPlaytest E2Eの成功とは区別します。
ブリッジは専用 ws://127.0.0.1:18241(GUA_BRIDGE_PORT で変更可能)。同時実行はポート・保存先を分離してください。通常起動では実時間を固定60Hzの accumulator に反映し、1描画で最大0.1秒を処理します。大きな描画停止による負荷連鎖を抑えるため、実時間と simulation tick は同一とは限りません。
DeliveryFactory.exe -- --fixed-clock は Gua virtual clock を停止状態で導入し、標準 clock_run_for で60Hzの同じゲーム処理を進めます。UI は停止中も動きます。ポーズは物理・コンベア・プレス周期・死亡からの復帰を停止します。入力リースは Gua の実時間で管理され、仮想時計とは別です。
標準 Semantic UI でメニュー、標準 Game Input の move(axis1d)、jump、interact で通常プレイを操作します。World Tree の robot / cargo / platform / press / goal / checkpoint に標準位置を発行します。追加状態は正式 Observe の world owner で登録し、独自の公開範囲判定や「クリア」API は実装していません。Observe は既定の Debug 登録です。Player 公開・非公開の判断は Gua の既存プロトコルに従います。
テストは正式SDKが返す相関済み完了を待ち、その完了後のUI・World・Observe公開とavailable状態を揃えてから判定します。Observeの利用不能やtimeoutを成功に読み替えません。C#のTimeSpanが100ns精度のため、source回帰の時計stepは1/60秒を上へ丸めた16.6667msです。物理処理はゲーム側の固定60Hzだけで実行します。
| 文書 | 役割 |
|---|---|
| docs/testing.md | テスト責務・実行方法・正式API・同期と判定制約 |
| docs/test-matrix.md | 初期条件・手順・独立期待値・seed・バグ設定・実行層 |
| docs/playtest-handoff.md | Playtest接続条件・独立期待値・未実行範囲 |
| docs/design.md | ゲーム固有の設計判断と既知バグ |
実行ごとの結果は PRの検証結果、過去buildと証拠の対応は PRの保存記録 を参照してください。未実施の EXE・画像・探索・人間操作検証をモデルテストの成功で代用しません。音は仮素材段階では実装していないため、音による判断・音質は対象外です。3本のサンプルでゲーム QA 全般の網羅は主張しません。