/[enigma]/enigma/src/game.cc
ViewVC logotype

Diff of /enigma/src/game.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.42 by mhawlisch, Thu Aug 28 14:12:51 2003 UTC revision 1.43 by reallysoft, Sun Sep 7 09:56:55 2003 UTC
# Line 337  Game::advance_level(int mode) Line 337  Game::advance_level(int mode)
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);
# Line 824  enigma::StartGame (LevelPack *lp, unsign Line 824  enigma::StartGame (LevelPack *lp, unsign
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    
# Line 848  enigma::NextLevel(LevelPack *lp, unsigne Line 847  enigma::NextLevel(LevelPack *lp, unsigne
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;
# Line 862  enigma::NextLevel(LevelPack *lp, unsigne Line 867  enigma::NextLevel(LevelPack *lp, unsigne
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() {

Legend:
Removed from v.1.42  
changed lines
  Added in v.1.43

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26