Index: branches/playability/src/world_entities/projectiles/spike_ball.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10180)
+++ branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10188)
@@ -60,9 +60,19 @@
 
   this->angle = 0;
-  this->rotationSpeed = 0;
+  this->rotationSpeed = 130;
+
+  this->halo = new Billboard();
+  this->halo->setSize(2, 2);
+  this->halo->setTexture("hbolt_halo.png");
 /*
-  this->halo = new Billboard();
-  this->halo->setSize(.35, .35);
-  this->halo->setTexture("hbolt_halo.png");*/
+//   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);
+*/
+
 }
 
@@ -105,4 +115,5 @@
   this->setDamage(5);
   this->setHealth(0);
+  this->rotationVector = VECTOR_RAND(1);
 }
 
@@ -197,5 +208,5 @@
   glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
 
-  glRotatef(angle, 1.0, 0.0, 0.0);
+  glRotatef(angle, this->rotationVector.x, this->rotationVector.y, this->rotationVector.z);
   this->getAbsDir().matrix (matrix);
   glMultMatrixf((float*)matrix);
Index: branches/playability/src/world_entities/projectiles/spike_ball.h
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10180)
+++ branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10188)
@@ -9,5 +9,8 @@
 #include "projectile.h"
 #include "effects/billboard.h"
+
+#include "../weapons/spike_launcher.h"
 #include "../weapons/weapon.h"
+#include "../weapons/weapon_manager.h"
 
 class Vector;
@@ -16,4 +19,6 @@
 class ParticleEmitter;
 class FastFactory;
+class WeaponManager;
+
 
 class SpikeBall : public Projectile
@@ -35,4 +40,7 @@
     virtual void draw () const;
 
+    inline Vector getRotationVector() { return this->rotationVector; }
+    inline float getAngle() { return this->angle; }
+
 //     virtual void blow();
 
@@ -48,8 +56,12 @@
     float                             angle;
     float                             rotationSpeed;
+    Vector                            rotationVector;
 
     Billboard*                        halo;
 
     WorldEntity* hitEntity; // FIXME TEMPORARY
+
+//     WeaponManager                     weaponMan;
+
 };
 
Index: branches/playability/src/world_entities/projectiles/swarm_projectile.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/swarm_projectile.cc	(revision 10180)
+++ branches/playability/src/world_entities/projectiles/swarm_projectile.cc	(revision 10188)
@@ -268,4 +268,6 @@
 
   this->angle += this->rotationSpeed * time;
+  while (this->angle > 360)
+    this->angle -= 360;
 
   this->lastDir = this->curDir;
@@ -309,5 +311,5 @@
   glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
   Vector tmpRot = this->getAbsCoor().cross(tmpDir);
-  glRotatef (angleDeg ( this->getAbsCoor(), tmpDir), tmpRot.x, tmpRot.y, tmpRot.z );
+  glRotatef (angleRad ( this->getAbsCoor(), tmpDir), tmpRot.x, tmpRot.y, tmpRot.z );
   glRotatef(this->angle, 1.0f, 0.0f, 0.0f); //spinning missile
   this->getAbsDir().matrix (matrix);
Index: branches/playability/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10180)
+++ branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10188)
@@ -200,5 +200,5 @@
   this->secWeaponMan.changeWeaponConfig(0);
 
-  curWeaponPrimary    = 1;
+  curWeaponPrimary    = 3;
   curWeaponSecondary  = 0;
 
Index: branches/playability/src/world_entities/weapons/heavy_blaster.cc
===================================================================
--- branches/playability/src/world_entities/weapons/heavy_blaster.cc	(revision 10180)
+++ branches/playability/src/world_entities/weapons/heavy_blaster.cc	(revision 10188)
@@ -81,5 +81,5 @@
 
   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/spike_launcher.cc
===================================================================
--- branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10180)
+++ branches/playability/src/world_entities/weapons/spike_launcher.cc	(revision 10188)
@@ -172,6 +172,53 @@
 }
 
+void SpikeLauncher::updateFireDir(Vector v, float angle){
+
+  float** m = new float* [3];
+  for( int i = 0; i < 3 ; i++)
+    m[i] = new float;
+
+  float nx, ny, nz, ca, sa;
+  nx = v.x;
+  ny = v.y;
+  nz = v.z;
+
+  ca = cos (angle);
+  sa = sin (angle);
+// 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
+
+  ca = cos (this->getParent()->getAngle());
+  sa = sin (this->getParent()->getAngle());*/
+
+  m[0][0] = nx * nx * (1 - ca) + ca;
+  m[0][1] = nx * ny * (1 - ca) + nz * sa;
+  m[0][2] = nx * nz * (1 - ca) - ny * sa;
+  m[1][0] = nx * nz * (1 - ca) - nz * sa;
+  m[1][1] = ny * ny * (1 - ca) + ca;
+  m[1][2] = ny * nz * (1 - ca) + nx * sa;
+  m[2][0] = nx * nz * (1 - ca) + ny * sa;
+  m[2][1] = ny * nz * (1 - ca) - nx * sa;
+  m[2][2] = nz * nz * (1 - ca) + ca;
+
+  float x, y, z;
+  for (int i = 0; i < this->spikes;i++){
+    x = m[0][0] * this->launcher[i].x + m[0][1] * this->launcher[i].y + m[0][2] * this->launcher[i].z;
+    y = m[1][0] * this->launcher[i].x + m[1][1] * this->launcher[i].y + m[1][2] * this->launcher[i].z;
+    z = m[2][0] * this->launcher[i].x + m[2][1] * this->launcher[i].y + m[2][2] * this->launcher[i].z;
+
+    this->launcher[i] = Vector (x, y, z);
+  }
+}
+
+
 void SpikeLauncher::fire()
 {
+  // temporary solution to test module
+  updateFireDir(VECTOR_RAND(1), 20);
+
+
   Projectile* pj = NULL;
 //   for( ObjectList<Playable>::const_iterator eIterator = Playable::objectList().begin(); eIterator !=Playable::objectList().end(); eIterator++)
Index: branches/playability/src/world_entities/weapons/spike_launcher.h
===================================================================
--- branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10180)
+++ branches/playability/src/world_entities/weapons/spike_launcher.h	(revision 10188)
@@ -28,4 +28,5 @@
     virtual void fire();
 
+    virtual void updateFireDir(Vector v, float angle);
 
   private:
