98 |
private: |
private: |
99 |
// Private types. |
// Private types. |
100 |
enum State { |
enum State { |
101 |
|
LEVELINIT, // initialize level |
102 |
INGAME, // game is currently running |
INGAME, // game is currently running |
103 |
LEVELFINISHED, // level finished; proceed to next one |
LEVELFINISHED, // level finished; proceed to next one |
104 |
PLAYERDEAD, // player is dead; restart level shortly |
PLAYERDEAD, // player is dead; restart level shortly |
105 |
NOMORELIVES, // no player has any lives left, restart |
NOMORELIVES, // no player has any lives left, restart |
106 |
RESTARTGAME, // restart the current (new lives) |
RESTARTGAME, // restart the current (new lives) |
107 |
RELOADLEVEL, // reload current level (resets objects) |
RELOADLEVEL, // reload current level (resets objects) |
108 |
LEVELINFO, // display level info |
LEVELINFO, // display level info |
109 |
ABORT // quit the game immediately |
ABORT // quit the game immediately |
110 |
}; |
}; |
111 |
|
|
112 |
|
|
113 |
// Private methods. |
// Private methods. |
114 |
void handle_events(); |
void handle_events(); |
115 |
void on_keydown(SDL_Event &e); |
void on_keydown(SDL_Event &e); |
412 |
goto try_next; // Skip solved level |
goto try_next; // Skip solved level |
413 |
|
|
414 |
// this level is ok. |
// this level is ok. |
415 |
load_level(next_level); |
change_state(load_level(next_level) ? LEVELINFO : ABORT); |
|
change_state(LEVELINFO); |
|
416 |
} |
} |
417 |
} |
} |
418 |
|
|
423 |
switch (state) { |
switch (state) { |
424 |
case RESTARTGAME: |
case RESTARTGAME: |
425 |
player::NewGame(2); // two virtual players |
player::NewGame(2); // two virtual players |
426 |
if( ! load_level(icurrent_level)) { |
change_state(load_level(icurrent_level) ? LEVELINIT : ABORT); |
|
change_state(ABORT); |
|
|
} else |
|
|
change_state(INGAME); |
|
427 |
break; |
break; |
428 |
|
|
429 |
case PLAYERDEAD: |
case PLAYERDEAD: |
447 |
|
|
448 |
case RELOADLEVEL: |
case RELOADLEVEL: |
449 |
if (current_state_dtime >= 1.0) { |
if (current_state_dtime >= 1.0) { |
450 |
load_level(icurrent_level); |
change_state(load_level(icurrent_level) ? LEVELINIT : ABORT); |
|
change_state(INGAME); |
|
451 |
} else { |
} else { |
452 |
world::Tick(dtime); |
world::Tick(dtime); |
453 |
display::Tick(dtime); |
display::Tick(dtime); |
456 |
} |
} |
457 |
break; |
break; |
458 |
|
|
459 |
case LEVELINFO: |
case LEVELINFO: { |
460 |
// TODO: show level information (name, author, etc.) |
// TODO: show level information (name, author, etc.) |
461 |
change_state(INGAME); |
|
462 |
|
change_state(LEVELINIT); |
463 |
break; |
break; |
464 |
|
} |
465 |
|
case LEVELINIT: { |
466 |
|
const int BUFSIZE = 50; |
467 |
|
LevelInfo *info = level_pack->get_info(icurrent_level); |
468 |
|
char buffer[BUFSIZE+1]; |
469 |
|
|
470 |
|
snprintf(buffer, BUFSIZE, "Enigma - %s ", info->name.c_str()); |
471 |
|
video::SetCaption(buffer); |
472 |
|
|
473 |
|
change_state(INGAME); |
474 |
|
break; |
475 |
|
} |
476 |
case LEVELFINISHED: |
case LEVELFINISHED: |
477 |
if (current_state_dtime <= 2.5) { |
if (current_state_dtime <= 2.5) { |
478 |
handle_events(); |
handle_events(); |
708 |
options::ShowFPS = !options::ShowFPS; |
options::ShowFPS = !options::ShowFPS; |
709 |
break; |
break; |
710 |
case SDLK_l: |
case SDLK_l: |
711 |
load_level(icurrent_level); |
change_state(load_level(icurrent_level) ? LEVELINIT : ABORT); |
712 |
break; |
break; |
713 |
case SDLK_t: |
case SDLK_t: |
714 |
// Darken the current screen; useful for debugging screen updates |
// Darken the current screen; useful for debugging screen updates |
719 |
case SDLK_g: |
case SDLK_g: |
720 |
if (e.key.keysym.mod & KMOD_ALT) { |
if (e.key.keysym.mod & KMOD_ALT) { |
721 |
display::ReloadModels(); |
display::ReloadModels(); |
722 |
load_level(icurrent_level); |
change_state(load_level(icurrent_level) ? LEVELINIT : ABORT); |
723 |
} |
} |
724 |
break; |
break; |
725 |
case SDLK_1: ToggleFlag(display::SHOW_FLOOR); break; |
case SDLK_1: ToggleFlag(display::SHOW_FLOOR); break; |