diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 3ed8fb5..7156faf 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -82,19 +82,21 @@ jobs: sudo apt-get update && sudo apt-get install -y nsis p7zip-full VERSION="$(sed -n 's/.*config\/version="\([^"]*\)".*/\1/p' project.godot)" # NOTE: on Linux, makensis uses -D defines (the /D form is Windows-only - # and is rejected as a script path). + # and is rejected as a script path), and it resolves relative paths + # against the script directory — pass absolute paths from the workspace. cp assets/textures/icon.ico packaging/windows/step-line.ico makensis \ -DVERSION="$VERSION" \ - -DARTIFACT="build/step-line-windows-$VERSION.exe" \ - -DICON=packaging/windows/step-line.ico \ + -DARTIFACT="$PWD/build/step-line-windows-$VERSION.exe" \ + -DICON="$PWD/packaging/windows/step-line.ico" \ + -DOUT="$PWD/build/step-line-setup-$VERSION.exe" \ packaging/windows/step-line.nsi - name: Verify Windows installer contents run: | VERSION="$(sed -n 's/.*config\/version="\([^"]*\)".*/\1/p' project.godot)" ls -la build/step-line-setup-$VERSION.exe - 7z l build/step-line-setup-$VERSION.exe | grep -E "Step Line.exe|uninstall.exe" + 7z l build/step-line-setup-$VERSION.exe | grep -E "step-line.exe|uninstall.exe" - name: Package Linux AppImage run: | diff --git a/assets/textures/icon.ico b/assets/textures/icon.ico index 6e3ed3d..1b2727f 100644 Binary files a/assets/textures/icon.ico and b/assets/textures/icon.ico differ diff --git a/docs/screenshots/01-venue-overview.png b/docs/screenshots/01-venue-overview.png index b5186f0..9dceb5e 100644 Binary files a/docs/screenshots/01-venue-overview.png and b/docs/screenshots/01-venue-overview.png differ diff --git a/docs/screenshots/02-targeting-npc.png b/docs/screenshots/02-targeting-npc.png index 491bb66..95bda8a 100644 Binary files a/docs/screenshots/02-targeting-npc.png and b/docs/screenshots/02-targeting-npc.png differ diff --git a/docs/screenshots/03-access-inspection.png b/docs/screenshots/03-access-inspection.png index 74de4fb..7649b16 100644 Binary files a/docs/screenshots/03-access-inspection.png and b/docs/screenshots/03-access-inspection.png differ diff --git a/docs/screenshots/04-radio-report.png b/docs/screenshots/04-radio-report.png index f3b3fbf..7f5ece0 100644 Binary files a/docs/screenshots/04-radio-report.png and b/docs/screenshots/04-radio-report.png differ diff --git a/docs/screenshots/05-late-night-avenue.png b/docs/screenshots/05-late-night-avenue.png index 63b70d0..4349afd 100644 Binary files a/docs/screenshots/05-late-night-avenue.png and b/docs/screenshots/05-late-night-avenue.png differ diff --git a/docs/screenshots/06-night-flashlight.png b/docs/screenshots/06-night-flashlight.png index 1683483..7253a87 100644 Binary files a/docs/screenshots/06-night-flashlight.png and b/docs/screenshots/06-night-flashlight.png differ diff --git a/packaging/windows/step-line.ico b/packaging/windows/step-line.ico index 6e3ed3d..1b2727f 100644 Binary files a/packaging/windows/step-line.ico and b/packaging/windows/step-line.ico differ diff --git a/packaging/windows/step-line.nsi b/packaging/windows/step-line.nsi index f7ce689..53fa64a 100644 --- a/packaging/windows/step-line.nsi +++ b/packaging/windows/step-line.nsi @@ -14,8 +14,12 @@ !define ICON "packaging\windows\step-line.ico" !endif -; The installed executable always uses this clean name. -!define INSTALLED_EXE "Step Line.exe" +; The installed executable uses this clean name (no spaces — NSIS /oname tokens +; on whitespace, so a spaced name breaks the File directive). +!define INSTALLED_EXE "step-line.exe" +!ifndef OUT + !define OUT "build\step-line-setup-${VERSION}.exe" +!endif !define COMPANY "Step Line Project" !define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\Step Line" @@ -25,7 +29,7 @@ Icon "${ICON}" UninstallIcon "${ICON}" Name "Step Line ${VERSION}" -OutFile "build\step-line-setup-${VERSION}.exe" +OutFile "${OUT}" InstallDir "$PROGRAMFILES64\Step Line" RequestExecutionLevel admin diff --git a/src/game/ui/hud.gd b/src/game/ui/hud.gd index 24629e3..5332a63 100644 --- a/src/game/ui/hud.gd +++ b/src/game/ui/hud.gd @@ -140,7 +140,7 @@ func _init() -> void: # --- body-camera overlay (REC + shift clock + corner brackets, top right) --- var cam_box := VBoxContainer.new() cam_box.set_anchors_preset(Control.PRESET_TOP_RIGHT) - cam_box.position = Vector2(-180, 12) + cam_box.position = Vector2(-180, 50) cam_box.alignment = BoxContainer.ALIGNMENT_END add_child(cam_box) var rec_row := HBoxContainer.new() @@ -380,6 +380,7 @@ func show_inspection(controller: Object, artifacts: Array, result: Dictionary) - continue var card := TextureRect.new() card.texture = tex + card.expand_mode = TextureRect.EXPAND_IGNORE_SIZE card.custom_minimum_size = Vector2(92, 58) card.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED card.tooltip_text = artifact.summary() @@ -388,7 +389,8 @@ func show_inspection(controller: Object, artifacts: Array, result: Dictionary) - card_row.add_child(card) added_card = true if added_card: - inspect_panel.add_child(card_row) + var content := inspect_panel.get_child(0) as VBoxContainer + content.add_child(card_row) var lines: Array[String] = [] for artifact in artifacts: lines.append(" • " + artifact.summary()) @@ -409,7 +411,7 @@ func _clear_card_row() -> void: return var row := inspect_panel.find_child("INSPECT_CARD_ROW", true, false) as Control if row: - inspect_panel.remove_child(row) + row.get_parent().remove_child(row) row.queue_free() func show_wand(controller: Object, result: Dictionary) -> void: diff --git a/tools/generate_textures.py b/tools/generate_textures.py index f9a5e6d..791aac1 100644 --- a/tools/generate_textures.py +++ b/tools/generate_textures.py @@ -306,12 +306,30 @@ def app_icon(): icon("icon.png", badge, size=1024) icon("icon.ico", badge, size=256) - # ICO for Windows. Sizes stay at 16/32/48 so every entry uses classic BMP - # (PNG-compressed entries, used by PIL at >=256px, break some NSIS builds). - src = Image.open(os.path.join(ASSETS, "icon.png")).convert("RGBA") + # ICO for Windows. Must be BMP-entry based: PIL's ICO serializer emits + # PNG-compressed entries which NSIS' icon loader rejects. ImageMagick + # writes classic BMP entries; fall back to PIL only if ImageMagick is gone + # (flag it so a human notices). + import subprocess + import sys ico_path = os.path.join(ASSETS, "icon.ico") - src.save(ico_path, format="ICO", sizes=[(48, 48), (32, 32), (16, 16)]) - print("wrote assets/textures/icon.ico (BMP 16/32/48)") + src_png = os.path.join(ASSETS, "icon.png") + ran = False + for cmd in ( + ["magick", src_png, "-background", "none", "-define", "icon:auto-resize=48,32,16", ico_path], + ["convert", src_png, "-background", "none", "-define", "icon:auto-resize=48,32,16", ico_path], + ): + try: + subprocess.run(cmd, check=True, capture_output=True) + ran = True + break + except (FileNotFoundError, subprocess.CalledProcessError): + continue + if ran: + print("wrote assets/textures/icon.ico (BMP 16/32/48 via ImageMagick)") + else: + print("WARNING: ImageMagick not found; writing PIL ICO (may be PNG-compressed)") + Image.open(src_png).convert("RGBA").save(ico_path, format="ICO", sizes=[(48, 48), (32, 32), (16, 16)]) def cards():