* Add Airship (regular above-ground theme) and Battle (castle/boss theme) music court...
[supertux.git] / src / object / tilemap.cpp
index 1c4e490..a3e11ea 100644 (file)
@@ -44,7 +44,7 @@
 
 TileMap::TileMap(const TileSet *new_tileset)
   : tileset(new_tileset), solid(false), speed_x(1), speed_y(1), width(0),
-    height(0), z_pos(0), x_offset(0), y_offset(0), drawing_effect(NO_EFFECT),
+    height(0), z_pos(0), x_offset(0), y_offset(0), movement(Vector(0,0)), drawing_effect(NO_EFFECT),
     alpha(1.0), current_alpha(1.0), remaining_fade_time(0),
     draw_target(DrawingContext::NORMAL)
 {
@@ -52,7 +52,7 @@ TileMap::TileMap(const TileSet *new_tileset)
 
 TileMap::TileMap(const lisp::Lisp& reader)
   : solid(false), speed_x(1), speed_y(1), width(-1),
-    height(-1), z_pos(0), x_offset(0), y_offset(0), drawing_effect(NO_EFFECT),
+    height(-1), z_pos(0), x_offset(0), y_offset(0), movement(Vector(0,0)), drawing_effect(NO_EFFECT),
     alpha(1.0), current_alpha(1.0), remaining_fade_time(0),
     draw_target(DrawingContext::NORMAL)
 {
@@ -95,22 +95,32 @@ TileMap::TileMap(const lisp::Lisp& reader)
   if(width < 0 || height < 0)
     throw std::runtime_error("Invalid/No width/height specified in tilemap.");
 
-  if(!reader.get_vector("tiles", tiles))
+  if(!reader.get("tiles", tiles))
     throw std::runtime_error("No tiles in tilemap.");
 
   if(int(tiles.size()) != width*height) {
     throw std::runtime_error("wrong number of tiles in tilemap.");
   }
 
-  // make sure all tiles used on the tilemap are loaded
-  for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i)
+  bool empty = true;
+
+  // make sure all tiles used on the tilemap are loaded and tilemap isn't empty
+  for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) {
+    if(*i != 0) {
+      empty = false;
+    }
+
     tileset->get(*i);
+  }
+
+  if(empty)
+    log_info << "Tilemap '" << name << "', z-pos '" << z_pos << "' is empty." << std::endl;
 }
 
 TileMap::TileMap(const TileSet *new_tileset, std::string name, int z_pos,
                  bool solid, size_t width, size_t height)
   : tileset(new_tileset), solid(solid), speed_x(1), speed_y(1), width(0),
-    height(0), z_pos(z_pos), x_offset(0), y_offset(0),
+    height(0), z_pos(z_pos), x_offset(0), y_offset(0), movement(Vector(0,0)),
     drawing_effect(NO_EFFECT), alpha(1.0), current_alpha(1.0),
     remaining_fade_time(0), draw_target(DrawingContext::NORMAL)
 {
@@ -128,14 +138,14 @@ TileMap::write(lisp::Writer& writer)
 {
   writer.start_list("tilemap");
 
-  writer.write_int("z-pos", z_pos);
+  writer.write("z-pos", z_pos);
 
-  writer.write_bool("solid", solid);
-  writer.write_float("speed", speed_x);
-  writer.write_float("speed-y", speed_y);
-  writer.write_int("width", width);
-  writer.write_int("height", height);
-  writer.write_int_vector("tiles", tiles);
+  writer.write("solid", solid);
+  writer.write("speed", speed_x);
+  writer.write("speed-y", speed_y);
+  writer.write("width", width);
+  writer.write("height", height);
+  writer.write("tiles", tiles);
 
   writer.end_list("tilemap");
 }
@@ -157,9 +167,11 @@ TileMap::update(float elapsed_time)
     if ((alpha > 0.75) && (current_alpha > 0.75)) set_solid(true);
   }
 
+  movement = Vector(0,0);
   // if we have a path to follow, follow it
   if (walker.get()) {
     Vector v = walker->advance(elapsed_time);
+    movement = Vector(v.x-get_x_offset(), std::max(0.0f,v.y-get_y_offset()));
     set_x_offset(v.x);
     set_y_offset(v.y);
   }
@@ -180,7 +192,8 @@ TileMap::draw(DrawingContext& context)
 
   float trans_x = roundf(context.get_translation().x);
   float trans_y = roundf(context.get_translation().y);
-  context.set_translation(Vector(trans_x * speed_x, trans_y * speed_y));
+  context.set_translation(Vector(int(trans_x * speed_x),
+                                 int(trans_y * speed_y)));
 
   /** if we don't round here, we'll have a 1 pixel gap on screen sometimes.
    * I have no idea why */