&li.rate_time_over_score, FALSE
},
+ {
+ -1, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(14),
+ &li.bd_intermission, FALSE
+ },
+
+ {
+ -1, -1,
+ TYPE_INTEGER, CONF_VALUE_8_BIT(15),
+ &li.bd_scheduling_type, GD_SCHEDULING_MILLISECONDS
+ },
+
+ {
+ -1, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(16),
+ &li.bd_pal_timing, FALSE
+ },
+
+ {
+ -1, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(6),
+ &li.bd_cycle_delay_ms, 200
+ },
+
+ {
+ -1, -1,
+ TYPE_INTEGER, CONF_VALUE_8_BIT(17),
+ &li.bd_cycle_delay_c64, 0
+ },
+
+ {
+ -1, -1,
+ TYPE_INTEGER, CONF_VALUE_8_BIT(18),
+ &li.bd_hatching_delay_cycles, 21
+ },
+
+ {
+ -1, -1,
+ TYPE_INTEGER, CONF_VALUE_8_BIT(19),
+ &li.bd_hatching_delay_seconds, 2
+ },
+
{
-1, -1,
-1, -1,
&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
+ },
+
+ {
+ EL_BD_DIAMOND, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.score[SC_DIAMOND_EXTRA], 20
+ },
+
+ // (the following values are related to various game elements)
+
{
EL_EMERALD, -1,
TYPE_INTEGER, CONF_VALUE_16_BIT(1),
&li.score[SC_ELEM_BONUS], 10
},
- // ---------- unused values -------------------------------------------------
-
- {
- EL_UNKNOWN, SAVE_CONF_NEVER,
- TYPE_INTEGER, CONF_VALUE_16_BIT(1),
- &li.score[SC_UNKNOWN_15], 10
- },
-
{
-1, -1,
-1, -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_time[i] = level->time;
cave->level_diamonds[i] = level->gems_needed;
cave->level_magic_wall_time[i] = level->time_magic_wall;
+
+ cave->level_speed[i] = level->bd_cycle_delay_ms;
+ cave->level_ckdelay[i] = level->bd_cycle_delay_c64;
+ cave->level_hatching_delay_frame[i] = level->bd_hatching_delay_cycles;
+ cave->level_hatching_delay_time[i] = level->bd_hatching_delay_seconds;
+
cave->level_timevalue[i] = level->score[SC_TIME_BONUS];
}
- cave->diamond_value = level->score[SC_DIAMOND];
- cave->extra_diamond_value = level->score[SC_DIAMOND];
+ cave->diamond_value = level->score[SC_EMERALD];
+ cave->extra_diamond_value = level->score[SC_DIAMOND_EXTRA];
- cave->level_speed[0] = 160; // set cave speed
+ cave->scheduling = level->bd_scheduling_type;
+ cave->pal_timing = level->bd_pal_timing;
+ cave->intermission = level->bd_intermission;
+ cave->diagonal_movements = level->bd_diagonal_movements;
strncpy(cave->name, level->name, sizeof(GdString));
cave->name[sizeof(GdString) - 1] = '\0';
level->fieldx = MIN(cave->w, MAX_LEV_FIELDX);
level->fieldy = MIN(cave->h, MAX_LEV_FIELDY);
- level->time = cave->level_time[bd_level_nr];
- level->gems_needed = cave->level_diamonds[bd_level_nr];
- level->time_magic_wall = cave->level_magic_wall_time[bd_level_nr];
+ level->time = cave->level_time[bd_level_nr];
+ level->gems_needed = cave->level_diamonds[bd_level_nr];
+ level->time_magic_wall = cave->level_magic_wall_time[bd_level_nr];
+
+ level->bd_cycle_delay_ms = cave->level_speed[bd_level_nr];
+ level->bd_cycle_delay_c64 = cave->level_ckdelay[bd_level_nr];
+ level->bd_hatching_delay_cycles = cave->level_hatching_delay_frame[bd_level_nr];
+ level->bd_hatching_delay_seconds = cave->level_hatching_delay_time[bd_level_nr];
+
+ level->score[SC_TIME_BONUS] = cave->level_timevalue[bd_level_nr];
+ level->score[SC_EMERALD] = cave->diamond_value;
+ level->score[SC_DIAMOND_EXTRA] = cave->extra_diamond_value;
- level->score[SC_TIME_BONUS] = cave->level_timevalue[bd_level_nr];
- level->score[SC_DIAMOND] = cave->diamond_value;
+ level->bd_scheduling_type = cave->scheduling;
+ level->bd_pal_timing = cave->pal_timing;
+ level->bd_intermission = cave->intermission;
+ level->bd_diagonal_movements = cave->diagonal_movements;
- strncpy(level->name, cave->name, MAX_LEVEL_NAME_LEN);
+ char *cave_name = getStringPrint("%s / %d", cave->name, bd_level_nr + 1);
+
+ strncpy(level->name, cave_name, MAX_LEVEL_NAME_LEN);
level->name[MAX_LEVEL_NAME_LEN] = '\0';
for (x = 0; x < level->fieldx; x++)
for (y = 0; y < level->fieldy; y++)
level->field[x][y] = map_element_BD_to_RND(cave->map[y][x]);
+
+ checked_free(cave_name);
}
static void setTapeInfoToDefaults(void);
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);
}