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(); |
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; |
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; |
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 |
} |
} |
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 |
//---------------------------------------------------------------------- |
//---------------------------------------------------------------------- |
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 |
|
|
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 |
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; |
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 |
|
|
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 |
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; |
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 |
|
|