first try to load idf games

This commit is contained in:
p.kosyh 2011-04-18 17:48:25 +00:00
parent 921f1a96a1
commit 984d47fa59
5 changed files with 46 additions and 5 deletions

View file

@ -47,10 +47,15 @@ void game_err_msg(const char *s)
static int is_game(const char *path, const char *n)
{
int rc = 0;
char *p = getpath(path, n);
char *p = getfilepath(path, n);
char *pp;
if (!p)
return 0;
if (idf_magic(p)) {
free(p);
return 1;
}
strcat(p, "/");
pp = malloc(strlen(p) + strlen(MAIN_FILE) + 1);
if (pp) {
strcpy(pp, p);
@ -124,12 +129,21 @@ int game_select(const char *name)
curgame_dir = oldgame;
return -1;
}
if (setdir(g->path)) {
if (g->idf) {
setdir(game_cwd);
if (oldgame != curgame_dir) {
idf_done(game_idf);
game_idf = idf_init(g->path);
}
}
if ((!g->idf && setdir(g->path)) || (g->idf && !game_idf)) {
curgame_dir = oldgame;
return -1;
}
if (oldgame != curgame_dir) {
if (oldgame != curgame_dir && !g->idf) {
idf_done(game_idf);
game_idf = idf_init(DATA_IDF);
}
@ -200,14 +214,20 @@ static void games_sort()
{
qsort(games, games_nr, sizeof(struct game), cmp_game);
}
static int games_add(const char *path, const char *dir)
{
char *p;
if (!is_game(path, dir))
return -1;
p = getpath(path, dir);
p = getfilepath(path, dir);
if (!p)
return -1;
if (!idf_magic(p)) {
strcat(p, "/");
games[games_nr].idf = 0;
} else
games[games_nr].idf = 1;
games[games_nr].path = p;
games[games_nr].dir = strdup(dir);
games[games_nr].name = game_name(p, dir);

View file

@ -103,6 +103,7 @@ struct game {
char *path;
char *name;
char *dir;
int idf;
};
extern struct game *games;

View file

@ -69,6 +69,22 @@ static int write_word(FILE *fd, unsigned long w)
return 0;
}
int idf_magic(const char *fname)
{
char sign[4];
FILE *fd = fopen(dirpath(fname), "rb");
if (!fd)
return 0;
if (fread(sign, 1, 4, fd) != 4) {
fclose(fd);
return 0;
}
fclose(fd);
if (!memcmp(sign, "IDF\n", 4))
return 1;
return 0;
}
idf_t idf_init(const char *fname)
{
char sign[4];

View file

@ -23,5 +23,6 @@ extern int idf_eof(idff_t idf);
extern int idf_error(idff_t idf);
extern int idf_access(idf_t idf, const char *fname);
extern char *idf_gets(idff_t idf, char *b, int size);
extern int idf_magic(const char *fname);
#endif

View file

@ -737,7 +737,10 @@ int game_theme_init(void)
static int theme_parse(const char *path)
{
idff_t idf = idf_open(game_idf, path);
idff_t idf = NULL;
if (theme_relative)
idf = idf_open(game_idf, path);
if (idf) {
int rc = parse_idff(idf, path, cmd_parser);