mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-10-03 12:18:13 +03:00
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:
+23
-4
@@ -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
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user