New grow and skid sounds from remaxim
[supertux.git] / src / sector.cpp
index 28cb380..6b51f5b 100644 (file)
@@ -48,6 +48,7 @@
 #include "physfs/physfs_stream.hpp"
 #include "audio/sound_manager.hpp"
 #include "game_session.hpp"
+#include "constants.hpp"
 #include "resources.hpp"
 #include "statistics.hpp"
 #include "object_factory.hpp"
@@ -63,6 +64,7 @@
 #include "object/bullet.hpp"
 #include "object/text_object.hpp"
 #include "object/portable.hpp"
+#include "object/display_effect.hpp"
 #include "badguy/jumpy.hpp"
 #include "trigger/sequence_trigger.hpp"
 #include "player_status.hpp"
@@ -79,7 +81,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.0), player(0), camera(0)
+  ambient_light( 1.0f, 1.0f, 1.0f, 1.0f ), gravity(10.0), player(0), camera(0), effect(0)
 {
   add_object(new Player(player_status, "Tux"));
   add_object(new DisplayEffect("Effect"));
@@ -518,7 +520,11 @@ Sector::run_script(std::istream& in, const std::string& sourcename)
   sq_pushobject(vm, sector_table);
   sq_setroottable(vm);
 
-  compile_and_run(vm, in, sourcename);
+  try {
+    compile_and_run(vm, in, "Sector " + name + " - " + sourcename);
+  } catch(std::exception& e) {
+    log_warning << "Error running script: " << e.what() << std::endl;
+  }
 
   return vm;
 }
@@ -619,7 +625,7 @@ Sector::activate(const Vector& player_pos)
   if(PHYSFS_exists((basedir + "/info").c_str())) {
     try {
       IFileStream in(basedir + "/default.nut");
-      run_script(in, std::string("Sector(") + name + ") - default.nut");
+      run_script(in, "default.nut");
     } catch(std::exception& ) {
       // doesn't exist or erroneous; do nothing
     }
@@ -628,7 +634,7 @@ Sector::activate(const Vector& player_pos)
   // Run init script
   if(init_script != "") {
     std::istringstream in(init_script);
-    run_script(in, std::string("Sector(") + name + ") - init");
+    run_script(in, "init-script");
   }
 }
 
@@ -770,6 +776,15 @@ Sector::before_object_add(GameObject* object)
     this->player = player;
   }
 
+  DisplayEffect* effect = dynamic_cast<DisplayEffect*> (object);
+  if(effect != NULL) {
+    if(this->effect != 0) {
+      log_warning << "Multiple DisplayEffects added. Ignoring" << std::endl;
+      return false;
+    }
+    this->effect = effect;
+  }
+
   UsesPhysic *physic_object = dynamic_cast<UsesPhysic *>(object);
   if(physic_object)
   {
@@ -898,8 +913,6 @@ Sector::draw(DrawingContext& context)
  * Collision Detection
  *-------------------------------------------------------------------------*/
 
-static const float SHIFT_DELTA = 7.0f;
-
 /** r1 is supposed to be moving, r2 a solid object */
 void check_collisions(collision::Constraints* constraints,
                       const Vector& movement, const Rect& r1, const Rect& r2,
@@ -948,7 +961,7 @@ void check_collisions(collision::Constraints* constraints,
 
     if(other->get_movement() != Vector(0, 0)) {
       // TODO what todo when we collide with 2 moving objects?!?
-      constraints->ground_movement += other->get_movement();
+      constraints->ground_movement = other->get_movement();
     }
   }
 
@@ -1026,9 +1039,9 @@ Sector::collision_tilemap(collision::Constraints* constraints,
 uint32_t
 Sector::collision_tile_attributes(const Rect& dest) const
 {
-  float x1 = dest.p1.x - SHIFT_DELTA;
-  float y1 = dest.p1.y - SHIFT_DELTA;
-  float x2 = dest.p2.x + SHIFT_DELTA;
+  float x1 = dest.p1.x;
+  float y1 = dest.p1.y;
+  float x2 = dest.p2.x;
   float y2 = dest.p2.y + SHIFT_DELTA;
 
   uint32_t result = 0;
@@ -1387,10 +1400,9 @@ Sector::is_free_of_tiles(const Rect& rect, const bool ignoreUnisolid) const
       Vector p2((x+1)*32 + solids->get_x_offset(), (y+1)*32 + solids->get_y_offset());
       triangle = AATriangle(p1, p2, tile->getData());
       Constraints constraints;
-      return collision::rectangle_aatriangle(&constraints, rect, triangle);
+      if(collision::rectangle_aatriangle(&constraints, rect, triangle) && (!ignoreUnisolid || !(tile->getAttributes() & Tile::UNISOLID))) return false;
     }
-    if((tile->getAttributes() & Tile::SOLID) && !ignoreUnisolid) return false;
-    if((tile->getAttributes() & Tile::SOLID) && !(tile->getAttributes() & Tile::UNISOLID)) return false;
+    if((tile->getAttributes() & Tile::SOLID) && (!ignoreUnisolid || !(tile->getAttributes() & Tile::UNISOLID))) return false;
       }
     }
   }
@@ -1475,7 +1487,7 @@ Sector::play_music(MusicType type)
       sound_manager->play_music(music);
       break;
     case HERRING_MUSIC:
-      sound_manager->play_music("music/invincible.ogg");
+      sound_manager->play_music("music/invincible.music");
       break;
     case HERRING_WARNING_MUSIC:
       sound_manager->stop_music(TUX_INVINCIBLE_TIME_WARNING);
@@ -1589,7 +1601,7 @@ Sector::get_ambient_blue()
 void
 Sector::set_gravity(float gravity)
 {
-  log_warning << "Changing a Sector's gravitational constant might have unforseen side-effects" << std::endl;
+  log_warning << "Changing a Sector's gravitational constant might have unforeseen side-effects" << std::endl;
 
   this->gravity = gravity;