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);
{
// used instead of "level_nr" (needed for network games)
int last_level_nr = levelset.level_nr;
+ boolean tape_saved = FALSE;
game.LevelSolved_GameEnd = TRUE;
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));
}
// 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 &&
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;
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)
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
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);
}