Index: /branches/playability/src/world_entities/WorldEntities.am
===================================================================
--- /branches/playability/src/world_entities/WorldEntities.am	(revision 10179)
+++ /branches/playability/src/world_entities/WorldEntities.am	(revision 10180)
@@ -42,4 +42,5 @@
                 world_entities/weapons/swarm_launcher.cc \
                 world_entities/weapons/spike_launcher.cc \
+                world_entities/weapons/spike_thrower.cc \
                 world_entities/weapons/acid_launcher.cc \
                 \
@@ -160,4 +161,5 @@
                 weapons/swarm_launcher.h \
                 weapons/spike_launcher.h \
+                weapons/spike_thrower.h \
                 weapons/acid_launcher.h \
                 \
Index: /branches/playability/src/world_entities/projectiles/hbolt.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/hbolt.cc	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/hbolt.cc	(revision 10180)
@@ -113,5 +113,5 @@
 }
 
-
+/*
 void HBolt::collidesWith(WorldEntity* entity, const Vector& location)
 {
@@ -122,5 +122,5 @@
   dynamic_cast<SpaceShip*>(entity)->damage( this->getPhysDamage(), this->getElecDamage());
   this->deactivate();
-}
+}*/
 
 
Index: /branches/playability/src/world_entities/projectiles/hbolt.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/hbolt.h	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/hbolt.h	(revision 10180)
@@ -27,5 +27,5 @@
     virtual void deactivate();
 
-    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+//     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
     virtual void destroy (WorldEntity* killer);
Index: /branches/playability/src/world_entities/projectiles/lbolt.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/lbolt.cc	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/lbolt.cc	(revision 10180)
@@ -115,5 +115,5 @@
 }
 
-
+/*
 void LBolt::collidesWith(WorldEntity* entity, const Vector& location)
 {
@@ -124,5 +124,5 @@
   dynamic_cast<SpaceShip*>(entity)->damage(this->getDamage(),0);
 //   this->deactivate();
-}
+}*/
 
 /**
Index: /branches/playability/src/world_entities/projectiles/lbolt.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/lbolt.h	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/lbolt.h	(revision 10180)
@@ -27,5 +27,5 @@
     virtual void deactivate();
 
-    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+//     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
     virtual void destroy (WorldEntity* killer);
Index: /branches/playability/src/world_entities/projectiles/mbolt.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/mbolt.cc	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/mbolt.cc	(revision 10180)
@@ -141,5 +141,5 @@
 }
 
-
+/*
 void MBolt::collidesWith(WorldEntity* entity, const Vector& location)
 {
@@ -157,5 +157,5 @@
   //entity->destroy(this);
   //this->deactivate();
-}
+}*/
 
 /**
Index: /branches/playability/src/world_entities/projectiles/mbolt.h
===================================================================
--- /branches/playability/src/world_entities/projectiles/mbolt.h	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/mbolt.h	(revision 10180)
@@ -28,5 +28,5 @@
     virtual void deactivate();
 
-    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+//     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
     virtual void destroy (WorldEntity* killer);
Index: /branches/playability/src/world_entities/projectiles/spike_ball.cc
===================================================================
--- /branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10179)
+++ /branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10180)
@@ -30,4 +30,6 @@
 
 #include "space_ships/space_ship.h"
+
+#include "weapons/weapon.h"
 
 
@@ -58,5 +60,5 @@
 
   this->angle = 0;
-  this->rotationSpeed = 130;
+  this->rotationSpeed = 0;
 /*
   this->halo = new Billboard();
Index: /branches/playability/src/world_entities/weapons/spike_launcher.cc
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10179)
+++ /branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10180)
@@ -67,4 +67,6 @@
 SpikeLauncher::~SpikeLauncher ()
 {
+  delete this->launcher;
+
   // model will be deleted from WorldEntity-destructor
 }
@@ -95,10 +97,37 @@
 
   this->setCapability(WTYPE_ALLDIRS | WTYPE_TURRET | WTYPE_DIRECTIONAL | WTYPE_LIGHT);
-  this->setProjectileTypeC("SpikeBall");
+  this->setProjectileTypeC("Spike");
 
-  this->loadModel("models/guns/turret1.obj", 1.0);
+//   this->loadModel("models/guns/turret1.obj", 1.0);
+  this->size = 2.5;
 
-  this->setEmissionPoint(1.684, 0.472, 0);
-  this->getProjectileFactory()->prepare(50);
+  this->spikes = 26;
+  this->launcher = new Vector [this->spikes];
+
+  this->launcher[0] = Vector(1.0, 0.0, 0.0);
+  this->launcher[1] = Vector(0.0, 1.0, 0.0);
+  this->launcher[2] = Vector(0.0, 0.0, 1.0);
+
+  this->launcher[3] = Vector(1.0, 1.0, 0.0);
+  this->launcher[4] = Vector(0.0, 1.0, 1.0);
+  this->launcher[5] = Vector(1.0, 0.0, 1.0);
+  this->launcher[6] = Vector(1.0, -1.0, 0.0);
+  this->launcher[7] = Vector(0.0, 1.0, -1.0);
+  this->launcher[8] = Vector(-1.0, 0.0, 1.0);
+
+  this->launcher[9] = Vector(-1.0, 1.0, 1.0);
+  this->launcher[10] = Vector(1.0, 1.0, 1.0);
+  this->launcher[11] = Vector(1.0, -1.0, 1.0);
+  this->launcher[12] = Vector(-1.0, -1.0, 1.0);
+
+  int tmp = this->spikes / 2;
+  for (int i = 0; i < tmp; i++)
+  {
+    this->launcher[i].normalize();
+    this->launcher[tmp + i] =  this->launcher[i] * (-1);
+  }
+
+//   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");
@@ -145,27 +174,19 @@
 void SpikeLauncher::fire()
 {
-  bool fired  = false;
+  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++)
+  {
+    pj  = this->getProjectile();
+    if (pj == NULL) // if true, we do have a problem!!
+      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)));
+//     pj->setVelocity(this->getVelocity()+(this->getAbsDir().apply(Vector(1,0,0))*115.0 + VECTOR_RAND(10)));
+    pj->setVelocity(this->launcher[i] * 200.0);
 
-      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();
-    }
+    pj->setParent(PNode::getNullParent());
+    pj->setAbsCoor(this->getAbsCoor() + this->launcher[i] * this->size);
+    pj->setAbsDir(Quaternion(this->launcher[i], 0));
+    pj->activate();
   }
-  if( !fired)
-    this->increaseEnergy( this->getProjectile()->getMinEnergy());
 }
Index: /branches/playability/src/world_entities/weapons/spike_launcher.h
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10179)
+++ /branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10180)
@@ -30,4 +30,8 @@
 
   private:
+
+  int           spikes;
+  Vector*       launcher;
+  float         size;
   };
 
Index: /branches/playability/src/world_entities/weapons/spike_thrower.cc
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10180)
+++ /branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10180)
@@ -0,0 +1,172 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004-2006 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: Marc Schaerrer
+   co-programmer:
+*/
+//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "spike_thrower.h"
+
+#include "weapon_manager.h"
+#include "world_entities/projectiles/projectile.h"
+#include "world_entities/projectiles/spike_ball.h"
+
+#include "model.h"
+
+#include "state.h"
+#include "animation3d.h"
+
+#include <list>
+#include <iterator>
+#include "util/state.h"
+
+#include "math/quaternion.h"
+
+#include "util/loading/factory.h"
+
+#include "class_id_DEPRECATED.h"
+
+using namespace std;
+
+ObjectListDefinition(SpikeThrower);
+CREATE_FACTORY(SpikeThrower);
+
+/**
+ *  standard constructor
+ *
+ * creates a new SpikeThrower
+ */
+SpikeThrower::SpikeThrower()
+  : Weapon()
+{
+  this->init();
+}
+
+/**
+ * creates a new SpikeThrower from a TiXmlElement
+ */
+SpikeThrower::SpikeThrower(const TiXmlElement* root)
+{
+  this->init();
+  if (root != NULL)
+    this->loadParams(root);
+}
+
+/**
+ *  standard deconstructor
+*/
+SpikeThrower::~SpikeThrower ()
+{
+
+  // model will be deleted from WorldEntity-destructor
+}
+
+void SpikeThrower::init()
+{
+  this->registerObject(this, SpikeThrower::_objectList);
+
+  Animation3D* animation1 = this->getAnimation(WS_ACTIVATING, this);
+  Animation3D* animation2 = this->getAnimation(WS_DEACTIVATING, this);
+
+  animation1->addKeyFrame(Vector(0, -.5, 0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
+  animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
+  animation2->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
+  animation2->addKeyFrame(Vector(0, -.5, 0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_CONSTANT);
+
+  animation1->setInfinity(ANIM_INF_CONSTANT);
+  animation2->setInfinity(ANIM_INF_CONSTANT);
+
+  this->setStateDuration(WS_SHOOTING, .6);
+  this->setStateDuration(WS_RELOADING, 1.0f);
+  this->setStateDuration(WS_ACTIVATING, .4);
+  this->setStateDuration(WS_DEACTIVATING, .4);
+
+  this->setEnergyMax(10);
+  this->increaseEnergy(10);
+  //this->minCharge = 2;
+
+  this->setCapability(WTYPE_ALLDIRS | WTYPE_TURRET | WTYPE_DIRECTIONAL | WTYPE_LIGHT);
+  this->setProjectileTypeC("SpikeBall");
+
+//   this->loadModel("models/guns/turret1.obj", 1.0);
+
+  this->setEmissionPoint(1.684, 0.472, 0);
+  this->getProjectileFactory()->prepare(50);
+
+  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");
+
+}
+
+void SpikeThrower::loadParams(const TiXmlElement* root)
+{
+  Weapon::loadParams(root);
+}
+
+void SpikeThrower::activate()
+{
+}
+
+void SpikeThrower::deactivate()
+{
+}
+
+void SpikeThrower::tick(float dt)
+{
+  if (!Weapon::tickW(dt))
+    return;
+
+  Quaternion quat;
+  Vector direction;
+  if (this->getDefaultTarget() == NULL)
+    direction = this->getAbsCoor();
+  else
+    direction = this->getDefaultTarget()->getAbsCoor() - this->getAbsCoor();
+
+  direction.normalize();
+
+  if (likely (this->getParent() != NULL))
+    quat = Quaternion(direction, this->getParent()->getAbsDir().apply(Vector(0,1,0))) * Quaternion ( -M_PI_2, Vector(0,1,0)) ;
+  else
+    quat = Quaternion(direction, Vector(0,1,0)) * Quaternion ( -M_PI_2, Vector(0,1,0)) ;
+
+  this->setAbsDirSoft(quat, 5);
+}
+
+void SpikeThrower::fire()
+{
+  bool fired  = false;
+
+  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)));
+
+      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());
+}
Index: /branches/playability/src/world_entities/weapons/spike_thrower.h
===================================================================
--- /branches/playability/src/world_entities/weapons/spike_thrower.h	(revision 10180)
+++ /branches/playability/src/world_entities/weapons/spike_thrower.h	(revision 10180)
@@ -0,0 +1,34 @@
+/*!
+ * @file spike_thrower.h
+*/
+
+
+#ifndef _SPIKE_THROWER_H
+#define _SPIKE_THROWER_H
+
+#include "weapon.h"
+
+#define SPIKE_THROWER_MAXRANGE = 500.0;
+
+class SpikeThrower : public Weapon
+  {
+  ObjectListDeclaration(SpikeThrower);
+  public:
+    SpikeThrower ();
+    SpikeThrower(const TiXmlElement* root);
+    virtual ~SpikeThrower ();
+
+    void init();
+    virtual void loadParams(const TiXmlElement* root);
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void tick(float dt);
+    virtual void fire();
+
+
+  private:
+  };
+
+#endif /* _SPIKE_THROWER_H */
