Index: branches/playability/src/world_entities/Makefile.am
===================================================================
--- branches/playability/src/world_entities/Makefile.am	(revision 10106)
+++ branches/playability/src/world_entities/Makefile.am	(revision 10107)
@@ -11,5 +11,5 @@
 						extendable.cc 		power_ups/power_up.cc 		power_ups/param_power_up.cc \
 				power_ups/weapon_power_up.cc 				spawning_point.cc 						effects/explosion.cc 		effects/billboard.cc \
-				effects/trail.cc				elements/glgui_energywidget.cc glgui_energywidget.cc
+				effects/trail.cc				elements/glgui_energywidget.cc elements/glgui_energywidgetvertical.cc
 
 
@@ -19,5 +19,5 @@
 						power_ups/power_up.h 		power_ups/param_power_up.h 		power_ups/weapon_power_up.h \
 						spawning_point.h 						effects/explosion.h 		effects/billboard.h		effects/trail.h \
-										elements/glgui_energywidget.h glgui_energywidget.h
+										elements/glgui_energywidget.h elements/glgui_energywidgetvertical.h
 
 
Index: branches/playability/src/world_entities/effects/trail.cc
===================================================================
--- branches/playability/src/world_entities/effects/trail.cc	(revision 10106)
+++ branches/playability/src/world_entities/effects/trail.cc	(revision 10107)
@@ -174,8 +174,8 @@
   //glMatrixMode(GL_MODELVIEW);
   //glLoadIdentity();
-
-  glEnable( GL_BLEND);
+  /*
+  glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA,GL_ONE);
-  glDisable( GL_ALPHA_TEST);
+  glDisable( GL_ALPHA_TEST);*/
 
   glTranslatef(-this->getAbsCoor().x,-this->getAbsCoor().y,-this->getAbsCoor().z);
@@ -183,5 +183,5 @@
   this->material->select();
 
-  float alphaStep = (trailAlphaMax - trailAlphaMin)/this->sections;
+  //float alphaStep = 1.0 / this->sections;
 
   glBegin(GL_TRIANGLE_STRIP);
@@ -190,6 +190,6 @@
   for( int i = 1; i < this->sections-1; i++)
   {
-    radone  = this->radius * (1.0-i*fact);
-    radzero  = this->radius * (1.0-(i+1)*fact);
+    radone  = this->radius * (1.0-i*fact + 0.2 * (float)rand()/(float)RAND_MAX);
+    radzero  = this->radius * (1.0-(i+1)*fact + 0.2 * (float)rand()/(float)RAND_MAX);
 
     now   =  this->nodeList[i];
@@ -204,6 +204,6 @@
     Q[3]  = now + Vector(0,-radone,0) ;
     
-    glTexCoord2f(0.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[0].x,Q[0].y,Q[0].z);
-	glTexCoord2f(1.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[3].x,Q[3].y,Q[3].z);
+    glTexCoord2f(0.0f, 0.0f); glVertex3f(Q[0].x,Q[0].y,Q[0].z);
+	glTexCoord2f(1.0f, 0.0f); glVertex3f(Q[3].x,Q[3].y,Q[3].z);
 
     if( i == this->sections - 1)
@@ -212,6 +212,6 @@
       Q[1]  = later + Vector(0,radzero,0) ;
       Q[2]  = later + Vector(0,-radzero,0) ;
-      glTexCoord2f(0.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[1].x,Q[1].y,Q[1].z);
-      glTexCoord2f(1.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[2].x,Q[2].y,Q[2].z);
+      glTexCoord2f(0.0f, 1.0f); glVertex3f(Q[1].x,Q[1].y,Q[1].z);
+      glTexCoord2f(1.0f, 1.0f); glVertex3f(Q[2].x,Q[2].y,Q[2].z);
     }
 
@@ -222,6 +222,6 @@
   for( int i = this->sections-1; i > 0; i--)
   {
-    radone  = this->radius * (1.0-i*fact);
-    radzero  = this->radius * (1.0-(i-1)*fact);
+    radone  = this->radius * (1.0-i*fact + 0.2 * (float)rand()/(float)RAND_MAX);
+    radzero  = this->radius * (1.0-(i-1)*fact + 0.2 * (float)rand()/(float)RAND_MAX);
 
     now   =  this->nodeList[i];
@@ -236,6 +236,6 @@
     Q[3]  = now + Vector(0,-radone,0) ;
 
-	glTexCoord2f(1.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[3].x,Q[3].y,Q[3].z+0.01f);
-	glTexCoord2f(0.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[0].x,Q[0].y,Q[0].z+0.01f);
+	glTexCoord2f(1.0f, 0.0f); glVertex3f(Q[3].x,Q[3].y,Q[3].z+0.01f);
+	glTexCoord2f(0.0f, 0.0f); glVertex3f(Q[0].x,Q[0].y,Q[0].z+0.01f);
 
     if( i == 1)
@@ -243,6 +243,7 @@
         Q[1]  = later + Vector(0,radzero,0) ;
         Q[2]  = later + Vector(0,-radzero,0) ;
-		glTexCoord2f(1.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[2].x,Q[2].y,Q[2].z+0.01f);
-		glTexCoord2f(0.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[1].x,Q[1].y,Q[1].z+0.01f);
+
+		glTexCoord2f(1.0f, 1.0f); glVertex3f(Q[2].x,Q[2].y,Q[2].z+0.01f);
+		glTexCoord2f(0.0f, 1.0f); glVertex3f(Q[1].x,Q[1].y,Q[1].z+0.01f);
 	}
 
@@ -254,6 +255,6 @@
   for( int i = 1; i < this->sections-1; i++)
   {
-    radone  = this->radius * (1.0-i*fact);
-    radzero  = this->radius * (1.0-(i+1)*fact);
+    radone  = this->radius * (1.0-i*fact + 0.2 * (float)rand()/(float)RAND_MAX);
+    radzero  = this->radius * (1.0-(i+1)*fact + 0.2 * (float)rand()/(float)RAND_MAX);
 
     now   =  this->nodeList[i];
@@ -268,6 +269,6 @@
     Q[3]  = now + targ.cross(Vector(0,-radone,0)) ;
     
-	glTexCoord2f(0.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[0].x,Q[0].y,Q[0].z);
-	glTexCoord2f(1.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[3].x,Q[3].y,Q[3].z);
+	glTexCoord2f(0.0f, 0.0f); glVertex3f(Q[0].x,Q[0].y,Q[0].z);
+	glTexCoord2f(1.0f, 0.0f); glVertex3f(Q[3].x,Q[3].y,Q[3].z);
 
     if( i == this->sections-1)
@@ -275,6 +276,6 @@
       Q[1]  = later + targ.cross(Vector(0,radzero,0)) ;
       Q[2]  = later + targ.cross(Vector(0,-radzero,0)) ;
-      glTexCoord2f(0.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[1].x,Q[1].y,Q[1].z);
-      glTexCoord2f(1.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[2].x,Q[2].y,Q[2].z);
+      glTexCoord2f(0.0f, 1.0f); glVertex3f(Q[1].x,Q[1].y,Q[1].z);
+      glTexCoord2f(1.0f, 1.0f); glVertex3f(Q[2].x,Q[2].y,Q[2].z);
     }
 
@@ -285,6 +286,6 @@
   for( int i = this->sections-1; i > 0; i--)
   {
-    radone  = this->radius * (1.0-i*fact);
-    radzero  = this->radius * (1.0-(i-1)*fact);
+    radone  = this->radius * (1.0-i*fact + 0.2 * (float)rand()/(float)RAND_MAX);
+    radzero  = this->radius * (1.0-(i-1)*fact + 0.2 * (float)rand()/(float)RAND_MAX);
 
     now   =  this->nodeList[i];
@@ -299,6 +300,6 @@
     Q[3]  = now + targ.cross(Vector(0,-radone,0)) ;
 
-	glTexCoord2f(0.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[0].x+0.01f,Q[0].y,Q[0].z);
-	glTexCoord2f(1.0f, 0.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[3].x+0.01f,Q[3].y,Q[3].z);
+	glTexCoord2f(0.0f, 0.0f); glVertex3f(Q[0].x+0.01f,Q[0].y,Q[0].z);
+	glTexCoord2f(1.0f, 0.0f); glVertex3f(Q[3].x+0.01f,Q[3].y,Q[3].z);
 
     if( i == 1)
@@ -306,6 +307,7 @@
         Q[1]  = later + targ.cross(Vector(0,radzero,0)) ;
         Q[2]  = later + targ.cross(Vector(0,-radzero,0)) ;
-		glTexCoord2f(0.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[1].x+0.01f,Q[1].y,Q[1].z);
-		glTexCoord2f(1.0f, 1.0f); glColor4f(1,1,1, trailAlphaMax - i * alphaStep); glVertex3f(Q[2].x+0.01f,Q[2].y,Q[2].z);
+
+		glTexCoord2f(0.0f, 1.0f); glVertex3f(Q[1].x+0.01f,Q[1].y,Q[1].z);
+		glTexCoord2f(1.0f, 1.0f); glVertex3f(Q[2].x+0.01f,Q[2].y,Q[2].z);
 	}
 
@@ -316,46 +318,3 @@
   glPopMatrix();
   glPopAttrib();
-/*
-  //glTranslatef(this->getAbsCoor().x, this->getAbsCoor().y, this->getAbsCoor().z);
-  //glTranslatef(0,0,0);
-
-  const PNode* camera = State::getCameraNode();  //!< @todo MUST be different
-  Vector cameraPos = camera->getAbsCoor();
-  Vector cameraTargetPos = State::getCameraTargetNode()->getAbsCoor();
-  Vector view = cameraTargetPos - cameraPos;
-  Vector up = Vector(0, 1, 0);
-  up = camera->getAbsDir().apply(up);
-  Vector h = up.cross(view);
-  Vector v = h.cross(view);
-  h.normalize();
-  v.normalize();
-
-  v *= sizeX;
-  h *= sizeY;
-
-//v += this->getAbsCoor();
-    //PRINTF(0)("sizeX: %f sizeY: %f\n", sizeX, sizeY);
-  glBegin(GL_QUADS);
-  glTexCoord2f(0.0f, 0.0f);
-  glVertex3f(this->getAbsCoor().x - h.x - v.x,
-             this->getAbsCoor().y - h.y - v.y,
-             this->getAbsCoor().z - h.z - v.z);
-  glTexCoord2f(1.0f, 0.0f);
-  glVertex3f( this->getAbsCoor().x + h.x - v.x,
-              this->getAbsCoor().y + h.y - v.y,
-              this->getAbsCoor().z + h.z - v.z);
-  glTexCoord2f(1.0f, 1.0f);
-  glVertex3f(this->getAbsCoor().x + h.x + v.x,
-             this->getAbsCoor().y + h.y + v.y,
-             this->getAbsCoor().z + h.z + v.z);
-  glTexCoord2f(0.0f, 1.0f);
-  glVertex3f(this->getAbsCoor().x - h.x + v.x,
-             this->getAbsCoor().y - h.y + v.y,
-             this->getAbsCoor().z - h.z + v.z);
-  glEnd();
-
-
-  glPopMatrix();
-
-  glPopAttrib();*/
-}
+}
Index: branches/playability/src/world_entities/elements/glgui_energywidgetvertical.cc
===================================================================
--- branches/playability/src/world_entities/elements/glgui_energywidgetvertical.cc	(revision 10107)
+++ branches/playability/src/world_entities/elements/glgui_energywidgetvertical.cc	(revision 10107)
@@ -0,0 +1,104 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific:
+   main-programmer: Benjamin Grauer
+   co-programmer: ...
+*/
+
+//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_
+
+#include "glgui_energywidgetvertical.h"
+
+#include "multi_type.h"
+
+namespace OrxGui
+{
+  /**
+   * @brief standard constructor
+   */
+  GLGuiEnergyWidgetVertical::GLGuiEnergyWidgetVertical ()
+  {
+    //   this->setClassID(CL_PROTO_ID, "GLGuiEnergyWidget");
+
+    
+
+    this->_bar.setSize2D(100, 30);
+    this->pack(&this->_name);
+    this->pack(&this->_valueText);
+    this->_bar.setParent2D(&this->_valueText);
+
+    this->_name.setForegroundColor(Color(1,1,1,.8));
+    this->_valueText.setChangedTextColor(Color::white);
+
+    //this->setBackgroundTexture("maps/gui_element_background_2.png");
+    this->setBackgroundColor(Color(.5,.5,.5,1));
+
+    //this->_name.setBackgroundTexture(Texture());
+    //this->_valueText.setBackgroundTexture("maps/gui_element_background_2.png");
+    this->_bar.setBackgroundTexture(Texture());
+    this->_bar.setBackgroundColor(Color(0,0,0,0));
+    this->_bar.setForegroundTexture("maps/gui_element_background_faded.png");
+    this->_bar.setForegroundColor(Color(.5, .5, .5, 1));
+    this->_bar.setChangedValueColor(Color::black);
+  }
+
+
+  /**
+   * @brief standard deconstructor
+   */
+  GLGuiEnergyWidgetVertical::~GLGuiEnergyWidgetVertical ()
+  {
+  }
+
+
+  void GLGuiEnergyWidgetVertical::setDisplayedName(const std::string& name)
+  {
+    this->_name.setText(name);
+    this->_bar.setWidgetSize(this->_name.getSize2D());
+  }
+
+  void GLGuiEnergyWidgetVertical::setMaximum(float max)
+  {
+    this->_bar.setMaximum(max);
+  }
+
+  void GLGuiEnergyWidgetVertical::setValue(float value)
+  {
+    MultiType val(value);
+    val.setType(MT_INT);
+
+
+    this->_bar.setValue(value);
+    this->_bar.setForegroundColor(Color::slerpHSVColor(Color::red, Color::green, value/this->_bar.maximum()));
+    this->_bar.setFrontColor(Color(1,1,1,1), true);
+    this->_valueText.setText(val.getString());
+  }
+
+  void GLGuiEnergyWidgetVertical::resize()
+  {
+    GLGuiBox::resize();
+  }
+
+
+  void GLGuiEnergyWidgetVertical::showing()
+  {
+    this->_name.show();
+    this->_valueText.show();
+    this->_bar.show();
+  }
+
+  void GLGuiEnergyWidgetVertical::hiding()
+  {
+    this->_name.hide();
+    this->_valueText.hide();
+    this->_bar.hide();
+  }
+}
Index: branches/playability/src/world_entities/elements/glgui_energywidgetvertical.h
===================================================================
--- branches/playability/src/world_entities/elements/glgui_energywidgetvertical.h	(revision 10107)
+++ branches/playability/src/world_entities/elements/glgui_energywidgetvertical.h	(revision 10107)
@@ -0,0 +1,44 @@
+/*!
+ * @file glgui_energywidgetvertical.h
+ * @brief Definition of an EnergyWidgetVertical, that displays a bar and a Text
+*/
+
+#ifndef _GLGUI_ENERGY_WIDGET_VERTICAL_H
+#define _GLGUI_ENERGY_WIDGET_VERTICAL_H
+
+#include "glgui_box.h"
+#include "glgui_bar.h"
+#include "glgui_text.h"
+
+namespace OrxGui
+{
+
+  //! A class for ...
+  class GLGuiEnergyWidgetVertical : public GLGuiBox
+  {
+
+  public:
+    GLGuiEnergyWidgetVertical();
+    virtual ~GLGuiEnergyWidgetVertical();
+
+    void setDisplayedName(const std::string& name);
+    void setMaximum(float max);
+    void setValue(float value);
+
+    inline GLGuiWidget* getNameWidget() {return &this->_name;};
+    inline GLGuiWidget* getValueWidget() {return &this->_valueText;};
+    inline GLGuiWidget* getBarWidget() {return &this->_bar;};
+
+  protected:
+    virtual void resize();
+    virtual void showing();
+    virtual void hiding();
+
+  private:
+    GLGuiText               _name;
+    GLGuiText               _valueText;
+    GLGuiBar                _bar;
+
+  };
+}
+#endif /* _GLGUI_ENERGY_WIDGET_VERTICAL_H */
Index: branches/playability/src/world_entities/particles/emitter_node.cc
===================================================================
--- branches/playability/src/world_entities/particles/emitter_node.cc	(revision 10106)
+++ branches/playability/src/world_entities/particles/emitter_node.cc	(revision 10107)
@@ -21,7 +21,9 @@
 
 #include "util/loading/load_param.h"
+#include "util/loading/factory.h"
 #include "debug.h"
 
 ObjectListDefinition(EmitterNode);
+//CREATE_FAST_FACTORY(EmitterNode);
 
 /**
@@ -32,8 +34,12 @@
   this->registerObject(this, EmitterNode::_objectList);
 
+  this->toList(OM_DEAD_TICK);
+
   this->system = NULL;
   this->emitter = NULL;
   this->lifeCycle = 0.0;
   this->lifeSpan = lifetime;
+
+  this->setParent( PNode::getNullParent());
 }
 
@@ -64,4 +70,8 @@
 {
   this->started  = true;
+
+  this->emitter->start();
+  this->emitter->setSystem( this->system);
+
   return this->started;
 }
@@ -69,18 +79,19 @@
 void EmitterNode::tick(float dt)
 {
+
   if( !this->started)
     return;
 
   this->lifeCycle += dt/this->lifeSpan;
-  if  (this->lifeCycle >= 1)
+
+  if( this->lifeCycle >= 1.0f)
   {
     this->removeNode();
-    this->hide();
-    this->system->removeEmitter(this->emitter);
     this->emitter->stop();
     this->emitter->setSystem(NULL);
     this->started = false;
+
+    this->destroy( NULL );
   }
-  PRINTF(0)("Coordinate Update EmitterNode: (%f,%f,%f) -> (%f,%f,%f)\n",this->getAbsCoor().x,this->getAbsCoor().y,this->getAbsCoor().z,this->velocity.x,this->velocity.y,this->velocity.z);
-  this->setAbsCoor(this->getAbsCoor() + (this->velocity * dt));
+  this->shiftCoor(this->velocity * dt);
 }
Index: branches/playability/src/world_entities/particles/emitter_node.h
===================================================================
--- branches/playability/src/world_entities/particles/emitter_node.h	(revision 10106)
+++ branches/playability/src/world_entities/particles/emitter_node.h	(revision 10107)
@@ -1,4 +1,4 @@
 /*!
- * @file particle_emitter.h
+ * @file emitter_node.h
   *  Definition of a EmitterNode
   *  An emitter node is a node that takes an emitter and a particle system and keeps them alive for a given amount of time.
@@ -32,5 +32,5 @@
   inline void setVelocity(Vector velocity) { this->velocity = velocity;};
 
-  inline void setupParticle(DotEmitter* emitter, ParticleSystem* system) { this->emitter = emitter; this->system = system; this->system->setLifeSpan(this->lifeSpan);} ;
+  inline void setupParticle(DotEmitter* emitter, ParticleSystem* system) { this->emitter = emitter; this->emitter->setParent( this); this->system = system;} ;
   void setLifetime( float lifeTime) { this->lifeSpan  = lifeTime;};
 
Index: branches/playability/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10106)
+++ branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10107)
@@ -585,5 +585,5 @@
 void SpaceShip::destroy( WorldEntity* killer )
 {
-  PRINTF(0)("spaceship destroy\n");
+  PRINTF(5)("spaceship destroy\n");
   
   EmitterNode* node  = NULL;
@@ -591,7 +591,7 @@
   SpriteParticles*  explosionParticles  = NULL;
 
-  explosionParticles = new SpriteParticles(100);
-  explosionParticles->setName("MBoltExplosionParticles");
-  explosionParticles->setLifeSpan(.5, .3);
+  explosionParticles = new SpriteParticles(200);
+  explosionParticles->setName("SpaceShipExplosionParticles");
+  explosionParticles->setLifeSpan(.2, .3);
   explosionParticles->setRadius(0.0, 10.0);
   explosionParticles->setRadius(.5, 6.0);
@@ -600,19 +600,22 @@
   explosionParticles->setColor(0.1,  1,1,0,.9);
   explosionParticles->setColor(0.5, .8,.4,0,.5);
-  explosionParticles->setColor(1.0, .2,.2,.2,.0);
-
-  
-  emitter = new DotEmitter( 200, 200, M_2_PI);
-  emitter->setSpread( 0, M_2_PI);
-  emitter->setEmissionRate( 400.0);
+  explosionParticles->setColor(1.0, .2,.2,.2,.5);
+
+  
+  emitter = new DotEmitter( 2000, 70, 360);
+  //emitter->setSpread( 0, M_2_PI);
+  emitter->setEmissionRate( 200.0);
   //emitter->setEmissionVelocity( 200.0);
-  emitter->setSystem( explosionParticles);
-  emitter->setAbsCoor( this->getAbsCoor());
-
-  node  = new EmitterNode( 1);
+  //emitter->setSystem( explosionParticles);
+  //emitter->setAbsCoor( this->getAbsCoor());
+
+  node  = new EmitterNode( .1f);
   node->setupParticle( emitter, explosionParticles);
-  node->setVelocity( this->getParent()->getVelocity());
+  node->setAbsDir( this->getAbsDir());
+  node->setVelocity( this->getVelocity() * .9f);
   node->setAbsCoor( this->getAbsCoor());
-  node->start();
+  if( !node->start())
+    PRINTF(0)("Explosion node not correctly started!");
+
 /*
   PNode* node          = new PNode();
@@ -621,14 +624,20 @@
   explosion->explode( node, Vector(5,5,5));
 */
-  this->setAbsCoor(Vector(-10000,10000,10000));
-  //this->hide();
-
-  this->toList( OM_DEAD);
-  PRINTF(0)("spaceship destroy == ship translated \n");
+
+  if( this->hasPlayer())
+  {
+	this->setAbsCoor(Vector(-10000,10000,10000));
+	this->hide();
+  }
+  else
+  {
+    this->setAbsCoor( this->getAbsCoor() + Vector(150,0,0) + Vector(1,0,0) * VECTOR_RAND(50).dot(Vector(1,0,0)));
+  }
+
 }
 
 void SpaceShip::respawn( )
 {
-  //this->unhide();
+  this->unhide();
   /*for(ObjectList<PNode>::const_iterator it = this->getNodesChildren().begin(); it != this->getNodesChildren().end(); it++)
   {
Index: branches/playability/src/world_entities/weapons/swarm_launcher.cc
===================================================================
--- branches/playability/src/world_entities/weapons/swarm_launcher.cc	(revision 10106)
+++ branches/playability/src/world_entities/weapons/swarm_launcher.cc	(revision 10107)
@@ -145,4 +145,6 @@
 void SwarmLauncher::fire()
 {
+  bool fired  = false;
+
   Projectile* pj = NULL;
   for( ObjectList<Playable>::const_iterator eIterator = Playable::objectList().begin(); eIterator !=Playable::objectList().end(); eIterator++)
@@ -153,5 +155,6 @@
       if (pj == NULL)
         return;
-
+      
+      fired = true;
       pj->setVelocity(this->getVelocity()+(this->getAbsDir().apply(Vector(1,0,0))*115.0 + VECTOR_RAND(10)));
 
@@ -164,3 +167,5 @@
     }
   }
+  if( !fired)
+    this->increaseEnergy( this->getProjectile()->getMinEnergy());
 }
Index: branches/playability/src/world_entities/world_entity.h
===================================================================
--- branches/playability/src/world_entities/world_entity.h	(revision 10106)
+++ branches/playability/src/world_entities/world_entity.h	(revision 10107)
@@ -148,5 +148,5 @@
   void increaseHealthMax(float increaseHealth);
   OrxGui::GLGuiWidget* getHealthWidget();
-  bool hasHealthWidget() const { return this->healthWidget; };
+  bool hasHealthWidget() const { return this->healthWidget != NULL; };
 
   virtual void varChangeHandler( std::list<int> & id );
