diff --git a/TODO.md b/TODO.md index 35d0e8c..b3ff920 100644 --- a/TODO.md +++ b/TODO.md @@ -57,8 +57,9 @@ screen-design judge before any model/texture changes. No gameplay rules change. - [x] Record the canonical terms for admit/refuse, warning/blocking, assistance/emergency, body camera, shift review and campaign; the current inspection/wand/radio/review labels use them (see `docs/ui-copy.md`). -- [ ] Audit all button labels for verb-first wording, capitalization, ordering, - destructive-action confirmation and consistent confirm/cancel placement. +- [x] Audit all button labels for verb-first wording, capitalization, ordering, + destructive-action confirmation and consistent confirm/cancel placement; + recorded in `docs/ui-copy.md` and fixed Quit/Apply wording. - [ ] List every hardcoded player-facing string and route it through `content/strings.en.json`; add placeholder validation for new keys. - [ ] Review NPC/door-staff/radio/tutorial/help/review/campaign dialogue for diff --git a/content/strings.en.json b/content/strings.en.json index dea0d5a..6f163ec 100644 --- a/content/strings.en.json +++ b/content/strings.en.json @@ -108,5 +108,7 @@ "ui.radio_cancelled": "Call cancelled — hold the button.", "ui.radio_holding": "Holding… %.0f%%", "ui.review_return_menu": "Return to menu", + "ui.quit_game": "Quit game", + "ui.apply_settings": "Apply settings", "tutorial.skipped": "Tutorial skipped." } diff --git a/docs/smoke-checklist.md b/docs/smoke-checklist.md index b951787..320232f 100644 --- a/docs/smoke-checklist.md +++ b/docs/smoke-checklist.md @@ -40,3 +40,5 @@ 38. Master/SFX/ambience volume settings clamp at 0/1 and persist; Reduce motion disables head bob; the captions toggle persists. 39. The 24-NPC budget smoke stays inside its frame budget; coats/dresses do not show obvious leg clipping in a normal walk. 40. Help remains readable with the largest HUD font scale, and CI/local verification use the same Godot 4.7.2 baseline. +41. UI copy: inspection/wand use "A = admit · D = refuse entry", review returns with "Return to menu", and application exit reads "Quit game". +42. Button states remain readable on hover/focus/pressed; settings Apply/Cancel and radio normal-send/emergency-hold behave as labelled. diff --git a/docs/ui-copy.md b/docs/ui-copy.md index 7b66098..4abeea1 100644 --- a/docs/ui-copy.md +++ b/docs/ui-copy.md @@ -31,12 +31,45 @@ Status: audit in progress for the 0.9.2 UI polish patch. - **Return to menu** — leave the review to the venue menu (it does not start a new shift by itself). - **Send request** — non-emergency assistance; **Send emergency** — emergency call. +## Button labels and states + +| Surface | Label | Behavior | State audit | +| --- | --- | --- | --- | +| Start menu | Continue shift — | Resume/advance campaign | Hidden when complete; venue-specific | +| Start menu | Venue rows | Start free-play/campaign venue | Hover/focus/pressed styled | +| Start menu | Help | Open Help overlay | Standard button | +| Start menu | Settings | Open Settings | Standard button | +| Start menu | Quit game | Exit application | Destructive; label clarifies scope | +| Tutorial | F1 skip tutorial | Skip lesson | Keyboard only, non-blocking | +| Action wheel | Stop/Look/Point/No/Ask/Inspect/Wand/Warn/Block/Reason/Recognize/Radio | Choose verb | Hover/selection highlight | +| Inspection | A = admit · D = refuse entry | Access decision | Keyboard hints, policy text | +| Wand | A = admit · D = refuse entry | Screening decision | Keyboard hints, item/alert text | +| Radio | Send request | Submit assistance | Normal click | +| Radio | Send emergency | Submit emergency | Hold-to-confirm; Cancel aborts | +| Radio | Cancel | Close form | Standard button | +| Pause | Resume | Resume shift | Default focus | +| Pause | Restart shift | Restart current shift | Standard button | +| Pause | Settings | Open Settings | Standard button | +| Pause | Quit to menu | Return to venue menu | Standard button | +| Settings | Apply settings | Persist settings | Standard button | +| Settings | Cancel | Discard edits | Standard button | +| Settings | Replay tutorial | Clear tutorial flags and restart Hollywood | Standard button | +| Settings | Reset campaign | Confirmed campaign reset | Confirmation dialog | +| Help | Close | Close overlay | Standard button | +| Review | Continue campaign | Start next venue | Hidden when campaign complete | +| Review | Body camera timeline | Open event timeline | Standard button | +| Review | Return to menu | Return to venue menu | Standard button | +| Review | Quit game | Exit application | Standard button | +| Timeline | Previous / Next / Close | Step/close evidence | Standard buttons | + ## Button/label issues found - HUD inspection and wand used “allow/deny” versus “admit/refuse”; both now use **A = admit · D = refuse entry**. - Shift review’s old “Run another shift” actually returned to the menu; renamed **Return to menu**. - Radio emergency action used all-caps while assistance used sentence case; both are now sentence case, with the warning in the panel title/hold hint. - Normal radio send was previously wired only to the emergency hold handlers; fixed in 0.8.1 and covered by `test_radio_panel.gd`. +- “Quit” was ambiguous between menu and application exit; both application-exit buttons now read **Quit game**. +- Settings “Apply” was made verb+object as **Apply settings**. ## Remaining audit work diff --git a/src/game/ui/settings_panel.gd b/src/game/ui/settings_panel.gd index b338fad..b2ca8b3 100644 --- a/src/game/ui/settings_panel.gd +++ b/src/game/ui/settings_panel.gd @@ -8,6 +8,7 @@ extends CanvasLayer const InputBindings := preload("res://src/core/input_bindings.gd") const UiArt := preload("res://src/game/ui/art.gd") +const Strings := preload("res://src/core/strings.gd") signal applied(settings: Dictionary) signal replay_tutorial_requested() @@ -169,7 +170,7 @@ func _build() -> void: var save_button := Button.new() save_button.name = "ApplyButton" - save_button.text = "Apply" + save_button.text = Strings.lookup("ui.apply_settings") save_button.pressed.connect(_on_apply) row.add_child(save_button) diff --git a/src/game/ui/shift_review.gd b/src/game/ui/shift_review.gd index 6babb57..224ddd7 100644 --- a/src/game/ui/shift_review.gd +++ b/src/game/ui/shift_review.gd @@ -74,7 +74,7 @@ func _init() -> void: center.add_child(restart) var quit_btn := Button.new() - quit_btn.text = "Quit" + quit_btn.text = Strings.lookup("ui.quit_game") quit_btn.pressed.connect(func(): get_tree().quit()) quit_btn.size_flags_horizontal = Control.SIZE_SHRINK_CENTER _style_review_button(timeline) diff --git a/src/game/ui/start_menu.gd b/src/game/ui/start_menu.gd index 28abe46..620ae1b 100644 --- a/src/game/ui/start_menu.gd +++ b/src/game/ui/start_menu.gd @@ -11,6 +11,7 @@ signal settings_requested() signal quit_requested() const UiArt := preload("res://src/game/ui/art.gd") +const Strings := preload("res://src/core/strings.gd") const VENUES := [ {"id": "hollywood_building", "label": "Hollywood Boulevard", "blurb": "Building entrance, tourists and late-night trouble."}, @@ -142,7 +143,7 @@ func _build() -> void: var quit_button := Button.new() quit_button.name = "QuitButton" - quit_button.text = "Quit" + quit_button.text = Strings.lookup("ui.quit_game") quit_button.pressed.connect(func(): quit_requested.emit()) row.add_child(quit_button)