X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ffiles.c;h=ac75c2afc8151a97e03cd7428bb08ab5265c8b59;hp=4bebae7fdd29d0c1017fafa86823e4444cdd5fca;hb=70fe541d68f18a22eb3bd134f128c0d56b885701;hpb=e436fa7c34d639bab7ce690267975e34b67191b4 diff --git a/src/files.c b/src/files.c index 4bebae7f..ac75c2af 100644 --- a/src/files.c +++ b/src/files.c @@ -18,6 +18,7 @@ #include "files.h" #include "init.h" +#include "screens.h" #include "tools.h" #include "tape.h" #include "config.h" @@ -839,9 +840,29 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = }, { - EL_MM_FUSE, -1, + EL_MM_FUSE_ACTIVE, -1, TYPE_INTEGER, CONF_VALUE_16_BIT(1), - &li.mm_time_fuse, 0 + &li.mm_time_fuse, 25 + }, + { + EL_MM_BOMB, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(1), + &li.mm_time_bomb, 75 + }, + { + EL_MM_GRAY_BALL, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(1), + &li.mm_time_ball, 75 + }, + { + EL_MM_STEEL_BLOCK, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(1), + &li.mm_time_block, 75 + }, + { + EL_MM_LIGHTBALL, -1, + TYPE_INTEGER, CONF_VALUE_16_BIT(1), + &li.score[SC_ELEM_BONUS], 10 }, /* ---------- unused values ----------------------------------------------- */ @@ -849,11 +870,6 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] = { EL_UNKNOWN, SAVE_CONF_NEVER, TYPE_INTEGER, CONF_VALUE_16_BIT(1), - &li.score[SC_UNKNOWN_14], 10 - }, - { - EL_UNKNOWN, SAVE_CONF_NEVER, - TYPE_INTEGER, CONF_VALUE_16_BIT(2), &li.score[SC_UNKNOWN_15], 10 }, @@ -3976,10 +3992,6 @@ void CopyNativeLevel_RND_to_MM(struct LevelInfo *level) struct LevelInfo_MM *level_mm = level->native_mm_level; int x, y; - level_mm->file_version = level->file_version; - level_mm->game_version = level->game_version; - level_mm->encoding_16bit_field = level->encoding_16bit_field; - level_mm->fieldx = MIN(level->fieldx, MM_MAX_PLAYFIELD_WIDTH); level_mm->fieldy = MIN(level->fieldy, MM_MAX_PLAYFIELD_HEIGHT); @@ -3994,12 +4006,17 @@ void CopyNativeLevel_RND_to_MM(struct LevelInfo *level) strcpy(level_mm->name, level->name); strcpy(level_mm->author, level->author); + level_mm->score[SC_EMERALD] = level->score[SC_EMERALD]; level_mm->score[SC_PACMAN] = level->score[SC_PACMAN]; level_mm->score[SC_KEY] = level->score[SC_KEY]; level_mm->score[SC_TIME_BONUS] = level->score[SC_TIME_BONUS]; + level_mm->score[SC_ELEM_BONUS] = level->score[SC_ELEM_BONUS]; level_mm->amoeba_speed = level->amoeba_speed; - level_mm->time_fuse = level->mm_time_fuse; + level_mm->time_fuse = level->mm_time_fuse; + level_mm->time_bomb = level->mm_time_bomb; + level_mm->time_ball = level->mm_time_ball; + level_mm->time_block = level->mm_time_block; for (x = 0; x < level->fieldx; x++) for (y = 0; y < level->fieldy; y++) @@ -4012,10 +4029,6 @@ void CopyNativeLevel_MM_to_RND(struct LevelInfo *level) struct LevelInfo_MM *level_mm = level->native_mm_level; int x, y; - level->file_version = level_mm->file_version; - level->game_version = level_mm->game_version; - level->encoding_16bit_field = level_mm->encoding_16bit_field; - level->fieldx = MIN(level_mm->fieldx, MAX_LEV_FIELDX); level->fieldy = MIN(level_mm->fieldy, MAX_LEV_FIELDY); @@ -4033,12 +4046,17 @@ void CopyNativeLevel_MM_to_RND(struct LevelInfo *level) if (!strEqual(level_mm->author, ANONYMOUS_NAME)) strcpy(level->author, level_mm->author); + level->score[SC_EMERALD] = level_mm->score[SC_EMERALD]; level->score[SC_PACMAN] = level_mm->score[SC_PACMAN]; level->score[SC_KEY] = level_mm->score[SC_KEY]; level->score[SC_TIME_BONUS] = level_mm->score[SC_TIME_BONUS]; + level->score[SC_ELEM_BONUS] = level_mm->score[SC_ELEM_BONUS]; - level->amoeba_speed = level_mm->amoeba_speed; - level->mm_time_fuse = level_mm->time_fuse; + level->amoeba_speed = level_mm->amoeba_speed; + level->mm_time_fuse = level_mm->time_fuse; + level->mm_time_bomb = level_mm->time_bomb; + level->mm_time_ball = level_mm->time_ball; + level->mm_time_block = level_mm->time_block; for (x = 0; x < level->fieldx; x++) for (y = 0; y < level->fieldy; y++) @@ -8064,18 +8082,18 @@ void SaveTape(int nr) tape.changed = FALSE; } -boolean SaveTapeChecked(int nr) +static boolean SaveTapeCheckedExt(int nr, char *msg_replace, char *msg_saved) { char *filename = getTapeFilename(nr); boolean new_tape = !fileExists(filename); boolean tape_saved = FALSE; - if (new_tape || Request("Replace old tape?", REQ_ASK)) + if (new_tape || Request(msg_replace, REQ_ASK)) { SaveTape(nr); if (new_tape) - Request("Tape saved!", REQ_CONFIRM); + Request(msg_saved, REQ_CONFIRM); tape_saved = TRUE; } @@ -8083,6 +8101,17 @@ boolean SaveTapeChecked(int nr) return tape_saved; } +boolean SaveTapeChecked(int nr) +{ + return SaveTapeCheckedExt(nr, "Replace old tape?", "Tape saved!"); +} + +boolean SaveTapeChecked_LevelSolved(int nr) +{ + return SaveTapeCheckedExt(nr, "Level solved! Replace old tape?", + "Level solved! Tape saved!"); +} + void DumpTape(struct TapeInfo *tape) { int tape_frame_counter; @@ -8276,8 +8305,15 @@ void SaveScore(int nr) #define SETUP_TOKEN_TOUCH_CONTROL_TYPE 41 #define SETUP_TOKEN_TOUCH_MOVE_DISTANCE 42 #define SETUP_TOKEN_TOUCH_DROP_DISTANCE 43 +#define SETUP_TOKEN_TOUCH_TRANSPARENCY 44 +#define SETUP_TOKEN_TOUCH_DRAW_OUTLINED 45 +#define SETUP_TOKEN_TOUCH_DRAW_PRESSED 46 +#define SETUP_TOKEN_TOUCH_GRID_XSIZE_0 47 +#define SETUP_TOKEN_TOUCH_GRID_YSIZE_0 48 +#define SETUP_TOKEN_TOUCH_GRID_XSIZE_1 49 +#define SETUP_TOKEN_TOUCH_GRID_YSIZE_1 50 -#define NUM_GLOBAL_SETUP_TOKENS 44 +#define NUM_GLOBAL_SETUP_TOKENS 51 /* auto setup */ #define SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE 0 @@ -8478,6 +8514,13 @@ static struct TokenInfo global_setup_tokens[] = { TYPE_STRING, &si.touch.control_type, "touch.control_type" }, { TYPE_INTEGER,&si.touch.move_distance, "touch.move_distance" }, { TYPE_INTEGER,&si.touch.drop_distance, "touch.drop_distance" }, + { TYPE_INTEGER,&si.touch.transparency, "touch.transparency" }, + { TYPE_INTEGER,&si.touch.draw_outlined, "touch.draw_outlined" }, + { TYPE_INTEGER,&si.touch.draw_pressed, "touch.draw_pressed" }, + { TYPE_INTEGER,&si.touch.grid_xsize[0], "touch.virtual_buttons.0.xsize" }, + { TYPE_INTEGER,&si.touch.grid_ysize[0], "touch.virtual_buttons.0.ysize" }, + { TYPE_INTEGER,&si.touch.grid_xsize[1], "touch.virtual_buttons.1.xsize" }, + { TYPE_INTEGER,&si.touch.grid_ysize[1], "touch.virtual_buttons.1.ysize" }, }; static struct TokenInfo auto_setup_tokens[] = @@ -8691,6 +8734,58 @@ static void setSetupInfoToDefaults(struct SetupInfo *si) si->touch.control_type = getStringCopy(TOUCH_CONTROL_DEFAULT); si->touch.move_distance = TOUCH_MOVE_DISTANCE_DEFAULT; /* percent */ si->touch.drop_distance = TOUCH_DROP_DISTANCE_DEFAULT; /* percent */ + si->touch.transparency = TOUCH_TRANSPARENCY_DEFAULT; /* percent */ + si->touch.draw_outlined = TRUE; + si->touch.draw_pressed = TRUE; + + for (i = 0; i < 2; i++) + { + char *default_grid_button[6][2] = + { + { " ", " ^^ " }, + { " ", " ^^ " }, + { " ", "<< >>" }, + { " ", "<< >>" }, + { "111222", " vv " }, + { "111222", " vv " } + }; + int grid_xsize = DEFAULT_GRID_XSIZE(i); + int grid_ysize = DEFAULT_GRID_YSIZE(i); + int min_xsize = MIN(6, grid_xsize); + int min_ysize = MIN(6, grid_ysize); + int startx = grid_xsize - min_xsize; + int starty = grid_ysize - min_ysize; + int x, y; + + // virtual buttons grid can only be set to defaults if video is initialized + // (this will be repeated if virtual buttons are not loaded from setup file) + if (video.initialized) + { + si->touch.grid_xsize[i] = grid_xsize; + si->touch.grid_ysize[i] = grid_ysize; + } + else + { + si->touch.grid_xsize[i] = -1; + si->touch.grid_ysize[i] = -1; + } + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + si->touch.grid_button[i][x][y] = CHAR_GRID_BUTTON_NONE; + + for (x = 0; x < min_xsize; x++) + for (y = 0; y < min_ysize; y++) + si->touch.grid_button[i][x][starty + y] = + default_grid_button[y][0][x]; + + for (x = 0; x < min_xsize; x++) + for (y = 0; y < min_ysize; y++) + si->touch.grid_button[i][startx + x][starty + y] = + default_grid_button[y][1][x]; + } + + si->touch.grid_initialized = video.initialized; si->editor.el_boulderdash = TRUE; si->editor.el_emerald_mine = TRUE; @@ -8868,17 +8963,22 @@ static char *getHideSetupToken(void *setup_value) return hide_setup_token; } -static void setHideSetupEntry(void *setup_value_raw) +void setHideSetupEntry(void *setup_value) { - /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */ - void *setup_value = setup_value_raw - (void *)&si + (void *)&setup; - char *hide_setup_token = getHideSetupToken(setup_value); if (setup_value != NULL) setHashEntry(hide_setup_hash, hide_setup_token, ""); } +static void setHideSetupEntryRaw(char *token_text, void *setup_value_raw) +{ + /* !!! DIRTY WORKAROUND; TO BE FIXED AFTER THE MM ENGINE RELEASE !!! */ + void *setup_value = setup_value_raw - (void *)&si + (void *)&setup; + + setHideSetupEntry(setup_value); +} + boolean hideSetupEntry(void *setup_value) { char *hide_setup_token = getHideSetupToken(setup_value); @@ -8899,7 +8999,7 @@ static void setSetupInfoFromTokenText(SetupFileHash *setup_file_hash, /* check if this setup option should be hidden in the setup menu */ if (token_hide_value != NULL && get_boolean_from_string(token_hide_value)) - setHideSetupEntry(token_info[token_nr].value); + setHideSetupEntryRaw(token_text, token_info[token_nr].value); } static void setSetupInfoFromTokenInfo(SetupFileHash *setup_file_hash, @@ -8926,6 +9026,45 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) setSetupInfoFromTokenInfo(setup_file_hash, global_setup_tokens, i); setup = si; + /* virtual buttons setup */ + setup.touch.grid_initialized = TRUE; + for (i = 0; i < 2; i++) + { + int grid_xsize = setup.touch.grid_xsize[i]; + int grid_ysize = setup.touch.grid_ysize[i]; + int x, y; + + // if virtual buttons are not loaded from setup file, repeat initializing + // virtual buttons grid with default values later when video is initialized + if (grid_xsize == -1 || + grid_ysize == -1) + { + setup.touch.grid_initialized = FALSE; + + continue; + } + + for (y = 0; y < grid_ysize; y++) + { + char token_string[MAX_LINE_LEN]; + + sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y); + + char *value_string = getHashEntry(setup_file_hash, token_string); + + if (value_string == NULL) + continue; + + for (x = 0; x < grid_xsize; x++) + { + char c = value_string[x]; + + setup.touch.grid_button[i][x][y] = + (c == '.' ? CHAR_GRID_BUTTON_NONE : c); + } + } + } + /* editor setup */ sei = setup.editor; for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++) @@ -8980,6 +9119,8 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash) for (i = 0; i < NUM_OPTIONS_SETUP_TOKENS; i++) setSetupInfoFromTokenInfo(setup_file_hash, options_setup_tokens, i); setup.options = soi; + + setHideRelatedSetupEntries(); } static void decodeSetupFileHash_AutoSetup(SetupFileHash *setup_file_hash) @@ -9185,12 +9326,43 @@ void SaveSetup() if (i == SETUP_TOKEN_PLAYER_NAME + 1 || i == SETUP_TOKEN_GRAPHICS_SET || i == SETUP_TOKEN_VOLUME_SIMPLE || - i == SETUP_TOKEN_TOUCH_CONTROL_TYPE) + i == SETUP_TOKEN_TOUCH_CONTROL_TYPE || + i == SETUP_TOKEN_TOUCH_GRID_XSIZE_0 || + i == SETUP_TOKEN_TOUCH_GRID_XSIZE_1) fprintf(file, "\n"); fprintf(file, "%s\n", getSetupLine(global_setup_tokens, "", i)); } + /* virtual buttons setup */ + for (i = 0; i < 2; i++) + { + int grid_xsize = setup.touch.grid_xsize[i]; + int grid_ysize = setup.touch.grid_ysize[i]; + int x, y; + + fprintf(file, "\n"); + + for (y = 0; y < grid_ysize; y++) + { + char token_string[MAX_LINE_LEN]; + char value_string[MAX_LINE_LEN]; + + sprintf(token_string, "touch.virtual_buttons.%d.%02d", i, y); + + for (x = 0; x < grid_xsize; x++) + { + char c = setup.touch.grid_button[i][x][y]; + + value_string[x] = (c == CHAR_GRID_BUTTON_NONE ? '.' : c); + } + + value_string[grid_xsize] = '\0'; + + fprintf(file, "%s\n", getFormattedSetupEntry(token_string, value_string)); + } + } + /* editor setup */ sei = setup.editor; fprintf(file, "\n"); @@ -9731,6 +9903,40 @@ static void LoadMenuDesignSettingsFromFilename(char *filename) menu.draw_yoffset_setup[i] = get_integer_from_string(value_2); } + /* special case: initialize with default values that may be overwritten */ + /* (eg, init "menu.line_spacing.INFO[XXX]" from "menu.line_spacing.INFO") */ + for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++) + { + char *value_1 = getHashEntry(setup_file_hash,"menu.left_spacing.INFO"); + char *value_2 = getHashEntry(setup_file_hash,"menu.right_spacing.INFO"); + char *value_3 = getHashEntry(setup_file_hash,"menu.top_spacing.INFO"); + char *value_4 = getHashEntry(setup_file_hash,"menu.bottom_spacing.INFO"); + char *value_5 = getHashEntry(setup_file_hash,"menu.paragraph_spacing.INFO"); + char *value_6 = getHashEntry(setup_file_hash,"menu.headline1_spacing.INFO"); + char *value_7 = getHashEntry(setup_file_hash,"menu.headline2_spacing.INFO"); + char *value_8 = getHashEntry(setup_file_hash,"menu.line_spacing.INFO"); + char *value_9 = getHashEntry(setup_file_hash,"menu.extra_spacing.INFO"); + + if (value_1 != NULL) + menu.left_spacing_info[i] = get_integer_from_string(value_1); + if (value_2 != NULL) + menu.right_spacing_info[i] = get_integer_from_string(value_2); + if (value_3 != NULL) + menu.top_spacing_info[i] = get_integer_from_string(value_3); + if (value_4 != NULL) + menu.bottom_spacing_info[i] = get_integer_from_string(value_4); + if (value_5 != NULL) + menu.paragraph_spacing_info[i] = get_integer_from_string(value_5); + if (value_6 != NULL) + menu.headline1_spacing_info[i] = get_integer_from_string(value_6); + if (value_7 != NULL) + menu.headline2_spacing_info[i] = get_integer_from_string(value_7); + if (value_8 != NULL) + menu.line_spacing_info[i] = get_integer_from_string(value_8); + if (value_9 != NULL) + menu.extra_spacing_info[i] = get_integer_from_string(value_9); + } + /* special case: initialize with default values that may be overwritten */ /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */ for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)