Packages are unique-per-type; duplicate pulls now auto-scrap into Cache
(mirroring the distro dupe->Merges path) instead of a dead-end merges
pool, and the pull reveal shows "-> N cache" for the dupe card. Save
loading collapses any pre-existing duplicate package entries to the
highest-level instance and grants Cache for the extras, logging the
migration.
Also adds a dedicated Packages tab in the Collection screen (master
list with slot filter/sort + affordability hints, detail panel with
upgrade/scrap actions) so the whole inventory can be managed from one
place, sharing state with the existing per-distro Packages sub-tab.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQmck8EqqWxSq5uVZ4E7yN
Convert CombatManager's phase state machine to coroutines so drawing,
interpreter-queue cards, and enemy actions each resolve one at a time
with visible delays, instead of an entire phase mutating state in a
single synchronous frame. Delays are skipped when UIPreferences.ReducedMotion
is set. Also drops the UI's old artificial cascade stagger for queued-card
animations since real per-card timing now provides the spacing.
Menu <-> combat scene loads now fade through black instead of hard-cutting,
gacha pulls reveal reward cards with a staggered stagger-in and a rarity
flash instead of a static text block, starter selection and root-credit
exchange modals fade+scale in/out instead of popping via display:none, and
menu/collection/gacha rows now transition on hover/select instead of
snapping. All new motion respects the existing reduced-motion setting.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015hiJi3irEg1RegCXRaQDcu
- DistroDatabase.TryValidate() catches empty slots, blank ids, and
duplicate ids at edit time (OnValidate) and runtime, instead of only
surfacing as a runtime count check.
- StarterSelectionController centralizes the "do we have a usable
starter set" check (previously re-derived in five places) and shows a
dismissible in-UI error when the database is misconfigured, rather
than silently leaving the modal hidden with just a console warning.
- Boot-intro's bootIntroPlayed flag now resets via
RuntimeInitializeOnLoadMethod so it stays session-scoped even when
the Editor's Reload Domain setting is off.
- Extracted StarterSelectionController and CollectionScreenController
out of MainMenuController (885 -> ~490 lines), following the same
plain-class-plus-Bind() pattern already used by FeaturedUnitPanel.
Shared DisplayName/FormatLanguages formatting and digit-key mapping
moved into DistroPresentation/CommandKeyBindings to remove the
duplication that split would otherwise have introduced.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01364Mm9NsPooiSfDHKr4FAx