Add Michroma-Regular.ttf (OFL license) as the game font. Create
FontVariation with +1px tracking and a global Theme resource with
cyan-white (#E0F7FA) implant text color. Wire theme into project.godot
so all Label/RichTextLabel/Button/LineEdit nodes inherit automatically.
Add IMPLANT_TEXT_COLOR/DIM/PULSE constants to constants.gd.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mouse position now determines facing direction as a client-side float.
WASD remapped: W=toward cursor, S=away, A/D=strafe. Facing octant
derived from mouse angle and sent to server via SET_FACING action only
when it changes. EntityRenderer facing indicator uses continuous angle
for smooth rotation. SimBridge test mode updated to handle SetFacing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Critical:
- deactivate_insert() now called when selecting non-Insert spoke,
cancelling with no selection, or pressing Escape while insert is
active. Fixes simulation staying paused permanently after Insert.
Warnings:
- Checklist conditions with empty id excluded from get_results() and
get_total_count() — prevents impossible-to-complete checklists.
Warns at load time when empty-id conditions are found.
- _content_base now checks res://content/ first (exported builds),
falls back to ../content for editor/dev mode.
- 26 new tests for D-054 functions: _angle_to_octant (8 octants),
_snap_to_octant_dir (9 cases incl. zero/tiny), _wasd_to_world_dir
(8 facing/movement combos). New test file: test_input_mapper_facing.gd.
Suggestions:
- Cached get_theme_default_font() in checklist overlay _ready().
- Documented InputMapper → GameState coupling as intentional.
- Documented YAML parser # truncation limitation.
- _insert_active reset on Escape dismiss (Tyre #3).
- SimBridge test mode SetFacing reads action_data.facing instead of
InputMapper global (Tyre #4).
- Removed dead _facing_to_rotation() from entity_renderer.gd (Tyre #5).
- Fixed 2 failing facing indicator tests to use InputMapper.facing_angle
instead of GameState.player_facing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 10 review items addressed in 919ef39. Critical: deactivate_insert() now called on spoke change, cancel, and Escape. Warnings: empty-id conditions excluded from totals, content path export-safe, 26 new D-054 tests + 2 facing tests fixed. Suggestions: font cached, coupling documented, YAML hash documented, insert_active reset on Escape, SetFacing uses action_data, dead _facing_to_rotation removed.
All 10 review items addressed in 919ef39. Critical: deactivate_insert() now called on spoke change, cancel, and Escape. Warnings: empty-id conditions excluded from totals, content path export-safe, 26 new D-054 tests + 2 facing tests fixed. Suggestions: font cached, coupling documented, YAML hash documented, insert_active reset on Escape, SetFacing uses action_data, dead _facing_to_rotation removed.
Warnings: facing indicator tests use Godot-normalized rotation range
(-PI, PI] instead of raw addition (SW/W/NW in test_rendering,
West in test_client_p3). Suggestions: cache font in world_radial
_draw(), fix docstring on deactivate_insert() trigger, document
tile-coordinate system on _eval_player_near (D-066), add public
reset_facing_state() to InputMapper (D-030 testability).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rotation normalization in test_rendering.gd — all 8 directions now use Godot-normalized (-PI, PI] values with explanatory comments
Rotation normalization in test_client_p3.gd — West case corrected from 3*PI/2 to -PI/2
Font caching in world_radial.gd — _cached_font initialized in _ready(), used in _draw()
Docstring in checklist_evaluator.gd — now correctly lists 7 condition types
Additional fixes noted: reset_facing_state() added to InputMapper for D-030 testability, D-066 dual-scale coordinate docs added.
Tyre (Architecture): APPROVE
All items confirmed addressed. Original suggestions already resolved:
PERIPHERAL_ALPHA — single source of truth in constants.gd, referenced everywhere
D-054 client-authority — already documented ("Mouse facing is a client-side float; the server receives the facing octant only")
No critical or warning-level issues.
Verdict: APPROVED
## Re-Review (round 2): client -> main (type: code)
### Hoshe (Code Quality): APPROVE
All 4 items from previous round confirmed fixed:
1. Rotation normalization in `test_rendering.gd` — all 8 directions now use Godot-normalized `(-PI, PI]` values with explanatory comments
2. Rotation normalization in `test_client_p3.gd` — West case corrected from `3*PI/2` to `-PI/2`
3. Font caching in `world_radial.gd` — `_cached_font` initialized in `_ready()`, used in `_draw()`
4. Docstring in `checklist_evaluator.gd` — now correctly lists 7 condition types
Additional fixes noted: `reset_facing_state()` added to InputMapper for D-030 testability, D-066 dual-scale coordinate docs added.
### Tyre (Architecture): APPROVE
All items confirmed addressed. Original suggestions already resolved:
1. `PERIPHERAL_ALPHA` — single source of truth in `constants.gd`, referenced everywhere
2. D-054 client-authority — already documented ("Mouse facing is a client-side float; the server receives the facing octant only")
No critical or warning-level issues.
### Verdict: APPROVED
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
Sprint 10 client delivery — 5 tickets completed:
2 tickets remain blocked on server (#501 on #491, #521 on #520).
Files
Test plan
🤖 Generated with Claude Code
Review: client -> main (type: code)
Hoshe (Code Quality): REQUEST_CHANGES
Substantial delivery with 48 new tests. Two issues before merge.
client/ui/world_radial.gddeactivate_insert()never called — simulation stays paused permanently after Insert.client/scripts/checklist/checklist_evaluator.gdidsilently skipped but counted in total — checklist can never complete.client/scripts/checklist/checklist_evaluator.gd_content_baseuses../contentrelative tores://— breaks in exported builds.client/scripts/autoloads/input_mapper.gd_angle_to_octant,_snap_to_octant_dir,_wasd_to_world_dir).client/ui/checklist_overlay.gdget_theme_default_font()called every frame — cache it.Tyre (Architecture): APPROVE
Clean architectural split — client-side float for rendering, octant-only on wire.
input_mapper.gdchecklist_evaluator.gd#silently truncated. Document.world_radial.gd_insert_activenot reset on unexpected close paths.sim_bridge.gdentity_renderer.gd_facing_to_rotation()is dead code — remove.Verdict: CHANGES REQUESTED
All 10 review items addressed in
919ef39. Critical: deactivate_insert() now called on spoke change, cancel, and Escape. Warnings: empty-id conditions excluded from totals, content path export-safe, 26 new D-054 tests + 2 facing tests fixed. Suggestions: font cached, coupling documented, YAML hash documented, insert_active reset on Escape, SetFacing uses action_data, dead _facing_to_rotation removed.Re-Review: client -> main (type: code)
Hoshe (Code Quality): REQUEST_CHANGES
7/10 previous issues cleanly fixed. Critical
deactivate_insert()fix is solid. Two new warnings in facing indicator tests.test_rendering.gd:~3135*PI/4,3*PI/2,7*PI/4but Godot normalizesNode2D.rotationto(-PI, PI]— SW/W/NW cases will fail.test_client_p3.gd:~2703*PI/2but getter returns-PI/2.world_radial.gd:195get_theme_default_font()still called per-spoke per-frame in_draw()— same issue fixed in checklist_overlay but missed here.world_radial.gd:8deactivate_insert()— it doesn't.Tyre (Architecture): APPROVE
All 5 previous suggestions confirmed fixed. Three new suggestion-level items.
world_radial.gd:_open_menu()deactivate_insert()but it doesn't — doc/code mismatch.checklist_evaluator.gd:_eval_player_near()test_input_mapper_facing.gd:after_test()_last_sent_octant— prefer areset_facing_state()method per D-030.Verdict: CHANGES REQUESTED
All 7 re-review items addressed in
503644b.Warnings fixed (2):
Suggestions fixed (5):
Re-Review (round 2): client -> main (type: code)
Hoshe (Code Quality): APPROVE
All 4 items from previous round confirmed fixed:
test_rendering.gd— all 8 directions now use Godot-normalized(-PI, PI]values with explanatory commentstest_client_p3.gd— West case corrected from3*PI/2to-PI/2world_radial.gd—_cached_fontinitialized in_ready(), used in_draw()checklist_evaluator.gd— now correctly lists 7 condition typesAdditional fixes noted:
reset_facing_state()added to InputMapper for D-030 testability, D-066 dual-scale coordinate docs added.Tyre (Architecture): APPROVE
All items confirmed addressed. Original suggestions already resolved:
PERIPHERAL_ALPHA— single source of truth inconstants.gd, referenced everywhereNo critical or warning-level issues.
Verdict: APPROVED
Pull request closed