X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=6c150ea0f86b3ea4be3de7cc8a7ed79b252036c2;hp=3468df641ff8bcc26072cf1d47f51194a3ff84d6;hb=5df6c84e44cee231f11c2b886a9a73784bd10a54;hpb=a6a203764b16840a0f5ae3d776f2d881f270d71b diff --git a/src/files.c b/src/files.c index 3468df64..6c150ea0 100644 --- a/src/files.c +++ b/src/files.c @@ -20,6 +20,7 @@ #include "init.h" #include "tools.h" #include "tape.h" +#include "config.h" #define ENABLE_UNUSED_CODE 0 /* currently unused functions */ #define ENABLE_HISTORIC_CHUNKS 0 /* only for historic reference */ @@ -3774,10 +3775,20 @@ static void CopyNativeTape_RND_to_SP(struct LevelInfo *level) level_sp->header.DemoRandomSeed = tape.random_seed; demo->length = 0; + for (i = 0; i < tape.length; i++) { int demo_action = map_key_RND_to_SP(tape.pos[i].action[0]); int demo_repeat = tape.pos[i].delay; + int demo_entries = (demo_repeat + 15) / 16; + + if (demo->length + demo_entries >= SP_MAX_TAPE_LEN) + { + Error(ERR_WARN, "tape truncated: size exceeds maximum SP demo size %d", + SP_MAX_TAPE_LEN); + + break; + } for (j = 0; j < demo_repeat / 16; j++) demo->data[demo->length++] = 0xf0 | demo_action; @@ -3786,8 +3797,6 @@ static void CopyNativeTape_RND_to_SP(struct LevelInfo *level) demo->data[demo->length++] = ((demo_repeat % 16 - 1) << 4) | demo_action; } - demo->data[demo->length++] = 0xff; - demo->is_available = TRUE; } @@ -3807,22 +3816,36 @@ static void CopyNativeTape_SP_to_RND(struct LevelInfo *level) return; tape.level_nr = demo->level_nr; /* (currently not used) */ - tape.length = demo->length - 1; /* without "end of demo" byte */ tape.random_seed = level_sp->header.DemoRandomSeed; TapeSetDateFromEpochSeconds(getFileTimestampEpochSeconds(filename)); - for (i = 0; i < demo->length - 1; i++) + tape.counter = 0; + tape.pos[tape.counter].delay = 0; + + for (i = 0; i < demo->length; i++) { int demo_action = demo->data[i] & 0x0f; int demo_repeat = (demo->data[i] & 0xf0) >> 4; + int tape_action = map_key_SP_to_RND(demo_action); + int tape_repeat = demo_repeat + 1; + byte action[MAX_PLAYERS] = { tape_action, 0, 0, 0 }; + boolean success = 0; + int j; + + for (j = 0; j < tape_repeat; j++) + success = TapeAddAction(action); - tape.pos[i].action[0] = map_key_SP_to_RND(demo_action); - tape.pos[i].delay = demo_repeat + 1; + if (!success) + { + Error(ERR_WARN, "SP demo truncated: size exceeds maximum tape size %d", + MAX_TAPE_LEN); + + break; + } } - tape.length_frames = GetTapeLengthFrames(); - tape.length_seconds = GetTapeLengthSeconds(); + TapeHaltRecording(); } @@ -7347,7 +7370,16 @@ static int LoadTape_BODY(File *file, int chunk_size, struct TapeInfo *tape) for (i = 0; i < tape->length; i++) { if (i >= MAX_TAPE_LEN) + { + Error(ERR_WARN, "tape truncated -- size exceeds maximum tape size %d", + MAX_TAPE_LEN); + + // tape too large; read and ignore remaining tape data from this chunk + for (;i < tape->length; i++) + ReadUnusedBytesFromFile(file, tape->num_participating_players + 1); + break; + } for (j = 0; j < MAX_PLAYERS; j++) { @@ -8061,24 +8093,26 @@ void SaveScore(int nr) /* internal setup */ #define SETUP_TOKEN_INT_PROGRAM_TITLE 0 -#define SETUP_TOKEN_INT_PROGRAM_AUTHOR 1 -#define SETUP_TOKEN_INT_PROGRAM_EMAIL 2 -#define SETUP_TOKEN_INT_PROGRAM_WEBSITE 3 -#define SETUP_TOKEN_INT_PROGRAM_COPYRIGHT 4 -#define SETUP_TOKEN_INT_PROGRAM_COMPANY 5 -#define SETUP_TOKEN_INT_PROGRAM_ICON_FILE 6 -#define SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET 7 -#define SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET 8 -#define SETUP_TOKEN_INT_DEFAULT_MUSIC_SET 9 -#define SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE 10 -#define SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE 11 -#define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE 12 -#define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES 13 -#define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 14 -#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH 15 -#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT 16 - -#define NUM_INTERNAL_SETUP_TOKENS 17 +#define SETUP_TOKEN_INT_PROGRAM_VERSION 1 +#define SETUP_TOKEN_INT_PROGRAM_AUTHOR 2 +#define SETUP_TOKEN_INT_PROGRAM_EMAIL 3 +#define SETUP_TOKEN_INT_PROGRAM_WEBSITE 4 +#define SETUP_TOKEN_INT_PROGRAM_COPYRIGHT 5 +#define SETUP_TOKEN_INT_PROGRAM_COMPANY 6 +#define SETUP_TOKEN_INT_PROGRAM_ICON_FILE 7 +#define SETUP_TOKEN_INT_DEFAULT_GRAPHICS_SET 8 +#define SETUP_TOKEN_INT_DEFAULT_SOUNDS_SET 9 +#define SETUP_TOKEN_INT_DEFAULT_MUSIC_SET 10 +#define SETUP_TOKEN_INT_FALLBACK_GRAPHICS_FILE 11 +#define SETUP_TOKEN_INT_FALLBACK_SOUNDS_FILE 12 +#define SETUP_TOKEN_INT_FALLBACK_MUSIC_FILE 13 +#define SETUP_TOKEN_INT_DEFAULT_LEVEL_SERIES 14 +#define SETUP_TOKEN_INT_CHOOSE_FROM_TOP_LEVELDIR 15 +#define SETUP_TOKEN_INT_SHOW_SCALING_IN_TITLE 16 +#define SETUP_TOKEN_INT_DEFAULT_WINDOW_WIDTH 17 +#define SETUP_TOKEN_INT_DEFAULT_WINDOW_HEIGHT 18 + +#define NUM_INTERNAL_SETUP_TOKENS 19 /* debug setup */ #define SETUP_TOKEN_DEBUG_FRAME_DELAY_0 0 @@ -8255,6 +8289,7 @@ static struct TokenInfo system_setup_tokens[] = static struct TokenInfo internal_setup_tokens[] = { { TYPE_STRING, &sxi.program_title, "program_title" }, + { TYPE_STRING, &sxi.program_version, "program_version" }, { TYPE_STRING, &sxi.program_author, "program_author" }, { TYPE_STRING, &sxi.program_email, "program_email" }, { TYPE_STRING, &sxi.program_website, "program_website" }, @@ -8269,6 +8304,7 @@ static struct TokenInfo internal_setup_tokens[] = { TYPE_STRING, &sxi.fallback_music_file, "fallback_music_file" }, { TYPE_STRING, &sxi.default_level_series, "default_level_series" }, { TYPE_BOOLEAN,&sxi.choose_from_top_leveldir, "choose_from_top_leveldir" }, + { TYPE_BOOLEAN,&sxi.show_scaling_in_title, "show_scaling_in_title" }, { TYPE_INTEGER,&sxi.default_window_width, "default_window_width" }, { TYPE_INTEGER,&sxi.default_window_height, "default_window_height" }, }; @@ -8448,6 +8484,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->system.audio_fragment_size = DEFAULT_AUDIO_FRAGMENT_SIZE; si->internal.program_title = getStringCopy(PROGRAM_TITLE_STRING); + si->internal.program_version = getStringCopy(getProgramRealVersionString()); si->internal.program_author = getStringCopy(PROGRAM_AUTHOR_STRING); si->internal.program_email = getStringCopy(PROGRAM_EMAIL_STRING); si->internal.program_website = getStringCopy(PROGRAM_WEBSITE_STRING); @@ -8466,6 +8503,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->internal.default_level_series = getStringCopy(UNDEFINED_LEVELSET); si->internal.choose_from_top_leveldir = FALSE; + si->internal.show_scaling_in_title = TRUE; si->internal.default_window_width = WIN_XSIZE_DEFAULT; si->internal.default_window_height = WIN_YSIZE_DEFAULT;