X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=83b0c1f3cb94a98767c21573f527dcdaac6ee1c2;hb=7a5e1469c7df6a9f07717f5a9c0e7b8d9a796a2c;hp=b050950d7ff899a5894b31fcef21b98f9bc42aa9;hpb=fd72fbf3b83fc7215347e131aa6fc3c87ad7b4d5;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index b050950d..83b0c1f3 100644 --- a/src/game.c +++ b/src/game.c @@ -89,7 +89,7 @@ // game panel display and control definitions #define GAME_PANEL_LEVEL_NUMBER 0 #define GAME_PANEL_GEMS 1 -#define GAME_PANEL_GEMS_TOTAL 2 +#define GAME_PANEL_GEMS_NEEDED 2 #define GAME_PANEL_GEMS_COLLECTED 3 #define GAME_PANEL_GEMS_SCORE 4 #define GAME_PANEL_INVENTORY_COUNT 5 @@ -246,8 +246,8 @@ static struct GamePanelControlInfo game_panel_controls[] = TYPE_INTEGER, }, { - GAME_PANEL_GEMS_TOTAL, - &game.panel.gems_total, + GAME_PANEL_GEMS_NEEDED, + &game.panel.gems_needed, TYPE_INTEGER, }, { @@ -1835,6 +1835,29 @@ static void InitPlayerField(int x, int y, int element, boolean init_game) } } +static void InitFieldForEngine_RND(int x, int y) +{ + int element = Tile[x][y]; + + // convert BD engine elements to corresponding R'n'D engine elements + element = (element == EL_BD_EMPTY ? EL_EMPTY : + element == EL_BD_PLAYER ? EL_PLAYER_1 : + element == EL_BD_INBOX ? EL_PLAYER_1 : + element == EL_BD_SAND ? EL_SAND : + element == EL_BD_STEELWALL ? EL_STEELWALL : + element == EL_BD_EXIT_CLOSED ? EL_EXIT_CLOSED : + element == EL_BD_EXIT_OPEN ? EL_EXIT_OPEN : + element); + + Tile[x][y] = element; +} + +static void InitFieldForEngine(int x, int y) +{ + if (level.game_engine_type == GAME_ENGINE_TYPE_RND) + InitFieldForEngine_RND(x, y); +} + static void InitField(int x, int y, boolean init_game) { int element = Tile[x][y]; @@ -2291,10 +2314,10 @@ static void UpdateGameControlValues(void) level.game_engine_type == GAME_ENGINE_TYPE_MM ? game_mm.kettles_still_needed : game.gems_still_needed); - int gems_total = level.gems_needed; + int gems_needed = level.gems_needed; int gems_collected = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.game->cave->diamonds_collected : - gems_total - gems); + gems_needed - gems); int gems_score = (level.game_engine_type == GAME_ENGINE_TYPE_BD ? game_bd.game->cave->diamond_value : level.score[SC_EMERALD]); @@ -2325,7 +2348,7 @@ static void UpdateGameControlValues(void) // used instead of "level_nr" (for network games) game_panel_controls[GAME_PANEL_LEVEL_NUMBER].value = levelset.level_nr; game_panel_controls[GAME_PANEL_GEMS].value = gems; - game_panel_controls[GAME_PANEL_GEMS_TOTAL].value = gems_total; + game_panel_controls[GAME_PANEL_GEMS_NEEDED].value = gems_needed; game_panel_controls[GAME_PANEL_GEMS_COLLECTED].value = gems_collected; game_panel_controls[GAME_PANEL_GEMS_SCORE].value = gems_score; @@ -4007,6 +4030,8 @@ void InitGame(void) SCAN_PLAYFIELD(x, y) { + InitFieldForEngine(x, y); + if (emulate_bd && !IS_BD_ELEMENT(Tile[x][y])) emulate_bd = FALSE; if (emulate_sp && !IS_SP_ELEMENT(Tile[x][y])) @@ -4881,6 +4906,27 @@ static void LevelSolved(void) LevelSolved_SetFinalGameValues(); } +static void AdvanceToNextLevel(void) +{ + if (setup.increment_levels && + level_nr < leveldir_current->last_level && + !network_playing) + { + level_nr++; // advance to next level + TapeErase(); // start with empty tape + + if (setup.auto_play_next_level) + { + scores.continue_playing = TRUE; + scores.next_level_nr = level_nr; + + LoadLevel(level_nr); + + SaveLevelSetup_SeriesInfo(); + } + } +} + void GameWon(void) { static int time_count_steps; @@ -5158,23 +5204,8 @@ void GameEnd(void) // save score and score tape before potentially erasing tape below NewHighScore(last_level_nr, tape_saved); - if (setup.increment_levels && - level_nr < leveldir_current->last_level && - !network_playing) - { - level_nr++; // advance to next level - TapeErase(); // start with empty tape - - if (setup.auto_play_next_level) - { - scores.continue_playing = TRUE; - scores.next_level_nr = level_nr; - - LoadLevel(level_nr); - - SaveLevelSetup_SeriesInfo(); - } - } + // increment and load next level (if possible and not configured otherwise) + AdvanceToNextLevel(); if (scores.last_added >= 0 && setup.show_scores_after_game) {