X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=12397d5c4f262cf5367957a8c78e32c06f37f081;hp=4a3d1eef4d4e63bbe088da3b3209f31ce03088ad;hb=99261bc36a147246e39cdc6d5ce9b098257c4d1b;hpb=94437c1c17bca3eb27deba579ce376de0aa49a4f diff --git a/src/game.c b/src/game.c index 4a3d1eef..12397d5c 100644 --- a/src/game.c +++ b/src/game.c @@ -1683,6 +1683,30 @@ int GetElementFromGroupElement(int element) return element; } +static void IncrementPlayerSokobanFieldsNeeded(struct PlayerInfo *player) +{ + if (level.sb_fields_needed) + player->sokoban_fields_still_needed++; +} + +static void IncrementPlayerSokobanObjectsNeeded(struct PlayerInfo *player) +{ + if (level.sb_objects_needed) + player->sokoban_objects_still_needed++; +} + +static void DecrementPlayerSokobanFieldsNeeded(struct PlayerInfo *player) +{ + if (player->sokoban_fields_still_needed > 0) + player->sokoban_fields_still_needed--; +} + +static void DecrementPlayerSokobanObjectsNeeded(struct PlayerInfo *player) +{ + if (player->sokoban_objects_still_needed > 0) + player->sokoban_objects_still_needed--; +} + static void InitPlayerField(int x, int y, int element, boolean init_game) { if (element == EL_SP_MURPHY) @@ -1792,11 +1816,11 @@ static void InitField(int x, int y, boolean init_game) break; case EL_SOKOBAN_FIELD_EMPTY: - local_player->sokoban_fields_still_needed++; + IncrementPlayerSokobanFieldsNeeded(local_player); break; case EL_SOKOBAN_OBJECT: - local_player->sokoban_objects_still_needed++; + IncrementPlayerSokobanObjectsNeeded(local_player); break; case EL_STONEBLOCK: @@ -11093,34 +11117,32 @@ static void CheckLevelSolved(void) { if (level.game_engine_type == GAME_ENGINE_TYPE_EM) { - if (level.native_em_level->lev->home == 0) // all players at home + if (game_em.level_solved && + !game_em.game_over) // game won { PlayerWins(local_player); - AllPlayersGone = TRUE; + game_em.game_over = TRUE; - level.native_em_level->lev->home = -1; + AllPlayersGone = TRUE; } - if (level.native_em_level->ply[0]->alive == 0 && - level.native_em_level->ply[1]->alive == 0 && - level.native_em_level->ply[2]->alive == 0 && - level.native_em_level->ply[3]->alive == 0) // all dead + if (game_em.game_over) // game lost AllPlayersGone = TRUE; } else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) { - if (game_sp.LevelSolved && - !game_sp.GameOver) // game won + if (game_sp.level_solved && + !game_sp.game_over) // game won { PlayerWins(local_player); - game_sp.GameOver = TRUE; + game_sp.game_over = TRUE; AllPlayersGone = TRUE; } - if (game_sp.GameOver) // game lost + if (game_sp.game_over) // game lost AllPlayersGone = TRUE; } else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) @@ -13948,15 +13970,17 @@ static int DigField(struct PlayerInfo *player, if (element == EL_SOKOBAN_FIELD_FULL) { Back[x][y] = EL_SOKOBAN_FIELD_EMPTY; - local_player->sokoban_fields_still_needed++; - local_player->sokoban_objects_still_needed++; + + IncrementPlayerSokobanFieldsNeeded(local_player); + IncrementPlayerSokobanObjectsNeeded(local_player); } if (Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY) { Back[nextx][nexty] = EL_SOKOBAN_FIELD_EMPTY; - local_player->sokoban_fields_still_needed--; - local_player->sokoban_objects_still_needed--; + + DecrementPlayerSokobanFieldsNeeded(local_player); + DecrementPlayerSokobanObjectsNeeded(local_player); // sokoban object was pushed from empty field to sokoban field if (Back[x][y] == EL_EMPTY) @@ -15015,9 +15039,9 @@ boolean checkGameFailed(void) return FALSE; if (level.game_engine_type == GAME_ENGINE_TYPE_EM) - return (level.native_em_level->lev->home > 0); + return (game_em.game_over && !game_em.level_solved); else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) - return (game_sp.GameOver && !game_sp.LevelSolved); + return (game_sp.game_over && !game_sp.level_solved); else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) return (game_mm.game_over && !game_mm.level_solved); else // GAME_ENGINE_TYPE_RND