Klaus Denker's widescreen_fixes.patch:
[supertux.git] / src / sector.cpp
index f43170a..c70d606 100644 (file)
@@ -28,6 +28,7 @@
 #include <float.h>
 #include <math.h>
 #include <limits>
+#include <physfs.h>
 
 #include "sector.hpp"
 #include "object/player.hpp"
@@ -66,6 +67,7 @@
 #include "scripting/squirrel_util.hpp"
 #include "script_interface.hpp"
 #include "log.hpp"
+#include "main.hpp"
 
 Sector* Sector::_current = 0;
 
@@ -74,7 +76,7 @@ bool Sector::draw_solids_only = false;
 
 Sector::Sector(Level* parent)
   : level(parent), currentmusic(LEVEL_MUSIC),
-  ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), gravity(10), player(0), camera(0) 
+  ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), gravity(10.0), player(0), camera(0) 
 {
   add_object(new Player(player_status, "Tux"));
   add_object(new DisplayEffect("Effect"));
@@ -226,7 +228,17 @@ Sector::parse_old_format(const lisp::Lisp& reader)
   reader.get("gravity", gravity);
 
   std::string backgroundimage;
-  reader.get("background", backgroundimage);
+  if (reader.get("background", backgroundimage) && (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;
@@ -249,8 +261,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();
@@ -277,7 +288,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;
@@ -289,18 +303,33 @@ Sector::parse_old_format(const lisp::Lisp& reader)
       || reader.get_vector("tilemap", tiles)) {
     TileMap* tilemap = new TileMap();
     tilemap->set(width, height, tiles, LAYER_TILES, true);
+
+    // replace tile id 112 (old invisible tile) with 1311 (new invisible tile)
+    for(size_t x=0; x < tilemap->get_width(); ++x) {
+      for(size_t y=0; y < tilemap->get_height(); ++y) {
+        const Tile* tile = tilemap->get_tile(x, y);
+        if(tile->getID() == 112) tilemap->change(x, y, 1311);
+      }
+    }
+
+    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);
   }
 
@@ -355,7 +384,6 @@ Sector::fix_old_tiles()
 {
   for(std::list<TileMap*>::iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
     TileMap* solids = *i;
-
     for(size_t x=0; x < solids->get_width(); ++x) {
       for(size_t y=0; y < solids->get_height(); ++y) {
        const Tile* tile = solids->get_tile(x, y);
@@ -603,31 +631,7 @@ Sector::get_active_region()
 {
   return Rect(
     camera->get_translation() - Vector(1600, 1200),
-    camera->get_translation() + Vector(1600, 1200));
-}
-
-namespace {
-  bool is_tilemap_solid(const TileMap* tm) { return tm->is_solid(); }
-  bool is_tilemap_nonsolid(const TileMap* tm) { return !tm->is_solid(); }
-}
-
-void
-Sector::update_solid_tilemap_list()
-{
-
-  // remove non-solid tilemaps from list
-  solid_tilemaps.erase(std::remove_if(solid_tilemaps.begin(), solid_tilemaps.end(), is_tilemap_nonsolid), solid_tilemaps.end());
-  
-  // if tilemaps are to be added, create new list of solid tilemaps
-  if (solid_tilemaps.size() != (unsigned int)std::count_if(tilemaps.begin(), tilemaps.end(), is_tilemap_solid)) {
-    log_debug << "Found new solid tilemaps - this is eeevil! Re-creating list of solid tilemaps." << std::endl;
-    solid_tilemaps.clear();
-    for(std::list<TileMap*>::iterator i = tilemaps.begin(); i != tilemaps.end(); i++) {
-      TileMap* tm = *i;
-      if (tm->is_solid()) solid_tilemaps.push_back(tm);
-    }
-  }
-
+    camera->get_translation() + Vector(1600, 1200) + Vector(SCREEN_WIDTH,SCREEN_HEIGHT));
 }
 
 void
@@ -635,9 +639,6 @@ Sector::update(float elapsed_time)
 {
   player->check_bounds(camera);
 
-  // update solid_tilemaps list
-  update_solid_tilemap_list();
-
   /* update objects */
   for(GameObjects::iterator i = gameobjects.begin();
           i != gameobjects.end(); ++i) {
@@ -704,9 +705,8 @@ Sector::before_object_add(GameObject* object)
   }
 
   TileMap* tilemap = dynamic_cast<TileMap*> (object);
-  if(tilemap != NULL) {
-    tilemaps.push_back(tilemap);
-    if (tilemap->is_solid()) solid_tilemaps.push_back(tilemap);
+  if(tilemap != NULL && tilemap->is_solid()) {
+    solid_tilemaps.push_back(tilemap);
   }
 
   Camera* camera = dynamic_cast<Camera*> (object);
@@ -727,6 +727,13 @@ Sector::before_object_add(GameObject* object)
     this->player = player;
   }
 
+  UsesPhysic *physic_object = dynamic_cast<UsesPhysic *>(object);
+  if(physic_object)
+  {
+    physic_object->physic.set_gravity(gravity);
+  }
+
+
   if(_current == this) {
     try_expose(object);
   }
@@ -763,11 +770,6 @@ Sector::before_object_remove(GameObject* object)
   if(portable != NULL) {
     portables.erase(std::find(portables.begin(), portables.end(), portable));
   }
-  TileMap* tilemap = dynamic_cast<TileMap*> (object);
-  if(tilemap != NULL) {
-    tilemaps.erase(std::find(tilemaps.begin(), tilemaps.end(), tilemap));
-    if (tilemap->is_solid()) solid_tilemaps.erase(std::find(solid_tilemaps.begin(), solid_tilemaps.end(), tilemap));
-  }
   Bullet* bullet = dynamic_cast<Bullet*> (object);
   if(bullet != NULL) {
     bullets.erase(std::find(bullets.begin(), bullets.end(), bullet));
@@ -1432,7 +1434,6 @@ Sector::inside(const Rect& rect) const
 {
   for(std::list<TileMap*>::const_iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
     TileMap* solids = *i;
-
     bool horizontally = ((rect.p2.x >= 0 + solids->get_x_offset()) && (rect.p1.x <= solids->get_width() * 32 + solids->get_x_offset()));
     bool vertically = (rect.p1.y <= solids->get_height() * 32 + solids->get_y_offset());
     if (horizontally && vertically) return true;
@@ -1446,7 +1447,6 @@ Sector::get_width() const
   float width = 0;
   for(std::list<TileMap*>::const_iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
     TileMap* solids = *i;
-
     if ((solids->get_width() * 32 + solids->get_x_offset()) > width) width = (solids->get_width() * 32 + solids->get_x_offset());
   }
   return width;
@@ -1458,7 +1458,6 @@ Sector::get_height() const
   float height = 0;
   for(std::list<TileMap*>::const_iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
     TileMap* solids = *i;
-
     if ((solids->get_height() * 32 + solids->get_y_offset()) > height) height = (solids->get_height() * 32 + solids->get_y_offset());
   }
   return height;
@@ -1469,7 +1468,6 @@ Sector::change_solid_tiles(uint32_t old_tile_id, uint32_t new_tile_id)
 {
   for(std::list<TileMap*>::const_iterator i = solid_tilemaps.begin(); i != solid_tilemaps.end(); i++) {
     TileMap* solids = *i;
-
     solids->change_all(old_tile_id, new_tile_id);
   }
 }