gd_caveset_clear();
- gd_init_keystate();
+ gd_init_play_area();
gd_sound_init();
}
setLevelInfoToDefaults_BD_Ext(0, 0);
}
+static List *getNativeLevelReplay_BD_Ext(List *item, boolean only_successful_replays)
+{
+ // look for replay that was recorded for the current difficulty level
+ while (item != NULL &&
+ (item->data == NULL ||
+ (((GdReplay *)item->data)->success == FALSE && only_successful_replays) ||
+ ((GdReplay *)item->data)->level != native_bd_level.level_nr))
+ item = item->next;
+
+ return item;
+}
+
+static List *getNativeLevelReplay_BD(List *replays)
+{
+ // 1st try: look for successful replay
+ List *item = getNativeLevelReplay_BD_Ext(replays, TRUE);
+
+ if (item != NULL)
+ return item;
+
+ // 2nd try: look for any replay
+ return getNativeLevelReplay_BD_Ext(replays, FALSE);
+}
+
boolean LoadNativeLevel_BD(char *filename, int level_pos, boolean level_info_only)
{
static char *filename_loaded = NULL;
// check if this cave has any replays
if (native_bd_level.cave->replays != NULL)
{
- List *item = native_bd_level.cave->replays;
+ List *item = getNativeLevelReplay_BD(native_bd_level.cave->replays);
- // try to find replay that was recorded for this difficulty level
- while (item != NULL &&
- (item->data == NULL ||
- ((GdReplay *)item->data)->success == FALSE ||
- ((GdReplay *)item->data)->level != native_bd_level.level_nr))
- item = item->next;
-
- // matching replay found
+ // check if any matching replay was found
if (item != NULL)
native_bd_level.replay = (GdReplay *)item->data;
}
return gd_caveset_save_to_file(filename);
}
+void DumpLevelset_BD(void)
+{
+ int num_levels_per_cave = (gd_caveset_has_levels() ? 5 : 1);
+
+ Print("Number of levels: %d\n", num_levels_per_cave * gd_caveset_count());
+ Print("First level number: %d\n", 1);
+}
+
// ============================================================================
// game engine functions
static void PrepareGameTileBitmap_BD(void)
{
- struct GraphicInfo_BD *g = &graphic_info_bd_object[O_STONE][0];
+ struct GraphicInfo_BD *g_template = &graphic_info_bd_color_template;
+ struct GraphicInfo_BD *g_default = &graphic_info_bd_object[O_STONE][0];
+
+ // prepare bitmap using cave ready for playing (may have changed colors)
+ gd_prepare_tile_bitmap(game_bd.game->cave, g_template->bitmap, 1);
+
+ // set reference bitmap which should be replaced with prepared bitmap
+ gd_set_tile_bitmap_reference(g_default->bitmap);
+}
+
+void PreparePreviewTileBitmap_BD(Bitmap *bitmap, int scale_down_factor)
+{
+ // prepare bitmap using cave from file (with originally defined colors)
+ gd_prepare_tile_bitmap(native_bd_level.cave, bitmap, scale_down_factor);
+}
+
+void SetPreviewTileBitmapReference_BD(Bitmap *bitmap)
+{
+ gd_set_tile_bitmap_reference(bitmap);
+}
- gd_prepare_tile_bitmap(native_bd_level.cave, g->bitmap, 1);
+Bitmap *GetPreviewTileBitmap_BD(Bitmap *bitmap)
+{
+ return gd_get_tile_bitmap(bitmap);
}
unsigned int InitEngineRandom_BD(int seed)
game_bd.game->itermax = 8; // default; dynamically changed at runtime
game_bd.game->itermax_last = game_bd.game->itermax;
- // prepare tile bitmap with level-specific colors, if available
- PrepareGameTileBitmap_BD();
-
// default: start with completely covered playfield
int next_state = GAME_INT_START_UNCOVER + 1;
if (setup.bd_skip_uncovering)
next_state = GAME_INT_LOAD_CAVE + 1;
- // fast-forward game engine until cave loaded (covered or uncovered)
+ // first iteration loads and prepares the cave (may change colors)
+ play_game_func(game_bd.game, 0);
+
+ // prepare tile bitmap with level-specific colors, if available
+ PrepareGameTileBitmap_BD();
+
+ // fast-forward game engine to selected state (covered or uncovered)
while (game_bd.game->state_counter < next_state)
play_game_func(game_bd.game, 0);
// when skipping uncovering, continue with uncovered playfield
if (setup.bd_skip_uncovering)
game_bd.game->state_counter = GAME_INT_UNCOVER_ALL + 1;
+ else if (isLevelEditorTestGame())
+ game_bd.game->state_counter = GAME_INT_UNCOVER_ALL - 8;
- if (setup.bd_skip_uncovering)
+ if (setup.bd_skip_uncovering || isLevelEditorTestGame())
gd_scroll(game_bd.game, TRUE, TRUE);
ClearRectangle(gd_screen_bitmap, 0, 0, SXSIZE, SYSIZE);
play_game_func(game_bd.game, action[0]);
+ // scroll without iterating engine if player out of sight (mainly due to wrap-around)
+ // (this is needed to prevent broken tapes in case of viewport or tile size changes)
+ while (game_bd.game->out_of_window)
+ {
+ RedrawPlayfield_BD(TRUE);
+
+ BlitScreenToBitmap_BD(backbuffer);
+
+ BackToFront();
+
+ play_game_func(game_bd.game, action[0]);
+ }
+
RedrawPlayfield_BD(FALSE);
UpdateGameDoorValues_BD();
// graphics functions
// ============================================================================
+// check if native BD graphics engine requested in custom graphics configuration
+boolean use_native_bd_graphics_engine(void)
+{
+ return game.use_native_bd_graphics_engine;
+}
+
+// check if smooth game element movements selected in setup menu
+boolean use_bd_smooth_movements(void)
+{
+ return ((setup.bd_smooth_movements == STATE_TRUE) ||
+ (setup.bd_smooth_movements == STATE_AUTO && !use_native_bd_graphics_engine()));
+}
+
+// check if player pushing graphics selected in setup menu
+boolean use_bd_pushing_graphics(void)
+{
+ return ((setup.bd_pushing_graphics == STATE_TRUE) ||
+ (setup.bd_pushing_graphics == STATE_AUTO && !use_native_bd_graphics_engine()));
+}
+
+// check if player up/down graphics selected in setup menu
+boolean use_bd_up_down_graphics(void)
+{
+ return ((setup.bd_up_down_graphics == STATE_TRUE) ||
+ (setup.bd_up_down_graphics == STATE_AUTO && !use_native_bd_graphics_engine()));
+}
+
+// check if skipping falling sounds selected in setup menu
+boolean skip_bd_falling_sounds(void)
+{
+ return ((setup.bd_skip_falling_sounds == STATE_TRUE) ||
+ (setup.bd_skip_falling_sounds == STATE_AUTO && !game.use_native_bd_sound_engine));
+}
+
+Bitmap **GetTitleScreenBitmaps_BD(void)
+{
+ Bitmap **title_screen_bitmaps = gd_get_title_screen_bitmaps();
+
+ if (title_screen_bitmaps == NULL || title_screen_bitmaps[0] == NULL)
+ return NULL;
+
+ return title_screen_bitmaps;
+}
+
void CoverScreen_BD(void)
{
game_bd.cover_screen = FALSE;