diff --git a/src/gameresource.c b/src/gameresource.c index b267f63..84e1f07 100644 --- a/src/gameresource.c +++ b/src/gameresource.c @@ -66,6 +66,8 @@ static void storeSaveName(GameResource *gr, int no, char *src) { boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_readdir)(DIR *)) { memset(gr, 0, sizeof(GameResource)); + char *basename = NULL; + bool found_xsleep = false; struct dirent* d; while ((d = p_readdir(dir))) { char *filename = d->d_name; @@ -91,6 +93,10 @@ boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_r switch (toupper(filename[len - 6])) { case 'S': storeDataName(gr, DRIFILE_SCO, dno, filename); + if (!basename) { + basename = strdup(filename); + basename[len - 5] = '\0'; + } break; case 'G': storeDataName(gr, DRIFILE_CG, dno, filename); @@ -111,13 +117,26 @@ boolean initGameResourceFromDir(GameResource *gr, DIR *dir, struct dirent *(*p_r storeDataName(gr, DRIFILE_BGM, dno, filename); break; } + } else if (strcasecmp(filename + 1, "sleep.asd") == 0) { + found_xsleep = true; } } - for (int i = 0; i < SAVE_MAXNUMBER; i++) { - char buf[] = "asleep.asd"; - buf[0] = 'a' + i; - storeSaveName(gr, i, buf); + if (basename && !found_xsleep) { + char *buf = malloc(strlen(basename) + 6); + int a = basename[strlen(basename) - 1] == 'S' ? 'A' : 'a'; + for (int i = 0; i < SAVE_MAXNUMBER; i++) { + sprintf(buf, "%s%c.asd", basename, a + i); + storeSaveName(gr, i, buf); + } + free(buf); + } else { + for (int i = 0; i < SAVE_MAXNUMBER; i++) { + char buf[] = "asleep.asd"; + buf[0] = 'a' + i; + storeSaveName(gr, i, buf); + } } + free(basename); return (gr->cnt[DRIFILE_SCO] > 0) ? TRUE : FALSE; } diff --git a/src/gameresource_test.c b/src/gameresource_test.c index f4d6c29..24eadf0 100644 --- a/src/gameresource_test.c +++ b/src/gameresource_test.c @@ -74,50 +74,69 @@ static struct dirent *mockReaddir(DIR *dir) { } static void initGameResourceFromDir_test(void) { - const char *files[] = { - "ADISK.ALD", - "FOOSB.ALD", - "foogz.ald", - "WA.ALD", - "unknownXA.ald", - "a.ald", - ".ald", - "a", - "SYSTEM39.AIN", - "foo_WA.WAI", - "foo_BA.BGI", - "SACTEFAM.KLD", - "System39.ini", - "foo1.alk", - "0.alk", - ".alk", - NULL - }; - const char **dir = files; - GameResource gr; - ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir)); - ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 2); - ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "ADISK.ALD"); - ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][1], "FOOSB.ALD"); - ASSERT_EQUAL(gr.cnt[DRIFILE_CG], 26); - ASSERT_STRCMP(gr.game_fname[DRIFILE_CG][25], "foogz.ald"); - ASSERT_EQUAL(gr.cnt[DRIFILE_WAVE], 1); - ASSERT_STRCMP(gr.game_fname[DRIFILE_WAVE][0], "WA.ALD"); - for (int i = 0; i < 26; i++) { - char buf[16]; - sprintf(buf, "%csleep.asd", 'a' + i); - ASSERT_STRCMP(gr.save_fname[i], buf); + { + const char *files[] = { + "FOOSA.ALD", + "FOOSB.ALD", + "foogz.ald", + "WA.ALD", + "unknownXA.ald", + "a.ald", + ".ald", + "a", + "SYSTEM39.AIN", + "foo_WA.WAI", + "foo_BA.BGI", + "SACTEFAM.KLD", + "System39.ini", + "foo1.alk", + "0.alk", + ".alk", + NULL + }; + const char **dir = files; + GameResource gr; + ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir)); + ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 2); + ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "FOOSA.ALD"); + ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][1], "FOOSB.ALD"); + ASSERT_EQUAL(gr.cnt[DRIFILE_CG], 26); + ASSERT_STRCMP(gr.game_fname[DRIFILE_CG][25], "foogz.ald"); + ASSERT_EQUAL(gr.cnt[DRIFILE_WAVE], 1); + ASSERT_STRCMP(gr.game_fname[DRIFILE_WAVE][0], "WA.ALD"); + for (int i = 0; i < 26; i++) { + char buf[16]; + sprintf(buf, "FOOS%c.asd", 'A' + i); + ASSERT_STRCMP(gr.save_fname[i], buf); + } + ASSERT_STRCMP(gr.save_path, "."); + ASSERT_STRCMP(gr.ain, "SYSTEM39.AIN"); + ASSERT_STRCMP(gr.wai, "foo_WA.WAI"); + ASSERT_STRCMP(gr.bgi, "foo_BA.BGI"); + ASSERT_STRCMP(gr.sact01, "SACTEFAM.KLD"); + ASSERT_STRCMP(gr.init, "System39.ini"); + ASSERT_STRCMP(gr.alk[0], "0.alk"); + ASSERT_STRCMP(gr.alk[1], "foo1.alk"); + for (int i = 2; i < 10; i++) + ASSERT_NULL(gr.alk[i]); + } + { + const char *files[] = { + "ADISK.ALD", + "asleep.asd", + NULL + }; + const char **dir = files; + GameResource gr; + ASSERT_TRUE(initGameResourceFromDir(&gr, (DIR *)&dir, mockReaddir)); + ASSERT_EQUAL(gr.cnt[DRIFILE_SCO], 1); + ASSERT_STRCMP(gr.game_fname[DRIFILE_SCO][0], "ADISK.ALD"); + for (int i = 0; i < 26; i++) { + char buf[16]; + sprintf(buf, "%csleep.asd", 'a' + i); + ASSERT_STRCMP(gr.save_fname[i], buf); + } } - ASSERT_STRCMP(gr.save_path, "."); - ASSERT_STRCMP(gr.ain, "SYSTEM39.AIN"); - ASSERT_STRCMP(gr.wai, "foo_WA.WAI"); - ASSERT_STRCMP(gr.bgi, "foo_BA.BGI"); - ASSERT_STRCMP(gr.sact01, "SACTEFAM.KLD"); - ASSERT_STRCMP(gr.init, "System39.ini"); - ASSERT_STRCMP(gr.alk[0], "0.alk"); - ASSERT_STRCMP(gr.alk[1], "foo1.alk"); - for (int i = 2; i < 10; i++) - ASSERT_NULL(gr.alk[i]); } void gameresource_test(void) {