X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=d4cc5ea8e0c5572bb737e62cb9202bdad128b344;hb=ef596d6fab46df4658603046b589b3e21bda9bca;hp=2535720ae6a4af3b9ab39825e58b344802e2dce5;hpb=7b08325f1948f30b1099ae5719d036a56cd0c60f;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 2535720a..d4cc5ea8 100644 --- a/src/game.c +++ b/src/game.c @@ -1106,7 +1106,7 @@ void ContinueMoving(int, int); void Bang(int, int); void InitMovDir(int, int); void InitAmoebaNr(int, int); -void NewHighScore(int); +void NewHighScore(int, boolean); void TestIfGoodThingHitsBadThing(int, int, int); void TestIfBadThingHitsGoodThing(int, int, int); @@ -4965,6 +4965,7 @@ void GameEnd(void) { // used instead of "level_nr" (needed for network games) int last_level_nr = levelset.level_nr; + boolean tape_saved = FALSE; game.LevelSolved_GameEnd = TRUE; @@ -4974,7 +4975,8 @@ void GameEnd(void) if (!global.use_envelope_request) CloseDoor(DOOR_CLOSE_1); - SaveTapeChecked_LevelSolved(tape.level_nr); // ask to save tape + // ask to save tape + tape_saved = SaveTapeChecked_LevelSolved(tape.level_nr); // set unique basename for score tape (also saved in high score table) strcpy(tape.score_tape_basename, getScoreTapeBasename(setup.player_name)); @@ -5009,7 +5011,7 @@ void GameEnd(void) } // save score and score tape before potentially erasing tape below - NewHighScore(last_level_nr); + NewHighScore(last_level_nr, tape_saved); if (setup.increment_levels && level_nr < leveldir_current->last_level && @@ -5117,7 +5119,7 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry, return -1; } -void NewHighScore(int level_nr) +void NewHighScore(int level_nr, boolean tape_saved) { struct ScoreEntry new_entry = {{ 0 }}; // (prevent warning from GCC bug 53119) boolean one_per_name = FALSE; @@ -5132,19 +5134,37 @@ void NewHighScore(int level_nr) scores.last_added = addScoreEntry(&scores, &new_entry, one_per_name); - if (scores.last_added >= 0) - { - SaveScore(level_nr); + if (scores.last_added < 0) + return; - // store last added local score entry (before merging server scores) - scores.last_added_local = scores.last_added; - } + SaveScore(level_nr); - if (game.LevelSolved_SaveTape) + // store last added local score entry (before merging server scores) + scores.last_added_local = scores.last_added; + + if (!game.LevelSolved_SaveTape) + return; + + SaveScoreTape(level_nr); + + if (setup.ask_for_using_api_server) { - SaveScoreTape(level_nr); - SaveServerScore(level_nr); + setup.use_api_server = + Request("Upload your score and tape to the high score server?", REQ_ASK); + + if (!setup.use_api_server) + Request("Not using high score server! Use setup menu to enable again!", + REQ_CONFIRM); + + runtime.use_api_server = setup.use_api_server; + + // after asking for using API server once, do not ask again + setup.ask_for_using_api_server = FALSE; + + SaveSetup_ServerSetup(); } + + SaveServerScore(level_nr, tape_saved); } void MergeServerScore(void) @@ -11711,7 +11731,7 @@ static void GameActionsExt(void) Warn("element '%s' caused endless loop in game engine", EL_NAME(recursion_loop_element)); - RequestQuitGameExt(FALSE, level_editor_test_game, message); + RequestQuitGameExt(program.headless, level_editor_test_game, message); recursion_loop_detected = FALSE; // if game should be continued @@ -13968,7 +13988,11 @@ static void TestFieldAfterSnapping(int x, int y, int element, int direction, if (level.finish_dig_collect) { int dig_side = MV_DIR_OPPOSITE(direction); + int change_event = (IS_DIGGABLE(element) ? CE_PLAYER_DIGS_X : + CE_PLAYER_COLLECTS_X); + CheckTriggeredElementChangeByPlayer(x, y, element, change_event, + player_index_bit, dig_side); CheckTriggeredElementChangeByPlayer(x, y, element, CE_PLAYER_SNAPS_X, player_index_bit, dig_side); }