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
Reshape selection into two mutually-exclusive categories: buildings
(exclusive, win all ties) and field objects (ships, defence stations,
scrap piles) that coexist freely. Add REQ-UI-SELECTION-CATEGORIES and
REQ-UI-FIELD-MULTI-SELECTION; update entity/scrap click- and
multi-select requirements and the ship/station/scrap panels accordingly.
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