X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=2308c32b0e8bef612aeca72b5a9264c438c51fd2;hp=f0e9e20c792a4706e5ecd5f2a06c5c73181a88c7;hb=d18eaeed7b265b71d147e9dfcd0a4ba3348e22f8;hpb=2fe72b13a82860dfcffd9eb1eded086734023715 diff --git a/src/game.c b/src/game.c index f0e9e20c..2308c32b 100644 --- a/src/game.c +++ b/src/game.c @@ -1683,28 +1683,28 @@ int GetElementFromGroupElement(int element) return element; } -static void IncrementPlayerSokobanFieldsNeeded(struct PlayerInfo *player) +static void IncrementSokobanFieldsNeeded(void) { if (level.sb_fields_needed) - player->sokoban_fields_still_needed++; + game.sokoban_fields_still_needed++; } -static void IncrementPlayerSokobanObjectsNeeded(struct PlayerInfo *player) +static void IncrementSokobanObjectsNeeded(void) { if (level.sb_objects_needed) - player->sokoban_objects_still_needed++; + game.sokoban_objects_still_needed++; } -static void DecrementPlayerSokobanFieldsNeeded(struct PlayerInfo *player) +static void DecrementSokobanFieldsNeeded(void) { - if (player->sokoban_fields_still_needed > 0) - player->sokoban_fields_still_needed--; + if (game.sokoban_fields_still_needed > 0) + game.sokoban_fields_still_needed--; } -static void DecrementPlayerSokobanObjectsNeeded(struct PlayerInfo *player) +static void DecrementSokobanObjectsNeeded(void) { - if (player->sokoban_objects_still_needed > 0) - player->sokoban_objects_still_needed--; + if (game.sokoban_objects_still_needed > 0) + game.sokoban_objects_still_needed--; } static void InitPlayerField(int x, int y, int element, boolean init_game) @@ -1816,11 +1816,11 @@ static void InitField(int x, int y, boolean init_game) break; case EL_SOKOBAN_FIELD_EMPTY: - IncrementPlayerSokobanFieldsNeeded(local_player); + IncrementSokobanFieldsNeeded(); break; case EL_SOKOBAN_OBJECT: - IncrementPlayerSokobanObjectsNeeded(local_player); + IncrementSokobanObjectsNeeded(); break; case EL_STONEBLOCK: @@ -1905,11 +1905,11 @@ static void InitField(int x, int y, boolean init_game) break; case EL_LAMP: - local_player->lights_still_needed++; + game.lights_still_needed++; break; case EL_PENGUIN: - local_player->friends_still_needed++; + game.friends_still_needed++; break; case EL_PIG: @@ -2231,7 +2231,7 @@ static void UpdateGameControlValues(void) level.native_sp_level->game_sp->infotrons_still_needed : level.game_engine_type == GAME_ENGINE_TYPE_MM ? game_mm.kettles_still_needed : - local_player->gems_still_needed); + game.gems_still_needed); int exit_closed = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? level.native_em_level->lev->required > 0 : level.game_engine_type == GAME_ENGINE_TYPE_SP ? @@ -2239,10 +2239,10 @@ static void UpdateGameControlValues(void) level.game_engine_type == GAME_ENGINE_TYPE_MM ? game_mm.kettles_still_needed > 0 || game_mm.lights_still_needed > 0 : - local_player->gems_still_needed > 0 || - local_player->sokoban_fields_still_needed > 0 || - local_player->sokoban_objects_still_needed > 0 || - local_player->lights_still_needed > 0); + game.gems_still_needed > 0 || + game.sokoban_fields_still_needed > 0 || + game.sokoban_objects_still_needed > 0 || + game.lights_still_needed > 0); int health = (game.LevelSolved ? game.LevelSolved_CountingHealth : level.game_engine_type == GAME_ENGINE_TYPE_MM ? @@ -2407,12 +2407,12 @@ static void UpdateGameControlValues(void) (local_player->dynabomb_xl ? EL_DYNABOMB_INCREASE_POWER : EL_EMPTY); game_panel_controls[GAME_PANEL_PENGUINS].value = - local_player->friends_still_needed; + game.friends_still_needed; game_panel_controls[GAME_PANEL_SOKOBAN_OBJECTS].value = - local_player->sokoban_objects_still_needed; + game.sokoban_objects_still_needed; game_panel_controls[GAME_PANEL_SOKOBAN_FIELDS].value = - local_player->sokoban_fields_still_needed; + game.sokoban_fields_still_needed; game_panel_controls[GAME_PANEL_ROBOT_WHEEL].value = (game.robot_wheel_active ? EL_ROBOT_WHEEL_ACTIVE : EL_ROBOT_WHEEL); @@ -3396,6 +3396,7 @@ void InitGame(void) player->killed = FALSE; player->reanimated = FALSE; + player->buried = FALSE; player->action = 0; player->effective_action = 0; @@ -3417,13 +3418,6 @@ void InitGame(void) player->health = MAX_HEALTH; player->health_final = MAX_HEALTH; - player->gems_still_needed = level.gems_needed; - player->sokoban_fields_still_needed = 0; - player->sokoban_objects_still_needed = 0; - player->lights_still_needed = 0; - player->players_still_needed = 0; - player->friends_still_needed = 0; - for (j = 0; j < MAX_NUM_KEYS; j++) player->key[j] = FALSE; @@ -3546,8 +3540,6 @@ void InitGame(void) DigField(player, 0, 0, 0, 0, 0, 0, DF_NO_PUSH); SnapField(player, 0, 0); - player->GameOver = FALSE; - map_player_action[i] = i; } @@ -3575,6 +3567,7 @@ void InitGame(void) AllPlayersGone = FALSE; game.LevelSolved = FALSE; + game.GameOver = FALSE; game.LevelSolved_GameWon = FALSE; game.LevelSolved_GameEnd = FALSE; @@ -3598,6 +3591,13 @@ void InitGame(void) game.switchgate_pos = 0; game.wind_direction = level.wind_direction_initial; + game.gems_still_needed = level.gems_needed; + game.sokoban_fields_still_needed = 0; + game.sokoban_objects_still_needed = 0; + game.lights_still_needed = 0; + game.players_still_needed = 0; + game.friends_still_needed = 0; + game.lenses_time_left = 0; game.magnify_time_left = 0; @@ -3985,10 +3985,10 @@ void InitGame(void) for (i = 0; i < MAX_PLAYERS; i++) if (stored_player[i].active) - local_player->players_still_needed++; + game.players_still_needed++; if (level.solved_by_one_player) - local_player->players_still_needed = 1; + game.players_still_needed = 1; // when recording the game, store which players take part in the game if (tape.recording) @@ -4457,15 +4457,14 @@ void InitAmoebaNr(int x, int y) AmoebaCnt2[group_nr]++; } -static void PlayerWins(void) +static void LevelSolved(void) { if (level.game_engine_type == GAME_ENGINE_TYPE_RND && - local_player->players_still_needed > 0) + game.players_still_needed > 0) return; game.LevelSolved = TRUE; - - local_player->GameOver = TRUE; + game.GameOver = TRUE; local_player->score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ? level.native_em_level->lev->score : @@ -5304,7 +5303,7 @@ static void RelocatePlayer(int jx, int jy, int el_player_raw) int enter_side = enter_side_horiz | enter_side_vert; int leave_side = leave_side_horiz | leave_side_vert; - if (player->GameOver) // do not reanimate dead player + if (player->buried) // do not reanimate dead player return; if (!player_relocated) // no need to relocate the player @@ -7949,10 +7948,10 @@ static void StartMoving(int x, int y) if (IN_SCR_FIELD(SCREENX(newx), SCREENY(newy))) DrawGraphicThruMask(SCREENX(newx),SCREENY(newy), el2img(element), 0); - local_player->friends_still_needed--; - if (!local_player->friends_still_needed && - !local_player->GameOver && AllPlayersGone) - PlayerWins(); + game.friends_still_needed--; + if (!game.friends_still_needed && + !game.GameOver && AllPlayersGone) + LevelSolved(); return; } @@ -9083,10 +9082,10 @@ static void ActivateMagicBall(int bx, int by) static void CheckExit(int x, int y) { - if (local_player->gems_still_needed > 0 || - local_player->sokoban_fields_still_needed > 0 || - local_player->sokoban_objects_still_needed > 0 || - local_player->lights_still_needed > 0) + if (game.gems_still_needed > 0 || + game.sokoban_fields_still_needed > 0 || + game.sokoban_objects_still_needed > 0 || + game.lights_still_needed > 0) { int element = Feld[x][y]; int graphic = el2img(element); @@ -9107,10 +9106,10 @@ static void CheckExit(int x, int y) static void CheckExitEM(int x, int y) { - if (local_player->gems_still_needed > 0 || - local_player->sokoban_fields_still_needed > 0 || - local_player->sokoban_objects_still_needed > 0 || - local_player->lights_still_needed > 0) + if (game.gems_still_needed > 0 || + game.sokoban_fields_still_needed > 0 || + game.sokoban_objects_still_needed > 0 || + game.lights_still_needed > 0) { int element = Feld[x][y]; int graphic = el2img(element); @@ -9131,10 +9130,10 @@ static void CheckExitEM(int x, int y) static void CheckExitSteel(int x, int y) { - if (local_player->gems_still_needed > 0 || - local_player->sokoban_fields_still_needed > 0 || - local_player->sokoban_objects_still_needed > 0 || - local_player->lights_still_needed > 0) + if (game.gems_still_needed > 0 || + game.sokoban_fields_still_needed > 0 || + game.sokoban_objects_still_needed > 0 || + game.lights_still_needed > 0) { int element = Feld[x][y]; int graphic = el2img(element); @@ -9155,10 +9154,10 @@ static void CheckExitSteel(int x, int y) static void CheckExitSteelEM(int x, int y) { - if (local_player->gems_still_needed > 0 || - local_player->sokoban_fields_still_needed > 0 || - local_player->sokoban_objects_still_needed > 0 || - local_player->lights_still_needed > 0) + if (game.gems_still_needed > 0 || + game.sokoban_fields_still_needed > 0 || + game.sokoban_objects_still_needed > 0 || + game.lights_still_needed > 0) { int element = Feld[x][y]; int graphic = el2img(element); @@ -9179,7 +9178,7 @@ static void CheckExitSteelEM(int x, int y) static void CheckExitSP(int x, int y) { - if (local_player->gems_still_needed > 0) + if (game.gems_still_needed > 0) { int element = Feld[x][y]; int graphic = el2img(element); @@ -9706,7 +9705,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) action_arg == CA_ARG_NUMBER_CE_SCORE ? ei->collect_score : action_arg == CA_ARG_NUMBER_CE_DELAY ? GET_CE_DELAY_VALUE(change) : action_arg == CA_ARG_NUMBER_LEVEL_TIME ? level_time_value : - action_arg == CA_ARG_NUMBER_LEVEL_GEMS ? local_player->gems_still_needed : + action_arg == CA_ARG_NUMBER_LEVEL_GEMS ? game.gems_still_needed : action_arg == CA_ARG_NUMBER_LEVEL_SCORE ? local_player->score : action_arg == CA_ARG_ELEMENT_CV_TARGET ? GET_NEW_CE_VALUE(target_element): action_arg == CA_ARG_ELEMENT_CV_TRIGGER ? change->actual_trigger_ce_value: @@ -9720,7 +9719,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) -1); int action_arg_number_old = - (action_type == CA_SET_LEVEL_GEMS ? local_player->gems_still_needed : + (action_type == CA_SET_LEVEL_GEMS ? game.gems_still_needed : action_type == CA_SET_LEVEL_TIME ? TimeLeft : action_type == CA_SET_LEVEL_SCORE ? local_player->score : action_type == CA_SET_CE_VALUE ? CustomValue[x][y] : @@ -9803,12 +9802,11 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) case CA_SET_LEVEL_GEMS: { - local_player->gems_still_needed = action_arg_number_new; + game.gems_still_needed = action_arg_number_new; game.snapshot.collected_item = TRUE; - game_panel_controls[GAME_PANEL_GEMS].value = - local_player->gems_still_needed; + game_panel_controls[GAME_PANEL_GEMS].value = game.gems_still_needed; DisplayGameControlValues(); @@ -9849,7 +9847,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) ExitPlayer(&stored_player[i]); if (AllPlayersGone) - PlayerWins(); + LevelSolved(); break; } @@ -11121,7 +11119,7 @@ static void CheckLevelSolved(void) if (game_em.level_solved && !game_em.game_over) // game won { - PlayerWins(); + LevelSolved(); game_em.game_over = TRUE; @@ -11136,7 +11134,7 @@ static void CheckLevelSolved(void) if (game_sp.level_solved && !game_sp.game_over) // game won { - PlayerWins(); + LevelSolved(); game_sp.game_over = TRUE; @@ -11151,7 +11149,7 @@ static void CheckLevelSolved(void) if (game_mm.level_solved && !game_mm.game_over) // game won { - PlayerWins(); + LevelSolved(); game_mm.game_over = TRUE; @@ -12675,10 +12673,10 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) { ExitPlayer(player); - if ((local_player->friends_still_needed == 0 || + if ((game.friends_still_needed == 0 || IS_SP_ELEMENT(Feld[jx][jy])) && AllPlayersGone) - PlayerWins(); + LevelSolved(); } // this breaks one level: "machine", level 000 @@ -13405,8 +13403,10 @@ void BuryPlayer(struct PlayerInfo *player) PlayLevelSoundElementAction(jx, jy, player->artwork_element, ACTION_DYING); PlayLevelSound(jx, jy, SND_GAME_LOSING); - player->GameOver = TRUE; RemovePlayer(player); + + player->buried = TRUE; + game.GameOver = TRUE; } void RemovePlayer(struct PlayerInfo *player) @@ -13439,11 +13439,11 @@ void ExitPlayer(struct PlayerInfo *player) DrawPlayer(player); // needed here only to cleanup last field RemovePlayer(player); - if (local_player->players_still_needed > 0) - local_player->players_still_needed--; + if (game.players_still_needed > 0) + game.players_still_needed--; // also set if some players not yet gone, but not needed to solve level - if (local_player->players_still_needed == 0) + if (game.players_still_needed == 0) AllPlayersGone = TRUE; } @@ -13854,13 +13854,13 @@ static int DigField(struct PlayerInfo *player, } else if (collect_count > 0) { - local_player->gems_still_needed -= collect_count; - if (local_player->gems_still_needed < 0) - local_player->gems_still_needed = 0; + game.gems_still_needed -= collect_count; + if (game.gems_still_needed < 0) + game.gems_still_needed = 0; game.snapshot.collected_item = TRUE; - game_panel_controls[GAME_PANEL_GEMS].value = local_player->gems_still_needed; + game_panel_controls[GAME_PANEL_GEMS].value = game.gems_still_needed; DisplayGameControlValues(); } @@ -13972,16 +13972,16 @@ static int DigField(struct PlayerInfo *player, { Back[x][y] = EL_SOKOBAN_FIELD_EMPTY; - IncrementPlayerSokobanFieldsNeeded(local_player); - IncrementPlayerSokobanObjectsNeeded(local_player); + IncrementSokobanFieldsNeeded(); + IncrementSokobanObjectsNeeded(); } if (Feld[nextx][nexty] == EL_SOKOBAN_FIELD_EMPTY) { Back[nextx][nexty] = EL_SOKOBAN_FIELD_EMPTY; - DecrementPlayerSokobanFieldsNeeded(local_player); - DecrementPlayerSokobanObjectsNeeded(local_player); + DecrementSokobanFieldsNeeded(); + DecrementSokobanObjectsNeeded(); // sokoban object was pushed from empty field to sokoban field if (Back[x][y] == EL_EMPTY) @@ -14000,13 +14000,13 @@ static int DigField(struct PlayerInfo *player, ACTION_FILLING); if (sokoban_task_solved && - local_player->sokoban_fields_still_needed == 0 && - local_player->sokoban_objects_still_needed == 0 && + game.sokoban_fields_still_needed == 0 && + game.sokoban_objects_still_needed == 0 && (game.emulation == EMU_SOKOBAN || level.auto_exit_sokoban)) { - local_player->players_still_needed = 0; + game.players_still_needed = 0; - PlayerWins(); + LevelSolved(); PlayLevelSound(x, y, SND_GAME_SOKOBAN_SOLVING); } @@ -14122,7 +14122,7 @@ static int DigField(struct PlayerInfo *player, else if (element == EL_LAMP) { Feld[x][y] = EL_LAMP_ACTIVE; - local_player->lights_still_needed--; + game.lights_still_needed--; ResetGfxAnimation(x, y); TEST_DrawLevelField(x, y); @@ -15046,7 +15046,7 @@ boolean checkGameFailed(void) else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) return (game_mm.game_over && !game_mm.level_solved); else // GAME_ENGINE_TYPE_RND - return (local_player->GameOver && !game.LevelSolved); + return (game.GameOver && !game.LevelSolved); } boolean checkGameEnded(void)