/[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.8 by dheck, Thu Mar 13 18:07:39 2003 UTC revision 1.9 by dheck, Sun Mar 23 17:27:06 2003 UTC
# Line 38  using namespace std; Line 38  using namespace std;
38  //----------------------------------------  //----------------------------------------
39  namespace  namespace
40  {  {
41    
42        class LevelPack_Enigma : public LevelPack {
43        public:
44            LevelPack_Enigma (const string &initfile, const string &n);
45    
46            // LevelPack interface
47            void reinit();
48    
49            string name() const { return m_name; }
50            size_t size() const { return m_levels.size(); }
51            
52            bool load_level (size_t index)
53            {
54                LevelInfo *levelinfo = get_info(index);
55                return world::Load(levelinfo->filename);
56            }
57            
58            LevelInfo *get_info (size_t index) {
59                return &m_levels[index];
60            };
61        private:
62            // Variables
63            string            m_initfile;
64            string            m_name;
65            vector<LevelInfo> m_levels;
66        };
67    
68    
69    
70      class GameMenu : public gui::Menu {      class GameMenu : public gui::Menu {
71      public:      public:
72          GameMenu();          GameMenu();
# Line 88  namespace Line 117  namespace
117          void show_menu();          void show_menu();
118          void show_help();          void show_help();
119          bool load_level(int ilevel);          bool load_level(int ilevel);
120            void advance_level();
121    
122          // Private variables.          // Private variables.
123          State       state;          State       state;
# Line 249  namespace enigma Line 279  namespace enigma
279  /*  /*
280  ** Read list of levels from this->init_file.  ** Read list of levels from this->init_file.
281  */  */
282    LevelPack_Enigma::LevelPack_Enigma (const string &initfile, const string &n)
283    : m_initfile(initfile), m_name(n)
284    {
285        reinit();
286    }
287    
288  void  void
289  LevelPack::init()  LevelPack_Enigma::reinit()
290  {  {
291      string filename = enigma::FindDataFile(init_file);      string filename = enigma::FindDataFile(m_initfile);
292      ifstream is(filename.c_str());      ifstream is(filename.c_str());
293    
294      if (!is) {      if (!is) {
295          fprintf(stderr, "Couldn't load level pack %s.\n", filename.c_str());          fprintf(stderr, "Couldn't load level pack %s.\n", filename.c_str());
296          return;          return;
297      }      }
298      levels.clear();      m_levels.clear();
299    
300      string line;      string line;
301      vector<string> tokens;      vector<string> tokens;
# Line 268  LevelPack::init() Line 304  LevelPack::init()
304          transform(tokens.begin(), tokens.end(),          transform(tokens.begin(), tokens.end(),
305                    tokens.begin(), trim<string>);                    tokens.begin(), trim<string>);
306          if (tokens.size() == 2)          if (tokens.size() == 2)
307              levels.push_back(LevelInfo(tokens[0], tokens[1], ""));              m_levels.push_back(LevelInfo(tokens[0], tokens[1], ""));
308          tokens.clear();          tokens.clear();
309      }      }
310  }  }
# Line 276  LevelPack::init() Line 312  LevelPack::init()
312  void  void
313  enigma::AddLevelPack (const char *init_file, const char *name)  enigma::AddLevelPack (const char *init_file, const char *name)
314  {  {
315      LevelPack *lp = new LevelPack(init_file, name);      LevelPack *lp = new LevelPack_Enigma (init_file, name);
316      LevelPacks.push_back(lp);      LevelPacks.push_back(lp);
     lp->init();  
317  }  }
318    
319  //----------------------------------------------------------------------  //----------------------------------------------------------------------
# Line 286  enigma::AddLevelPack (const char *init_f Line 321  enigma::AddLevelPack (const char *init_f
321  //----------------------------------------------------------------------  //----------------------------------------------------------------------
322    
323  Game::Game()  Game::Game()
324      : state(INGAME),  : state(INGAME),
325        icurrent_level(0),    icurrent_level(0),
326        last_tick_time(0),    last_tick_time(0),
327        screen (0)    screen (0)
328  {  {
329  }  }
330    
# Line 331  Game::change_state(State newstate) Line 366  Game::change_state(State newstate)
366              display::GetStatusBar()->show_text("Level finished!", display::TEXT_STATIC);              display::GetStatusBar()->show_text("Level finished!", display::TEXT_STATIC);
367              player::LevelFinished(); // remove player-controlled actors              player::LevelFinished(); // remove player-controlled actors
368                            
369              options::SetLevelFinished(level_pack->name,              options::SetLevelFinished
370                                        level_pack->levels[icurrent_level].filename,                  (level_pack->name(),
371                                        DIFFICULTY_HARD);                   level_pack->get_info(icurrent_level)->filename,
372                     DIFFICULTY_HARD);
373          }          }
374          else          else
375              return;             // do not enter state              return;             // do not enter state
# Line 349  Game::change_state(State newstate) Line 385  Game::change_state(State newstate)
385  }  }
386    
387  void  void
388    Game::advance_level()
389    {
390    
391        unsigned next_level = icurrent_level;
392    
393      try_next:
394        next_level++;
395                    
396        if (next_level >= level_pack->size()) {
397            change_state(ABORT);    // no next level in level pack
398        }
399        else {
400            LevelInfo *info = level_pack->get_info(next_level);
401            options::LevelStatus *ls =
402                options::GetLevelStatus(level_pack->name(),
403                                        info->filename);
404            
405            if (info->filename == "todo")
406                goto try_next;     // Skip todo levels
407                    
408            if (options::SkipSolvedLevels && ls && ls->finished)
409                goto try_next;      // Skip solved level
410                        
411            // this level is ok.
412            load_level(next_level);
413            change_state(LEVELINFO);
414        }
415    }
416    
417    void
418  Game::tick(double dtime)  Game::tick(double dtime)
419  {  {
420      current_state_dtime += dtime;      current_state_dtime += dtime;
# Line 405  Game::tick(double dtime) Line 471  Game::tick(double dtime)
471              display::Tick(dtime);              display::Tick(dtime);
472              display::Redraw(screen);              display::Redraw(screen);
473          } else {          } else {
474              unsigned next_level = icurrent_level;              advance_level();
             bool try_next = false;  
             do {        // search for next level  
                 next_level++;  
                 try_next = false;  
                   
                 if( next_level >= level_pack->levels.size())  
                     change_state(ABORT);        // no next level in level pack  
                 else  
                 {  
                     if(level_pack->levels[next_level].filename == "todo")  
                         try_next =  true; // Skip todo levels  
   
                     options::LevelStatus *ls;  
                     if ((ls=options::GetLevelStatus(level_pack->name, level_pack->levels[next_level].filename)))  
                     {  
                         if (ls->finished != 0 && options::SkipSolvedLevels)  
                             try_next = true; // Skip solved level  
                     }  
                       
                     if( ! try_next) // this level is ok.  
                     {  
                         load_level(next_level);  
                         change_state(LEVELINFO);  
                     }  
                 }  
             } while( try_next);  
475          }          }
476          break;          break;
477    
# Line 452  Game::tick(double dtime) Line 492  Game::tick(double dtime)
492  bool  bool
493  Game::load_level(int ilevel)  Game::load_level(int ilevel)
494  {  {
495  //    FX_Fade(video::FADEOUT);      if (level_pack->load_level (ilevel))
496      vector<LevelInfo> &levels = level_pack->levels;      {
497                icurrent_level=ilevel;
     icurrent_level=ilevel;  
     if( ! world::Load(levels[icurrent_level].filename))  
         return false;  
498    
499      display::FocusReferencePoint();          display::FocusReferencePoint();
500    
501      GC gc(video::BackBuffer());          GC gc(video::BackBuffer());
502      display::DrawAll(gc);          display::DrawAll(gc);
503      ShowScreen(video::TM_PUSH_RANDOM, video::BackBuffer());          ShowScreen(video::TM_PUSH_RANDOM, video::BackBuffer());
504  //    FX_Fade(video::FADEIN);          sdl::FlushEvents();
505      sdl::FlushEvents();          update_mouse_button_state();
506      update_mouse_button_state();          last_tick_time = SDL_GetTicks();
507      last_tick_time = SDL_GetTicks();          return true;
508      return true;      }
509        else
510            return false;
511  }  }
512    
513  void  void
# Line 640  Game::on_keydown(SDL_Event &e) Line 679  Game::on_keydown(SDL_Event &e)
679    
680      case SDLK_F10:      case SDLK_F10:
681          {          {
682              string fname = level_pack->levels[icurrent_level].filename + ".bmp";              string fname = level_pack->get_info(icurrent_level)->filename + ".bmp";
683              video::Screenshot(fname.c_str());              video::Screenshot(fname.c_str());
684          }          }
685          break;          break;
# Line 727  int  enigma::Difficulty    = 1; Line 766  int  enigma::Difficulty    = 1;
766  void  void
767  enigma::StartGame (LevelPack *lp, unsigned levelidx)  enigma::StartGame (LevelPack *lp, unsigned levelidx)
768  {  {
769      if (lp->levels[levelidx].filename != "todo")      if (lp->get_info(levelidx)->filename != "todo")
770          game_inst.run (lp, levelidx);          game_inst.run (lp, levelidx);
771  }  }
772    

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

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