diff --git a/README.md b/README.md index 84ef7db..1447873 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ Der mitgelieferte Logiktest lässt sich bei Bedarf mit `godot --headless --path Für reproduzierbare Windows-Builds steht `packaging/windows/build.ps1` bereit. Godot und NSIS werden als Parameter übergeben; das Skript exportiert das Spiel, erstellt den Installer und gibt anschließend Größe und SHA-256-Prüfsumme aus. Die manuellen Freigabeprüfungen stehen in `ALPHA_TEST_CHECKLIST.md`. -Die Hinweise zum aktuellen Windows-Testbuild stehen in `RELEASE_NOTES_0.1.0-alpha.7.md`. +Die Hinweise zum aktuellen Windows-Testbuild stehen in `RELEASE_NOTES_0.1.0-alpha.8.md`. ## Werbung und Datenschutz diff --git a/RELEASE_NOTES_0.1.0-alpha.8.md b/RELEASE_NOTES_0.1.0-alpha.8.md new file mode 100644 index 0000000..b795be0 --- /dev/null +++ b/RELEASE_NOTES_0.1.0-alpha.8.md @@ -0,0 +1,12 @@ +# Void Bastion 0.1.0-alpha.8 + +## Fehlerbehebung für Windows-Updates + +- Der Windows-Export wurde frisch erzeugt und anschließend vor dem Verpacken headless gestartet, um beschädigte eingebettete Projektdaten zu erkennen. +- Das Buildskript bricht künftig ab, wenn `project.binary` nicht geladen werden kann; ein fehlerhafter NSIS-Installer wird so nicht mehr gebaut. +- Enthält die Spiel- und Balance-Änderungen aus Alpha 7. + +## Testhinweise + +- Der exportierte Windows-Build wurde headless gestartet und konnte die eingebetteten Godot-Projektdaten laden. +- Smoke-Test und Nakama-Simulation wurden ausgeführt. diff --git a/export_presets.cfg b/export_presets.cfg index 6fc2779..dd0d152 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -24,8 +24,8 @@ application/modify_resources=true application/icon="res://assets/app_icon.png" application/console_wrapper_icon="" application/icon_interpolation=4 -application/file_version="0.1.0.7" -application/product_version="0.1.0.7" +application/file_version="0.1.0.8" +application/product_version="0.1.0.8" application/company_name="GerGames" application/product_name="Void Bastion" application/file_description="Void Bastion – Alpha-Testversion" diff --git a/packaging/windows/build.ps1 b/packaging/windows/build.ps1 index 16e633b..3229707 100644 --- a/packaging/windows/build.ps1 +++ b/packaging/windows/build.ps1 @@ -53,6 +53,15 @@ try { if ($LASTEXITCODE -ne 0 -or -not (Test-Path -LiteralPath $gameExe)) { throw "Der Godot-Windows-Export ist fehlgeschlagen." } + + # Prüft, dass Godot die eingebetteten Projektdaten tatsächlich laden kann, + # bevor NSIS daraus einen Installer erstellt. Ein bloß vorhandenes EXE reicht + # nicht: ein defektes project.binary würde erst beim Start des Spiels auffallen. + $launchOutput = & $gameExe --headless --quit 2>&1 | Out-String + $launchExitCode = $LASTEXITCODE + if (($null -ne $launchExitCode -and $launchExitCode -ne 0) -or $launchOutput -match "Corrupted header in binary project\.binary|Couldn't load project data|Is the \.pck file missing") { + throw "Der exportierte Windows-Build kann seine Projektdaten nicht laden. NSIS-Installer wurde nicht erstellt. Ausgabe: $launchOutput" + } } finally { Set-Content -LiteralPath $projectFile -Value $projectConfiguration -NoNewline diff --git a/packaging/windows/installer.nsi b/packaging/windows/installer.nsi index f8d4e02..f3a4368 100644 --- a/packaging/windows/installer.nsi +++ b/packaging/windows/installer.nsi @@ -6,7 +6,7 @@ RequestExecutionLevel user !include "LogicLib.nsh" !define PRODUCT_NAME "Void Bastion" -!define PRODUCT_VERSION "0.1.0-alpha.7" +!define PRODUCT_VERSION "0.1.0-alpha.8" !define PRODUCT_PUBLISHER "GerGames" !define PRODUCT_WEBSITE "https://void-bastion.gergames.de/" !define PRODUCT_EXE "Void-Bastion.exe" @@ -21,7 +21,7 @@ BrandingText "GerGames" ShowInstDetails show ShowUninstDetails show -VIProductVersion "0.1.0.7" +VIProductVersion "0.1.0.8" VIAddVersionKey /LANG=1031 "ProductName" "${PRODUCT_NAME}" VIAddVersionKey /LANG=1031 "CompanyName" "${PRODUCT_PUBLISHER}" VIAddVersionKey /LANG=1031 "FileDescription" "${PRODUCT_NAME} Setup" diff --git a/project.godot b/project.godot index 191db22..89eb375 100644 --- a/project.godot +++ b/project.godot @@ -15,7 +15,7 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true [application] config/name="Void Bastion" -config/version="0.1.0-alpha.7" +config/version="0.1.0-alpha.8" run/main_scene="res://main.tscn" config/features=PackedStringArray("4.7") config/icon="res://assets/app_icon.png" diff --git a/tests/smoke_test.gd b/tests/smoke_test.gd index f266d4e..7234718 100644 --- a/tests/smoke_test.gd +++ b/tests/smoke_test.gd @@ -141,10 +141,10 @@ func _run() -> void: assert(game.get("game_mode") == "menu", "Die Bestenliste benötigt einen funktionierenden Zurück-Button.") assert(not account_manager.player_id.is_empty(), "Beim ersten Start muss automatisch ein stabiles Gastprofil angelegt werden.") assert(not account_manager.display_name.is_empty(), "Das Gastprofil benötigt einen sichtbaren Pilotennamen.") - assert(game.call("_app_version") == "0.1.0-alpha.7", "Profil, Installer und Online-Übertragung müssen dieselbe Alpha-Version verwenden.") + assert(game.call("_app_version") == "0.1.0-alpha.8", "Profil, Installer und Online-Übertragung müssen dieselbe Alpha-Version verwenden.") var support_url: String = game.call("_support_email_url") assert(support_url.begins_with("mailto:support@gergames.de?"), "Die Feedback-Schaltfläche muss die öffentliche Supportadresse verwenden.") - assert(support_url.contains("0.1.0-alpha.7") and support_url.contains(account_manager.short_id()), "Die Support-Mail muss Version und gekürzte Spieler-ID zur Fehlerzuordnung enthalten.") + assert(support_url.contains("0.1.0-alpha.8") and support_url.contains(account_manager.short_id()), "Die Support-Mail muss Version und gekürzte Spieler-ID zur Fehlerzuordnung enthalten.") account_manager.storage_enabled = false var original_display_name: String = account_manager.display_name assert(account_manager.validate_display_name("Kommandant Ägir").is_empty(), "Ein normaler internationaler Spielername muss gültig sein.") @@ -163,9 +163,9 @@ func _run() -> void: assert(not update_manager.call("_is_newer_version", "0.1.0-alpha.6", "0.1.0-alpha.6"), "Die installierte Version darf nicht als Update angeboten werden.") var announced_update := {} update_manager.update_available.connect(func(info: Dictionary): announced_update.merge(info, true)) - var fake_release_body := JSON.stringify([{"tag_name": "v0.1.0-alpha.8", "name": "Alpha.8", "draft": false, "assets": [{"name": "Void-Bastion-Setup-x64.exe", "browser_download_url": "https://git.dominicspringer.de/public-test.exe"}]}]).to_utf8_buffer() + var fake_release_body := JSON.stringify([{"tag_name": "v0.1.0-alpha.9", "name": "Alpha.9", "draft": false, "assets": [{"name": "Void-Bastion-Setup-x64.exe", "browser_download_url": "https://git.dominicspringer.de/public-test.exe"}]}]).to_utf8_buffer() update_manager.call("_on_request_completed", HTTPRequest.RESULT_SUCCESS, 200, PackedStringArray(), fake_release_body) - assert(announced_update.get("version") == "0.1.0-alpha.8", "Die Update-Prüfung muss eine neuere öffentliche Version ankündigen.") + assert(announced_update.get("version") == "0.1.0-alpha.9", "Die Update-Prüfung muss eine neuere öffentliche Version ankündigen.") assert(str(announced_update.get("url", "")).begins_with("https://git.dominicspringer.de/"), "Der Update-Hinweis darf nur einen öffentlichen Download-Link öffnen.") assert(game.get("path_points").size() == 9, "Bastion Prime sollte mit einer eigenen Einfahrt im Reaktor enden.") _assert_grid_aligned_path(game.get("path_points"), "Bastion Prime")