Improve loading of old levels: Don't quit when background is missing, ignore music...
authorChristoph Sommer <mail@christoph-sommer.de>
Mon, 8 Jan 2007 21:56:21 +0000 (21:56 +0000)
committerChristoph Sommer <mail@christoph-sommer.de>
Mon, 8 Jan 2007 21:56:21 +0000 (21:56 +0000)
SVN-Revision: 4536

src/object/tilemap.cpp
src/object/tilemap.hpp
src/sector.cpp

index 86d66e5..c923d5d 100644 (file)
@@ -257,7 +257,7 @@ TileMap::set(int newwidth, int newheight, const std::vector<unsigned int>&newt,
 }
 
 void
-TileMap::resize(int new_width, int new_height)
+TileMap::resize(int new_width, int new_height, int fill_id)
 {
   if(new_width < width) {
     // remap tiles for new width
@@ -268,14 +268,14 @@ TileMap::resize(int new_width, int new_height)
     }
   }
 
-  tiles.resize(new_width * new_height);
+  tiles.resize(new_width * new_height, fill_id);
 
   if(new_width > width) {
     // remap tiles
     for(int y = std::min(height, new_height)-1; y >= 0; --y) {
       for(int x = new_width-1; x >= 0; --x) {
         if(x >= width) {
-          tiles[y * new_width + x] = 0;
+          tiles[y * new_width + x] = fill_id;
           continue;
         }
 
index 5fc73bb..73c0f57 100644 (file)
@@ -74,7 +74,7 @@ public:
   /** resizes the tilemap to a new width and height (tries to not destroy the
    * existing map)
    */
-  void resize(int newwidth, int newheight);
+  void resize(int newwidth, int newheight, int fill_id = 0);
 
   size_t get_width() const
   { return width; }
index 4380472..7ec7720 100644 (file)
@@ -28,6 +28,7 @@
 #include <float.h>
 #include <math.h>
 #include <limits>
+#include <physfs.h>
 
 #include "sector.hpp"
 #include "object/player.hpp"
@@ -226,8 +227,17 @@ Sector::parse_old_format(const lisp::Lisp& reader)
   reader.get("gravity", gravity);
 
   std::string backgroundimage;
-  reader.get("background", backgroundimage);
-  if (backgroundimage == "arctis2.jpg") backgroundimage = "arctis.jpg";
+  if (reader.get("background", backgroundimage)) {
+    if (backgroundimage == "arctis.png") backgroundimage = "arctis.jpg";
+    if (backgroundimage == "arctis2.jpg") backgroundimage = "arctis.jpg";
+    if (backgroundimage == "ocean.png") backgroundimage = "ocean.jpg";
+    backgroundimage = "images/background/" + backgroundimage;
+    if (!PHYSFS_exists(backgroundimage.c_str())) {
+      log_warning << "Background image \"" << backgroundimage << "\" not found. Ignoring." << std::endl;
+      backgroundimage = "";
+    }
+  }
+
   float bgspeed = .5;
   reader.get("bkgd_speed", bgspeed);
   bgspeed /= 100;
@@ -250,8 +260,7 @@ Sector::parse_old_format(const lisp::Lisp& reader)
 
   if(backgroundimage != "") {
     Background* background = new Background();
-    background->set_image(
-            std::string("images/background/") + backgroundimage, bgspeed);
+    background->set_image(backgroundimage, bgspeed);
     add_object(background);
   } else {
     Gradient* gradient = new Gradient();
@@ -278,7 +287,10 @@ Sector::parse_old_format(const lisp::Lisp& reader)
   spawnpoints.push_back(spawn);
 
   music = "chipdisko.ogg";
+  // skip reading music filename. It's all .ogg now, anyway
+  /*
   reader.get("music", music);
+  */
   music = "music/" + music;
 
   int width = 30, height = 15;
@@ -299,18 +311,24 @@ Sector::parse_old_format(const lisp::Lisp& reader)
       }
     }
 
+    if (height < 19) tilemap->resize(width, 19);
     add_object(tilemap);
   }
 
   if(reader.get_vector("background-tm", tiles)) {
     TileMap* tilemap = new TileMap();
     tilemap->set(width, height, tiles, LAYER_BACKGROUNDTILES, false);
+    if (height < 19) tilemap->resize(width, 19);
     add_object(tilemap);
   }
 
   if(reader.get_vector("foreground-tm", tiles)) {
     TileMap* tilemap = new TileMap();
     tilemap->set(width, height, tiles, LAYER_FOREGROUNDTILES, false);
+    
+    // fill additional space in foreground with tiles of ID 2035 (lightmap/black)
+    if (height < 19) tilemap->resize(width, 19, 2035); 
+
     add_object(tilemap);
   }