Index: /branches/playability/src/world_entities/projectiles/projectile.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/projectile.h	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/projectile.h	(revision 10196)
@@ -87,6 +87,4 @@
     OrxSound::SoundBuffer  explosionBuffer;
     OrxSound::SoundBuffer  engineBuffer;
-
-//     virtual Vector newDirection(Vector curDirection, Vector estTargetDir, float angle);
 };
 
Index: /branches/playability/src/world_entities/projectiles/spike.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/spike.cc	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/spike.cc	(revision 10196)
@@ -165,5 +165,6 @@
   float matrix[4][4];
   glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
-
+  Vector tmpRot = this->getAbsDir().getSpacialAxis();
+  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
   glRotatef(angle, 1.0, 0.0, 0.0);
   this->getAbsDir().matrix (matrix);
Index: /branches/playability/src/world_entities/projectiles/spike.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/spike.h	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/spike.h	(revision 10196)
@@ -34,5 +34,5 @@
     virtual void draw () const;
 
-
+    inline void setVelocity(Vector velocity) {this->velocity = velocity;}
   private:
     static FastFactory*               fastFactory;
Index: /branches/playability/src/world_entities/projectiles/spike_ball.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10196)
@@ -32,5 +32,5 @@
 
 #include "weapons/weapon.h"
-
+#include "../weapons/weapon_manager.h"
 
 #include "class_id_DEPRECATED.h"
@@ -65,13 +65,13 @@
   this->halo->setSize(2, 2);
   this->halo->setTexture("hbolt_halo.png");
-/*
-//   this->weaponMan = new WeaponManager(dynamic_cast<WorldEntity*>(this));
-  this->weaponMan.setParentEntity(this);
+
+  this->weaponMan = new WeaponManager(dynamic_cast<WorldEntity*>(this));
+  this->weaponMan->setParentEntity(this);
 
   Weapon* cannon = new SpikeLauncher();
   cannon->setName( "SpikeLauncher");
-  this->weaponMan.addWeapon(cannon, 0, 0);
-  this->weaponMan.changeWeaponConfig(0);
-*/
+  this->weaponMan->addWeapon(cannon, 0, 0);
+  this->weaponMan->changeWeaponConfig(0);
+
 
 }
@@ -177,5 +177,5 @@
 
   if (this->tickLifeCycle(dt)){
-//     this->blow();
+    this->weaponMan->fire();
     this->deactivate();
   }
Index: /branches/playability/src/world_entities/projectiles/spike_ball.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10196)
@@ -11,6 +11,7 @@
 
 #include "../weapons/spike_launcher.h"
-#include "../weapons/weapon.h"
-#include "../weapons/weapon_manager.h"
+
+
+#include "extendable.h"
 
 class Vector;
@@ -62,5 +63,5 @@
     WorldEntity* hitEntity; // FIXME TEMPORARY
 
-//     WeaponManager                     weaponMan;
+    WeaponManager*                   weaponMan;
 
 };
Index: /branches/playability/src/world_entities/projectiles/swarm_projectile.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/swarm_projectile.cc	(revision 10195)
+++ /branches/playability/src/world_entities/projectiles/swarm_projectile.cc	(revision 10196)
@@ -1,3 +1,2 @@
-
 /*
    orxonox - the future of 3D-vertical-scrollers
@@ -187,4 +186,7 @@
 void SwarmProjectile::tick (float time)
 {
+  if(unlikely(this->target == NULL)) /** Check whether the target still exists*/
+    this->deactivate();
+
 /*
   Vector targetFarFarAway = this->getAbsCoor() + Vector(100000, 0, 0);
Index: /branches/playability/src/world_entities/space_ships/space_ship.cc
===================================================================
--- /branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10195)
+++ /branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10196)
@@ -28,4 +28,5 @@
 #include "weapons/swarm_launcher.h"
 #include "weapons/spike_launcher.h"
+#include "weapons/spike_thrower.h"
 #include "weapons/boomerang_gun.h"
 #include "weapons/turret.h"
@@ -173,5 +174,7 @@
   Weapon* cannon = new SwarmLauncher();
   cannon->setName( "SwarmLauncher");
-  //cannon->setParent( this);
+
+  Weapon* spike = new SpikeLauncher();
+  spike->setName( "SpikeThrower" );
 
 
@@ -195,4 +198,5 @@
 
   this->secWeaponMan.addWeapon( cannon, 0, 0);
+  this->secWeaponMan.addWeapon( spike, 1, 1);
 
   
Index: /branches/playability/src/world_entities/weapons/spike_launcher.cc
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10195)
+++ /branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10196)
@@ -102,4 +102,7 @@
   this->size = 2.5;
 
+  this->setEmissionPoint(0.0, 0.0, 0.0);
+
+
   this->spikes = 26;
   this->launcher = new Vector [this->spikes];
@@ -128,10 +131,9 @@
   }
 
-//   this->setEmissionPoint(1.684, 0.472, 0);
   this->getProjectileFactory()->prepare(this->spikes);  //we don't need more...
 
-  this->setActionSound(WA_SHOOT, "sound/explosions/explosion_1.wav");
-  this->setActionSound(WA_ACTIVATE, "sound/vocals/missiles.wav");
-  this->setActionSound(WA_RELOAD, "sound/vocals/reload.wav");
+//   this->setActionSound(WA_SHOOT, "sound/explosions/explosion_1.wav");
+//   this->setActionSound(WA_ACTIVATE, "sound/vocals/missiles.wav");
+//   this->setActionSound(WA_RELOAD, "sound/vocals/reload.wav");
 
 }
@@ -179,4 +181,5 @@
 
   float nx, ny, nz, ca, sa;
+
   nx = v.x;
   ny = v.y;
@@ -187,7 +190,7 @@
 // final version below... easier to to cheat with the one above.
 /*
-  nx = this->getParent()->getRotationVector().x
-  ny = this->getParent()->getRotationVector().y
-  nz = this->getParent()->getRotationVector().z
+  nx = this->getParent()->getRotationVector().x;
+  ny = this->getParent()->getRotationVector().y;
+  nz = this->getParent()->getRotationVector().z;
 
   ca = cos (this->getParent()->getAngle());
@@ -212,4 +215,8 @@
     this->launcher[i] = Vector (x, y, z);
   }
+
+  for( int i = 0; i < 3 ; i++)
+    delete m[i];
+  delete m;
 }
 
@@ -222,5 +229,4 @@
 
   Projectile* pj = NULL;
-//   for( ObjectList<Playable>::const_iterator eIterator = Playable::objectList().begin(); eIterator !=Playable::objectList().end(); eIterator++)
   for (int i = 0; i < this->spikes; i++)
   {
@@ -230,9 +236,11 @@
 
 //     pj->setVelocity(this->getVelocity()+(this->getAbsDir().apply(Vector(1,0,0))*115.0 + VECTOR_RAND(10)));
-    pj->setVelocity(this->launcher[i] * 200.0);
+    pj->setVelocity(this->launcher[i] * 300.0);
 
     pj->setParent(PNode::getNullParent());
     pj->setAbsCoor(this->getAbsCoor() + this->launcher[i] * this->size);
-    pj->setAbsDir(Quaternion(this->launcher[i], 0));
+    pj->setRelDir(0, this->launcher[i].x, this->launcher[i].y, this->launcher[i].z);
+
+    pj->toList(this->getOMListNumber());
     pj->activate();
   }
Index: /branches/playability/src/world_entities/weapons/spike_thrower.cc
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10195)
+++ /branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10196)
@@ -146,27 +146,17 @@
 void SpikeThrower::fire()
 {
-  bool fired  = false;
+  Projectile* pj =  this->getProjectile();
+  if (pj == NULL)
+    return;
 
-  Projectile* pj = NULL;
-  for( ObjectList<Playable>::const_iterator eIterator = Playable::objectList().begin(); eIterator !=Playable::objectList().end(); eIterator++)
-  {
-    if( ((*eIterator)->getOMListNumber() == OM_GROUP_00) && ((*eIterator)->getClassCName() != "Weapon") && ((*eIterator)->getClassCName() != "Projectile") && ((*eIterator)->getAbsCoor() - this->getAbsCoor()).len() <= 300)
-    {
-      pj  = this->getProjectile();
-      if (pj == NULL)
-        return;
-      
-      fired = true;
-      pj->setVelocity(this->getVelocity()+(this->getAbsDir().apply(Vector(1,0,0))*115.0 + VECTOR_RAND(10)));
+  // set the owner
+  pj->setOwner(this->getOwner());
 
-      pj->setParent(PNode::getNullParent());
-      pj->setAbsCoor(this->getEmissionPoint());
-      pj->setAbsDir(this->getAbsDir());
-//       dynamic_cast<SpikeProjectile*>(pj)->setTarget( (PNode*)(*eIterator) );
-      pj->toList(OM_GROUP_01_PROJ);
-      pj->activate();
-    }
-  }
-  if( !fired)
-    this->increaseEnergy( this->getProjectile()->getMinEnergy());
+  pj->setParent(PNode::getNullParent());
+
+  pj->setVelocity(this->getAbsDir().apply(Vector(1,0,0))*150);
+  pj->setAbsCoor(this->getEmissionPoint());
+
+  pj->setAbsDir(this->getAbsDir());
+  pj->activate();
 }
