X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fmain_bd.c;h=06ecfd0458fa7cea799a9fe044236b56122a75b9;hb=refs%2Fheads%2Fmaster-next-major-release;hp=3992593359260faac31cd6b3823666dd57ac1889;hpb=3b292f6abf8f677bbfdbd9b583c54113b8e64959;p=rocksndiamonds.git diff --git a/src/game_bd/main_bd.c b/src/game_bd/main_bd.c index 39925933..4404d0ab 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(); } @@ -181,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 @@ -247,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; } } @@ -312,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; @@ -327,6 +339,11 @@ void InitGameEngine_BD(void) game_bd.game->itercycle = 0; game_bd.game->itermax = 8; // default; dynamically changed at runtime game_bd.game->itermax_last = game_bd.game->itermax; + game_bd.game->itermax2[0] = game_bd.game->itermax; + game_bd.game->itermax2[1] = game_bd.game->itermax; + + game_bd.player_moving = FALSE; + game_bd.player_snapping = FALSE; // default: start with completely covered playfield int next_state = GAME_INT_START_UNCOVER + 1; @@ -348,8 +365,10 @@ void InitGameEngine_BD(void) // when skipping uncovering, continue with uncovered playfield if (setup.bd_skip_uncovering) game_bd.game->state_counter = GAME_INT_UNCOVER_ALL + 1; + else if (isLevelEditorFastStart()) + game_bd.game->state_counter = GAME_INT_UNCOVER_ALL - 8; - if (setup.bd_skip_uncovering) + if (setup.bd_skip_uncovering || isLevelEditorFastStart()) gd_scroll(game_bd.game, TRUE, TRUE); ClearRectangle(gd_screen_bitmap, 0, 0, SXSIZE, SYSIZE); @@ -423,6 +442,15 @@ void GameActions_BD(byte action[MAX_PLAYERS]) play_game_func(game_bd.game, action[0]); } + boolean single_step_mode_paused = + CheckSingleStepMode_BD(check_iteration_reached(game_bd.game), + game_bd.player_moving, + game_bd.player_snapping); + + // draw final movement animation frame before going to single step pause mode + if (single_step_mode_paused) + game_bd.game->itercycle = game_bd.game->itermax - 1; + RedrawPlayfield_BD(FALSE); UpdateGameDoorValues_BD(); @@ -442,15 +470,34 @@ boolean use_native_bd_graphics_engine(void) // 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())); + 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 == TRUE) || - (setup.bd_pushing_graphics == AUTO && !use_native_bd_graphics_engine())); + 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 element falling sounds selected in setup menu +boolean use_bd_falling_sounds(void) +{ + return ((setup.bd_falling_sounds == STATE_TRUE) || + (setup.bd_falling_sounds == STATE_AUTO && game.use_native_bd_sound_engine)); +} + +boolean hasColorTemplate_BD(void) +{ + return gd_bitmap_has_c64_colors(graphic_info_bd_color_template.bitmap); } Bitmap **GetTitleScreenBitmaps_BD(void) @@ -507,3 +554,99 @@ void RedrawPlayfield_BD(boolean force_redraw) { gd_drawcave(gd_screen_bitmap, game_bd.game, force_redraw); } + + +// ============================================================================ +// snapshot functions +// ============================================================================ + +void SaveEngineSnapshotValues_BD(void) +{ + GdGame *game = game_bd.game; + GdCave *cave = game_bd.game->cave; + int x, y; + + engine_snapshot_bd.game = *game; + + for (y = 0; y < cave->h; y++) + { + for (x = 0; x < cave->w; x++) + { + engine_snapshot_bd.element_buffer[x][y] = game->element_buffer[y][x]; + engine_snapshot_bd.last_element_buffer[x][y] = game->last_element_buffer[y][x]; + engine_snapshot_bd.dir_buffer_from[x][y] = game->dir_buffer_from[y][x]; + engine_snapshot_bd.dir_buffer_to[x][y] = game->dir_buffer_to[y][x]; + engine_snapshot_bd.gfx_buffer[x][y] = game->gfx_buffer[y][x]; + } + } + + engine_snapshot_bd.cave = *cave; + + for (y = 0; y < cave->h; y++) + { + for (x = 0; x < cave->w; x++) + { + engine_snapshot_bd.map[x][y] = cave->map[y][x]; + + if (cave->hammered_walls_reappear) + engine_snapshot_bd.hammered_reappear[x][y] = cave->hammered_reappear[y][x]; + } + } +} + +void LoadEngineSnapshotValues_BD(void) +{ + GdGame *game = game_bd.game; + GdCave *cave = game_bd.game->cave; + int x, y; + + // copy pointers + engine_snapshot_bd.game.cave = game->cave; + engine_snapshot_bd.game.original_cave = game->original_cave; + + engine_snapshot_bd.game.element_buffer = game->element_buffer; + engine_snapshot_bd.game.last_element_buffer = game->last_element_buffer; + engine_snapshot_bd.game.dir_buffer_from = game->dir_buffer_from; + engine_snapshot_bd.game.dir_buffer_to = game->dir_buffer_to; + engine_snapshot_bd.game.gfx_buffer = game->gfx_buffer; + + *game = engine_snapshot_bd.game; + + for (y = 0; y < cave->h; y++) + { + for (x = 0; x < cave->w; x++) + { + game->element_buffer[y][x] = engine_snapshot_bd.element_buffer[x][y]; + game->last_element_buffer[y][x] = engine_snapshot_bd.last_element_buffer[x][y]; + game->dir_buffer_from[y][x] = engine_snapshot_bd.dir_buffer_from[x][y]; + game->dir_buffer_to[y][x] = engine_snapshot_bd.dir_buffer_to[x][y]; + game->gfx_buffer[y][x] = engine_snapshot_bd.gfx_buffer[x][y]; + } + } + + // copy pointers + engine_snapshot_bd.cave.story = cave->story; + engine_snapshot_bd.cave.remark = cave->remark; + engine_snapshot_bd.cave.tags = cave->tags; + engine_snapshot_bd.cave.map = cave->map; + engine_snapshot_bd.cave.objects = cave->objects; + engine_snapshot_bd.cave.replays = cave->replays; + engine_snapshot_bd.cave.random = cave->random; + engine_snapshot_bd.cave.objects_order = cave->objects_order; + engine_snapshot_bd.cave.hammered_reappear = cave->hammered_reappear; + + *cave = engine_snapshot_bd.cave; + + for (y = 0; y < cave->h; y++) + { + for (x = 0; x < cave->w; x++) + { + cave->map[y][x] = engine_snapshot_bd.map[x][y]; + + if (cave->hammered_walls_reappear) + cave->hammered_reappear[y][x] = engine_snapshot_bd.hammered_reappear[x][y]; + } + } + + gd_scroll(game_bd.game, TRUE, TRUE); +}