namespace WorldMapNS {
+Direction reverse_dir(Direction direction)
+{
+ switch(direction)
+ {
+ case WEST:
+ return EAST;
+ case EAST:
+ return WEST;
+ case NORTH:
+ return SOUTH;
+ case SOUTH:
+ return NORTH;
+ case NONE:
+ return NONE;
+ }
+ return NONE;
+}
+
+std::string
+direction_to_string(Direction direction)
+{
+ switch(direction)
+ {
+ case WEST:
+ return "west";
+ case EAST:
+ return "east";
+ case NORTH:
+ return "north";
+ case SOUTH:
+ return "south";
+ default:
+ return "none";
+ }
+}
+
+Direction
+string_to_direction(const std::string& directory)
+{
+ if (directory == "west")
+ return WEST;
+ else if (directory == "east")
+ return EAST;
+ else if (directory == "north")
+ return NORTH;
+ else if (directory == "south")
+ return SOUTH;
+ else
+ return NONE;
+}
+
TileManager* TileManager::instance_ = 0;
TileManager::TileManager()
if (!moving)
{
if (input_direction != NONE)
- { // We got a new direction, so lets start walking when possible
+ {
+ WorldMap::Level* level = worldmap->at_level();
+
+ // We got a new direction, so lets start walking when possible
Point next_tile;
- if (worldmap->path_ok(input_direction, tile_pos, &next_tile))
+ if ((!level || level->solved)
+ && worldmap->path_ok(input_direction, tile_pos, &next_tile))
{
tile_pos = next_tile;
moving = true;
direction = input_direction;
+ back_direction = reverse_dir(direction);
+ }
+ else if (input_direction == back_direction)
+ {
+ std::cout << "Back triggered" << std::endl;
+ moving = true;
+ direction = input_direction;
+ tile_pos = worldmap->get_next_tile(tile_pos, direction);
+ back_direction = reverse_dir(direction);
}
}
}
{ // We reached the next tile, so we check what to do now
offset -= 32;
- if (worldmap->at(tile_pos)->stop)
+ if (worldmap->at(tile_pos)->stop || worldmap->at_level())
{
stop();
}
else
{
+ // Walk automatically to the next tile
Point next_tile;
if (worldmap->path_ok(direction, tile_pos, &next_tile))
{
Level level;
LispReader reader(lisp_cdr(element));
level.solved = false;
+
+ level.north = true;
+ level.east = true;
+ level.south = true;
+ level.west = true;
+
reader.read_string("name", &level.name);
reader.read_int("x", &level.x);
reader.read_int("y", &level.y);
SDL_Event event;
while (SDL_PollEvent(&event))
{
- if(show_menu)
- {
- current_menu->event(event);
- }
- else
+ if(!show_menu && event.key.keysym.sym == SDLK_ESCAPE)
+ Menu::set_current(worldmap_menu);
+
+ current_menu->event(event);
+ if(!show_menu)
{
switch(event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
- case SDLK_ESCAPE:
- Menu::set_current(worldmap_menu);
- show_menu = !show_menu;
- break;
case SDLK_LCTRL:
case SDLK_RETURN:
enter_level = true;
&& p.x < width
&& p.y >= 0
&& p.y < height);
+
return TileManager::instance()->get(tilemap[width * p.y + p.x]);
}
+WorldMap::Level*
+WorldMap::at_level()
+{
+ for(Levels::iterator i = levels.begin(); i != levels.end(); ++i)
+ {
+ if (i->x == tux->get_tile_pos().x &&
+ i->y == tux->get_tile_pos().y)
+ return &*i;
+ }
+
+ return 0;
+}
+
+
void
WorldMap::draw(const Point& offset)
{
for(Levels::iterator i = levels.begin(); i != levels.end(); ++i)
{
- leveldot_green->draw(i->x*32 + offset.x,
- i->y*32 + offset.y);
+ if (i->solved)
+ leveldot_green->draw(i->x*32 + offset.x,
+ i->y*32 + offset.y);
+ else
+ leveldot_red->draw(i->x*32 + offset.x,
+ i->y*32 + offset.y);
}
tux->draw(offset);
void
WorldMap::display()
{
- show_menu = 0;
- menu_reset();
+ show_menu = false;
quit = false;
get_input();
update();
- menu_process_current();
+ if(show_menu)
+ {
+ menu_process_current();
+ mouse_cursor->draw();
+ }
flipscreen();
SDL_Delay(20);
<< " (lives " << player_status.lives << ")\n"
<< " (score " << player_status.score << ")\n"
<< " (distros " << player_status.distros << ")\n"
- << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << "))\n"
+ << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << ")"
+ << " (back \"" << direction_to_string(tux->back_direction) << "\"))\n"
<< " (levels\n";
for(Levels::iterator i = levels.begin(); i != levels.end(); ++i)
{
while(level_cur)
{
- std::string name;
- bool solved = false;
- LispReader level_reader(level_cur);
- level_reader.read_string("name", &name);
- level_reader.read_bool("solved", &solved);
+ lisp_object_t* sym = lisp_car(lisp_car(level_cur));
+ lisp_object_t* data = lisp_cdr(lisp_car(level_cur));
- for(Levels::iterator i = levels.begin(); i != levels.end(); ++i)
+ if (strcmp(lisp_symbol(sym), "level") == 0)
{
- if (name == i->name)
- i->solved = solved;
+ std::string name;
+ bool solved = false;
+ std::string back_str ="";
+ Direction back = NONE;
+
+ LispReader level_reader(data);
+ level_reader.read_string("name", &name);
+ level_reader.read_bool("solved", &solved);
+ if (level_reader.read_string("back", &back_str))
+ back = string_to_direction(back_str);
+
+ std::cout << "Name: " << name << " " << solved << std::endl;
+
+ for(Levels::iterator i = levels.begin(); i != levels.end(); ++i)
+ {
+ if (name == i->name)
+ i->solved = solved;
+ }
}
level_cur = lisp_cdr(level_cur);