Spawn points should now be working!
authorRicardo Cruz <rick2@aeiou.pt>
Mon, 13 Sep 2004 18:50:46 +0000 (18:50 +0000)
committerRicardo Cruz <rick2@aeiou.pt>
Mon, 13 Sep 2004 18:50:46 +0000 (18:50 +0000)
SVN-Revision: 1900

src/gameloop.cpp
src/sector.cpp
src/sector.h

index 5a85fa1..62e0d7f 100644 (file)
@@ -60,6 +60,7 @@
 #include "worldmap.h"
 #include "intro.h"
 #include "misc.h"
+#include "camera.h"
 
 GameSession* GameSession::current_ = 0;
 
@@ -110,13 +111,11 @@ GameSession::restart_level()
 
   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;
@@ -125,31 +124,24 @@ GameSession::restart_level()
   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)
@@ -377,6 +369,10 @@ GameSession::process_events()
                           }
                         break;
                       default:
+                        break;
+                      }
+                  }
+
                         /* Check if chacrater is ASCII */
                         char ch[2];
                         if((event.key.keysym.unicode & 0xFF80) == 0)
@@ -420,9 +416,7 @@ GameSession::process_events()
                           tux.invincible_timer.start(time_left.get_left());
                           last_keys.clear();
                           }
-                        break;
-                      }
-                  }
+
                   break;
 
                 case SDL_JOYAXISMOTION:
index c31dda2..9064af7 100644 (file)
@@ -96,7 +96,7 @@ Sector::parse(LispReader& lispreader)
     } 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);
@@ -228,7 +228,27 @@ Sector::parse_old_format(LispReader& reader)
     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
   {
@@ -272,11 +292,11 @@ Sector::write(LispWriter& writer)
   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
@@ -363,6 +383,22 @@ Sector::activate(const std::string& spawnpoint)
   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)
 {
index 1b186ef..e9c1206 100644 (file)
@@ -72,6 +72,8 @@ public:
 
   /// 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();