337 |
|
|
338 |
{ |
{ |
339 |
bool skip_solved = mode == 2 || (mode == 0 && options::SkipSolvedLevels); |
bool skip_solved = mode == 2 || (mode == 0 && options::SkipSolvedLevels); |
340 |
unsigned next_level = NextLevel(level_pack, icurrent_level, skip_solved, true); |
unsigned next_level = NextLevel(level_pack, icurrent_level, HighestAvailableLevel(level_pack), skip_solved, true); |
341 |
|
|
342 |
if (next_level) { |
if (next_level) { |
343 |
change_state(load_level(next_level) ? LEVELINFO : ABORT); |
change_state(load_level(next_level) ? LEVELINFO : ABORT); |
824 |
} |
} |
825 |
|
|
826 |
unsigned |
unsigned |
827 |
enigma::NextLevel(LevelPack *lp, unsigned levelidx, bool skip_solved, bool skip_todo_and_unnamed) { |
enigma::NextLevel(LevelPack *lp, unsigned levelidx, unsigned max_available, bool skip_solved, bool skip_todo_and_unnamed) { |
828 |
// returns 0 if none found |
// returns 0 if none found |
|
|
|
829 |
unsigned found = 0; |
unsigned found = 0; |
830 |
unsigned size = lp->size(); |
unsigned size = lp->size(); |
831 |
|
|
832 |
while (!found) { |
while (!found) { |
833 |
++levelidx; |
++levelidx; |
834 |
if (levelidx >= size || levelidx >= HighestAvailableLevel( lp)) |
if (levelidx >= size) |
835 |
break; |
break; // none found |
836 |
|
|
837 |
const LevelInfo *info = lp->get_info(levelidx); |
const LevelInfo *info = lp->get_info(levelidx); |
838 |
|
|
847 |
} |
} |
848 |
} |
} |
849 |
|
|
850 |
if (skip_solved) { |
bool available = levelidx <= max_available; |
851 |
|
|
852 |
|
if (skip_solved || !available) { |
853 |
options::LevelStatus *ls = options::GetLevelStatus(lp->get_name(), info->filename); |
options::LevelStatus *ls = options::GetLevelStatus(lp->get_name(), info->filename); |
854 |
if (ls && ls->finished >= options::Difficulty) |
if (ls && ls->finished >= options::Difficulty) { // already solved |
855 |
continue; // skip solved |
if (skip_solved) |
856 |
|
continue; // skip solved |
857 |
|
available = true; // otherwise force available |
858 |
|
} |
859 |
} |
} |
860 |
|
|
861 |
found = levelidx; |
if (available) |
862 |
|
found = levelidx; |
863 |
} |
} |
864 |
|
|
865 |
return found; |
return found; |
867 |
|
|
868 |
unsigned |
unsigned |
869 |
enigma::HighestAvailableLevel(LevelPack *lp) { |
enigma::HighestAvailableLevel(LevelPack *lp) { |
870 |
// The player can choose out of 10 unsolved levels |
if( options::WizardMode || // No restriction in WizardMode |
871 |
unsigned max_available = 10; |
lp->get_name() == "TestLevels") // and test-levelpack |
872 |
|
return lp->size()-1; |
873 |
|
|
874 |
if( options::WizardMode) // No restriction in WizardMode |
// Otherwise the player can choose out of 10 unsolved levels |
875 |
return( lp->size()); |
unsigned max_available = 10-1; // level numbers start at 0 |
876 |
|
|
877 |
for( int i = 0; i < lp->size() && i <= max_available; i++) |
for( unsigned i = 0; i < lp->size() && i <= max_available; i++) { |
|
{ |
|
878 |
const LevelInfo *levelinfo = lp->get_info(i); |
const LevelInfo *levelinfo = lp->get_info(i); |
879 |
if (options::LevelStatus *ls=options::GetLevelStatus(lp->get_name(), levelinfo->filename)) |
if (options::LevelStatus *ls=options::GetLevelStatus(lp->get_name(), levelinfo->filename)) { |
|
{ |
|
880 |
if (ls->finished != 0) { |
if (ls->finished != 0) { |
881 |
max_available++; // for each solved level, an additional level is available; |
max_available++; // for each solved level, an additional level is available; |
882 |
} |
} |
883 |
} |
} |
884 |
} |
} |
885 |
return( max_available); |
return max_available; |
886 |
} |
} |
887 |
|
|
888 |
void enigma::FinishLevel() { |
void enigma::FinishLevel() { |