X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=6d858c475be133ebbe2e54027677bbdbb63c9db7;hb=38c26472a6e9f0f037ddfe535d3919c00772b26f;hp=51710b07c105d526806aa4b1276321d06dfed751;hpb=79411a5006963926966da0465fd46344a34a57fe;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 51710b07..6d858c47 100644 --- a/src/files.c +++ b/src/files.c @@ -58,7 +58,7 @@ static void setLevelInfoToDefaults() for(x=0; xauthor, ANONYMOUS_NAME) != 0) @@ -129,11 +134,15 @@ static void setLevelInfoToDefaults() static int checkLevelElement(int element) { - if (element >= EL_FIRST_RUNTIME) + if (element >= NUM_FILE_ELEMENTS) { Error(ERR_WARN, "invalid level element %d", element); - element = EL_CHAR_FRAGE; + element = EL_CHAR_QUESTION; } + else if (element == EL_PLAYER_OBSOLETE) + element = EL_PLAYER1; + else if (element == EL_KEY_OBSOLETE) + element = EL_KEY1; return element; } @@ -283,7 +292,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) if (num_contents < 1 || num_contents > MAX_ELEMENT_CONTENTS) num_contents = STD_ELEMENT_CONTENTS; - if (element == EL_MAMPFER) + if (element == EL_YAMYAM) { level->num_yam_contents = num_contents; @@ -292,7 +301,7 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) for(x=0; x<3; x++) level->yam_content[i][x][y] = content_array[i][x][y]; } - else if (element == EL_AMOEBE_BD) + else if (element == EL_BD_AMOEBA) { level->amoeba_content = content_array[0][0][0]; } @@ -304,9 +313,8 @@ static int LoadLevel_CNT2(FILE *file, int chunk_size, struct LevelInfo *level) return chunk_size; } -void LoadLevel(int level_nr) +void LoadLevelFromFilename(char *filename) { - char *filename = getLevelFilename(level_nr); char cookie[MAX_LINE_LEN]; char chunk_name[CHUNK_ID_LEN + 1]; int chunk_size; @@ -317,6 +325,8 @@ void LoadLevel(int level_nr) if (!(file = fopen(filename, MODE_READ))) { + level.no_level_file = TRUE; + Error(ERR_WARN, "cannot read level '%s' - creating new level", filename); return; } @@ -425,6 +435,9 @@ void LoadLevel(int level_nr) fclose(file); + if (leveldir_current == NULL) /* only when dumping level */ + return; + if (IS_LEVELCLASS_CONTRIBUTION(leveldir_current) || IS_LEVELCLASS_USER(leveldir_current)) { @@ -476,6 +489,13 @@ void LoadLevel(int level_nr) SetBorderElement(); } +void LoadLevel(int level_nr) +{ + char *filename = getLevelFilename(level_nr); + + LoadLevelFromFilename(filename); +} + static void SaveLevel_VERS(FILE *file, struct LevelInfo *level) { putFileVersion(file, level->file_version); @@ -501,13 +521,13 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level) for(i=0; iencoding_16bit_yamyam ? EL_LEERRAUM : + fputc((level->encoding_16bit_yamyam ? EL_EMPTY : level->yam_content[i][x][y]), file); fputc(level->amoeba_speed, file); fputc(level->time_magic_wall, file); fputc(level->time_wheel, file); - fputc((level->encoding_16bit_amoeba ? EL_LEERRAUM : level->amoeba_content), + fputc((level->encoding_16bit_amoeba ? EL_EMPTY : level->amoeba_content), file); fputc((level->double_speed ? 1 : 0), file); fputc((level->gravity ? 1 : 0), file); @@ -530,7 +550,7 @@ static void SaveLevel_CONT(FILE *file, struct LevelInfo *level) { int i, x, y; - fputc(EL_MAMPFER, file); + fputc(EL_YAMYAM, file); fputc(level->num_yam_contents, file); fputc(0, file); fputc(0, file); @@ -563,7 +583,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) int num_contents, content_xsize, content_ysize; int content_array[MAX_ELEMENT_CONTENTS][3][3]; - if (element == EL_MAMPFER) + if (element == EL_YAMYAM) { num_contents = level->num_yam_contents; content_xsize = 3; @@ -574,7 +594,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) for(x=0; x<3; x++) content_array[i][x][y] = level->yam_content[i][x][y]; } - else if (element == EL_AMOEBE_BD) + else if (element == EL_BD_AMOEBA) { num_contents = 1; content_xsize = 1; @@ -583,7 +603,7 @@ static void SaveLevel_CNT2(FILE *file, struct LevelInfo *level, int element) for(i=0; iamoeba_content; } else @@ -666,13 +686,13 @@ void SaveLevel(int level_nr) level.num_yam_contents != STD_ELEMENT_CONTENTS) { putFileChunkBE(file, "CNT2", LEVEL_CHUNK_CNT2_SIZE); - SaveLevel_CNT2(file, &level, EL_MAMPFER); + SaveLevel_CNT2(file, &level, EL_YAMYAM); } if (level.encoding_16bit_amoeba) { putFileChunkBE(file, "CNT2", LEVEL_CHUNK_CNT2_SIZE); - SaveLevel_CNT2(file, &level, EL_AMOEBE_BD); + SaveLevel_CNT2(file, &level, EL_BD_AMOEBA); } fclose(file); @@ -680,6 +700,35 @@ void SaveLevel(int level_nr) SetFilePermissions(filename, PERMS_PRIVATE); } +void DumpLevel(struct LevelInfo *level) +{ + printf_line('-', 79); + printf("Level xxx (file version %06d, game version %06d)\n", + level->file_version, level->game_version); + printf_line('-', 79); + + printf("Level Author: '%s'\n", level->author); + printf("Level Title: '%s'\n", level->name); + printf("\n"); + printf("Playfield Size: %d x %d\n", level->fieldx, level->fieldy); + printf("\n"); + printf("Level Time: %d seconds\n", level->time); + printf("Gems needed: %d\n", level->gems_needed); + printf("\n"); + printf("Time for Magic Wall: %d seconds\n", level->time_magic_wall); + printf("Time for Wheel: %d seconds\n", level->time_wheel); + printf("Time for Light: %d seconds\n", level->time_light); + printf("Time for Timegate: %d seconds\n", level->time_timegate); + printf("\n"); + printf("Amoeba Speed: %d\n", level->amoeba_speed); + printf("\n"); + printf("Gravity: %s\n", (level->gravity ? "yes" : "no")); + printf("Double Speed Movement: %s\n", (level->double_speed ? "yes" : "no")); + printf("EM style slippery gems: %s\n", (level->em_slippery_gems ? "yes" : "no")); + + printf_line('-', 79); +} + /* ========================================================================= */ /* tape file functions */ @@ -838,9 +887,8 @@ static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape) return chunk_size; } -void LoadTape(int level_nr) +void LoadTapeFromFilename(char *filename) { - char *filename = getTapeFilename(level_nr); char cookie[MAX_LINE_LEN]; char chunk_name[CHUNK_ID_LEN + 1]; FILE *file; @@ -956,6 +1004,13 @@ void LoadTape(int level_nr) tape.length_seconds = GetTapeLength(); } +void LoadTape(int level_nr) +{ + char *filename = getTapeFilename(level_nr); + + LoadTapeFromFilename(filename); +} + static void SaveTape_VERS(FILE *file, struct TapeInfo *tape) { putFileVersion(file, tape->file_version); @@ -1065,17 +1120,18 @@ void DumpTape(struct TapeInfo *tape) return; } - printf("\n"); - printf("-------------------------------------------------------------------------------\n"); - printf("Tape of Level %d (file version %06d, game version %06d)\n", + printf_line('-', 79); + printf("Tape of Level %03d (file version %06d, game version %06d)\n", tape->level_nr, tape->file_version, tape->game_version); - printf("-------------------------------------------------------------------------------\n"); + printf_line('-', 79); for(i=0; ilength; i++) { if (i >= MAX_TAPELEN) break; + printf("%03d: ", i); + for(j=0; jplayer_participates[j]) @@ -1096,7 +1152,7 @@ void DumpTape(struct TapeInfo *tape) printf("(%03d)\n", tape->pos[i].delay); } - printf("-------------------------------------------------------------------------------\n"); + printf_line('-', 79); } @@ -1214,34 +1270,48 @@ void SaveScore(int level_nr) #define NUM_GLOBAL_SETUP_TOKENS 22 +/* editor setup */ +#define SETUP_TOKEN_EDITOR_EL_BOULDERDASH 0 +#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE 1 +#define SETUP_TOKEN_EDITOR_EL_MORE 2 +#define SETUP_TOKEN_EDITOR_EL_SOKOBAN 3 +#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX 4 +#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES 5 +#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH 6 +#define SETUP_TOKEN_EDITOR_EL_CHARS 7 +#define SETUP_TOKEN_EDITOR_EL_CUSTOM 8 + +#define NUM_EDITOR_SETUP_TOKENS 9 + /* shortcut setup */ -#define SETUP_TOKEN_SAVE_GAME 0 -#define SETUP_TOKEN_LOAD_GAME 1 -#define SETUP_TOKEN_TOGGLE_PAUSE 2 +#define SETUP_TOKEN_SHORTCUT_SAVE_GAME 0 +#define SETUP_TOKEN_SHORTCUT_LOAD_GAME 1 +#define SETUP_TOKEN_SHORTCUT_TOGGLE_PAUSE 2 #define NUM_SHORTCUT_SETUP_TOKENS 3 /* 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 SETUP_TOKEN_PLAYER_USE_JOYSTICK 0 +#define SETUP_TOKEN_PLAYER_JOY_DEVICE_NAME 1 +#define SETUP_TOKEN_PLAYER_JOY_XLEFT 2 +#define SETUP_TOKEN_PLAYER_JOY_XMIDDLE 3 +#define SETUP_TOKEN_PLAYER_JOY_XRIGHT 4 +#define SETUP_TOKEN_PLAYER_JOY_YUPPER 5 +#define SETUP_TOKEN_PLAYER_JOY_YMIDDLE 6 +#define SETUP_TOKEN_PLAYER_JOY_YLOWER 7 +#define SETUP_TOKEN_PLAYER_JOY_SNAP 8 +#define SETUP_TOKEN_PLAYER_JOY_BOMB 9 +#define SETUP_TOKEN_PLAYER_KEY_LEFT 10 +#define SETUP_TOKEN_PLAYER_KEY_RIGHT 11 +#define SETUP_TOKEN_PLAYER_KEY_UP 12 +#define SETUP_TOKEN_PLAYER_KEY_DOWN 13 +#define SETUP_TOKEN_PLAYER_KEY_SNAP 14 +#define SETUP_TOKEN_PLAYER_KEY_BOMB 15 #define NUM_PLAYER_SETUP_TOKENS 16 static struct SetupInfo si; +static struct SetupEditorInfo sei; static struct SetupShortcutInfo ssi; static struct SetupInputInfo sii; @@ -1272,6 +1342,20 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_SWITCH, &si.override_level_music, "override_level_music" }, }; +static struct TokenInfo editor_setup_tokens[] = +{ + /* shortcut setup */ + { TYPE_SWITCH, &sei.el_boulderdash, "editor.el_boulderdash" }, + { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine" }, + { TYPE_SWITCH, &sei.el_more, "editor.el_more" }, + { TYPE_SWITCH, &sei.el_sokoban, "editor.el_sokoban" }, + { TYPE_SWITCH, &sei.el_supaplex, "editor.el_supaplex" }, + { TYPE_SWITCH, &sei.el_diamond_caves, "editor.el_diamond_caves" }, + { TYPE_SWITCH, &sei.el_dx_boulderdash,"editor.el_dx_boulderdash" }, + { TYPE_SWITCH, &sei.el_chars, "editor.el_chars" }, + { TYPE_SWITCH, &sei.el_custom, "editor.el_custom" }, +}; + static struct TokenInfo shortcut_setup_tokens[] = { /* shortcut setup */ @@ -1332,6 +1416,16 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->override_level_sounds = FALSE; si->override_level_music = FALSE; + si->editor.el_boulderdash = TRUE; + si->editor.el_emerald_mine = TRUE; + si->editor.el_more = TRUE; + si->editor.el_sokoban = TRUE; + si->editor.el_supaplex = TRUE; + si->editor.el_diamond_caves = TRUE; + si->editor.el_dx_boulderdash = TRUE; + si->editor.el_chars = TRUE; + si->editor.el_custom = FALSE; + si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME; si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME; si->shortcut.toggle_pause = DEFAULT_KEY_TOGGLE_PAUSE; @@ -1371,6 +1465,13 @@ static void decodeSetupFileList(struct SetupFileList *setup_file_list) getTokenValue(setup_file_list, global_setup_tokens[i].text)); setup = si; + /* editor setup */ + sei = setup.editor; + for (i=0; i