&li.initial_inventory_size[3], 1, MAX_INITIAL_INVENTORY_SIZE
},
+ // (these values are only valid for BD style levels)
+ {
+ EL_BD_PLAYER, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(1),
+ &li.bd_diagonal_movements, FALSE
+ },
+
+ // (the following values are related to various game elements)
+
{
EL_EMERALD, -1,
TYPE_INTEGER, CONF_VALUE_16_BIT(1),
}
}
+static boolean checkForPackageFromBasename_BD(char *basename)
+{
+ // check for native BD level file extensions
+ if (!strSuffixLower(basename, ".bd") &&
+ !strSuffixLower(basename, ".bdr") &&
+ !strSuffixLower(basename, ".brc") &&
+ !strSuffixLower(basename, ".gds"))
+ return FALSE;
+
+ // check for standard single-level BD files (like "001.bd")
+ if (strSuffixLower(basename, ".bd") &&
+ strlen(basename) == 6 &&
+ basename[0] >= '0' && basename[0] <= '9' &&
+ basename[1] >= '0' && basename[1] <= '9' &&
+ basename[2] >= '0' && basename[2] <= '9')
+ return FALSE;
+
+ // this is a level package in native BD file format
+ return TRUE;
+}
+
static char *getLevelFilenameFromBasename(char *basename)
{
static char *filename = NULL;
return LEVEL_FILE_TYPE_SB;
// check for typical filename of a Boulder Dash (GDash) level package file
- if (strSuffixLower(basename, ".bd") ||
- strSuffixLower(basename, ".bdr") ||
- strSuffixLower(basename, ".brc") ||
- strSuffixLower(basename, ".gds"))
+ if (checkForPackageFromBasename_BD(basename))
return LEVEL_FILE_TYPE_BD;
// ---------- try to determine file type from filesize ----------
if (fileExists(lfi->filename))
return;
+ // check for native Boulder Dash level file
+ setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_BD, "%03d.bd", nr);
+ if (fileExists(lfi->filename))
+ return;
+
// check for Emerald Mine level file (V1)
setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "a%c%c",
'a' + (nr / 10) % 26, '0' + nr % 10);
cave->level_speed[0] = 160; // set cave speed
+ cave->diagonal_movements = level->bd_diagonal_movements;
+
strncpy(cave->name, level->name, sizeof(GdString));
cave->name[sizeof(GdString) - 1] = '\0';
level->score[SC_TIME_BONUS] = cave->level_timevalue[bd_level_nr];
level->score[SC_DIAMOND] = cave->diamond_value;
+ level->bd_diagonal_movements = cave->diagonal_movements;
+
strncpy(level->name, cave->name, MAX_LEVEL_NAME_LEN);
level->name[MAX_LEVEL_NAME_LEN] = '\0';
boolean invalid_playfield_char = FALSE;
boolean load_xsb_to_ces = check_special_flags("load_xsb_to_ces");
int file_level_nr = 0;
- int line_nr = 0;
int x = 0, y = 0; // initialized to make compilers happy
last_comment[0] = '\0';
if (!getStringFromFile(file, line, MAX_LINE_LEN))
break;
- // check if line was completely read and is terminated by line break
- if (strlen(line) > 0 && line[strlen(line) - 1] == '\n')
- line_nr++;
-
// cut trailing line break (this can be newline and/or carriage return)
for (line_ptr = &line[strlen(line)]; line_ptr >= line; line_ptr--)
if ((*line_ptr == '\n' || *line_ptr == '\r') && *(line_ptr + 1) == '\0')
void SaveNativeLevel(struct LevelInfo *level)
{
- if (level->game_engine_type == GAME_ENGINE_TYPE_SP)
+ // saving native level files only supported for some game engines
+ if (level->game_engine_type != GAME_ENGINE_TYPE_BD &&
+ level->game_engine_type != GAME_ENGINE_TYPE_SP)
+ return;
+
+ char *file_ext = (level->game_engine_type == GAME_ENGINE_TYPE_BD ? "bd" :
+ level->game_engine_type == GAME_ENGINE_TYPE_SP ? "sp" : "");
+ char *basename = getSingleLevelBasenameExt(level->file_info.nr, file_ext);
+ char *filename = getLevelFilenameFromBasename(basename);
+
+ if (fileExists(filename) && !Request("Native level file already exists! Overwrite it?", REQ_ASK))
+ return;
+
+ boolean success = FALSE;
+
+ if (level->game_engine_type == GAME_ENGINE_TYPE_BD)
{
- char *basename = getSingleLevelBasenameExt(level->file_info.nr, "sp");
- char *filename = getLevelFilenameFromBasename(basename);
+ CopyNativeLevel_RND_to_BD(level);
+ // CopyNativeTape_RND_to_BD(level);
+ success = SaveNativeLevel_BD(filename);
+ }
+ else if (level->game_engine_type == GAME_ENGINE_TYPE_SP)
+ {
CopyNativeLevel_RND_to_SP(level);
CopyNativeTape_RND_to_SP(level);
- SaveNativeLevel_SP(filename);
+ success = SaveNativeLevel_SP(filename);
}
+
+ if (success)
+ Request("Native level file saved!", REQ_CONFIRM);
+ else
+ Request("Failed to save native level file!", REQ_CONFIRM);
}
TYPE_SWITCH,
&setup.bd_scroll_delay, "bd_scroll_delay"
},
+ {
+ TYPE_SWITCH3,
+ &setup.bd_smooth_movements, "bd_smooth_movements"
+ },
{
TYPE_SWITCH,
&setup.sp_show_border_elements, "sp_show_border_elements"
si->bd_skip_uncovering = FALSE;
si->bd_skip_hatching = FALSE;
si->bd_scroll_delay = TRUE;
+ si->bd_smooth_movements = AUTO;
si->sp_show_border_elements = FALSE;
si->small_game_graphics = FALSE;
si->show_load_save_buttons = FALSE;
{
if (isURL(token))
{
- result = get_hash_from_key(token); // unsigned int => int
+ result = get_hash_from_string(token); // unsigned int => int
result = ABS(result); // may be negative now
result += (result < MAX_IMAGE_FILES ? MAX_IMAGE_FILES : 0);
else if (strEqual(suffix, ".class"))
{
result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE :
- get_hash_from_key(value));
+ get_hash_from_string(value));
}
else if (strEqual(suffix, ".style"))
{