X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=97617bb336003beddee02f2b2f1d37b73ea81d49;hb=9c94b5f043a204edb69f88c95d6a44fafa95ddb2;hp=1cc2f72b6a42f55b412607049633ed5f1ed1a588;hpb=0f38cfdd905d52190ca959b75c849459cbc99144;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 1cc2f72b..97617bb3 100644 --- a/src/game.c +++ b/src/game.c @@ -4777,6 +4777,8 @@ static void LevelSolved(void) game.LevelSolved = TRUE; game.GameOver = TRUE; + tape.solved = TRUE; + // needed here to display correct panel values while player walks into exit LevelSolved_SetFinalGameValues(); } @@ -5116,10 +5118,11 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry, if (strEqual(new_entry->tape_basename, entry->tape_basename) && !strEqual(new_entry->tape_basename, UNDEFINED_FILENAME)) { - // special case: use server score instead of local score value if higher - // (historic scores might have been truncated to 16-bit values locally) - if (score_is_better) - entry->score = new_entry->score; + // add fields from server score entry not stored in local score entry + // (currently, this means setting platform, version and country fields; + // in rare cases, this may also correct an invalid score value, as + // historic scores might have been truncated to 16-bit values locally) + *entry = *new_entry; return -1; } @@ -9656,7 +9659,7 @@ static void DrawTwinkleOnField(int x, int y) } } -static void MauerWaechst(int x, int y) +static void WallGrowing(int x, int y) { int delay = 6; @@ -9706,15 +9709,59 @@ static void MauerWaechst(int x, int y) } } -static void MauerAbleger(int ax, int ay) +static void CheckWallGrowing(int ax, int ay) { int element = Tile[ax][ay]; int graphic = el2img(element); - boolean oben_frei = FALSE, unten_frei = FALSE; - boolean links_frei = FALSE, rechts_frei = FALSE; - boolean oben_massiv = FALSE, unten_massiv = FALSE; - boolean links_massiv = FALSE, rechts_massiv = FALSE; - boolean new_wall = FALSE; + boolean free_top = FALSE; + boolean free_bottom = FALSE; + boolean free_left = FALSE; + boolean free_right = FALSE; + boolean stop_top = FALSE; + boolean stop_bottom = FALSE; + boolean stop_left = FALSE; + boolean stop_right = FALSE; + boolean new_wall = FALSE; + + boolean is_steelwall = (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_EXPANDABLE_STEELWALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean grow_vertical = (element == EL_EXPANDABLE_WALL_VERTICAL || + element == EL_EXPANDABLE_WALL_ANY || + element == EL_EXPANDABLE_STEELWALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean grow_horizontal = (element == EL_EXPANDABLE_WALL_HORIZONTAL || + element == EL_EXPANDABLE_WALL_ANY || + element == EL_EXPANDABLE_WALL || + element == EL_BD_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean stop_vertical = (element == EL_EXPANDABLE_WALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_VERTICAL); + + boolean stop_horizontal = (element == EL_EXPANDABLE_WALL_HORIZONTAL || + element == EL_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL); + + int wall_growing = (is_steelwall ? + EL_EXPANDABLE_STEELWALL_GROWING : + EL_EXPANDABLE_WALL_GROWING); + + int gfx_wall_growing_up = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_UP : + IMG_EXPANDABLE_WALL_GROWING_UP); + int gfx_wall_growing_down = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_DOWN : + IMG_EXPANDABLE_WALL_GROWING_DOWN); + int gfx_wall_growing_left = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_LEFT : + IMG_EXPANDABLE_WALL_GROWING_LEFT); + int gfx_wall_growing_right = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_RIGHT : + IMG_EXPANDABLE_WALL_GROWING_RIGHT); if (IS_ANIMATED(graphic)) DrawLevelGraphicAnimationIfNeeded(ax, ay, graphic); @@ -9730,184 +9777,88 @@ static void MauerAbleger(int ax, int ay) } if (IN_LEV_FIELD(ax, ay - 1) && IS_FREE(ax, ay - 1)) - oben_frei = TRUE; + free_top = TRUE; if (IN_LEV_FIELD(ax, ay + 1) && IS_FREE(ax, ay + 1)) - unten_frei = TRUE; + free_bottom = TRUE; if (IN_LEV_FIELD(ax - 1, ay) && IS_FREE(ax - 1, ay)) - links_frei = TRUE; + free_left = TRUE; if (IN_LEV_FIELD(ax + 1, ay) && IS_FREE(ax + 1, ay)) - rechts_frei = TRUE; + free_right = TRUE; - if (element == EL_EXPANDABLE_WALL_VERTICAL || - element == EL_EXPANDABLE_WALL_ANY) + if (grow_vertical) { - if (oben_frei) + if (free_top) { - Tile[ax][ay - 1] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax][ay - 1] = 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); + DrawLevelGraphic(ax, ay - 1, gfx_wall_growing_up, 0); + new_wall = TRUE; } - if (unten_frei) + + if (free_bottom) { - Tile[ax][ay + 1] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax][ay + 1] = 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); + DrawLevelGraphic(ax, ay + 1, gfx_wall_growing_down, 0); + new_wall = TRUE; } } - if (element == EL_EXPANDABLE_WALL_HORIZONTAL || - element == EL_EXPANDABLE_WALL_ANY || - element == EL_EXPANDABLE_WALL || - element == EL_BD_EXPANDABLE_WALL) + if (grow_horizontal) { - if (links_frei) + if (free_left) { - Tile[ax - 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax - 1][ay] = 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); + DrawLevelGraphic(ax - 1, ay, gfx_wall_growing_left, 0); + new_wall = TRUE; } - if (rechts_frei) + if (free_right) { - Tile[ax + 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax + 1][ay] = 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); + DrawLevelGraphic(ax + 1, ay, gfx_wall_growing_right, 0); + new_wall = TRUE; } } - if (element == EL_EXPANDABLE_WALL && (links_frei || rechts_frei)) + if (element == EL_EXPANDABLE_WALL && (free_left || free_right)) TEST_DrawLevelField(ax, ay); if (!IN_LEV_FIELD(ax, ay - 1) || IS_WALL(Tile[ax][ay - 1])) - oben_massiv = TRUE; + stop_top = TRUE; if (!IN_LEV_FIELD(ax, ay + 1) || IS_WALL(Tile[ax][ay + 1])) - unten_massiv = TRUE; + stop_bottom = TRUE; if (!IN_LEV_FIELD(ax - 1, ay) || IS_WALL(Tile[ax - 1][ay])) - links_massiv = TRUE; + stop_left = TRUE; if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) - rechts_massiv = TRUE; + stop_right = TRUE; - if (((oben_massiv && unten_massiv) || - element == EL_EXPANDABLE_WALL_HORIZONTAL || - element == EL_EXPANDABLE_WALL) && - ((links_massiv && rechts_massiv) || - element == EL_EXPANDABLE_WALL_VERTICAL)) + if (((stop_top && stop_bottom) || stop_horizontal) && + ((stop_left && stop_right) || stop_vertical)) Tile[ax][ay] = EL_WALL; if (new_wall) PlayLevelSoundAction(ax, ay, ACTION_GROWING); } -static void MauerAblegerStahl(int ax, int ay) -{ - int element = Tile[ax][ay]; - int graphic = el2img(element); - boolean oben_frei = FALSE, unten_frei = FALSE; - boolean links_frei = FALSE, rechts_frei = FALSE; - boolean oben_massiv = FALSE, unten_massiv = FALSE; - boolean links_massiv = FALSE, rechts_massiv = FALSE; - boolean new_wall = FALSE; - - if (IS_ANIMATED(graphic)) - DrawLevelGraphicAnimationIfNeeded(ax, ay, graphic); - - if (!MovDelay[ax][ay]) // start building new wall - MovDelay[ax][ay] = 6; - - if (MovDelay[ax][ay]) // wait some time before building new wall - { - MovDelay[ax][ay]--; - if (MovDelay[ax][ay]) - return; - } - - 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)) - unten_frei = TRUE; - 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)) - rechts_frei = TRUE; - - if (element == EL_EXPANDABLE_STEELWALL_VERTICAL || - element == EL_EXPANDABLE_STEELWALL_ANY) - { - 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))) - 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))) - DrawLevelGraphic(ax, ay + 1, IMG_EXPANDABLE_STEELWALL_GROWING_DOWN, 0); - new_wall = TRUE; - } - } - - if (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || - element == EL_EXPANDABLE_STEELWALL_ANY) - { - 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))) - 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))) - 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])) - oben_massiv = TRUE; - 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])) - links_massiv = TRUE; - if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) - rechts_massiv = TRUE; - - if (((oben_massiv && unten_massiv) || - element == EL_EXPANDABLE_STEELWALL_HORIZONTAL) && - ((links_massiv && rechts_massiv) || - element == EL_EXPANDABLE_STEELWALL_VERTICAL)) - Tile[ax][ay] = EL_STEELWALL; - - if (new_wall) - PlayLevelSoundAction(ax, ay, ACTION_GROWING); -} - static void CheckForDragon(int x, int y) { int i, j; @@ -12433,17 +12384,16 @@ void GameActions_RND(void) CheckExitSP(x, y); else if (element == EL_EXPANDABLE_WALL_GROWING || element == EL_EXPANDABLE_STEELWALL_GROWING) - MauerWaechst(x, y); + WallGrowing(x, y); else if (element == EL_EXPANDABLE_WALL || element == EL_EXPANDABLE_WALL_HORIZONTAL || element == EL_EXPANDABLE_WALL_VERTICAL || element == EL_EXPANDABLE_WALL_ANY || - element == EL_BD_EXPANDABLE_WALL) - MauerAbleger(x, y); - else if (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_BD_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || element == EL_EXPANDABLE_STEELWALL_VERTICAL || element == EL_EXPANDABLE_STEELWALL_ANY) - MauerAblegerStahl(x, y); + CheckWallGrowing(x, y); else if (element == EL_FLAMES) CheckForDragon(x, y); else if (element == EL_EXPLOSION) @@ -14430,9 +14380,13 @@ static int DigField(struct PlayerInfo *player, } else if (element == EL_SHIELD_NORMAL || element == EL_SHIELD_DEADLY) { - player->shield_normal_time_left += level.shield_normal_time; + int shield_time = (element == EL_SHIELD_DEADLY ? + level.shield_deadly_time : + level.shield_normal_time); + + player->shield_normal_time_left += shield_time; if (element == EL_SHIELD_DEADLY) - player->shield_deadly_time_left += level.shield_deadly_time; + player->shield_deadly_time_left += shield_time; } else if (element == EL_DYNAMITE || element == EL_EM_DYNAMITE ||