X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=2a72397139931fb4d9c735428353d0925c65e1cb;hb=2443a8a09966a9940e1420c91d24a297325c2a00;hp=00e471610249cdc40baee8b5a824528d8ee443a2;hpb=41e8d55b767c898f20c29a1b0b8d2ef8840be2f5;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 00e47161..2a723971 100644 --- a/src/files.c +++ b/src/files.c @@ -38,6 +38,10 @@ #define SCORE_COOKIE "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2" +/* ========================================================================= */ +/* level file functions */ +/* ========================================================================= */ + static void setLevelInfoToDefaults() { int i, x, y; @@ -668,6 +672,11 @@ void SaveLevel(int level_nr) SetFilePermissions(filename, PERMS_PRIVATE); } + +/* ========================================================================= */ +/* tape file functions */ +/* ========================================================================= */ + static void setTapeInfoToDefaults() { int i; @@ -789,6 +798,8 @@ static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape) } else if (tape->file_version < FILE_VERSION_2_0) { + /* convert pre-2.0 tapes to new tape format */ + if (tape->pos[i].delay > 1) { /* action part */ @@ -1064,6 +1075,11 @@ void DumpTape(struct TapeInfo *tape) printf("-------------------------------------------------------------------------------\n"); } + +/* ========================================================================= */ +/* score file functions */ +/* ========================================================================= */ + void LoadScore(int level_nr) { int i; @@ -1140,3 +1156,286 @@ void SaveScore(int level_nr) SetFilePermissions(filename, PERMS_PUBLIC); } + + +/* ========================================================================= */ +/* setup file functions */ +/* ========================================================================= */ + +#define TOKEN_STR_PLAYER_PREFIX "player_" + +/* global setup */ +#define SETUP_TOKEN_PLAYER_NAME 0 +#define SETUP_TOKEN_SOUND 1 +#define SETUP_TOKEN_SOUND_LOOPS 2 +#define SETUP_TOKEN_SOUND_MUSIC 3 +#define SETUP_TOKEN_SOUND_SIMPLE 4 +#define SETUP_TOKEN_TOONS 5 +#define SETUP_TOKEN_SCROLL_DELAY 6 +#define SETUP_TOKEN_SOFT_SCROLLING 7 +#define SETUP_TOKEN_FADING 8 +#define SETUP_TOKEN_AUTORECORD 9 +#define SETUP_TOKEN_QUICK_DOORS 10 +#define SETUP_TOKEN_TEAM_MODE 11 +#define SETUP_TOKEN_HANDICAP 12 +#define SETUP_TOKEN_TIME_LIMIT 13 +#define SETUP_TOKEN_FULLSCREEN 14 +#define SETUP_TOKEN_ASK_ON_ESCAPE 15 + +#define NUM_GLOBAL_SETUP_TOKENS 16 + +/* shortcut setup */ +#define SETUP_TOKEN_SAVE_GAME 0 +#define SETUP_TOKEN_LOAD_GAME 1 + +#define NUM_SHORTCUT_SETUP_TOKENS 2 + +/* player setup */ +#define SETUP_TOKEN_USE_JOYSTICK 0 +#define SETUP_TOKEN_JOY_DEVICE_NAME 1 +#define SETUP_TOKEN_JOY_XLEFT 2 +#define SETUP_TOKEN_JOY_XMIDDLE 3 +#define SETUP_TOKEN_JOY_XRIGHT 4 +#define SETUP_TOKEN_JOY_YUPPER 5 +#define SETUP_TOKEN_JOY_YMIDDLE 6 +#define SETUP_TOKEN_JOY_YLOWER 7 +#define SETUP_TOKEN_JOY_SNAP 8 +#define SETUP_TOKEN_JOY_BOMB 9 +#define SETUP_TOKEN_KEY_LEFT 10 +#define SETUP_TOKEN_KEY_RIGHT 11 +#define SETUP_TOKEN_KEY_UP 12 +#define SETUP_TOKEN_KEY_DOWN 13 +#define SETUP_TOKEN_KEY_SNAP 14 +#define SETUP_TOKEN_KEY_BOMB 15 + +#define NUM_PLAYER_SETUP_TOKENS 16 + +static struct SetupInfo si; +static struct SetupShortcutInfo ssi; +static struct SetupInputInfo sii; + +static struct TokenInfo global_setup_tokens[] = +{ + /* global setup */ + { TYPE_STRING, &si.player_name, "player_name" }, + { TYPE_SWITCH, &si.sound, "sound" }, + { TYPE_SWITCH, &si.sound_loops, "repeating_sound_loops" }, + { TYPE_SWITCH, &si.sound_music, "background_music" }, + { TYPE_SWITCH, &si.sound_simple, "simple_sound_effects" }, + { TYPE_SWITCH, &si.toons, "toons" }, + { TYPE_SWITCH, &si.scroll_delay, "scroll_delay" }, + { TYPE_SWITCH, &si.soft_scrolling, "soft_scrolling" }, + { TYPE_SWITCH, &si.fading, "screen_fading" }, + { TYPE_SWITCH, &si.autorecord, "automatic_tape_recording" }, + { TYPE_SWITCH, &si.quick_doors, "quick_doors" }, + { TYPE_SWITCH, &si.team_mode, "team_mode" }, + { TYPE_SWITCH, &si.handicap, "handicap" }, + { TYPE_SWITCH, &si.time_limit, "time_limit" }, + { TYPE_SWITCH, &si.ask_on_escape, "ask_on_escape" }, + { TYPE_SWITCH, &si.fullscreen, "fullscreen" } +}; + +static struct TokenInfo shortcut_setup_tokens[] = +{ + /* shortcut setup */ + { TYPE_KEY_X11, &ssi.save_game, "shortcut.save_game" }, + { TYPE_KEY_X11, &ssi.load_game, "shortcut.load_game" } +}; + +static struct TokenInfo player_setup_tokens[] = +{ + /* player setup */ + { TYPE_BOOLEAN, &sii.use_joystick, ".use_joystick" }, + { TYPE_STRING, &sii.joy.device_name, ".joy.device_name" }, + { TYPE_INTEGER, &sii.joy.xleft, ".joy.xleft" }, + { TYPE_INTEGER, &sii.joy.xmiddle, ".joy.xmiddle" }, + { TYPE_INTEGER, &sii.joy.xright, ".joy.xright" }, + { TYPE_INTEGER, &sii.joy.yupper, ".joy.yupper" }, + { TYPE_INTEGER, &sii.joy.ymiddle, ".joy.ymiddle" }, + { TYPE_INTEGER, &sii.joy.ylower, ".joy.ylower" }, + { TYPE_INTEGER, &sii.joy.snap, ".joy.snap_field" }, + { TYPE_INTEGER, &sii.joy.bomb, ".joy.place_bomb" }, + { TYPE_KEY_X11, &sii.key.left, ".key.move_left" }, + { TYPE_KEY_X11, &sii.key.right, ".key.move_right" }, + { TYPE_KEY_X11, &sii.key.up, ".key.move_up" }, + { TYPE_KEY_X11, &sii.key.down, ".key.move_down" }, + { TYPE_KEY_X11, &sii.key.snap, ".key.snap_field" }, + { TYPE_KEY_X11, &sii.key.bomb, ".key.place_bomb" } +}; + +static void setSetupInfoToDefaults(struct SetupInfo *si) +{ + int i; + + si->player_name = getStringCopy(getLoginName()); + + si->sound = TRUE; + si->sound_loops = TRUE; + si->sound_music = TRUE; + si->sound_simple = TRUE; + si->toons = TRUE; + si->double_buffering = TRUE; + si->direct_draw = !si->double_buffering; + si->scroll_delay = TRUE; + si->soft_scrolling = TRUE; + si->fading = FALSE; + si->autorecord = TRUE; + si->quick_doors = FALSE; + si->team_mode = FALSE; + si->handicap = TRUE; + si->time_limit = TRUE; + si->fullscreen = FALSE; + si->ask_on_escape = TRUE; + + si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME; + si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME; + + for (i=0; iinput[i].use_joystick = FALSE; + si->input[i].joy.device_name=getStringCopy(getDeviceNameFromJoystickNr(i)); + si->input[i].joy.xleft = JOYSTICK_XLEFT; + si->input[i].joy.xmiddle = JOYSTICK_XMIDDLE; + si->input[i].joy.xright = JOYSTICK_XRIGHT; + si->input[i].joy.yupper = JOYSTICK_YUPPER; + si->input[i].joy.ymiddle = JOYSTICK_YMIDDLE; + si->input[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 : KSYM_UNDEFINED); + si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KSYM_UNDEFINED); + si->input[i].key.up = (i == 0 ? DEFAULT_KEY_UP : KSYM_UNDEFINED); + si->input[i].key.down = (i == 0 ? DEFAULT_KEY_DOWN : KSYM_UNDEFINED); + si->input[i].key.snap = (i == 0 ? DEFAULT_KEY_SNAP : KSYM_UNDEFINED); + si->input[i].key.bomb = (i == 0 ? DEFAULT_KEY_BOMB : KSYM_UNDEFINED); + } +} + +static void decodeSetupFileList(struct SetupFileList *setup_file_list) +{ + int i, pnr; + + if (!setup_file_list) + return; + + /* global setup */ + si = setup; + for (i=0; i MAX_PLAYER_NAME_LEN) + setup.player_name[MAX_PLAYER_NAME_LEN] = '\0'; + else if (strlen(setup.player_name) < MAX_PLAYER_NAME_LEN) + { + char *new_name = checked_malloc(MAX_PLAYER_NAME_LEN + 1); + + strcpy(new_name, setup.player_name); + free(setup.player_name); + setup.player_name = new_name; + } + } + else + Error(ERR_WARN, "using default setup values"); +} + +void SaveSetup() +{ + char *filename = getSetupFilename(); + FILE *file; + int i, pnr; + + InitUserDataDirectory(); + + if (!(file = fopen(filename, MODE_WRITE))) + { + Error(ERR_WARN, "cannot write setup file '%s'", filename); + return; + } + + fprintf(file, "%s\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER, + getCookie("SETUP"))); + fprintf(file, "\n"); + + /* global setup */ + si = setup; + for (i=0; i