X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fmain_bd.c;h=e6def9ed41643850f7e1dead0799690339f5cd08;hb=f7132b81a5b7559991e1048ab8680c65cc4b98c2;hp=fcd2a23dd4287ecb768c202c33afceea142c77c8;hpb=459e3ba4589c247d389e315d1f501ee099a8a125;p=rocksndiamonds.git diff --git a/src/game_bd/main_bd.c b/src/game_bd/main_bd.c index fcd2a23d..e6def9ed 100644 --- a/src/game_bd/main_bd.c +++ b/src/game_bd/main_bd.c @@ -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; } @@ -164,6 +181,14 @@ boolean SaveNativeLevel_BD(char *filename) 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 @@ -230,20 +255,28 @@ int getTimeLeft_BD(void) return 0; } +void SetTimeFrames_BD(int frames_played) +{ + // needed to store final time after solving game (before counting down remaining time) + if (game_bd.game->state_counter == GAME_INT_CAVE_RUNNING) + game_bd.frames_played = frames_played; + +} + static void UpdateGameDoorValues_BD(void) { GdCave *cave = game_bd.game->cave; - int time_secs = gd_cave_time_show(cave, cave->time); + int time_left = gd_cave_time_show(cave, cave->time); int gems_still_needed = MAX(0, (cave->diamonds_needed - cave->diamonds_collected)); - game_bd.time_played = time_secs; + game_bd.time_left = time_left; game_bd.gems_still_needed = gems_still_needed; game_bd.score = game_bd.game->player_score; if (game.LevelSolved) { // update time and score in panel while counting bonus time - game.LevelSolved_CountingTime = game_bd.time_played; + game.LevelSolved_CountingTime = game_bd.time_left; game.LevelSolved_CountingScore = game_bd.score; } } @@ -253,12 +286,16 @@ static void PrepareGameTileBitmap_BD(void) struct GraphicInfo_BD *g_template = &graphic_info_bd_color_template; struct GraphicInfo_BD *g_default = &graphic_info_bd_object[O_STONE][0]; - gd_prepare_tile_bitmap(native_bd_level.cave, g_template->bitmap, 1); + // 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); } @@ -291,10 +328,6 @@ void InitGameEngine_BD(void) game_bd.game_over = FALSE; game_bd.cover_screen = FALSE; - game_bd.time_played = 0; - game_bd.gems_still_needed = 0; - game_bd.score = 0; - gd_caveset_last_selected = native_bd_level.cave_nr; gd_caveset_last_selected_level = native_bd_level.level_nr; @@ -307,9 +340,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; @@ -317,15 +347,23 @@ 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); // 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); @@ -386,6 +424,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(); @@ -396,6 +447,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 == 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;