Replace text-only stance labels with SVG icons + tint shader per D-086.
Alpha-mask shader swaps color at runtime via ShaderMaterial parameter.
Icons: walk, crouch, careful, sprint at 18px inside ImplantPanel row.
Also fix stale UILayer/HUD test path in test_ui_framework_sprint15.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Preload stance icons at _ready() into cache Dictionary
- Null-guard shader + theme loads with push_error() + early return
- Guard _icon_mat.set_shader_parameter inside if _icon_mat:
- Icon size 18→20px per D-086, container height 44→46px to fit
- Add _apply_stance test coverage (known + unknown stance)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Preload icons at _ready() — Fixed (icon cache Dictionary)
Null-guard shader + theme — Fixed (push_error + early return)
_icon_mat guard — Fixed (if _icon_mat:)
Icon size 18→20 — Fixed (D-086 compliant)
Test coverage — Fixed (known + unknown stance tests)
New blocker found:
#
Sev
File
Issue
1
BLOCKER
stance_indicator.gd:33-34
STANCE_ICONS constant is referenced in the preload loop but was removed from the file during the refactor. Will crash on startup. Restore the const STANCE_ICONS dictionary or inline the paths.
Startup crash — preload loop referenced STANCE_ICONS but the constant
was accidentally dropped when rewriting the icon cache logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Re-review: sprint-32/client → main (PR #118, round 3)
Commit:168c5e0d — fix(ui): restore STANCE_ICONS constant removed during refactor
Round 2 blocker resolved: STANCE_ICONS constant restored. The preload loop at _ready() now has the dictionary it references.
All 6 issues across 2 review rounds are fixed:
Preload icons at _ready() into cache Dictionary
Null-guard shader + theme loads with push_error()
_icon_mat.set_shader_parameter inside if _icon_mat: guard
Icon size 20×20 per D-086
_apply_stance test coverage (known + unknown stance)
STANCE_ICONS constant restored
Verdict: APPROVED
No new issues. Ready to merge.
## Re-review: sprint-32/client → main (PR #118, round 3)
**Commit:** `168c5e0d` — fix(ui): restore STANCE_ICONS constant removed during refactor
Round 2 blocker resolved: `STANCE_ICONS` constant restored. The preload loop at `_ready()` now has the dictionary it references.
All 6 issues across 2 review rounds are fixed:
1. Preload icons at `_ready()` into cache Dictionary
2. Null-guard shader + theme loads with `push_error()`
3. `_icon_mat.set_shader_parameter` inside `if _icon_mat:` guard
4. Icon size 20×20 per D-086
5. `_apply_stance` test coverage (known + unknown stance)
6. `STANCE_ICONS` constant restored
### Verdict: APPROVED
No new issues. Ready to merge.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
icon_tint.gdshader— samples texture alpha, applies runtimetint_colorparameterUILayer/HUDtest path intest_ui_framework_sprint15.gdFiles changed
client/shaders/icon_tint.gdshader— new alpha-mask tint shaderclient/ui/stance_indicator.gd— TextureRect + ShaderMaterial replaces text labelclient/tests/test_ui_framework_sprint15.gd— stale path fixCHANGELOG.md— updatedDecisions referenced
Test plan
make test-clientfor unit test passReview: sprint-32/client → main (PR #118, type: code)
Reviewers: Hoshe (code quality), Tyre (architecture)
Lint: gdlint clean.
Hoshe (Code Quality): REQUEST_CHANGES
stance_indicator.gd:34,48icon_shadernot null-checked. Missing shader = broken material + runtime errors.stance_indicator.gd:73_icon_mat.set_shader_parameterfires even when texture load fails. Move insideif tex:or add guard.stance_indicator.gd:45_apply_stance— unknown stance fallback, null-texture, no-op guard.Tyre (Architecture): REQUEST_CHANGES
stance_indicator.gd_apply_stance()load()per transition — preload 4 icons at_ready()into Dictionary.stance_indicator.gd_ready()theme_resoricon_shader. Addpush_error()+ early return.Verdict: CHANGES REQUESTED
5 deduplicated issues:
_ready()(Tyre)push_error()(both)_icon_mat.set_shader_parameterconsistency (Hoshe)_apply_stancetest coverage (Hoshe)Re-review: sprint-32/client → main (PR #118, round 2)
Commit:
746ed05e— fix(ui): address PR #118 review — 5 itemsRound 1 issues (5/5 addressed):
_ready()— Fixed (icon cache Dictionary)_icon_matguard — Fixed (if _icon_mat:)New blocker found:
stance_indicator.gd:33-34STANCE_ICONSconstant is referenced in the preload loop but was removed from the file during the refactor. Will crash on startup. Restore theconst STANCE_ICONSdictionary or inline the paths.Verdict: CHANGES REQUESTED — 1 blocker (startup crash)
Re-review: sprint-32/client → main (PR #118, round 3)
Commit:
168c5e0d— fix(ui): restore STANCE_ICONS constant removed during refactorRound 2 blocker resolved:
STANCE_ICONSconstant restored. The preload loop at_ready()now has the dictionary it references.All 6 issues across 2 review rounds are fixed:
_ready()into cache Dictionarypush_error()_icon_mat.set_shader_parameterinsideif _icon_mat:guard_apply_stancetest coverage (known + unknown stance)STANCE_ICONSconstant restoredVerdict: APPROVED
No new issues. Ready to merge.
Pull request closed