Platform that hurts Tux and Badguys when touched
[supertux.git] / src / object / ambient_sound.cpp
index 3b8093e..6893054 100644 (file)
@@ -1,6 +1,7 @@
-// ambient_sound.cpp   basti_
+//  $Id$
 //
 //  SuperTux
+//  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
 //
 //  This program is free software; you can redistribute it and/or
 //  modify it under the terms of the GNU General Public License
 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 //  GNU General Public License for more details.
-// 
+//
 //  You should have received a copy of the GNU General Public License
 //  along with this program; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-//  02111-1307, USA.
+//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
 #include <config.h>
 
 #include <math.h>
 #include "sector.hpp"
 #include "audio/sound_manager.hpp"
 #include "audio/sound_source.hpp"
+#include "log.hpp"
 
 AmbientSound::AmbientSound(const lisp::Lisp& lisp)
 {
-  position.x=0;
-  position.y=0;
+  position.x = 0;
+  position.y = 0;
 
-  dimension.x=0;
-  dimension.y=0;
+  dimension.x = 0;
+  dimension.y = 0;
 
-  distance_factor=0;
-  distance_bias=0;
-  maximumvolume=1;
-  sample="";
+  distance_factor = 0;
+  distance_bias = 0;
+  maximumvolume = 1;
+  sample = "";
+  currentvolume = 0;
 
   if (!(lisp.get("x", position.x)&&lisp.get("y", position.y))) {
-    std::cerr << "No Position in ambient_sound"  << std::endl;
+    log_warning << "No Position in ambient_sound" << std::endl;
   }
 
   lisp.get("width" , dimension.x);
@@ -131,51 +134,43 @@ AmbientSound::start_playing()
     currentvolume=targetvolume=1e-20;
     sound_source->play();
   } catch(std::exception& e) {
-    std::cerr << "Couldn't play '" << sample << "': " << e.what() << "\n";
+    log_warning << "Couldn't play '" << sample << "': " << e.what() << "" << std::endl;
     delete sound_source;
     sound_source = 0;
+    remove_me();
   }
 }
 
 void
 AmbientSound::update(float deltat) 
-{
-  if (latency--<=0) {
-
+{ 
+  if (latency-- <= 0) {
     float px,py;
     float rx,ry;
 
     // Player position
-
     px=Sector::current()->player->get_pos().x;
     py=Sector::current()->player->get_pos().y;
 
     // Relate to which point in the area
-
     rx=px<position.x?position.x:
       (px<position.x+dimension.x?px:position.x+dimension.x);
     ry=py<position.y?position.y:
       (py<position.y+dimension.y?py:position.y+dimension.y);
 
     // calculate square of distance
-
     float sqrdistance=(px-rx)*(px-rx)+(py-ry)*(py-ry);
-    
     sqrdistance-=distance_bias;
 
     // inside the bias: full volume (distance 0)
-    
     if (sqrdistance<0)
       sqrdistance=0;
     
     // calculate target volume - will never become 0
-
     targetvolume=1/(1+sqrdistance*distance_factor);
-
     float rise=targetvolume/currentvolume;
 
     // rise/fall half life?
-
     currentvolume*=pow(rise,deltat*10);
     currentvolume += 1e-6; // volume is at least 1e-6 (0 would never rise)