X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=abf350ce93311d668bc344cc1301affb90fa0a1e;hp=8422878aeff98cd52891afaa1411fa5300fabf9f;hb=1d7ec87196d24515b3d6e9400c689d9cd48c49f5;hpb=88fd751f97e6f0f4acb3a9b790f98e3291960c2a diff --git a/src/game.c b/src/game.c index 8422878a..abf350ce 100644 --- a/src/game.c +++ b/src/game.c @@ -1837,15 +1837,15 @@ static void InitField(int x, int y, boolean init_game) break; case EL_STONEBLOCK: - if (x < lev_fieldx-1 && Tile[x+1][y] == EL_ACID) + if (x < lev_fieldx - 1 && Tile[x + 1][y] == EL_ACID) Tile[x][y] = EL_ACID_POOL_TOPLEFT; - else if (x > 0 && Tile[x-1][y] == EL_ACID) + else if (x > 0 && Tile[x - 1][y] == EL_ACID) Tile[x][y] = EL_ACID_POOL_TOPRIGHT; - else if (y > 0 && Tile[x][y-1] == EL_ACID_POOL_TOPLEFT) + else if (y > 0 && Tile[x][y - 1] == EL_ACID_POOL_TOPLEFT) Tile[x][y] = EL_ACID_POOL_BOTTOMLEFT; - else if (y > 0 && Tile[x][y-1] == EL_ACID) + else if (y > 0 && Tile[x][y - 1] == EL_ACID) Tile[x][y] = EL_ACID_POOL_BOTTOM; - else if (y > 0 && Tile[x][y-1] == EL_ACID_POOL_TOPRIGHT) + else if (y > 0 && Tile[x][y - 1] == EL_ACID_POOL_TOPRIGHT) Tile[x][y] = EL_ACID_POOL_BOTTOMRIGHT; break; @@ -2682,15 +2682,24 @@ static void DisplayGameControlValues(void) { if (nr == GAME_PANEL_LEVEL_NUMBER || nr == GAME_PANEL_INVENTORY_COUNT || + nr == GAME_PANEL_SCORE || + nr == GAME_PANEL_HIGHSCORE || nr == GAME_PANEL_TIME) { boolean use_dynamic_size = (size == -1 ? TRUE : FALSE); if (use_dynamic_size) // use dynamic number of digits { - int value_change = (nr == GAME_PANEL_LEVEL_NUMBER ? 100 : 1000); - int size1 = (nr == GAME_PANEL_LEVEL_NUMBER ? 2 : 3); - int size2 = size1 + 1; + int value_change = (nr == GAME_PANEL_LEVEL_NUMBER ? 100 : + nr == GAME_PANEL_INVENTORY_COUNT || + nr == GAME_PANEL_TIME ? 1000 : 100000); + int size_add = (nr == GAME_PANEL_LEVEL_NUMBER || + nr == GAME_PANEL_INVENTORY_COUNT || + nr == GAME_PANEL_TIME ? 1 : 2); + int size1 = (nr == GAME_PANEL_LEVEL_NUMBER ? 2 : + nr == GAME_PANEL_INVENTORY_COUNT || + nr == GAME_PANEL_TIME ? 3 : 5); + int size2 = size1 + size_add; int font1 = pos->font; int font2 = pos->font_alt; @@ -4988,7 +4997,7 @@ void GameEnd(void) game.LevelSolved_GameEnd = TRUE; - if (game.LevelSolved_SaveTape) + if (game.LevelSolved_SaveTape && !score_info_tape_play) { // make sure that request dialog to save tape does not open door again if (!global.use_envelope_request) @@ -5004,7 +5013,7 @@ void GameEnd(void) // if no tape is to be saved, close both doors simultaneously CloseDoor(DOOR_CLOSE_ALL); - if (level_editor_test_game) + if (level_editor_test_game || score_info_tape_play) { SetGameStatus(GAME_MODE_MAIN); @@ -5041,6 +5050,9 @@ void GameEnd(void) if (setup.auto_play_next_level) { + scores.continue_playing = TRUE; + scores.next_level_nr = level_nr; + LoadLevel(level_nr); SaveLevelSetup_SeriesInfo(); @@ -5053,9 +5065,7 @@ void GameEnd(void) DrawHallOfFame(last_level_nr); } - else if (setup.auto_play_next_level && setup.increment_levels && - last_level_nr < leveldir_current->last_level && - !network_playing) + else if (scores.continue_playing) { StartGameActions(network.enabled, setup.autorecord, level.random_seed); } @@ -5142,7 +5152,8 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry, } } - return -1; + // special case: new score is beyond the last high score list position + return MAX_SCORE_ENTRIES; } void NewHighScore(int level_nr, boolean tape_saved) @@ -5160,6 +5171,19 @@ void NewHighScore(int level_nr, boolean tape_saved) scores.last_added = addScoreEntry(&scores, &new_entry, one_per_name); + if (scores.last_added >= MAX_SCORE_ENTRIES) + { + scores.last_added = MAX_SCORE_ENTRIES - 1; + scores.force_last_added = TRUE; + + scores.entry[scores.last_added] = new_entry; + + // store last added local score entry (before merging server scores) + scores.last_added_local = scores.last_added; + + return; + } + if (scores.last_added < 0) return; @@ -6071,11 +6095,11 @@ static void Explode(int ex, int ey, int phase, int mode) } else if (IS_WALKABLE_UNDER(Back[x][y])) { - DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame); + DrawLevelGraphic(x, y, graphic, frame); DrawLevelElementThruMask(x, y, Back[x][y]); } else if (!IS_WALKABLE_INSIDE(Back[x][y])) - DrawScreenGraphic(SCREENX(x), SCREENY(y), graphic, frame); + DrawLevelGraphic(x, y, graphic, frame); } } @@ -8286,7 +8310,7 @@ static void StartMoving(int x, int y) if (IN_SCR_FIELD(sx, sy)) { TEST_DrawLevelFieldCrumbled(xx, yy); - DrawGraphic(sx, sy, flame_graphic, frame); + DrawScreenGraphic(sx, sy, flame_graphic, frame); } } else @@ -9136,7 +9160,7 @@ static void AmoebaGrowing(int x, int y) int frame = getGraphicAnimationFrame(IMG_AMOEBA_GROWING, 6 - MovDelay[x][y]); - DrawGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_GROWING, frame); + DrawLevelGraphic(x, y, IMG_AMOEBA_GROWING, frame); } if (!MovDelay[x][y]) @@ -9169,7 +9193,7 @@ static void AmoebaShrinking(int x, int y) int frame = getGraphicAnimationFrame(IMG_AMOEBA_SHRINKING, 6 - MovDelay[x][y]); - DrawGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_SHRINKING, frame); + DrawLevelGraphic(x, y, IMG_AMOEBA_SHRINKING, frame); } if (!MovDelay[x][y]) @@ -9423,7 +9447,7 @@ static void Life(int ax, int ay) num_neighbours <= life_parameter[3]) { Tile[xx][yy] = element; - MovDelay[xx][yy] = (element == EL_GAME_OF_LIFE ? 0 : life_time-1); + MovDelay[xx][yy] = (element == EL_GAME_OF_LIFE ? 0 : life_time - 1); if (Tile[xx][yy] != old_element) TEST_DrawLevelField(xx, yy); Stop[xx][yy] = TRUE; @@ -9687,7 +9711,7 @@ static void MauerWaechst(int x, int y) int graphic = el_dir2img(Tile[x][y], GfxDir[x][y]); int frame = getGraphicAnimationFrame(graphic, 17 - MovDelay[x][y]); - DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame); + DrawLevelGraphic(x, y, graphic, frame); } if (!MovDelay[x][y]) @@ -9744,13 +9768,13 @@ static void MauerAbleger(int ax, int ay) return; } - if (IN_LEV_FIELD(ax, ay-1) && IS_FREE(ax, ay-1)) + if (IN_LEV_FIELD(ax, ay - 1) && IS_FREE(ax, ay - 1)) oben_frei = TRUE; - if (IN_LEV_FIELD(ax, ay+1) && IS_FREE(ax, ay+1)) + if (IN_LEV_FIELD(ax, ay + 1) && IS_FREE(ax, ay + 1)) unten_frei = TRUE; - if (IN_LEV_FIELD(ax-1, ay) && IS_FREE(ax-1, ay)) + if (IN_LEV_FIELD(ax - 1, ay) && IS_FREE(ax - 1, ay)) links_frei = TRUE; - if (IN_LEV_FIELD(ax+1, ay) && IS_FREE(ax+1, ay)) + if (IN_LEV_FIELD(ax + 1, ay) && IS_FREE(ax + 1, ay)) rechts_frei = TRUE; if (element == EL_EXPANDABLE_WALL_VERTICAL || @@ -9758,22 +9782,20 @@ static void MauerAbleger(int ax, int ay) { if (oben_frei) { - Tile[ax][ay-1] = EL_EXPANDABLE_WALL_GROWING; - Store[ax][ay-1] = element; - GfxDir[ax][ay-1] = MovDir[ax][ay-1] = MV_UP; - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay-1))) - DrawGraphic(SCREENX(ax), SCREENY(ay - 1), - IMG_EXPANDABLE_WALL_GROWING_UP, 0); + Tile[ax][ay - 1] = EL_EXPANDABLE_WALL_GROWING; + Store[ax][ay - 1] = element; + GfxDir[ax][ay - 1] = MovDir[ax][ay - 1] = MV_UP; + if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay - 1))) + DrawLevelGraphic(ax, ay - 1, IMG_EXPANDABLE_WALL_GROWING_UP, 0); new_wall = TRUE; } if (unten_frei) { - Tile[ax][ay+1] = EL_EXPANDABLE_WALL_GROWING; - Store[ax][ay+1] = element; - GfxDir[ax][ay+1] = MovDir[ax][ay+1] = MV_DOWN; - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay+1))) - DrawGraphic(SCREENX(ax), SCREENY(ay + 1), - IMG_EXPANDABLE_WALL_GROWING_DOWN, 0); + Tile[ax][ay + 1] = EL_EXPANDABLE_WALL_GROWING; + Store[ax][ay + 1] = element; + GfxDir[ax][ay + 1] = MovDir[ax][ay + 1] = MV_DOWN; + if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay + 1))) + DrawLevelGraphic(ax, ay + 1, IMG_EXPANDABLE_WALL_GROWING_DOWN, 0); new_wall = TRUE; } } @@ -9785,23 +9807,21 @@ static void MauerAbleger(int ax, int ay) { if (links_frei) { - Tile[ax-1][ay] = EL_EXPANDABLE_WALL_GROWING; - Store[ax-1][ay] = element; - GfxDir[ax-1][ay] = MovDir[ax-1][ay] = MV_LEFT; - if (IN_SCR_FIELD(SCREENX(ax-1), SCREENY(ay))) - DrawGraphic(SCREENX(ax - 1), SCREENY(ay), - IMG_EXPANDABLE_WALL_GROWING_LEFT, 0); + Tile[ax - 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Store[ax - 1][ay] = element; + GfxDir[ax - 1][ay] = MovDir[ax - 1][ay] = MV_LEFT; + if (IN_SCR_FIELD(SCREENX(ax - 1), SCREENY(ay))) + DrawLevelGraphic(ax - 1, ay, IMG_EXPANDABLE_WALL_GROWING_LEFT, 0); new_wall = TRUE; } if (rechts_frei) { - Tile[ax+1][ay] = EL_EXPANDABLE_WALL_GROWING; - Store[ax+1][ay] = element; - GfxDir[ax+1][ay] = MovDir[ax+1][ay] = MV_RIGHT; - if (IN_SCR_FIELD(SCREENX(ax+1), SCREENY(ay))) - DrawGraphic(SCREENX(ax + 1), SCREENY(ay), - IMG_EXPANDABLE_WALL_GROWING_RIGHT, 0); + Tile[ax + 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Store[ax + 1][ay] = element; + GfxDir[ax + 1][ay] = MovDir[ax + 1][ay] = MV_RIGHT; + if (IN_SCR_FIELD(SCREENX(ax + 1), SCREENY(ay))) + DrawLevelGraphic(ax + 1, ay, IMG_EXPANDABLE_WALL_GROWING_RIGHT, 0); new_wall = TRUE; } } @@ -9809,13 +9829,13 @@ static void MauerAbleger(int ax, int ay) if (element == EL_EXPANDABLE_WALL && (links_frei || rechts_frei)) TEST_DrawLevelField(ax, ay); - if (!IN_LEV_FIELD(ax, ay-1) || IS_WALL(Tile[ax][ay-1])) + if (!IN_LEV_FIELD(ax, ay - 1) || IS_WALL(Tile[ax][ay - 1])) oben_massiv = TRUE; - if (!IN_LEV_FIELD(ax, ay+1) || IS_WALL(Tile[ax][ay+1])) + if (!IN_LEV_FIELD(ax, ay + 1) || IS_WALL(Tile[ax][ay + 1])) unten_massiv = TRUE; - if (!IN_LEV_FIELD(ax-1, ay) || IS_WALL(Tile[ax-1][ay])) + if (!IN_LEV_FIELD(ax - 1, ay) || IS_WALL(Tile[ax - 1][ay])) links_massiv = TRUE; - if (!IN_LEV_FIELD(ax+1, ay) || IS_WALL(Tile[ax+1][ay])) + if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) rechts_massiv = TRUE; if (((oben_massiv && unten_massiv) || @@ -9852,13 +9872,13 @@ static void MauerAblegerStahl(int ax, int ay) return; } - if (IN_LEV_FIELD(ax, ay-1) && IS_FREE(ax, ay-1)) + if (IN_LEV_FIELD(ax, ay - 1) && IS_FREE(ax, ay - 1)) oben_frei = TRUE; - if (IN_LEV_FIELD(ax, ay+1) && IS_FREE(ax, ay+1)) + if (IN_LEV_FIELD(ax, ay + 1) && IS_FREE(ax, ay + 1)) unten_frei = TRUE; - if (IN_LEV_FIELD(ax-1, ay) && IS_FREE(ax-1, ay)) + if (IN_LEV_FIELD(ax - 1, ay) && IS_FREE(ax - 1, ay)) links_frei = TRUE; - if (IN_LEV_FIELD(ax+1, ay) && IS_FREE(ax+1, ay)) + if (IN_LEV_FIELD(ax + 1, ay) && IS_FREE(ax + 1, ay)) rechts_frei = TRUE; if (element == EL_EXPANDABLE_STEELWALL_VERTICAL || @@ -9866,22 +9886,20 @@ static void MauerAblegerStahl(int ax, int ay) { if (oben_frei) { - Tile[ax][ay-1] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax][ay-1] = element; - GfxDir[ax][ay-1] = MovDir[ax][ay-1] = MV_UP; - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay-1))) - DrawGraphic(SCREENX(ax), SCREENY(ay - 1), - IMG_EXPANDABLE_STEELWALL_GROWING_UP, 0); + Tile[ax][ay - 1] = EL_EXPANDABLE_STEELWALL_GROWING; + Store[ax][ay - 1] = element; + GfxDir[ax][ay - 1] = MovDir[ax][ay - 1] = MV_UP; + if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay - 1))) + DrawLevelGraphic(ax, ay - 1, IMG_EXPANDABLE_STEELWALL_GROWING_UP, 0); new_wall = TRUE; } if (unten_frei) { - Tile[ax][ay+1] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax][ay+1] = element; - GfxDir[ax][ay+1] = MovDir[ax][ay+1] = MV_DOWN; - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay+1))) - DrawGraphic(SCREENX(ax), SCREENY(ay + 1), - IMG_EXPANDABLE_STEELWALL_GROWING_DOWN, 0); + Tile[ax][ay + 1] = EL_EXPANDABLE_STEELWALL_GROWING; + Store[ax][ay + 1] = element; + GfxDir[ax][ay + 1] = MovDir[ax][ay + 1] = MV_DOWN; + if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay + 1))) + DrawLevelGraphic(ax, ay + 1, IMG_EXPANDABLE_STEELWALL_GROWING_DOWN, 0); new_wall = TRUE; } } @@ -9891,34 +9909,32 @@ static void MauerAblegerStahl(int ax, int ay) { if (links_frei) { - Tile[ax-1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax-1][ay] = element; - GfxDir[ax-1][ay] = MovDir[ax-1][ay] = MV_LEFT; - if (IN_SCR_FIELD(SCREENX(ax-1), SCREENY(ay))) - DrawGraphic(SCREENX(ax - 1), SCREENY(ay), - IMG_EXPANDABLE_STEELWALL_GROWING_LEFT, 0); + Tile[ax - 1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; + Store[ax - 1][ay] = element; + GfxDir[ax - 1][ay] = MovDir[ax - 1][ay] = MV_LEFT; + if (IN_SCR_FIELD(SCREENX(ax - 1), SCREENY(ay))) + DrawLevelGraphic(ax - 1, ay, IMG_EXPANDABLE_STEELWALL_GROWING_LEFT, 0); new_wall = TRUE; } if (rechts_frei) { - Tile[ax+1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax+1][ay] = element; - GfxDir[ax+1][ay] = MovDir[ax+1][ay] = MV_RIGHT; - if (IN_SCR_FIELD(SCREENX(ax+1), SCREENY(ay))) - DrawGraphic(SCREENX(ax + 1), SCREENY(ay), - IMG_EXPANDABLE_STEELWALL_GROWING_RIGHT, 0); + Tile[ax + 1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; + Store[ax + 1][ay] = element; + GfxDir[ax + 1][ay] = MovDir[ax + 1][ay] = MV_RIGHT; + if (IN_SCR_FIELD(SCREENX(ax + 1), SCREENY(ay))) + DrawLevelGraphic(ax + 1, ay, IMG_EXPANDABLE_STEELWALL_GROWING_RIGHT, 0); new_wall = TRUE; } } - if (!IN_LEV_FIELD(ax, ay-1) || IS_WALL(Tile[ax][ay-1])) + if (!IN_LEV_FIELD(ax, ay - 1) || IS_WALL(Tile[ax][ay - 1])) oben_massiv = TRUE; - if (!IN_LEV_FIELD(ax, ay+1) || IS_WALL(Tile[ax][ay+1])) + if (!IN_LEV_FIELD(ax, ay + 1) || IS_WALL(Tile[ax][ay + 1])) unten_massiv = TRUE; - if (!IN_LEV_FIELD(ax-1, ay) || IS_WALL(Tile[ax-1][ay])) + if (!IN_LEV_FIELD(ax - 1, ay) || IS_WALL(Tile[ax - 1][ay])) links_massiv = TRUE; - if (!IN_LEV_FIELD(ax+1, ay) || IS_WALL(Tile[ax+1][ay])) + if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) rechts_massiv = TRUE; if (((oben_massiv && unten_massiv) || @@ -11762,6 +11778,9 @@ void StartGameActions(boolean init_network_game, boolean record_tape, if (record_tape) TapeStartRecording(new_random_seed); + if (setup.auto_pause_on_start && !tape.pausing) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + if (init_network_game) { SendToServer_LevelFile(); @@ -12535,10 +12554,10 @@ void GameActions_RND(void) element == EL_ACID_SPLASH_LEFT || element == EL_ACID_SPLASH_RIGHT)) { - if ((IN_LEV_FIELD(x, y-1) && Tile[x][y-1] == EL_AMOEBA_WET) || - (IN_LEV_FIELD(x-1, y) && Tile[x-1][y] == EL_AMOEBA_WET) || - (IN_LEV_FIELD(x+1, y) && Tile[x+1][y] == EL_AMOEBA_WET) || - (IN_LEV_FIELD(x, y+1) && Tile[x][y+1] == EL_AMOEBA_WET)) + if ((IN_LEV_FIELD(x, y - 1) && Tile[x][y - 1] == EL_AMOEBA_WET) || + (IN_LEV_FIELD(x - 1, y) && Tile[x - 1][y] == EL_AMOEBA_WET) || + (IN_LEV_FIELD(x + 1, y) && Tile[x + 1][y] == EL_AMOEBA_WET) || + (IN_LEV_FIELD(x, y + 1) && Tile[x][y + 1] == EL_AMOEBA_WET)) Tile[x][y] = EL_AMOEBA_DROP; } @@ -13234,9 +13253,6 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) } } - player->last_jx = jx; - player->last_jy = jy; - if (Tile[jx][jy] == EL_EXIT_OPEN || Tile[jx][jy] == EL_EM_EXIT_OPEN || Tile[jx][jy] == EL_EM_EXIT_OPENING || @@ -13254,6 +13270,9 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) LevelSolved(); } + player->last_jx = jx; + player->last_jy = jy; + // this breaks one level: "machine", level 000 { int move_direction = player->MovDir; @@ -15673,9 +15692,10 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message) { // prevent short reactivation of overlay buttons while closing door SetOverlayActive(FALSE); + UnmapGameButtons(); // door may still be open due to skipped or envelope style request - CloseDoor(DOOR_CLOSE_1); + CloseDoor(score_info_tape_play ? DOOR_CLOSE_ALL : DOOR_CLOSE_1); } if (network.enabled) @@ -15708,7 +15728,7 @@ void RequestQuitGame(boolean escape_key_pressed) boolean quick_quit = ((escape_key_pressed && !ask_on_escape) || level_editor_test_game); boolean skip_request = (game.all_players_gone || !setup.ask_on_quit_game || - quick_quit); + quick_quit || score_info_tape_play); RequestQuitGameExt(skip_request, quick_quit, "Do you really want to quit the game?"); @@ -16280,6 +16300,10 @@ void CreateGameButtons(void) int y = (is_touch_button ? pos->y : GDI_ACTIVE_POS(pos->y)); int id = i; + // do not use touch buttons if overlay touch buttons are disabled + if (is_touch_button && !setup.touch.overlay_buttons) + continue; + if (gfx->bitmap == NULL) { game_gadget[id] = NULL; @@ -16425,8 +16449,15 @@ static void MapGameButtonsExt(boolean on_tape) int i; for (i = 0; i < NUM_GAME_BUTTONS; i++) + { + if ((i == GAME_CTRL_ID_UNDO || + i == GAME_CTRL_ID_REDO) && + game_status != GAME_MODE_PLAYING) + continue; + if (!on_tape || gamebutton_info[i].allowed_on_tape) MapGadget(game_gadget[i]); + } UnmapGameButtonsAtSamePosition_All(); @@ -16566,13 +16597,7 @@ static void HandleGameButtonsExt(int id, int button) case GAME_CTRL_ID_STOP: case GAME_CTRL_ID_PANEL_STOP: case GAME_CTRL_ID_TOUCH_STOP: - if (game_status == GAME_MODE_MAIN) - break; - - if (tape.playing) - TapeStop(); - else - RequestQuitGame(FALSE); + TapeStopGame(); break;