Save slots now track the currently-active cutscene file (defaulting to a
new placeholder new_game.jsonc intro) so loading a save resumes it;
cutsceneSystemStartCutsceneWith persists this on every cutscene start, and
a cutsceneSystemLoad ordering bug (loadedFile stamped after starting) is
fixed so the persisted path is always correct. Also adds a
battlefighterspecies_t/battlespeciesid_t stub for upcoming species data.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
- party.jsonc's "members" is now a key/value object (e.g. "hero",
"companion") instead of an array - partyInit seeds party_t.keys
alongside members, and partyGetMemberIndexByKey/partyGetMemberKey do the
lookups. Cutscene items (PARTY_ADD_MEMBER/PARTY_REMOVE_MEMBER/
PARTY_HEAL_MEMBER) now take a "key" JSON field, resolved to a roster
index at load time, instead of a raw index.
- Battle UI shows who's acting: uibattlemenu.c draws the current fighter's
party key above the action menu, and uibattlehud.c draws each ally
fighter's key as an extra line above their HP/MP.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
- Battle selection menu can now go back a fighter to re-decide their move,
and battle win/loss no longer leaks the round's remaining queued move
cutscenes into the ending state (cutsceneSystemDiscardQueued).
- Party roster is now driven by party.jsonc: every defined member always
exists (partyInit), while party->order alone determines who's currently
active - partyAddMember/partyRemoveMember (and their cutscene items) now
activate/deactivate an existing roster member by index instead of
creating/destroying one, with removal compacting order to stay packed.
- New PARTY_ADD_MEMBER/PARTY_REMOVE_MEMBER/PARTY_HEAL_MEMBER/PARTY_HEAL_ALL
cutscene items.
- saveSlotInit/partyInit now return errorret_t and take their target
struct directly (saveslot_t*/party_t*) instead of implicitly operating
on SAVE.slot; saveSlotReadJSON resets through saveSlotInit rather than
duplicating the reset logic.
- Test coverage: stub the JSON asset loader in save test fixtures so
partyInit's real party.jsonc load runs against an in-memory doc instead
of hanging with no asset system initialized.
Co-Authored-By: Claude Sonnet 5 <[email protected]>