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