Rebuild the Joke Shop as the Sunset Strip block
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped

- Replace the alley with the 27 m Comedy Store-inspired hall, signature canopy, circular blade sign, red curtain bays, west entrance, low-rise neighbours, dry hillside and opposite frontage.
- Add day/night/across-street concept frames and real-site mapping notes.
- Expose the Joke Shop day stage in the realism captures and refresh the gallery shots.
- Render multiline HUD/wand strings correctly and list carried items in the wand panel.
- Add the Joke Shop layout/budget tests and update docs, roadmap and changelog.
This commit is contained in:
Gig Line Dev committed 2026-11-02 14:10:07 +01:00
1 parent 74dc1fdc1d
commit 37f925c7ad
39 files changed
+1015 -96

No files matched your search

+53 -6
View File
@@ -116,8 +116,17 @@ func _advance() -> void:
gm.guard.rotation.y = 0.0
gm.guard.head.rotation.x = deg_to_rad(4.0)
_reset_hud()
if state_frames == 26 and gm != null:
# Light the facade on the final frames only: turning it on early
# made nearby guests log "notices you watching" over the shot.
gm.hud.clear_log()
gm.call("_toggle_flashlight")
if state_frames >= 30:
if state_frames == 29 and gm != null:
gm.hud.clear_log()
gm.hud.set_target_label("")
if state_frames >= 32:
gm.hud.clear_log()
gm.hud.set_target_label("")
_shoot("06-night-flashlight.png")
# Move to The Joke Shop for the wand/shift-review set, and keep
# the late-night phase so the UI sits on the night scene.
@@ -154,6 +163,12 @@ func _advance() -> void:
else:
gm.call("_cycle_nearby_target")
_face_target()
# Stage the documented false-alarm case (keys) so the capture
# shows the interesting alert instead of a clear guest.
var guest: Object = gm.call("_targeted_controller")
if guest != null and guest.profile != null:
var false_alarm: Array[String] = ["keys"]
guest.profile.carried_items = false_alarm
gm.call("_toggle_wand_screening")
wand_attempts += 1
elif state_frames > 600 and gm != null:
@@ -172,6 +187,10 @@ func _advance() -> void:
if gm != null:
if gm.wand_open:
gm.call("_toggle_wand_screening")
# The fallback path can show the wand HUD without setting
# `wand_open`; always hide it before the next screens.
gm.hud.hide_wand()
gm.wand_open = false
# Real escalation path: formal warning arms the body camera
# (a timeline row), then blocking raises the meter to L3.
gm.call("_apply_interaction", 2, "formal warning")
@@ -198,14 +217,33 @@ func _advance() -> void:
_shoot("09-body-camera-timeline.png")
if gm != null:
gm.event_timeline.close()
gm.guard.global_position = Vector3(0, 0.1, 6.2)
gm.guard.rotation.y = 0.0
# Precision walk at the Joke Shop entrance, not a blank wall:
# face the red curtain door and keep the step line in frame.
gm.guard.global_position = Vector3(-5.2, 0.1, 6.4)
gm.guard.rotation.y = deg_to_rad(22.0)
gm.guard.head.rotation.x = deg_to_rad(2.0)
gm.hud.set_body_camera(false)
gm.hud.set_escalation(0)
gm.hud.clear_log()
gm.hud.set_target_label("")
Input.action_press("move_forward")
Input.action_press("walk_slow")
state = 11
state_frames = 0
11:
if state_frames == 1 and gm != null:
if gm.wand_open:
gm.call("_toggle_wand_screening")
gm.hud.hide_wand()
gm.wand_open = false
if gm.inspection_open:
gm.call("_toggle_inspection")
gm.hud.hide_inspection()
gm.hud.clear_log()
gm.hud.set_target_label("")
if state_frames >= 50:
gm.hud.clear_log()
gm.hud.set_target_label("")
_shoot("11-precision-walk.png")
Input.action_release("move_forward")
Input.action_release("walk_slow")
@@ -216,9 +254,18 @@ func _advance() -> void:
state_frames = 0
12:
if state_frames == 1 and gm != null:
gm.guard.global_position = Vector3(-1.5, 0.1, 8.5)
gm.guard.rotation.y = deg_to_rad(-5.0)
gm.guard.head.rotation.x = deg_to_rad(2.0)
# The wand fallback can leave the panel open; close every modal
# before the venue beauty shot.
if gm.wand_open:
gm.call("_toggle_wand_screening")
gm.hud.hide_wand()
gm.wand_open = false
if gm.inspection_open:
gm.call("_toggle_inspection")
gm.hud.hide_inspection()
gm.guard.global_position = Vector3(-2.0, 0.1, 13.2)
gm.guard.rotation.y = deg_to_rad(12.0)
gm.guard.head.rotation.x = deg_to_rad(12.0)
gm.hud.clear_log()
gm.hud.set_escalation(0)
gm.hud.set_body_camera(false)