X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=ac1b0fa74a380246fa12e2f8880e3240648f6fae;hb=2f9311c5cfa019e40c127df71e25659b641986d3;hp=0de480e07354cc44929749acb9861785716a9b21;hpb=4b22e01f196292da25d7201cb08ca52af6a38901;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 0de480e0..ac1b0fa7 100644 --- a/src/files.c +++ b/src/files.c @@ -19,6 +19,92 @@ #include "tape.h" #include "joystick.h" +#define MAX_LINE_LEN 1000 + +static char *getGlobalDataDir() +{ + return GAME_DIR; +} + +static char *getUserDataDir() +{ + static char *userdata_dir = NULL; + + if (!userdata_dir) + { + char *home_dir = getHomeDir(); + char *data_dir = USERDATA_DIRECTORY; + + userdata_dir = checked_malloc(strlen(home_dir) + strlen(data_dir) + 2); + sprintf(userdata_dir, "%s/%s", home_dir, data_dir); + } + + return userdata_dir; +} + +static char *getSetupDir() +{ + return getUserDataDir(); +} + +static char *getTapeDir(char *level_subdir) +{ + static char *tape_dir = NULL; + char *data_dir = getUserDataDir(); + char *tape_subdir = TAPES_DIRECTORY; + + if (tape_dir) + free(tape_dir); + + tape_dir = checked_malloc(strlen(data_dir) + strlen(tape_subdir) + + strlen(level_subdir) + 3); + sprintf(tape_dir, "%s/%s%s%s", data_dir, tape_subdir, + (strlen(level_subdir) > 0 ? "/" : ""), level_subdir); + + return tape_dir; +} + +static char *getScoreDir(char *level_subdir) +{ + static char *score_dir = NULL; + char *data_dir = getGlobalDataDir(); + char *score_subdir = SCORES_DIRECTORY; + + if (score_dir) + free(score_dir); + + score_dir = checked_malloc(strlen(data_dir) + strlen(score_subdir) + + strlen(level_subdir) + 3); + sprintf(score_dir, "%s/%s%s%s", data_dir, score_subdir, + (strlen(level_subdir) > 0 ? "/" : ""), level_subdir); + + return score_dir; +} + +static void createDirectory(char *dir, char *text) +{ + if (access(dir, F_OK) != 0) + if (mkdir(dir, USERDATA_DIR_MODE) != 0) + Error(ERR_WARN, "cannot create %s directory '%s'", text, dir); +} + +static void InitUserDataDirectory() +{ + createDirectory(getUserDataDir(), "user data"); +} + +static void InitTapeDirectory(char *level_subdir) +{ + createDirectory(getTapeDir(""), "main tape"); + createDirectory(getTapeDir(level_subdir), "level tape"); +} + +static void InitScoreDirectory(char *level_subdir) +{ + createDirectory(getScoreDir(""), "main score"); + createDirectory(getScoreDir(level_subdir), "level score"); +} + boolean LoadLevelInfo() { int i; @@ -26,16 +112,16 @@ boolean LoadLevelInfo() char cookie[MAX_FILENAME_LEN]; FILE *file; - sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME); + sprintf(filename, "%s/%s", options.level_directory, LEVDIR_FILENAME); - if (!(file=fopen(filename,"r"))) + if (!(file = fopen(filename, "r"))) { Error(ERR_WARN, "cannot read level info '%s'", filename); return(FALSE); } - fscanf(file,"%s\n",cookie); - if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */ + fscanf(file, "%s\n", cookie); + if (strcmp(cookie, LEVELDIR_COOKIE)) { Error(ERR_WARN, "wrong format of level info file"); fclose(file); @@ -44,12 +130,12 @@ boolean LoadLevelInfo() num_leveldirs = 0; leveldir_nr = 0; - for(i=0;i0) + if (levelrec_10 && j > 0) { tape.pos[i].action[j] = MV_NO_MOVING; continue; @@ -272,6 +354,34 @@ void LoadLevelTape(int level_nr) tape.pos[i].delay = fgetc(file); + if (levelrec_10) + { + /* eliminate possible diagonal moves in old tapes */ + /* this is only for backward compatibility */ + + byte joy_dir[4] = { JOY_LEFT, JOY_RIGHT, JOY_UP, JOY_DOWN }; + byte action = tape.pos[i].action[0]; + int k, num_moves = 0; + + for (k=0; k<4; k++) + { + if (action & joy_dir[k]) + { + tape.pos[i + num_moves].action[0] = joy_dir[k]; + if (num_moves > 0) + tape.pos[i + num_moves].delay = 0; + num_moves++; + } + } + + if (num_moves > 1) + { + num_moves--; + i += num_moves; + tape.length += num_moves; + } + } + if (feof(file)) break; } @@ -284,39 +394,37 @@ void LoadLevelTape(int level_nr) tape.length_seconds = GetTapeLength(); } -void SaveLevelTape(int level_nr) +void SaveTape(int level_nr) { int i; char filename[MAX_FILENAME_LEN]; FILE *file; boolean new_tape = TRUE; -#ifndef MSDOS - sprintf(filename,"%s/%s/%d.tape", - level_directory,leveldir[leveldir_nr].filename,level_nr); -#else - sprintf(filename,"%s/%s/%d.tap", - level_directory,leveldir[leveldir_nr].filename,level_nr); -#endif + sprintf(filename, "%s/%d.%s", + getTapeDir(leveldir[leveldir_nr].filename), + level_nr, TAPEFILE_EXTENSION); + + InitTapeDirectory(leveldir[leveldir_nr].filename); /* Testen, ob bereits eine Aufnahme existiert */ - if ((file=fopen(filename,"r"))) + if ((file = fopen(filename, "r"))) { new_tape = FALSE; fclose(file); - if (!Request("Replace old tape ?",REQ_ASK)) + if (!Request("Replace old tape ?", REQ_ASK)) return; } - if (!(file=fopen(filename,"w"))) + if (!(file = fopen(filename, "w"))) { Error(ERR_WARN, "cannot save level recording file '%s'", filename); return; } - fputs(LEVELREC_COOKIE,file); /* Formatkennung */ - fputc(0x0a,file); + fputs(LEVELREC_COOKIE, file); /* Formatkennung */ + fputc(0x0a, file); fputc((tape.random_seed >> 24) & 0xff,file); fputc((tape.random_seed >> 16) & 0xff,file); @@ -333,14 +441,14 @@ void SaveLevelTape(int level_nr) fputc((tape.length >> 8) & 0xff,file); fputc((tape.length >> 0) & 0xff,file); - for(i=0;iautorecord = FALSE; si->quick_doors = FALSE; - strncpy(si->login_name, GetLoginName(), MAX_NAMELEN-1); + strncpy(si->login_name, getLoginName(), MAX_NAMELEN-1); si->login_name[MAX_NAMELEN-1] = '\0'; - strncpy(si->alias_name, GetLoginName(), MAX_NAMELEN-1); + strncpy(si->alias_name, getLoginName(), MAX_NAMELEN-1); si->alias_name[MAX_NAMELEN-1] = '\0'; for (i=0; i