X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=37210cd7ecc37b2631f1d21ad805375e2dc3eb95;hb=8be31c2781126204470171aff7af45713ec42e9e;hp=fa40845efe78e496e7e27c4fb9e57a19ec3c4cf2;hpb=f806f2ad0dfa82c3abd3d027250a549ca22f4374;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index fa40845e..37210cd7 100644 --- a/src/files.c +++ b/src/files.c @@ -14,7 +14,6 @@ #include #include #include -#include #include "files.h" #include "tools.h" @@ -64,9 +63,33 @@ #define LEVELFILE_EXTENSION "lvl" #define TAPEFILE_EXTENSION "tap" #define SCOREFILE_EXTENSION "sco" +#endif + +#if defined(MSDOS) || defined(WIN32) #define ERROR_FILENAME "error.out" #endif +#ifdef WIN32 +#ifndef S_IRGRP +#define S_IRGRP S_IRUSR +#endif +#ifndef S_IROTH +#define S_IROTH S_IRUSR +#endif +#ifndef S_IWGRP +#define S_IWGRP S_IWUSR +#endif +#ifndef S_IWOTH +#define S_IWOTH S_IWUSR +#endif +#ifndef S_IXGRP +#define S_IXGRP S_IXUSR +#endif +#ifndef S_IXOTH +#define S_IXOTH S_IXUSR +#endif +#endif + /* file permissions for newly written files */ #define MODE_R_ALL (S_IRUSR | S_IRGRP | S_IROTH) #define MODE_W_ALL (S_IWUSR | S_IWGRP | S_IWOTH) @@ -324,7 +347,11 @@ static char *getScoreFilename(int nr) static void createDirectory(char *dir, char *text) { if (access(dir, F_OK) != 0) +#ifdef WIN32 + if (mkdir(dir) != 0) +#else if (mkdir(dir, USERDATA_DIR_MODE) != 0) +#endif Error(ERR_WARN, "cannot create %s directory '%s'", text, dir); } @@ -441,6 +468,17 @@ static void setLevelInfoToDefaults() } } +static int checkLevelElement(int element) +{ + if (element >= EL_FIRST_RUNTIME_EL) + { + Error(ERR_WARN, "invalid level element %d", element); + element = EL_CHAR_FRAGE; + } + + return element; +} + void LoadLevel(int level_nr) { int i, x, y; @@ -510,7 +548,7 @@ void LoadLevel(int level_nr) for(x=0; x<3; x++) { if (i < STD_ELEMENT_CONTENTS) - level.yam_content[i][x][y] = fgetc(file); + level.yam_content[i][x][y] = checkLevelElement(fgetc(file)); else level.yam_content[i][x][y] = EL_LEERRAUM; } @@ -520,7 +558,7 @@ void LoadLevel(int level_nr) level.amoeba_speed = fgetc(file); level.time_magic_wall = fgetc(file); level.time_wheel = fgetc(file); - level.amoeba_content = fgetc(file); + level.amoeba_content = checkLevelElement(fgetc(file)); level.double_speed = (fgetc(file) == 1 ? TRUE : FALSE); level.gravity = (fgetc(file) == 1 ? TRUE : FALSE); @@ -566,9 +604,10 @@ void LoadLevel(int level_nr) for(y=0; y<3; y++) for(x=0; x<3; x++) level.yam_content[i][x][y] = - (encoding_16bit ? - getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) : - fgetc(file)); + checkLevelElement(encoding_16bit ? + getFile16BitInteger(file, + BYTE_ORDER_BIG_ENDIAN) : + fgetc(file)); getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN); } @@ -591,9 +630,9 @@ void LoadLevel(int level_nr) for(y=0; yteam_mode = FALSE; si->handicap = TRUE; si->time_limit = TRUE; + si->fullscreen = FALSE; for (i=0; iinput[i].joy.ylower = JOYSTICK_YLOWER; si->input[i].joy.snap = (i == 0 ? JOY_BUTTON_1 : 0); si->input[i].joy.bomb = (i == 0 ? JOY_BUTTON_2 : 0); - si->input[i].key.left = (i == 0 ? DEFAULT_KEY_LEFT : KEY_UNDEFINDED); - si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINDED); - si->input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KEY_UNDEFINDED); - si->input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KEY_UNDEFINDED); - si->input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KEY_UNDEFINDED); - si->input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KEY_UNDEFINDED); + si->input[i].key.left = (i == 0 ? DEFAULT_KEY_LEFT : KEY_UNDEFINED); + si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINED); + si->input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KEY_UNDEFINED); + si->input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KEY_UNDEFINED); + si->input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KEY_UNDEFINED); + si->input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KEY_UNDEFINED); } } @@ -1526,8 +1568,8 @@ static void setSetupInfo(int token_nr, char *token_value) *(boolean *)setup_value = get_string_boolean_value(token_value); break; - case TYPE_KEYSYM: - *(KeySym *)setup_value = getKeySymFromX11KeyName(token_value); + case TYPE_KEY: + *(Key *)setup_value = getKeyFromX11KeyName(token_value); break; case TYPE_INTEGER: @@ -1872,12 +1914,12 @@ static char *getSetupLine(char *prefix, int token_nr) strcat(entry, (*(boolean *)setup_value ? "on" : "off")); break; - case TYPE_KEYSYM: + case TYPE_KEY: { - KeySym keysym = *(KeySym *)setup_value; - char *keyname = getKeyNameFromKeySym(keysym); + Key key = *(Key *)setup_value; + char *keyname = getKeyNameFromKey(key); - strcat(entry, getX11KeyNameFromKeySym(keysym)); + strcat(entry, getX11KeyNameFromKey(key)); for (i=strlen(entry); i<50; i++) strcat(entry, " "); @@ -2038,7 +2080,7 @@ static void checkSeriesInfo() level_directory = getPath2((leveldir_current->user_defined ? getUserLevelDir("") : options.level_directory), - leveldir_current->filename); + leveldir_current->fullpath); if ((dir = opendir(level_directory)) == NULL) { @@ -2174,7 +2216,7 @@ void SaveLevelSetup_SeriesInfo() chmod(filename, SETUP_PERMS); } -#ifdef MSDOS +#if defined(MSDOS) || defined(WIN32) void initErrorFile() { char *filename;