#include "worldmap.h"
#include "intro.h"
#include "misc.h"
+#include "camera.h"
GameSession* GameSession::current_ = 0;
last_keys.clear();
-#if 0
- float old_x_pos = -1;
- if (world)
+ Vector tux_pos = Vector(-1,-1);
+ if (currentsector)
{ // Tux has lost a life, so we try to respawn him at the nearest reset point
- old_x_pos = world->get_tux()->base.x;
+ tux_pos = currentsector->player->base;
}
-#endif
delete level;
currentsector = 0;
level->load(levelname);
if(flip_level)
level->do_vertical_flip();
+
currentsector = level->get_sector("main");
if(!currentsector)
Termination::abort("Level has no main sector.", "");
currentsector->activate("main");
-#if 0 // TODO
// Set Tux to the nearest reset point
- if (old_x_pos != -1)
+ if(tux_pos.x != -1)
{
- ResetPoint best_reset_point = { -1, -1 };
- for(std::vector<ResetPoint>::iterator i = get_level()->reset_points.begin();
- i != get_level()->reset_points.end(); ++i)
- {
- if (i->x < old_x_pos && best_reset_point.x < i->x)
- best_reset_point = *i;
- }
-
- if (best_reset_point.x != -1)
- {
- world->get_tux()->base.x = best_reset_point.x;
- world->get_tux()->base.y = best_reset_point.y;
- }
- }
-#endif
+ tux_pos = currentsector->get_best_spawn_point(tux_pos);
+ currentsector->player->base.x = tux_pos.x;
+ currentsector->player->base.y = tux_pos.y;
+ // has to reset camera on swapping
+ currentsector->camera->reset(Vector(currentsector->player->base.x,
+ currentsector->player->base.y));
+ }
+
if (st_gl_mode != ST_GL_DEMO_GAME)
{
if(st_gl_mode == ST_GL_PLAY || st_gl_mode == ST_GL_LOAD_LEVEL_FILE)
}
break;
default:
+ break;
+ }
+ }
+
/* Check if chacrater is ASCII */
char ch[2];
if((event.key.keysym.unicode & 0xFF80) == 0)
tux.invincible_timer.start(time_left.get_left());
last_keys.clear();
}
- break;
- }
- }
+
break;
case SDL_JOYAXISMOTION:
} else if(token == "background") {
background = new Background(reader);
add_object(background);
- } else if(token == "playerspawn") {
+ } else if(token == "spawn-points") {
SpawnPoint* sp = new SpawnPoint;
reader.read_string("name", sp->name);
reader.read_float("x", sp->pos.x);
add_object(tilemap);
}
- // TODO read resetpoints
+ // read reset-points (now spawn-points)
+ {
+ lisp_object_t* cur = 0;
+ if(reader.read_lisp("reset-points", cur)) {
+ while(!lisp_nil_p(cur)) {
+ lisp_object_t* data = lisp_car(cur);
+ LispReader reader(lisp_cdr(data));
+
+ Vector sp_pos;
+ if(reader.read_float("x", sp_pos.x) && reader.read_float("y", sp_pos.y))
+ {
+ SpawnPoint* sp = new SpawnPoint;
+ sp->name = "main";
+ sp->pos = sp_pos;
+ spawnpoints.push_back(sp);
+ }
+
+ cur = lisp_cdr(cur);
+ }
+ }
+ }
// read objects
{
for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end();
++i) {
SpawnPoint* spawn = *i;
- writer.start_list("playerspawn");
+ writer.start_list("spawn-points");
writer.write_string("name", spawn->name);
writer.write_float("x", spawn->pos.x);
writer.write_float("y", spawn->pos.y);
- writer.end_list("playerspawn");
+ writer.end_list("spawn-points");
}
// write objects
camera->reset(Vector(player->base.x, player->base.y));
}
+Vector
+Sector::get_best_spawn_point(Vector pos)
+{
+Vector best_reset_point = Vector(-1,-1);
+
+for(SpawnPoints::iterator i = spawnpoints.begin(); i != spawnpoints.end();
+ ++i) {
+ if((*i)->name != "main")
+ continue;
+ if((*i)->pos.x > best_reset_point.x && (*i)->pos.x < pos.x)
+ best_reset_point = (*i)->pos;
+ }
+
+return best_reset_point;
+}
+
void
Sector::action(float elapsed_time)
{
/// activates this sector (change music, intialize player class, ...)
void activate(const std::string& spawnpoint = "main");
+ /// get best spawn point
+ Vector get_best_spawn_point(Vector pos);
void action(float elapsed_time);
void update_game_objects();