Repository navigation
What's Changed
- fix(hud): info panel renders off-screen when control bar appears by @dem-extra1 in #680
- Regenerate + diff all website demo clips on every PR (visual snapshot testing) by @dem-extra1 in #683
- Add a lint check that catches issue/PR-number citations in code comments by @dem-extra1 in #684
- Release: wire up macOS notarization + Windows Authenticode signing plumbing by @dem-extra1 in #686
- Fix default spawn-line spacing so wide regiments never overlap (#677) by @dem-extra1 in #685
- add historically accurate unit behaviors for reforming after casualties by @dem-extra1 in #694
- ci(links): exclude game-icons.net (expired SSL cert) by @dem-extra1 in #712
- Anchor all equations on website by @dem-extra1 in #696
- Periodic opposition research automation by @dem-extra1 in #699
- Check unit movement/attack speeds against historical records by @dem-extra1 in #700
- fix(ci): use raw.githubusercontent.com for demo GIF/MP4/state URLs by @dem-extra1 in #714
- fix(ci): set executable bit on website-demo-diff-summary.sh by @dem-extra1 in #717
- Record a website demo video for the isolated morale-recovery scenario by @dem-extra1 in #697
- debug chaotic entity swirling by @dem-extra1 in #698
- feat: multi-click move speeds for disciplined units by @dem-extra1 in #695
- feat: per-soldier ID overlay for the selected unit (dev/debug visual) by @dem-extra1 in #702
- Use Newton's laws for collision forces by @dem-extra1 in #709
- Attack mode: roll the line by @dem-extra1 in #708
- Sweep routers attack mode by @dem-extra1 in #711
- Fix "]" key naming in demo input scripts (silent no-op keycode) by @dem-extra1 in #725
- Wire SoldierCollision.overcomes_static_friction into the melee/collision impulse path by @dem-extra1 in #726
- feat(attack): pin down / stall (defensive attack with exposure window) by @dem-extra1 in #707
- feat: routing units path around terrain and fight if trapped by @dem-extra1 in #710
- chore: gitignore per-PR worktrees under .claude/worktrees/ by @dem-extra1 in #729
- docs: record lessons from PR #707's lifecycle and mma cascade sweep by @dem-extra1 in #728
- feat: Attack subtype: all-out attack (closes #689) by @dem-extra1 in #704
- Attack subtype: chase (relentless pursuit) by @dem-extra1 in #713
- fix(unit): absorb rout flee-facing snaps into _formation_angle (#723) by @dem-extra1 in #730
- fix(demos): update sidestep demo click target for new spawn spacing by @dem-extra1 in #731
- docs: bank review-lifecycle lessons from PR #730/#731 by @dem-extra1 in #732
- feat(orders): add wedge charge attack subtype by @dem-extra1 in #733
- HUD: give newer OrderMode stances their own order-cursor color by @dem-extra1 in #735
- Attack subtype: push back / knockback focus by @dem-extra1 in #736
- docs: record the knockback-focus cap-inversion review lesson by @dem-extra1 in #737
- Bleed regiment speed via friction instead of snapping to zero when idle by @dem-extra1 in #739
- Fade routing alpha instead of snapping it (flag only, not member icons) by @dem-extra1 in #741
- docs: record the bottom-up physics / no-top-down-gimmicks design philosophy by @dem-extra1 in #744
- Make residual speed coast the unit instead of decaying inert by @dem-extra1 in #743
- Fix residual speed still not coasting after the finishing blow by @dem-extra1 in #747
- Consolidate movement mechanics: retire combat-only soldier velocity by @dem-extra1 in #749
- ums: bank lessons from #747/#749's lifecycle by @dem-extra1 in #754
- Refresh benchmark.yml's stale CI baseline by @dem-extra1 in #755
- Remove static shield-wall / square formation graphic overlays by @dem-extra1 in #757
- Fix Square/Schiltron engaged-set staleness after casualties (partial #752) by @dem-extra1 in #758
- Record memory: partial-fix PRs can auto-close their tracking issue on merge by @dem-extra1 in #759
- Square/Schiltron engaged-set: select by real cross-unit proximity by @dem-extra1 in #760
- Make current maneuver explicit Unit state, auto-recorded by the transcript by @dem-extra1 in #761
- ums: bank lessons from PR #760's review lifecycle by @dem-extra1 in #762
- Refresh benchmark.yml's CI baseline on a schedule by @dem-extra1 in #764
- ums: prefer core mechanics over polish when picking issues by @dem-extra1 in #765
- Evaluate a damped crowding-pressure term for soldier-body collision by @dem-extra1 in #771
- chore: refresh benchmark.yml's CI baseline (scheduled) by @dem-extra1 in #767
- Undisciplined units use individual march/form-up behavior instead of professional maneuvers by @dem-extra1 in #768
- Add space/count-basis form-up split modes for mixed-density groups by @dem-extra1 in #772
- ums: bank findings from the #724/#774 swirl investigation by @dem-extra1 in #775
- Fix march-bearing instability causing formations to spin near arrival by @dem-extra1 in #776
- Tighten the engaged/friendly-contact tier-promotion gate by @dem-extra1 in #777
- Cap accumulated friendly-avoidance steering magnitude under sustained extreme crowding by @dem-extra1 in #778
- Select engaged soldiers by live front position, not stale array index by @dem-extra1 in #780
- Correct disproven "soldier physics alone stops a charge" claim (issue #296) by @dem-extra1 in #782
- Weight SoldierBodies.couple() toward engaged bodies so contact resistance can arrest a charge by @dem-extra1 in #784
- Memoize Unit.engaged_soldier_indices() per physics tick by @dem-extra1 in #785
- Maneuver sequencing (combo queue) foundation by @dem-extra1 in #788
- chore: bump .ai-config submodule pin (closes #789) by @dem-extra1 in #790
- fix(maneuver): short backward mouse moves back-step, don't about-face by @dem-extra1 in #787
- Fix engage-turn swirl in prolonged symmetric melee by @dem-extra1 in #773
- Move maneuvers: per-soldier 90° pivot / file-march for larger lateral shifts by @dem-extra1 in #793
- fix(maneuver): lateral pivot keeps its shape and turns back on arrival by @dem-extra1 in #796
- feat(ai): subcommanders — line integrity, mutual support, flank coverage (#585, phase 2 of battle AI) by @dem-extra1 in #791
- feat(ai): the general — doctrine profiles, army plans, reserves (#586, phase 3 of battle AI) by @dem-extra1 in #794
- docs: record two lessons from the Battle AI phase 2/3 review cycles by @dem-extra1 in #795
- Isolate and fix residual facing-rotation drift in step_all_sim_soldiers by @dem-extra1 in #797
- Generalize UnitRelief's friendly-target link into a reusable maneuver hook by @dem-extra1 in #800
- ci: bump publish-site.yml demo-recording timeout to match its actual workload by @dem-extra1 in #804
- Passage of lines: multi-unit relief pairing (triplex acies) by @dem-extra1 in #801
- Pair engaged bodies to canonical target slots by physical position (closes #798) by @dem-extra1 in #806
- perf(soldier-bodies): drop dict allocation + redundant array in the #797 hot path by @dem-extra1 in #807
- fix(soldier-bodies): rate-limit the engaged-target-slot pairing by @dem-extra1 in #814
- docs(memory): record GIA batch-cleanup lessons by @dem-extra1 in #812
- DemoInputRecorder: session setter for show_soldier_ids by @dem-extra1 in #815
- Investigate which rank knockback affects (front vs rear) by @dem-extra1 in #816
- Checkerboard (quincunx) multi-line form-up by @dem-extra1 in #818
- docs(memory): record PR #818's form-up movement/reform lessons by @dem-extra1 in #823
- Design: atomic order queue (unify reform-hold, decompose composite orders) by @dem-extra1 in #824
- ums: git worktree remove on your own active worktree can partially succeed by @dem-extra1 in #825
- Slice 0: order-tree data model + rear-move/lateral-pivot onto children by @dem-extra1 in #831
- Default scripted-input demos to show the soldier-ID overlay by @dem-extra1 in #833
- docs(memory): record the fake-worktree hazard hit on PR #831 by @dem-extra1 in #835
- Fix unit-stats info panel not rendering legible text in recorded demos by @dem-extra1 in #837
- Slice 1: form-up reform-hold onto a REFORM leaf order by @dem-extra1 in #839
- Slice 2: group-level FORM_UP composite as real tree children by @dem-extra1 in #840
- Default demo scripts to drill mode unless the demo needs an enemy by @dem-extra1 in #846
- Add Codecov badge to README by @dem-extra1 in #850
- Slice 3: HUD order-tree display by @dem-extra1 in #841
- Add a "parade ground" battle option with no enemy army by @dem-extra1 in #842
- Add a battle mode where the player controls all teams by @dem-extra1 in #853
- docs(memory): record the codecov/patch gap-pinpointing technique by @dem-extra1 in #854
- Add a local patch-coverage check (codecov/patch approximation) by @dem-extra1 in #852
- fix(hud): clarify the Soldier IDs toggle requires zoom-in by @dem-extra1 in #855
- feat(hud): add a frame-rate + tick-rate counter with a corner picker by @dem-extra1 in #856
- feat(hud): offer to save the replay before an unsaved battle exit by @dem-extra1 in #857
- feat(replay): stamp saved replays with the build's commit SHA by @dem-extra1 in #858
- memories: record the blob/main link-checker gotcha for same-PR new files by @dem-extra1 in #859
- Extend verify-via-state-dump with a standard demo defect checklist by @dem-extra1 in #865
- Add echelon/oblique order for multi-unit formations by @dem-extra1 in #862
- Investigate and fix rank-1 synchronized knockback recovery time by @dem-extra1 in #860
- Anchor unit position on front-rank midpoint instead of full centroid by @dem-extra1 in #861
- Add countermarch (exelismos) maneuver, 3 variants by @dem-extra1 in #866
- memories: bank lessons from the 817/821/379/864/375 gii batch by @dem-extra1 in #867
- docs(memory): always check demos thoroughly, not just the claimed feature by @dem-extra1 in #868
- docs: document cavalry charge speed as intentional canter-pace by @dem-extra1 in #873
- Document FORMATION_SPACING as the intentional synaspismos tier by @dem-extra1 in #874
- fix(ci): exclude unreachable imperiumromanum.pl from the link checker by @dem-extra1 in #882
- feat(maneuver): about-face + flank-pivot(wheel) + march for large turns by @dem-extra1 in #871
- docs(memory): demo reviews include a super-physical motion check by @dem-extra1 in #883
- Derived, on-demand state snapshots for fast replay rewind/scrub by @dem-extra1 in #872
- docs(memory): manually review every clip the website demo-diff flags, document in the PR description by @dem-extra1 in #884
- Fix click-and-drag preview width in loose formation by @dem-extra1 in #870
- memories: bank two lessons from the 2026-07-15 gii batch by @dem-extra1 in #888
- feat: WorldScale shared-constants leaf script (phase A of the metric-definition plan) by @dem-extra1 in #889
- feat(ci): diff-scoped units-convention lint (phase B of the metric-definition plan) by @dem-extra1 in #890
- feat: metric-author the Unit and SoldierCombat physical constants (phase C) by @dem-extra1 in #894
- feat: metric-author the soldier-layer constants; triage the borderline distances (phase D) by @dem-extra1 in #895
- docs+tooling: metric docs sweep; state dumps emit metric mirrors (phase E) by @dem-extra1 in #896
- memories: sim-equality proof technique for dump-schema changes by @dem-extra1 in #897
- fix(maneuver): pace a wheel by its outer file's gait, not a fixed angular rate by @dem-extra1 in #898
- feat(orders): drill commands take a response beat -- a configurable atomic-order delay by @dem-extra1 in #899
- memories: demo box-step timing and stagger-legibility gotchas by @dem-extra1 in #900
- fix(ui): resize grips follow the selected unit as it moves by @dem-extra1 in #902
- feat(hud): unit info panel shows the full unit-level stat sheet by @dem-extra1 in #903
- feat(ci): website-demo-diff compares state transcripts, not clip bytes by @dem-extra1 in #906
- fix(ci): validate force-compiles every .gd, catching load-only parse errors by @dem-extra1 in #908
- memories: branch switches count as a second writer during Godot runs by @dem-extra1 in #909
- feat(ui): resize drag anchors the far flank instead of the centre by @dem-extra1 in #910
- chore: refresh benchmark.yml's CI baseline (scheduled) by @github-actions[bot] in #914
- feat(hud): narrow unit info panel — one semantic item per line by @dem-extra1 in #912
- feat: model armor and mount as typed loadout objects by @dem-extra1 in #913
- feat(hud): fold static unit characteristics by default by @dem-extra1 in #918
- feat(hud): drop the top hint bar; clamp the info panel to the viewport by @dem-extra1 in #919
- fix(ui): centre selection chrome on the block's shifted footprint by @dem-extra1 in #923
- fix: pre-contact blobbing in the showcase battle (rightmost enemy unit) by @dem-extra1 in #924
- feat(demo): deterministic defect analyzer over state transcripts (slice 1 of #930) by @dem-extra1 in #931
- feat(demo): machine-checkable expect blocks in demo input scripts (slice 2 of #930) by @dem-extra1 in #932
- feat(ci): wire the demo defect scan into the demo and demo-diff workflows (slice 3 of #930) by @dem-extra1 in #933
- feat(ci): both-sides defect delta over changed clips in the demo diff (closes #930) by @dem-extra1 in #934
- feat(art): procedural textured ground, forest, and hill (slice 1 of #925) by @dem-extra1 in #935
- feat(art): shaded soldier figures at figure LOD (slice 2 of #925) by @dem-extra1 in #936
- feat(art): banner and standard art (slice 3 of #925, closes #925) by @dem-extra1 in #937
- feat: per-type anisotropic formation spacing --- cavalry at realistic horse dimensions (closes #926) by @dem-extra1 in #938
- docs(memories): sync the demo spawn table with the post-cavalry-pitch line by @dem-extra1 in #941
- feat(render): full-length cavalry figure silhouette (closes #721) by @dem-extra1 in #942
- fix(pathfinding): exact terrain footprints + per-unit clearance (closes #928) by @dem-extra1 in #943
- docs: 3D conversion plan by @dem-extra1 in #929
- feat(demo-defects): key blob/overlap floors on body geometry, not grid pitch (closes #939) by @dem-extra1 in #958
- feat: deepen the battlefield so armies deploy at real distance (closes #945) by @dem-extra1 in #946
- feat: per-battle map definitions --- field, terrain, and spawn lines as data (closes #960) by @dem-extra1 in #964
- fix(demo): retune trapped_routing so the terrain detour actually plays out (closes #927) by @dem-extra1 in #966
- docs(memories): session lessons --- pursuit staging constraints, chase deformation, staging tools, render-side const misses by @dem-extra1 in #967
- fix: cycle-charge recharge peel never ends when the target flees by @dem-extra1 in #968
- fix: idle cavalry near a routed enemy compresses its bodies into overlap by @dem-extra1 in #970
- docs(memories): session lessons --- defect-gate sampling, reversal transients, renderer-config drift by @dem-extra1 in #971
- chore: gate tools/check.sh patch_coverage on Codecov's effective patch target by @dem-extra1 in #973
- feat: pursuit stances canter beyond the sprint window instead of walking by @dem-extra1 in #974
- feat: per-tick two-tier sim-state hash in the state-dump path + offline verify mode by @dem-extra1 in #976
- feat: funnel string-pulling hugs the clearance-grown terrain boundary on straightaways by @dem-extra1 in #977
- fix: right-click can issue an attack order on a routing enemy by @dem-extra1 in #978
- docs(memories): session lessons --- funnel-walk tests, cross-unit crowd-pressure, analyzer dependency split, armed-stance sticky state by @dem-extra1 in #980
- feat: sustained asymmetric melee standoff (spear holds a swordsman at bay) by @dem-extra1 in #981
- docs(memories): note #296's second auto-close, narrows the mechanism by @dem-extra1 in #984
- feat: give-ground order — explicit fighting retreat for a longer-reach unit by @dem-extra1 in #985
- feat: migrate walk_advance/reform_before_move to per-unit, type-defaulted settings by @dem-extra1 in #987
- chore: extract Godot+GUT setup boilerplate into a shared composite action by @dem-extra1 in #989
- chore: dedupe test/coverage GUT reruns; fix stale demo-media comment by @dem-extra1 in #990
- docs(memories): lessons from the redundancy-audit session (#988/#989/#990) by @dem-extra1 in #991
- feat: moving wheel maneuver (wheel while marching) by @dem-extra1 in #998
- feat: file-major vs row-major casualty reflow (per-unit toggle) by @dem-extra1 in #995
- feat: auto mode for file_major_reform (unit-level AI decides) by @dem-extra1 in #999
- docs(memories): lessons from the #878/#922/#997 session by @dem-extra1 in #1000
- fix: undisciplined units skip the formed lateral-pivot maneuver by @dem-extra1 in #1001
- feat: a queued waypoint leg applies its own stance once promoted by @dem-extra1 in #1002
- docs(memories): lessons from the #994/#996 GII+mwc session by @dem-extra1 in #1004
- chore: refresh benchmark.yml's CI baseline (scheduled) by @github-actions[bot] in #1003
- chore: AI_PERIOD becomes caller-configurable ai_period by @dem-extra1 in #1007
- fix: correct sweep-routers demo caption and state-dump tick sampling by @dem-extra1 in #1006
- chore: CAMERA_SMOOTHING becomes caller-configurable camera_smoothing by @dem-extra1 in #1008
- chore: rout/rally thresholds become caller-configurable by @dem-extra1 in #1009
- docs(memories): benchmark-noise verification technique from #1007-#1009 by @dem-extra1 in #1010
- chore: bump .ai-config submodule pin to latest main by @dem-extra1 in #1012
- docs: pause the standing #963 tunable-externalization audit by @dem-extra1 in #1021
- chore: DETECTION_RANGE becomes caller-configurable by @dem-extra1 in #1013
- fix: deterministic per-unit lane offset breaks funnel-corner convergence near the hill by @dem-extra1 in #1020
- feat: melee maneuver -- disengage and step back by @dem-extra1 in #1024
- docs(memories): cross-agent Godot collision + Get-CimInstance verification lesson by @dem-extra1 in #1026
- chore: refresh benchmark.yml's CI baseline (scheduled) by @github-actions[bot] in #1025
New Contributors
- @github-actions[bot] made their first contribution in #914
Full Changelog: v0.3.0...v0.4.0