The event also fires on deselection and now carries a set of entities
rather than a single one, so the "SelectionChanged" name (matching
SelectionChangedEvent and ScrapSelectionChangedEvent) is more accurate.
Pure rename: header + include guard, CMake entry, and all usages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Reshape game-world selection into two categories: buildings (exclusive,
win all ties) and field objects (ships, defence stations, scrap) that
coexist. Ships/stations are now multi-selectable via Ctrl+click and
box-drag and can be selected together with scrap; the Selected panel
shows a single-actor stats panel or a multi-actor summary plus the scrap
total.
- Widen EntitySelectedEvent to std::vector<entt::entity>
- Add actorsInBox() ECS query (+ Catch2 test)
- GameWorldView: vector actor selection, building>actor>scrap hit-test,
actor Ctrl-toggle/box-select, membership highlights, per-frame prune
- SelectedBuildingPanel: buildFieldSelection composition, buildEntitySummary
- ArenaView/InspectWindow: adapt to vector payload (single-select)
Implements REQ-UI-SELECTION-CATEGORIES, REQ-UI-FIELD-MULTI-SELECTION and
the updated entity/scrap selection requirements.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Replace sentinel values that signalled "no value" with std::optional
across simulation, UI, and balancing code:
- BuildingId references: DeliverScrapBehavior::deliveryBay,
Simulation::m_hqBuildingId, the return types of BuildingSystem::place
and Simulation::tryPlaceBuilding (previously kInvalidBuildingId on
failure), GameWorldView building/site-at-tile lookups and demolish
hover, SelectedBuildingPanel::m_singleBuildingId.
- Command id fields: the five id-carrying commands now hold
optional<BuildingId>; CommandSerializer and Simulation::apply updated.
The serialized replay format is unchanged.
- Index sentinels: BlueprintPanel::m_activeIndex,
BalancingWindow::m_inspectedArenaIndex, ArenaSimulation winnerTeam,
and the moduleIndex grid cells in ShipLayoutDialog/ShipLayoutPreview.
ShipLayoutDialog::m_activeModuleIndex was a tri-state, so it is
modelled as bool m_removeMode + optional<int>.
Building/ConstructionSite id defaults keep kInvalidBuildingId (identity,
not an absent reference); entt::null and config -1 domain values are
left as-is.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Add deterministic record/playback for a run.
Recording captures `(seed, config hash, ordered tick-tagged commands)` and re-simulates on playback — no state snapshots. `DotaFactory.exe --replay <file>` re-plays a recorded run view-only with manual speed/pause.
Reviewed-on: #4
Co-authored-by: Malte Langkabel <malte.langkabel@gmail.com>
Co-committed-by: Malte Langkabel <malte.langkabel@gmail.com>
Fixes a bug where the selected construction site was not drawn with a border.
Reviewed-on: #2
Co-authored-by: Malte Langkabel <malte.langkabel@gmail.com>
Co-committed-by: Malte Langkabel <malte.langkabel@gmail.com>