Add hq.svg (flag-base command building) and station.svg (shield, rendered
glyph-only over each side's fill) for in-world building icons. Redraw
tunnel_entry.svg as the shared Tunnel build button: the belt runs on the
surface at both ends and drops straight into/out of the ground, with rounded
corners and a single exit tip. No belt/splitter/tunnel world icons.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Add REQ-UI-WORLD-ICON: buildings render their icon's glyph symbol centered on
the footprint (over the existing fill), replacing the letter identity glyph,
with a text-glyph fallback for types without an icon file. Update
REQ-UI-CONSTRUCTION-PROGRESS and the visuals.toml config summary accordingly;
port glyphs are unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Add REQ-UI-BUILD-ICON (per-building SVG chip icons loaded from
data/icons/buildings/) and extend REQ-UI-BUILD-DISABLED to cover the greyed
icon variant shown for unaffordable buildings.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Revert of "Undo build button grid icons" (614dda8): restore the per-building
SVG icons, the QtSvg-based icon loading in BuildButtonGrid, the icon dir
plumbing in MainWindow, and the Qt5::Svg dependency.
This returns the unlock-groups branch to having the icons. The preceding
undo commit exists only so the Demolish -> Deconstruct rename can be
cherry-picked on its own (rename+icons commit together with the undo).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Remove the per-building SVG icons and all their wiring (the icon assets,
the QtSvg-based icon loading in BuildButtonGrid, the icon dir plumbing in
MainWindow, and the Qt5::Svg dependency), leaving only the Demolish ->
Deconstruct rename from the previous commit.
This is the inverse of the icon half of the previous commit, paired with a
following revert that re-adds the icons. Cherry-picking the previous
"rename + icons" commit together with this undo reconstructs the rename on
its own.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Rename the Demolish* terminology to Deconstruct* across the simulation,
events, UI, tests, and docs (DemolishCommand and the DemolishMode* events
become their Deconstruct* equivalents), aligning with the deconstruction
queue at HEAD.
Add per-building SVG icons for the build button grid (REQ-UI-BUILD-GRID):
one color-chip icon per placeable building under data/icons/buildings,
loaded from disk at runtime and rendered with QtSvg onto each build button.
An unaffordable building's button shows a grey-recolored variant via a
QIcon Disabled-mode pixmap (REQ-UI-BUILD-DISABLED). Adds the Qt5::Svg
dependency and deploys Qt5Svg.dll.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Demolishing a fully-built building now queues it for timed deconstruction
(world.toml deconstruction_time_seconds, default 0.1) running in parallel
with the construction queue, instead of removing it instantly. The partial
refund is credited on completion. A queued building stops operating at once
(belt/tunnel/splitter tiles unregister from the belt subsystem, re-pairing
tunnels) but keeps occupying its tiles. Construction sites are still removed
instantly with the full refund.
Clicking a queued building un-queues it (new CancelDeconstructionCommand);
a demolish drag-box un-queues all covered built buildings when they are all
already queued, otherwise queues the rest. Queued buildings render with the
demolish tint. Implements REQ-BLD-DECON-QUEUE and the updated
REQ-BLD-DEMOLISH / REQ-BLD-DEMOLISH-CLICK / REQ-BLD-DEMOLISH-BOX /
REQ-BLD-TUNNEL-PAIR.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Demolishing a fully-built building now queues it for timed
deconstruction (parallel to the construction queue) rather than
removing it instantly; construction sites are still removed
instantly. Adds REQ-BLD-DECON-QUEUE and updates REQ-BLD-DEMOLISH,
REQ-BLD-DEMOLISH-CLICK, REQ-BLD-DEMOLISH-BOX, and REQ-BLD-TUNNEL-PAIR.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Lift unlocking into first-class unlock groups defined in unlocks.toml, so
one defence-station drop can grant a bundle of ships/modules/buildings/
recipes at once (e.g. the salvager module + salvage bay), and buildings
can now be locked at game start and unlocked via a drop.
Config:
- New UnlocksConfig + ConfigLoader::loadUnlocks + validateUnlocks (unknown/
duplicate/non-assembler grants, unknown requires, empty group all fail load).
- Drop unlock_at_station_level/unlock_requires from ship/module/recipe defs;
add unlocked_at_start bool to recipes for graph-unreachable base recipes.
Simulation:
- Track awarded groups + per-building unlock state; an item starts unlocked
iff no group grants it. Rework generateSchematicChoices/applySchematicChoice
to operate on groups (grant all members at once). Extend state checksum.
- isBuildingUnlocked query; tryPlaceBuilding rejects locked types.
UI:
- Build-menu buttons for locked buildings start hidden, revealed via a new
UnlockedBuildingsChangedEvent (emitted from GameWorldView's poll loop).
- Schematic choice dialog lists a group's granted items.
- Blueprint placement excludes locked building types (REQ-LOCK-UI-BLUEPRINT).
Data: unlocks.toml (app + test) reproduces the prior per-item gates as
singleton groups and adds salvage_operations (salvager + salvage_bay, lvl 1)
and reprocessing (reprocessing_plant, lvl 2).
Tests: rewrote unlock/config/recipe-schematic/artifact/wave/shipyard tests
for the group model; added UnlockGroupTest. All 443 cases pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc
Replace the per-config unlock fields (unlock_at_station_level,
unlock_requires) with a first-class unlock-group concept defined in a
new unlocks.toml. An unlock group is now the unit of loot: awarding one
grants all its members (ships, modules, buildings, assembler recipes) at
once, so a building and a module can be unlocked together.
- Buildings become lockable (REQ-LOCK-BUILDING); locked types are hidden
from the build grid and skipped in blueprint placement.
- Items absent from every unlock group start unlocked (replaces -1).
- New unlocked_at_start flag on assembler recipes for graph-unreachable
base recipes (e.g. building blocks).
- Group display name derived from id for now; no display_name field yet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y7N59FsLA5e2kuVdqe4Uhc