113 |
void show_menu(); |
void show_menu(); |
114 |
void show_help(); |
void show_help(); |
115 |
bool load_level(int ilevel); |
bool load_level(int ilevel); |
116 |
void advance_level(); |
void advance_level(int mode = 0); |
117 |
|
|
118 |
// Private variables. |
// Private variables. |
119 |
State state; |
State state; |
217 |
vector<string> tokens; |
vector<string> tokens; |
218 |
while (getline(is, line)) { |
while (getline(is, line)) { |
219 |
split_copy(line, '|', back_inserter(tokens)); |
split_copy(line, '|', back_inserter(tokens)); |
220 |
transform(tokens.begin(), tokens.end(), |
transform(tokens.begin(), tokens.end(), tokens.begin(), trim<string>); |
221 |
tokens.begin(), trim<string>); |
|
222 |
if (tokens.size() == 2) |
size_t num_tokens = tokens.size(); |
223 |
m_levels.push_back(LevelInfo(tokens[0], tokens[1], "")); |
if (num_tokens>0 && tokens[0].length()>0) { |
224 |
|
switch (num_tokens) { |
225 |
|
case 1: // level name only |
226 |
|
m_levels.push_back(LevelInfo(tokens[0], "", "")); |
227 |
|
break; |
228 |
|
case 2: // level name + long name |
229 |
|
m_levels.push_back(LevelInfo(tokens[0], tokens[1], "")); |
230 |
|
break; |
231 |
|
case 3: // level name + long name + author |
232 |
|
m_levels.push_back(LevelInfo(tokens[0], tokens[1], tokens[2])); |
233 |
|
break; |
234 |
|
} |
235 |
|
} |
236 |
|
|
237 |
tokens.clear(); |
tokens.clear(); |
238 |
} |
} |
239 |
} |
} |
318 |
} |
} |
319 |
|
|
320 |
void |
void |
321 |
Game::advance_level() |
Game::advance_level(int mode) |
322 |
|
// mode == 0 -> advance according to options::SkipSolvedLevels |
323 |
|
// mode == 1 -> advance to next level |
324 |
|
// mode == 2 -> advance to next unsolved level |
325 |
|
|
326 |
{ |
{ |
327 |
unsigned next_level = icurrent_level; |
unsigned next_level = icurrent_level; |
328 |
|
bool skip_solved = mode == 2 || (mode == 0 && options::SkipSolvedLevels); |
329 |
|
|
330 |
try_next: |
try_next: |
331 |
next_level++; |
next_level++; |
340 |
if (info->filename == "todo") |
if (info->filename == "todo") |
341 |
goto try_next; // Skip todo levels |
goto try_next; // Skip todo levels |
342 |
|
|
343 |
if (options::SkipSolvedLevels && ls && ls->finished) |
if (skip_solved && ls && ls->finished) |
344 |
goto try_next; // Skip solved level |
goto try_next; // Skip solved level |
345 |
|
|
346 |
// this level is ok. |
// this level is ok. |
348 |
} |
} |
349 |
} |
} |
350 |
|
|
351 |
|
static string displayedLevelInfo(LevelInfo *info) { |
352 |
|
string displayed; |
353 |
|
|
354 |
|
if (info->name.empty()) displayed = "Another nameless level"; |
355 |
|
else displayed = string("\"")+info->name+"\""; |
356 |
|
|
357 |
|
if (!info->author.empty()) displayed += " by "+info->author; |
358 |
|
|
359 |
|
return displayed; |
360 |
|
} |
361 |
|
|
362 |
void |
void |
363 |
Game::tick(double dtime) |
Game::tick(double dtime) |
364 |
{ |
{ |
404 |
|
|
405 |
case LEVELINFO: { |
case LEVELINFO: { |
406 |
// show level information (name, author, etc.) |
// show level information (name, author, etc.) |
407 |
LevelInfo *info = level_pack->get_info(icurrent_level); |
string disp = displayedLevelInfo(level_pack->get_info(icurrent_level)); |
408 |
int len = info->name.length()+6+info->author.length()+1; |
display::GetStatusBar()->show_text(disp.c_str(), display::TEXT_5SECONDS); |
|
char *buf = new char[len]; |
|
|
|
|
|
if (info->author.empty()) sprintf(buf, "\"%s\"", info->name.c_str()); |
|
|
else sprintf(buf, "\"%s\" by %s", info->name.c_str(), info->author.c_str()); |
|
|
|
|
|
display::GetStatusBar()->show_text(buf); |
|
|
free(buf); |
|
|
|
|
409 |
change_state(LEVELINIT); |
change_state(LEVELINIT); |
410 |
break; |
break; |
411 |
} |
} |
649 |
break; |
break; |
650 |
|
|
651 |
case SDLK_F4: |
case SDLK_F4: |
652 |
advance_level(); |
advance_level(1); // next level (ignores options::SkipSolvedLevels) |
653 |
break; |
break; |
654 |
|
|
655 |
case SDLK_F5: |
case SDLK_F5: |
656 |
{ |
advance_level(2); // next unsolved level |
|
bool oldSkip = options::SkipSolvedLevels; |
|
|
options::SkipSolvedLevels = true; |
|
|
advance_level(); |
|
|
options::SkipSolvedLevels = oldSkip; |
|
|
} |
|
657 |
break; |
break; |
658 |
|
|
659 |
case SDLK_F10: |
case SDLK_F10: |
660 |
{ |
{ |
661 |
string fname = level_pack->get_info(icurrent_level)->filename + ".bmp"; |
string fname = level_pack->get_info(icurrent_level)->filename + ".bmp"; |