Index: branches/playability/src/world_entities/WorldEntities.am
===================================================================
--- branches/playability/src/world_entities/WorldEntities.am	(revision 10168)
+++ branches/playability/src/world_entities/WorldEntities.am	(revision 10170)
@@ -41,4 +41,5 @@
                 world_entities/weapons/heavy_blaster.cc \
                 world_entities/weapons/swarm_launcher.cc \
+                world_entities/weapons/spike_launcher.cc \
                 \
                 world_entities/projectiles/lbolt.cc \
@@ -54,5 +55,6 @@
                 world_entities/projectiles/boomerang_projectile.cc \
                 world_entities/projectiles/hyperblast.cc \
-                world_entities/projectiles/acid_splash.cc \
+                world_entities/projectiles/spike.cc \
+                world_entities/projectiles/spike_ball.cc \
                 \
                 world_entities/power_ups/turret_power_up.cc \
@@ -155,4 +157,5 @@
                 weapons/heavy_blaster.h \
                 weapons/swarm_launcher.h \
+                weapons/spike_launcher.h \
                 \
                 projectiles/lbolt.h \
@@ -168,5 +171,6 @@
                 projectiles/boomerang_projectile.h \
                 projectiles/hyperblast.h \
-                projectiles/acid_splash.h \
+                projectiles/spike.h \
+                projectiles/spike_ball.h \
                 \
                 power_ups/turret_power_up.h \
Index: branches/playability/src/world_entities/projectiles/mbolt.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/mbolt.cc	(revision 10168)
+++ branches/playability/src/world_entities/projectiles/mbolt.cc	(revision 10170)
@@ -55,5 +55,4 @@
   this->lifeSpan = 3.0;
   this->angle     = 0;
-
 
   //this->emitter = new DotEmitter(1000, 0, 0);
Index: branches/playability/src/world_entities/projectiles/spike.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/spike.cc	(revision 10170)
+++ branches/playability/src/world_entities/projectiles/spike.cc	(revision 10170)
@@ -0,0 +1,179 @@
+/*
+   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: Nicolas Schlumberger, Marc Schaerrer
+   co-programmer: Benjamin Grauer
+
+*/
+
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "spike.h"
+
+#include "state.h"
+#include "model.h"
+
+#include "particles/dot_emitter.h"
+#include "particles/sprite_particles.h"
+
+#include <cassert>
+#include "debug.h"
+
+#include "space_ships/space_ship.h"
+
+
+#include "class_id_DEPRECATED.h"
+ObjectListDefinition(Spike);
+CREATE_FAST_FACTORY_STATIC(Spike);
+
+/**
+ *  standard constructor
+*/
+Spike::Spike () : Projectile()
+{
+  this->registerObject(this, Spike::_objectList);
+
+  this->loadModel("models/projectiles/spike.obj");
+
+  this->setMinEnergy(1);
+  this->setHealthMax(0);
+  this->lifeSpan = 2.0;
+
+  this->emitter = new DotEmitter(100, 5, M_2_PI);
+  this->emitter->setParent(this);
+  this->emitter->setSpread(M_PI, M_PI);
+  this->emitter->setEmissionRate(300.0);
+  this->emitter->setEmissionVelocity(50.0);
+
+  this->angle = 0;
+  this->rotationSpeed = 130;
+
+  this->halo = new Billboard();
+  this->halo->setSize(.35, .35);
+  this->halo->setTexture("hbolt_halo.png");
+}
+
+
+/**
+ *  standard deconstructor
+*/
+Spike::~Spike ()
+{
+  // delete this->emitter;
+
+  /* this is normaly done by World.cc by deleting the ParticleEngine */
+  if (Spike::explosionParticles != NULL && Spike::objectList().size() <= 1)
+  {
+    //if (ClassList::exists(Spike::explosionParticles, CL_PARTICLE_SYSTEM))
+    //  delete Spike::explosionParticles;
+    PRINTF(1)("Deleting Spike Particles\n");
+    Spike::explosionParticles = NULL;
+  }
+
+}
+
+SpriteParticles* Spike::explosionParticles = NULL;
+
+void Spike::activate()
+{
+  if (unlikely(Spike::explosionParticles == NULL))
+  {
+    Spike::explosionParticles = new SpriteParticles(1000);
+    Spike::explosionParticles->setName("BoltExplosionParticles");
+    Spike::explosionParticles->setLifeSpan(.5, .3);
+    Spike::explosionParticles->setRadius(0.0, 10.0);
+    Spike::explosionParticles->setRadius(.5, 6.0);
+    Spike::explosionParticles->setRadius(1.0, 3.0);
+    Spike::explosionParticles->setColor(0.0, 1,1,0,.9);
+    Spike::explosionParticles->setColor(0.5, .8,.8,0,.5);
+    Spike::explosionParticles->setColor(1.0, .8,.8,.7,.0);
+  }
+
+  this->setDamage(5);
+  this->setHealth(0);
+}
+
+
+void Spike::deactivate()
+{
+  assert (Spike::explosionParticles != NULL);
+  Spike::explosionParticles->removeEmitter(this->emitter);
+  this->lifeCycle = 0.0;
+
+  this->toList(OM_NULL);
+  this->removeNode();
+  Spike::fastFactory->kill(this);
+}
+
+
+void Spike::collidesWith(WorldEntity* entity, const Vector& location)
+{
+  PRINTF(0)("Collision with Spike\n");
+  if (this->hitEntity != entity && entity->isA(CL_NPC))
+    this->destroy( entity );
+  this->hitEntity = entity;
+  dynamic_cast<SpaceShip*>(entity)->damage(this->getDamage(),0);
+//   this->deactivate();
+}
+
+/**
+ *  signal tick, time dependent things will be handled here
+ * @param dt time since last tick
+*/
+void Spike::tick (float dt)
+{
+  //Vector v = *this->flightDirection * ( this->speed * time * 1000 + 0.1);
+  Vector v = this->velocity * dt;
+  this->shiftCoor(v);
+
+  if (this->tickLifeCycle(dt))
+    this->deactivate();
+
+  angle += rotationSpeed * dt;
+}
+
+/**
+ *  the function gets called, when the projectile is destroyed
+*/
+void Spike::destroy (WorldEntity* killer)
+{
+  Projectile::destroy( killer );
+  PRINTF(5)("DESTROY Spike\n");
+  this->lifeCycle = .95; //!< @todo calculate this usefully.
+
+  this->emitter->setSystem(Spike::explosionParticles);
+}
+
+
+void Spike::draw () const
+{
+  glPushAttrib(GL_ENABLE_BIT);
+  //glDisable(GL_LIGHTING);
+
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  float matrix[4][4];
+  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
+
+  glRotatef(angle, 1.0, 0.0, 0.0);
+  this->getAbsDir().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  this->getModel()->draw();
+
+  this->halo->draw();
+
+  glPopMatrix();
+
+  glPopAttrib();
+}
+
Index: branches/playability/src/world_entities/projectiles/spike.h
===================================================================
--- branches/playability/src/world_entities/projectiles/spike.h	(revision 10170)
+++ branches/playability/src/world_entities/projectiles/spike.h	(revision 10170)
@@ -0,0 +1,52 @@
+/*!
+ * @file spike.h
+ * @brief light blaster spike
+*/
+
+#ifndef _SPIKE_H
+#define _SPIKE_H
+
+#include "projectile.h"
+#include "effects/billboard.h"
+
+class Vector;
+class Weapon;
+class SpriteParticles;
+class ParticleEmitter;
+class FastFactory;
+
+class Spike : public Projectile
+{
+  ObjectListDeclaration(Spike);
+  public:
+    Spike ();
+    virtual ~Spike ();
+
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+
+    virtual void destroy (WorldEntity* killer);
+
+    virtual void tick (float dt);
+    virtual void draw () const;
+
+
+  private:
+    static FastFactory*               fastFactory;
+
+    static SpriteParticles*           explosionParticles;
+
+    ParticleEmitter*                  emitter;
+
+    float                             angle;
+    float                             rotationSpeed;
+
+    Billboard*                        halo;
+
+    WorldEntity* hitEntity; // FIXME TEMPORARY
+};
+
+#endif /* _SPIKE_H */
Index: branches/playability/src/world_entities/projectiles/spike_ball.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10170)
+++ branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10170)
@@ -0,0 +1,208 @@
+/*
+   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: Nicolas Schlumberger, Marc Schaerrer
+   co-programmer: Benjamin Grauer
+
+*/
+
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "spike_ball.h"
+
+#include "state.h"
+#include "model.h"
+
+#include "particles/dot_emitter.h"
+#include "particles/sprite_particles.h"
+
+#include <cassert>
+#include "debug.h"
+
+#include "space_ships/space_ship.h"
+
+
+#include "class_id_DEPRECATED.h"
+ObjectListDefinition(SpikeBall);
+CREATE_FAST_FACTORY_STATIC(SpikeBall);
+
+/**
+ *  standard constructor
+*/
+SpikeBall::SpikeBall () : Projectile()
+{
+  this->registerObject(this, SpikeBall::_objectList);
+
+  this->loadModel("models/projectiles/spike_ball.obj", .25);
+
+  this->setMinEnergy(1);
+  this->setHealthMax(0);
+  this->lifeSpan = 1.0;
+
+  this->emitter = new DotEmitter(100, 5, M_2_PI);
+  this->emitter->setParent(this);
+  this->emitter->setSpread(M_PI, M_PI);
+  this->emitter->setEmissionRate(300.0);
+  this->emitter->setEmissionVelocity(50.0);
+
+  this->speed = 150;
+
+  this->angle = 0;
+  this->rotationSpeed = 130;
+/*
+  this->halo = new Billboard();
+  this->halo->setSize(.35, .35);
+  this->halo->setTexture("hbolt_halo.png");*/
+}
+
+
+/**
+ *  standard deconstructor
+*/
+SpikeBall::~SpikeBall ()
+{
+  // delete this->emitter;
+
+  /* this is normaly done by World.cc by deleting the ParticleEngine */
+  if (SpikeBall::explosionParticles != NULL && SpikeBall::objectList().size() <= 1)
+  {
+    //if (ClassList::exists(SpikeBall::explosionParticles, CL_PARTICLE_SYSTEM))
+    //  delete SpikeBall::explosionParticles;
+    PRINTF(1)("Deleting SpikeBall Particles\n");
+    SpikeBall::explosionParticles = NULL;
+  }
+
+}
+
+SpriteParticles* SpikeBall::explosionParticles = NULL;
+
+void SpikeBall::activate()
+{
+  if (unlikely(SpikeBall::explosionParticles == NULL))
+  {
+    SpikeBall::explosionParticles = new SpriteParticles(1000);
+    SpikeBall::explosionParticles->setName("BoltExplosionParticles");
+    SpikeBall::explosionParticles->setLifeSpan(.5, .3);
+    SpikeBall::explosionParticles->setRadius(0.0, 10.0);
+    SpikeBall::explosionParticles->setRadius(.5, 6.0);
+    SpikeBall::explosionParticles->setRadius(1.0, 3.0);
+    SpikeBall::explosionParticles->setColor(0.0, 1,1,0,.9);
+    SpikeBall::explosionParticles->setColor(0.5, .8,.8,0,.5);
+    SpikeBall::explosionParticles->setColor(1.0, .8,.8,.7,.0);
+  }
+
+  this->setDamage(5);
+  this->setHealth(0);
+}
+
+
+void SpikeBall::deactivate()
+{
+  assert (SpikeBall::explosionParticles != NULL);
+  SpikeBall::explosionParticles->removeEmitter(this->emitter);
+  this->lifeCycle = 0.0;
+
+  this->toList(OM_NULL);
+  this->removeNode();
+  SpikeBall::fastFactory->kill(this);
+}
+
+
+void SpikeBall::collidesWith(WorldEntity* entity, const Vector& location)
+{
+  PRINTF(0)("Collision with SpikeBall\n");
+  if (this->hitEntity != entity && entity->isA(CL_NPC))
+    this->destroy( entity );
+  this->hitEntity = entity;
+  dynamic_cast<SpaceShip*>(entity)->damage(this->getDamage(),0);
+//   this->deactivate();
+}
+/*
+void SpikeBall::blow()
+{
+  const float* v = this->getModel()->getVertexArray();
+  Projectile* pj = NULL;
+
+  for (unsigned int i = 0; i < this->getModel()->getVertexCount(); i++)
+  {
+
+//     v = this->getModel()->getModelInfo
+
+      pj  = this->getProjectile();
+      if (pj == NULL)
+        return;
+
+      if (v[i].x * v[i].x + v[i].y * v[i].y + v[i].z * v[i].z > 4)
+      {
+        pj->setParent(PNode::getNullParent());
+        pj->setAbsCoor(this->getAbsCoor() + v);
+        pj->setAbsDir(v->getNormalized() * this->speed);
+        pj->activate();
+      }
+  }
+}*/
+
+
+/**
+ *  signal tick, time dependent things will be handled here
+ * @param dt time since last tick
+*/
+void SpikeBall::tick (float dt)
+{
+  //Vector v = *this->flightDirection * ( this->speed * time * 1000 + 0.1);
+  Vector v = this->velocity * dt;
+  this->shiftCoor(v);
+
+  if (this->tickLifeCycle(dt)){
+//     this->blow();
+    this->deactivate();
+  }
+
+  angle += rotationSpeed * dt;
+}
+
+/**
+ *  the function gets called, when the projectile is destroyed
+*/
+void SpikeBall::destroy (WorldEntity* killer)
+{
+  Projectile::destroy( killer );
+  PRINTF(5)("DESTROY SpikeBall\n");
+  this->lifeCycle = .95; //!< @todo calculate this usefully.
+
+  this->emitter->setSystem(SpikeBall::explosionParticles);
+}
+
+
+void SpikeBall::draw () const
+{
+  glPushAttrib(GL_ENABLE_BIT);
+  //glDisable(GL_LIGHTING);
+
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  float matrix[4][4];
+  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
+
+  glRotatef(angle, 1.0, 0.0, 0.0);
+  this->getAbsDir().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  this->getModel()->draw();
+
+  this->halo->draw();
+
+  glPopMatrix();
+
+  glPopAttrib();
+}
+
Index: branches/playability/src/world_entities/projectiles/spike_ball.h
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10170)
+++ branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10170)
@@ -0,0 +1,56 @@
+/*!
+ * @file lbolt.h
+ * @brief light blaster lbolt
+*/
+
+#ifndef _SPIKE_BALL_H
+#define _SPIKE_BALL_H
+
+#include "projectile.h"
+#include "effects/billboard.h"
+#include "../weapons/weapon.h"
+
+class Vector;
+class Weapon;
+class SpriteParticles;
+class ParticleEmitter;
+class FastFactory;
+
+class SpikeBall : public Projectile
+{
+  ObjectListDeclaration(SpikeBall);
+  public:
+    SpikeBall ();
+    virtual ~SpikeBall ();
+
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+
+    virtual void destroy (WorldEntity* killer);
+
+    virtual void tick (float dt);
+    virtual void draw () const;
+
+//     virtual void blow();
+
+  private:
+    static FastFactory*               fastFactory;
+
+    static SpriteParticles*           explosionParticles;
+
+    ParticleEmitter*                  emitter;
+
+    float                             speed;
+
+    float                             angle;
+    float                             rotationSpeed;
+
+    Billboard*                        halo;
+
+    WorldEntity* hitEntity; // FIXME TEMPORARY
+};
+
+#endif /* _SPIKE_BALL_H */
Index: branches/playability/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10168)
+++ branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10170)
@@ -27,4 +27,5 @@
 #include "weapons/heavy_blaster.h"
 #include "weapons/swarm_launcher.h"
+#include "weapons/spike_launcher.h"
 #include "weapons/boomerang_gun.h"
 #include "weapons/turret.h"
@@ -170,6 +171,6 @@
   //wpLeft3->setParent( this);
 
-  Weapon* cannon = new SwarmLauncher();
-  cannon->setName( "SwarmLauncher");
+  Weapon* cannon = new SpikeLauncher();
+  cannon->setName( "SpikeLauncher");
   //cannon->setParent( this);
 
Index: branches/playability/src/world_entities/weapons/heavy_blaster.cc
===================================================================
--- branches/playability/src/world_entities/weapons/heavy_blaster.cc	(revision 10168)
+++ branches/playability/src/world_entities/weapons/heavy_blaster.cc	(revision 10170)
@@ -35,4 +35,16 @@
 HeavyBlaster::~HeavyBlaster()
 {
+  for (int i = 0; i < this->getBarrels(); i++)
+  {
+    for(int j = 0; j < this->getSegs(); j++)
+    {
+      delete this->shootAnim[i][j];
+      delete this->objComp[i][j];
+    }
+    delete this->shootAnim[i];
+    delete this->objComp[i];
+    delete this->emissionPoint[i];
+  }
+
   this->deconstr();
      // model will be deleted from WorldEntity-destructor
@@ -69,5 +81,6 @@
 
   this->setCapability(WTYPE_ALLDIRS | WTYPE_DIRECTIONAL | WTYPE_LIGHT);
-  this->setProjectileTypeC("HBolt");   // FIXME temp project type until the blaste class exist
+ this->setProjectileTypeC("HBolt");   // FIXME temp project type until the blaste class exist
+//   this->setProjectileTypeC("SpikeBall");   // FIXME temp project type until the blaste class exist
   this->prepareProjectiles(5);
 
Index: branches/playability/src/world_entities/weapons/light_blaster.cc
===================================================================
--- branches/playability/src/world_entities/weapons/light_blaster.cc	(revision 10168)
+++ branches/playability/src/world_entities/weapons/light_blaster.cc	(revision 10170)
@@ -34,4 +34,17 @@
 LightBlaster::~LightBlaster()
 {
+  for (int i = 0; i < this->getBarrels(); i++)
+  {
+    for(int j = 0; j < this->getSegs(); j++)
+    {
+      delete this->shootAnim[i][j];
+      delete this->objComp[i][j];
+    }
+    delete this->shootAnim[i];
+    delete this->objComp[i];
+    delete this->emissionPoint[i];
+  }
+
+  this->deconstr();
       // model will be deleted from WorldEntity-destructor
 }
@@ -64,4 +77,5 @@
   //this->setProjectileTypeC("RailProjectile");   // FIXME temp project type until the blaste class exist
   this->setProjectileTypeC("LBolt");   // Working; FIXME: add textures
+//   this->setProjectileTypeC("Spike");   // Working; FIXME: add textures
   this->prepareProjectiles(100);
 
@@ -103,6 +117,6 @@
 
   for (int i = 0; i < this->getBarrels(); i++){
-    this->shootAnim[i][0]->addKeyFrame(Vector(), Quaternion(0.0, 0.0, 0.0), 0.04, ANIM_NULL, ANIM_LINEAR);
-    this->shootAnim[i][0]->addKeyFrame(Vector(), Quaternion(M_2_PI/3.0, 0.0, 0.0), 0.01, ANIM_NULL, ANIM_LINEAR);
+    this->shootAnim[i][0]->addKeyFrame(Vector(), Quaternion(i * 120, Vector(1.0, 0.0, 0.0)), 0.049, ANIM_NULL, ANIM_LINEAR);
+    this->shootAnim[i][0]->addKeyFrame(Vector(), Quaternion((i+1)*120, Vector(1.0, 0.0, 0.0)), 0.001, ANIM_NULL, ANIM_LINEAR);
   }
 
Index: branches/playability/src/world_entities/weapons/spike_launcher.cc
===================================================================
--- branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10170)
+++ branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10170)
@@ -0,0 +1,171 @@
+/*
+   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_launcher.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(SpikeLauncher);
+CREATE_FACTORY(SpikeLauncher);
+
+/**
+ *  standard constructor
+ *
+ * creates a new SpikeLauncher
+ */
+SpikeLauncher::SpikeLauncher()
+  : Weapon()
+{
+  this->init();
+}
+
+/**
+ * creates a new SpikeLauncher from a TiXmlElement
+ */
+SpikeLauncher::SpikeLauncher(const TiXmlElement* root)
+{
+  this->init();
+  if (root != NULL)
+    this->loadParams(root);
+}
+
+/**
+ *  standard deconstructor
+*/
+SpikeLauncher::~SpikeLauncher ()
+{
+  // model will be deleted from WorldEntity-destructor
+}
+
+void SpikeLauncher::init()
+{
+  this->registerObject(this, SpikeLauncher::_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 SpikeLauncher::loadParams(const TiXmlElement* root)
+{
+  Weapon::loadParams(root);
+}
+
+void SpikeLauncher::activate()
+{
+}
+
+void SpikeLauncher::deactivate()
+{
+}
+
+void SpikeLauncher::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 SpikeLauncher::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_launcher.h
===================================================================
--- branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10170)
+++ branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10170)
@@ -0,0 +1,34 @@
+/*!
+ * @file spike_launcher.h
+*/
+
+
+#ifndef _SPIKE_LAUNCHER_H
+#define _SPIKE_LAUNCHER_H
+
+#include "weapon.h"
+
+#define SPIKE_LAUNCHER_MAXRANGE = 500.0;
+
+class SpikeLauncher : public Weapon
+  {
+  ObjectListDeclaration(SpikeLauncher);
+  public:
+    SpikeLauncher ();
+    SpikeLauncher(const TiXmlElement* root);
+    virtual ~SpikeLauncher ();
+
+    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_LAUNCHER_H */
