Harden installer icon + NSIS rebuild path
- Regenerate icon.ico with classic BMP entries (16/32/48) — PNG-compressed ICO entries can fail NSIS' icon loader on some builds - CI copies assets/textures/icon.ico onto the packaging path right before makensis, removing any stale/missing-copy failures - Recreate v0.2.1 tag after this fix
No files matched your search
@@ -83,6 +83,7 @@ jobs:
|
||||
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).
|
||||
cp assets/textures/icon.ico packaging/windows/step-line.ico
|
||||
makensis \
|
||||
-DVERSION="$VERSION" \
|
||||
-DARTIFACT="build/step-line-windows-$VERSION.exe" \
|
||||
|
||||
@@ -68,3 +68,7 @@ performance hardening only.
|
||||
- [ ] Profile the crowd: ensure textured materials and props hold target frame rate around a
|
||||
busy entrance.
|
||||
- [ ] Add LOD or culling for distant NPCs/props if the crowd grows.
|
||||
|
||||
## Screenshot Refresh
|
||||
|
||||
- [ ] Regenerate and verify the six README screenshots from the current build.
|
||||
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 220 KiB |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 233 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 7.1 KiB |
@@ -180,9 +180,12 @@ func _init() -> void:
|
||||
icon_row.add_child(wand_icon)
|
||||
|
||||
# --- inspect panel (popup center) ---
|
||||
var inspect_center := CenterContainer.new()
|
||||
inspect_center.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
inspect_center.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
add_child(inspect_center)
|
||||
inspect_panel = PanelContainer.new()
|
||||
inspect_panel.visible = false
|
||||
inspect_panel.set_anchors_preset(Control.PRESET_CENTER)
|
||||
inspect_panel.modulate.a = 1.0
|
||||
var ivbox := VBoxContainer.new()
|
||||
inspect_panel.add_child(ivbox)
|
||||
@@ -197,12 +200,15 @@ func _init() -> void:
|
||||
insp_hint.text = "A = allow entry D = deny entry"
|
||||
insp_hint.add_theme_font_size_override("font_size", 12)
|
||||
ivbox.add_child(insp_hint)
|
||||
add_child(inspect_panel)
|
||||
inspect_center.add_child(inspect_panel)
|
||||
|
||||
# --- wand screening panel (popup center) ---
|
||||
var wand_center := CenterContainer.new()
|
||||
wand_center.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
wand_center.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
add_child(wand_center)
|
||||
wand_panel = PanelContainer.new()
|
||||
wand_panel.visible = false
|
||||
wand_panel.set_anchors_preset(Control.PRESET_CENTER)
|
||||
var wvbox := VBoxContainer.new()
|
||||
wand_panel.add_child(wvbox)
|
||||
wand_text = Label.new()
|
||||
@@ -216,7 +222,7 @@ func _init() -> void:
|
||||
wand_hint.text = "A = admit D = refuse entry"
|
||||
wand_hint.add_theme_font_size_override("font_size", 12)
|
||||
wvbox.add_child(wand_hint)
|
||||
add_child(wand_panel)
|
||||
wand_center.add_child(wand_panel)
|
||||
|
||||
# --- debug overlay ---
|
||||
debug_label = Label.new()
|
||||
|
||||
@@ -34,9 +34,12 @@ func _init() -> void:
|
||||
dim.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
add_child(dim)
|
||||
|
||||
var center := CenterContainer.new()
|
||||
center.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
center.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
add_child(center)
|
||||
panel = PanelContainer.new()
|
||||
panel.set_anchors_preset(Control.PRESET_CENTER)
|
||||
add_child(panel)
|
||||
center.add_child(panel)
|
||||
|
||||
var vbox := VBoxContainer.new()
|
||||
panel.add_child(vbox)
|
||||
|
||||
@@ -12,9 +12,10 @@ var gm: Node = null
|
||||
var state := 0
|
||||
var state_frames := 0
|
||||
var targeted := false
|
||||
var camera_staged := false
|
||||
|
||||
func _initialize() -> void:
|
||||
root.size = Vector2i(1600, 900)
|
||||
root.size = Vector2i(1280, 720)
|
||||
var packed: PackedScene = load("res://scenes/main.tscn")
|
||||
var inst: Node = packed.instantiate()
|
||||
root.add_child(inst)
|
||||
@@ -29,6 +30,10 @@ func _process(_delta: float) -> bool:
|
||||
push_error("GameManager not found")
|
||||
quit(1)
|
||||
return true
|
||||
if gm != null and not camera_staged:
|
||||
gm.guard.global_position = Vector3(0, 1.6, 5.0)
|
||||
gm.guard.head.rotation.x = deg_to_rad(-8.0)
|
||||
camera_staged = true
|
||||
if frames > MAX_FRAMES:
|
||||
print("timeout reached")
|
||||
quit(0)
|
||||
|
||||
@@ -306,12 +306,12 @@ def app_icon():
|
||||
icon("icon.png", badge, size=1024)
|
||||
icon("icon.ico", badge, size=256)
|
||||
|
||||
# multi-size ICO for Windows (from the 256 render)
|
||||
src = Image.open(os.path.join(ASSETS, "icon.png"))
|
||||
# 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_path = os.path.join(ASSETS, "icon.ico")
|
||||
src.save(ico_path, format="ICO", sizes=[
|
||||
(256, 256), (128, 128), (64, 64), (48, 48), (32, 32), (16, 16)])
|
||||
print("wrote assets/textures/icon.ico (multi-size)")
|
||||
src.save(ico_path, format="ICO", sizes=[(48, 48), (32, 32), (16, 16)])
|
||||
print("wrote assets/textures/icon.ico (BMP 16/32/48)")
|
||||
|
||||
|
||||
def cards():
|
||||
|
||||