- assert(s == cl->set);
-
- /* if no set, no next level */
- if (s == NULL)
- {
- /* if no set, return */
- lg->next_level = NULL;
- return;
- }
-
- /* On level completed */
- if (lg->state == GAME_GOAL)
- {
- /* Update level scores */
- dirty = level_score_update(lg, player);
-
- /* Complete the level */
- if (lg->mode == MODE_CHALLENGE || lg->mode == MODE_NORMAL)
- {
- /* Complete the level */
- if (!cl->is_completed)
- {
- cl->is_completed = 1;
- s->completed += 1;
- dirty = 1;
- }
- }
- }
-
- /* On goal reached */
- if (lg->state == GAME_GOAL || lg->state == GAME_SPEC)
- {
- /* Identify the following level */
- nl = next_level(ln + lg->state_value);
- if (nl != NULL)
- {
- /* skip bonuses if unlocked in non challenge mode */
- if (nl->is_bonus && nl->is_locked && lg->mode != MODE_CHALLENGE)
- nl = next_normal_level(nl->number);
- }
- else if (lg->mode == MODE_CHALLENGE)
- lg->win = 1;
- }
- else if (cl->is_bonus || lg->mode != MODE_CHALLENGE)
- {
- /* On fail, identify the next level (only in bonus for challenge) */
- nl = next_normal_level(ln);
- /* Next level may be unavailable */
- if (!cl->is_bonus && nl != NULL && nl->is_locked)
- nl = NULL;
- /* Fail a bonus level but win the set! */
- else if (nl == NULL && lg->mode == MODE_CHALLENGE)
- lg->win = 1;
- }
-
- /* Win ! */
- if (lg->win)
- {
- /* update set score */
- set_score_update(lg, player);
- /* unlock all levels */
- set_cheat();
- dirty = 1;
- }
-
- /* unlock the next level if needed */
- if (nl != NULL && nl->is_locked)
- {
- if (lg->mode == MODE_CHALLENGE || lg->mode == MODE_NORMAL)
- {
- lg->unlock = 1;
- nl->is_locked = 0;
- s->locked -= 1;
- dirty = 1;
- }
- else
- nl = NULL;
- }
-
- /* got the next level */
- lg->next_level = nl;
-
- /* Update file */
- if (dirty)
- set_store_hs();