Index: /orxonox/trunk/src/story_entities/world.cc
===================================================================
--- /orxonox/trunk/src/story_entities/world.cc	(revision 4889)
+++ /orxonox/trunk/src/story_entities/world.cc	(revision 4890)
@@ -183,4 +183,5 @@
   delete this->entities;
   State::setWorldEntityList(NULL);
+//  delete NullParent::getInstance();
 
 
Index: /orxonox/trunk/src/world_entities/weapons/projectile.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/projectile.cc	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/projectile.cc	(revision 4890)
@@ -36,8 +36,6 @@
 
   this->weapon = weapon;
-  this->flightDirection = NULL;
-  this->currentLifeTime = 0.0f;
-  this->ttl = 0.75f; /* sec */
-  this->speed = 2.0f;
+  this->lifeCycle = 0.0;
+  this->lifeSpan = 0.75f; /* sec */
 }
 
@@ -65,33 +63,8 @@
 void Projectile::setFlightDirection(Quaternion flightDirection)
 {
-  if( this->flightDirection == NULL)
-    this->flightDirection = new Vector();
   Vector v(1, 0, 0);
-  *this->flightDirection = flightDirection.apply(v);
-  this->flightDirection->normalize();
+  this->flightDirection = flightDirection.apply(v);
+  this->flightDirection.normalize();
 }
-
-
-/**
- *  this sets the time to life of the projectile
- * @param ttl in second
-
-   after this life time, the projectile will garbage collect itself
-*/
-void Projectile::setTTL(float ttl)
-{
-  this->ttl = ttl;
-}
-
-
-/**
- *  sets the speed of the projectile
-*/
-void Projectile::setSpeed(float speed)
-{
-  this->speed = speed * 3; /* fix speed settings */
-  PRINTF(4)("Projectile::setting speed to: %f\n", this->speed);
-}
-
 
 /**
@@ -101,7 +74,7 @@
 void Projectile::setVelocity(const Vector &velocity)
 {
-  this->offsetVel = this->velocity = velocity;
-  this->offsetVel.normalize();
-  this->velocity += (this->offsetVel * 50.0);
+  Vector offsetVel = this->velocity = velocity;
+  offsetVel.normalize();
+  this->velocity += (offsetVel * 50.0);
 }
 
@@ -116,22 +89,13 @@
   this->shiftCoor(v);
 
-  this->currentLifeTime += time;
-  if( this->ttl < this->currentLifeTime)
-    {
-      PRINTF(5)("FINALIZE==========================\n");
-      PRINTF(5)("current life time is: %f/%f\n", this->currentLifeTime, this->ttl);
-      PRINTF(5)("FINALIZE===========================\n");
-      this->finalize();
-      this->currentLifeTime = 0.0f;
-    }
+  this->lifeCycle += time/this->lifeSpan;
+  if( this->lifeCycle >= 1)
+  {
+    PRINTF(5)("FINALIZE==========================\n");
+    PRINTF(5)("current life cycle is: %f\n", this->lifeCycle);
+    PRINTF(5)("FINALIZE===========================\n");
+    this->finalize();
+  }
 }
-
-/**
- *  the projectile gets hit by another entity
- * @param the other entity
- * @param place where it is hit
-*/
-void Projectile::hit (WorldEntity* entity, Vector* place)
-{}
 
 
Index: /orxonox/trunk/src/world_entities/weapons/projectile.h
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/projectile.h	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/projectile.h	(revision 4890)
@@ -1,4 +1,4 @@
 /*!
-    \projectile.h
+    \file projectile.h
   *  a projectile, that is been shooted by a weapon
 
@@ -26,34 +26,40 @@
 class Vector;
 class Weapon;
+class ParticleEmitter;
 
 class Projectile : public WorldEntity
 {
-  friend class World;
+  public:
+    Projectile (Weapon* weapon);
+    virtual ~Projectile ();
 
- public:
-  Projectile (Weapon* weapon);
-  virtual ~Projectile ();
+    void setFlightDirection(Quaternion flightDirection);
+    void setVelocity(const Vector &velocity);
+    void setLifeSpan(float lifeSpan);
 
-  void setFlightDirection(Quaternion flightDirection);
-  void setSpeed(float speed);
-  void setVelocity(const Vector &velocity);
-  void setTTL(float ttl);
 
-  virtual void hit (WorldEntity* weapon, Vector* loc);
-  virtual void destroy ();
 
-  virtual void tick (float time);
-  virtual void draw ();
 
- protected:
-  //physical attriutes like: force, speed, acceleration etc.
-  float          speed;                     //!< this is the speed of the projectile
-  float          currentLifeTime;           //!< this is the time, the projectile exists in this world (incremented by tick)
-  float          ttl;                       //!< time to life, after this time, the projectile will garbage collect itself
-  Vector*        flightDirection;           //!< direction in which the shoot flights
-  Weapon*        weapon;                    //!< weapon the shoot belongs to
+    virtual void destroy ();
 
-  Vector         velocity;                  //!< velocity of the projectile
-  Vector         offsetVel;                 //!< offset velocity TEMP
+    virtual void tick (float time);
+    virtual void draw ();
+
+  protected:
+
+    // energy
+    float                 energyMin;
+    float                 energyMax;
+
+
+    float                 lifeCycle;                 //!< The percentage of the Lifetime done [0-1]
+    float                 lifeSpan;                  //!< The entire lifespan of the Shoot.
+
+    Vector                flightDirection;           //!< direction in which the shoot flighs
+    Weapon*               weapon;                    //!< weapon the shoot belongs to.
+
+    Vector                velocity;                  //!< velocity of the projectile.
+
+    ParticleEmitter*      emitter;                   //!< For special effects each Projectile consists of an emitter.
 };
 
Index: /orxonox/trunk/src/world_entities/weapons/test_bullet.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_bullet.cc	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/test_bullet.cc	(revision 4890)
@@ -64,23 +64,13 @@
   this->shiftCoor(v);
 
-  this->currentLifeTime += time;
-  if( this->ttl < this->currentLifeTime)
+  this->lifeCycle += time/this->lifeSpan;
+  if( this->lifeCycle >= 1)
     {
       PRINTF(5)("FINALIZE==========================\n");
-      PRINTF(5)("current life time is: %f/%f\n", this->currentLifeTime, this->ttl);
+      PRINTF(5)("current life cycle is: %f\n", this->lifeCycle);
       PRINTF(5)("FINALIZE===========================\n");
       this->finalize();
-      this->currentLifeTime = 0.0f;
     }
 }
-
-/**
- *  the projectile gets hit by another entity
- * @param the other entity
- * @param place where it is hit
-*/
-void TestBullet::hit (WorldEntity* entity, Vector* place)
-{}
-
 
 /**
Index: /orxonox/trunk/src/world_entities/weapons/test_bullet.h
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_bullet.h	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/test_bullet.h	(revision 4890)
@@ -1,3 +1,3 @@
-/*! 
+/*!
     \projectile.h
   *  a projectile, that is been shooted by a weapon
@@ -12,5 +12,5 @@
 class Weapon;
 
-class TestBullet : public Projectile 
+class TestBullet : public Projectile
 {
   friend class World;
@@ -20,10 +20,9 @@
   virtual ~TestBullet ();
 
-  virtual void hit (WorldEntity* weapon, Vector* loc);
   virtual void destroy ();
 
   virtual void tick (float time);
   virtual void draw ();
-  
+
 };
 
Index: /orxonox/trunk/src/world_entities/weapons/test_gun.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/test_gun.cc	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/test_gun.cc	(revision 4890)
@@ -101,4 +101,5 @@
 
   this->setStateDuration(WS_SHOOTING, .2);
+  this->setStateDuration(WS_RELOADING, .5);
 
   this->energy = 100;
Index: /orxonox/trunk/src/world_entities/weapons/weapon.cc
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/weapon.cc	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/weapon.cc	(revision 4890)
@@ -122,4 +122,26 @@
     printf("next action will be %s in %f seconds\n", actionToChar(action), this->stateDuration);
     this->requestedAction = action;
+  }
+}
+
+
+/**
+ * adds energy to the Weapon
+ * @param energyToAdd The amount of energy
+ * @returns the amount of energy we did not pick up, because the weapon is already full
+ */
+float Weapon::increaseEnergy(float energyToAdd)
+{
+  float maxAddEnergy = this->energyMax - this->energy;
+
+  if (maxAddEnergy >= energyToAdd)
+  {
+    this->energy += energyToAdd;
+    return 0.0;
+  }
+  else
+  {
+    this->energy += maxAddEnergy;
+    return energyToAdd - maxAddEnergy;
   }
 }
Index: /orxonox/trunk/src/world_entities/weapons/weapon.h
===================================================================
--- /orxonox/trunk/src/world_entities/weapons/weapon.h	(revision 4889)
+++ /orxonox/trunk/src/world_entities/weapons/weapon.h	(revision 4890)
@@ -28,5 +28,5 @@
 class TiXmlElement;
 
-//! An enumerator defining actions a Weapon can take
+//! An enumerator defining Actions a Weapon can take
 typedef enum {
   WA_NONE          =    0,    //!< No Action taken
@@ -80,4 +80,5 @@
 
     void requestAction(WeaponAction action);
+    float increaseEnergy(float energyToAdd);
 
     /** @returns true if the Weapon is Active */
@@ -117,10 +118,4 @@
 
   protected:
-    // utility:
-    static WeaponAction  charToAction(const char* action);
-    static const char*   actionToChar(WeaponAction action);
-    static WeaponState   charToState(const char* state);
-    static const char*   stateToChar(WeaponState state);
-
     //! ACTION: these functions are handled by the Weapon itself, and must be called by requestAction(WeaponAction);
     bool execute();
@@ -131,16 +126,24 @@
     virtual void charge();
 
+
+    // utility:
+    static WeaponAction  charToAction(const char* action);
+    static const char*   actionToChar(WeaponAction action);
+    static WeaponState   charToState(const char* state);
+    static const char*   stateToChar(WeaponState state);
   private:
     bool nextActionValid() const;
 
+
+
   protected:
-    SoundSource*         soundSource;
+    SoundSource*         soundSource;                      //!< A SoundSource to play sound from (this is connected to the PNode of the Weapon)
     // it is all about energy
-    float                energy;
-    float                energyLoaded;
-    float                energyMax;
-    float                energyLoadedMax;
-    float                minCharge;
-    float                maxCharge;
+    float                energy;                           //!< The energy stored in the weapons secondary buffers (reserve)
+    float                energyLoaded;                     //!< The energy stored in the weapons primary buffers (firewithout reload)
+    float                energyMax;                        //!< The maximal energy that can be stored in the secondary buffers (reserveMax)
+    float                energyLoadedMax;                  //!< The maximal energy that can be stored in the primary buffers
+    float                minCharge;                        //!< The minimal energy to be loaded onto one projectile if chargeable otherwise the power consumed by one projectile
+    float                maxCharge;                        //!< The maximal energy to be loaded onto one projectile (this is only availible if chargeable is enabled)
 
     ////////////
@@ -156,7 +159,8 @@
 
 
+    bool                 active;                          //!< states wheter the weapon is enabled or not
     bool                 hideInactive;                    //!< Hides the Weapon if it is inactive
+    bool                 chargeable;                      //!< if the Weapon is charcheable
 
-    bool                 active;                          //!< states wheter the weapon is enabled or not
     Projectile*          projectile;                      //!< the projectile used for this weapon
   };
