/[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.22 by reallysoft, Tue May 27 11:08:09 2003 UTC revision 1.23 by reallysoft, Sun Jun 1 18:49:00 2003 UTC
# Line 24  Line 24 
24  #include "video.hh"  #include "video.hh"
25  #include "sound.hh"  #include "sound.hh"
26  #include "help.hh"  #include "help.hh"
27    #include "system.hh"
28    
29  #include "px/sdl.hh"  #include "px/sdl.hh"
30    
# Line 59  namespace Line 60  namespace
60          LevelInfo *get_info (size_t index) {          LevelInfo *get_info (size_t index) {
61              return &m_levels[index];              return &m_levels[index];
62          };          };
63    
64            time_t get_modtime(size_t index) { // filedate of level
65                LevelInfo *levelinfo = get_info(index);
66                string     filename  = enigma::FindDataFile(string("levels/")+levelinfo->filename+".lua");
67                return sysdep::FileModTime(filename);
68            }
69    
70      private:      private:
71          // Variables          // Variables
72          string            m_initfile;          string            m_initfile;
# Line 116  namespace Line 124  namespace
124          void advance_level(int mode = 0);          void advance_level(int mode = 0);
125    
126          // Private variables.          // Private variables.
127          State       state;          State       state;
128          LevelPack  *level_pack;          LevelPack  *level_pack;
129          unsigned    icurrent_level;          unsigned    icurrent_level;
130          Uint32      last_tick_time;          Uint32      last_tick_time;
131          double      actor_dead_dtime;          double      actor_dead_dtime;
132          double      current_state_dtime;          double      current_state_dtime;
133            double      overall_level_time;
134          px::Screen *screen;          px::Screen *screen;
135      };      };
136  }  }
# Line 253  Game::Game() Line 262  Game::Game()
262  : state(INGAME),  : state(INGAME),
263    icurrent_level(0),    icurrent_level(0),
264    last_tick_time(0),    last_tick_time(0),
265      overall_level_time(0),
266    screen (0)    screen (0)
267  {  {
268  }  }
# Line 295  Game::change_state(State newstate) Line 305  Game::change_state(State newstate)
305              display::GetStatusBar()->show_text("Level finished!", display::TEXT_STATIC);              display::GetStatusBar()->show_text("Level finished!", display::TEXT_STATIC);
306              player::LevelFinished(); // remove player-controlled actors              player::LevelFinished(); // remove player-controlled actors
307    
308              options::SetLevelFinished              options::SetLevelTime (level_pack->get_name(),
309                  (level_pack->get_name(),                                     level_pack->get_info(icurrent_level)->filename,
310                   level_pack->get_info(icurrent_level)->filename,                                     Difficulty,
311                   DIFFICULTY_HARD);                                     int(overall_level_time+current_state_dtime+.5));
312    
313              if (options::LevelStatusChanged) {              if (options::LevelStatusChanged) {
314                  options::Save();    // save options (Enigma sometimes crashes when loading next level)                  options::Save();    // save options (Enigma sometimes crashes when loading next level)
# Line 313  Game::change_state(State newstate) Line 323  Game::change_state(State newstate)
323          break;          break;
324      default: break;      default: break;
325      }      }
326    
327      state = newstate;      state = newstate;
328      current_state_dtime = 0;      overall_level_time  += current_state_dtime;
329        current_state_dtime  = 0;
330  }  }
331    
332  void  void
# Line 324  Game::advance_level(int mode) Line 336  Game::advance_level(int mode)
336      // mode == 2 -> advance to next unsolved level      // mode == 2 -> advance to next unsolved level
337    
338  {  {
     unsigned next_level  = icurrent_level;  
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);
341    
342    try_next:      if (next_level) {
343      next_level++;          change_state(load_level(next_level) ? LEVELINFO : ABORT);
   
     if (next_level >= level_pack->size()) {  
         change_state(ABORT);    // no next level in level pack  
344      }      }
345      else {      else {
346          LevelInfo *info = level_pack->get_info(next_level);          change_state(ABORT); // no next level in level pack
         options::LevelStatus *ls = options::GetLevelStatus(level_pack->get_name(),  
                                                            info->filename);  
   
         if (info->filename == "todo")  
             goto try_next;     // Skip todo levels  
   
         if (skip_solved && ls && ls->finished)  
             goto try_next;      // Skip solved level  
   
         // this level is ok.  
         change_state(load_level(next_level) ? LEVELINFO : ABORT);  
347      }      }
348  }  }
349    
# Line 520  Game::run (LevelPack *lp, int ilevel) Line 518  Game::run (LevelPack *lp, int ilevel)
518          sound::StopMusic();          sound::StopMusic();
519      }      }
520    
521      double dtime=0;      double dtime       = 0;
522        state              = STARTGAME;
523        overall_level_time = 0;
524    
     state = STARTGAME;  
 //     state = RESTARTGAME;  
525      while (state != ABORT)      while (state != ABORT)
526      {      {
527          last_tick_time=SDL_GetTicks();          last_tick_time=SDL_GetTicks();
# Line 795  enigma::StartGame (LevelPack *lp, unsign Line 793  enigma::StartGame (LevelPack *lp, unsign
793      return levelidx;      return levelidx;
794  }  }
795    
796    unsigned
797    enigma::NextLevel(LevelPack *lp, unsigned levelidx, bool skip_solved, bool skip_todo_and_unnamed) {
798        // returns 0 if none found
799    
800        unsigned found = 0;
801        unsigned size  = lp->size();
802    
803        while (!found) {
804            ++levelidx;
805            if (levelidx >= size)
806                break;
807    
808            LevelInfo *info = lp->get_info(levelidx);
809    
810            if (skip_todo_and_unnamed && (info->filename == "todo" || info->name == ""))
811                continue; // skip "todo" and unnamed levels
812    
813            if (skip_solved) {
814                options::LevelStatus *ls = options::GetLevelStatus(lp->get_name(), info->filename);
815                if (ls && ls->finished >= Difficulty)
816                    continue; // skip solved
817            }
818    
819            found = levelidx;
820        }
821    
822        return found;
823    }
824    
825  void enigma::FinishLevel() {  void enigma::FinishLevel() {
826      game_inst.finish_level();      game_inst.finish_level();

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.23

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