renamed function
[rocksndiamonds.git] / src / game_bd / main_bd.c
index e7844fcb6e2a4922c6d21552438f31ec564cf08f..2d742bee733d5aca128a37f8366df99e0b599407 100644 (file)
@@ -40,7 +40,7 @@ void bd_open_all(void)
 
   gd_caveset_clear();
 
-  gd_init_keystate();
+  gd_init_play_area();
 
   gd_sound_init();
 }
@@ -95,6 +95,30 @@ void setLevelInfoToDefaults_BD(void)
   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;
@@ -137,16 +161,9 @@ boolean LoadNativeLevel_BD(char *filename, int level_pos, boolean level_info_onl
   // check if this cave has any replays
   if (native_bd_level.cave->replays != NULL)
   {
-    List *item = 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;
+    List *item = getNativeLevelReplay_BD(native_bd_level.cave->replays);
 
-    // matching replay found
+    // check if any matching replay was found
     if (item != NULL)
       native_bd_level.replay = (GdReplay *)item->data;
   }
@@ -250,9 +267,30 @@ static void UpdateGameDoorValues_BD(void)
 
 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);
+}
 
-  gd_prepare_tile_bitmap(native_bd_level.cave, g->bitmap, 1);
+void SetPreviewTileBitmapReference_BD(Bitmap *bitmap)
+{
+  gd_set_tile_bitmap_reference(bitmap);
+}
+
+Bitmap *GetPreviewTileBitmap_BD(Bitmap *bitmap)
+{
+  return gd_get_tile_bitmap(bitmap);
 }
 
 unsigned int InitEngineRandom_BD(int seed)
@@ -290,9 +328,6 @@ void InitGameEngine_BD(void)
   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;
 
@@ -300,7 +335,13 @@ void InitGameEngine_BD(void)
   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);
 
@@ -369,6 +410,19 @@ void GameActions_BD(byte action[MAX_PLAYERS])
 
   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();
@@ -379,6 +433,50 @@ void GameActions_BD(byte action[MAX_PLAYERS])
 // 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 == TRUE) ||
+         (setup.bd_smooth_movements == 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 == TRUE) ||
+         (setup.bd_pushing_graphics == 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 == TRUE) ||
+         (setup.bd_up_down_graphics == 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 == TRUE) ||
+         (setup.bd_skip_falling_sounds == 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;