Add order-based party roster, back-navigation in battle selection, fix win-state cutscene leak
- 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]>
This commit is contained in:
@@ -9,11 +9,25 @@
|
||||
#include "save/slot/saveslot.h"
|
||||
#include "save/save.h"
|
||||
#include "save/savejson.h"
|
||||
#include "savetestfixture.h"
|
||||
#include "util/memory.h"
|
||||
#include "util/string.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// saveSlotInit() seeds the party roster via partyInit(), which loads
|
||||
// party.jsonc through the real asset system - stub it out (see
|
||||
// savetestfixture.h) rather than needing a real asset bundle here.
|
||||
static int assetGroupSetup(void **state) {
|
||||
saveTestFixtureStubPartyAsset();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int assetGroupTeardown(void **state) {
|
||||
saveTestFixtureUnstubPartyAsset();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Helpers - wrap the writeInit/readInit macros (which can only be used
|
||||
// inside a function returning errorret_t) so tests can call them plainly.
|
||||
@@ -52,7 +66,7 @@ static errorret_t slotFromJSON(saveslot_t *slot, const char_t *json) {
|
||||
static void test_saveSlotInit_defaults(void **state) {
|
||||
memorySet(&SAVE.slot, 0xFF, sizeof(SAVE.slot));
|
||||
|
||||
saveSlotInit();
|
||||
saveSlotInit(&SAVE.slot);
|
||||
|
||||
assert_int_equal(SAVE.slot.version, 1);
|
||||
assert_int_equal(SAVE.slot.dataType, 0);
|
||||
@@ -66,7 +80,7 @@ static void test_saveSlotInit_defaults(void **state) {
|
||||
// ============================================================
|
||||
|
||||
static void test_saveSlotInUse(void **state) {
|
||||
saveSlotInit();
|
||||
saveSlotInit(&SAVE.slot);
|
||||
|
||||
assert_false(saveSlotInUse(&SAVE.slot.cachedData));
|
||||
|
||||
@@ -81,7 +95,7 @@ static void test_saveSlotInUse_nullAsserts(void **state) {
|
||||
}
|
||||
|
||||
static void test_saveSlotHasSaved(void **state) {
|
||||
saveSlotInit();
|
||||
saveSlotInit(&SAVE.slot);
|
||||
|
||||
assert_false(saveSlotHasSaved(&SAVE.slot.cachedData));
|
||||
|
||||
@@ -136,7 +150,7 @@ static void test_saveSlotReadJSON_nullAsserts(void **state) {
|
||||
static void test_saveSlotReadJSON_roundTrip(void **state) {
|
||||
// saveSlotInit() only ever operates on SAVE.slot now, so that's the
|
||||
// write source here.
|
||||
saveSlotInit();
|
||||
saveSlotInit(&SAVE.slot);
|
||||
SAVE.slot.version = 7;// deliberately non-default, not part of the JSON schema
|
||||
stringCopy(
|
||||
SAVE.slot.cachedData.name, "Hero", sizeof(SAVE.slot.cachedData.name)
|
||||
@@ -296,5 +310,5 @@ int main(void) {
|
||||
cmocka_unit_test(test_saveSlotReadJSON_versionMismatch_errors),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
return cmocka_run_group_tests(tests, assetGroupSetup, assetGroupTeardown);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user