Change how save file names are determined when no .gr file is specified

If `?sleep.asd` already exist, use them. Otherwise use `*s?.asd` as in
System3x.exe.
This commit is contained in:
kichikuou
2023-03-18 09:51:51 +09:00
parent aec06f775a
commit 6d70439dff
2 changed files with 85 additions and 47 deletions
+23 -4
View File
@@ -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;
}
+62 -43
View File
@@ -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) {