Index: branches/playability/src/world_entities/projectiles/projectile_weapon.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/projectile_weapon.cc	(revision 10251)
+++ branches/playability/src/world_entities/projectiles/projectile_weapon.cc	(revision 10252)
@@ -182,5 +182,5 @@
 }
 
-void ProjectileWeapon::fire()
+void ProjectileWeapon::blow()
 {
 }
Index: branches/playability/src/world_entities/projectiles/projectile_weapon.h
===================================================================
--- branches/playability/src/world_entities/projectiles/projectile_weapon.h	(revision 10251)
+++ branches/playability/src/world_entities/projectiles/projectile_weapon.h	(revision 10252)
@@ -82,4 +82,11 @@
     inline float getAngle () { return this->angle; };
 
+    inline void updateAngle ( float dt ) { this->angle += this->rotationSpeed * dt; };
+
+    inline void setFragments( int frag ) { this->fragments = frag; };
+    inline int getFragments () { return this->fragments; };
+
+//     virtual void blow ();
+
   protected:
     // energy
@@ -100,9 +107,11 @@
     Vector                  rotationAxis;           //!< rotation axis
 
+    int                     fragments;                //!< Number of fragements created by the blow
+
     Vector                  velocity;                 //!< velocity of the projectile_weapon.
 
     PNode*                  target;                   //!< A target for guided Weapons.
 
-    virtual void            fire();
+    virtual void            blow();
 
 //     FastFactory             ff;
Index: branches/playability/src/world_entities/projectiles/spike_ball.cc
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10251)
+++ branches/playability/src/world_entities/projectiles/spike_ball.cc	(revision 10252)
@@ -31,6 +31,4 @@
 #include "space_ships/space_ship.h"
 
-// #include "weapons/weapon.h"
-// #include "../weapons/weapon_manager.h"
 
 #include "class_id_DEPRECATED.h"
@@ -65,4 +63,10 @@
   this->halo->setSize(2, 2);
   this->halo->setTexture("hbolt_halo.png");
+
+  this->setFragments(26);
+
+  this->size = 4;
+//   this->fastFactory = tFastFactory<Spike>::getFastFactory(CL_SPIKE, "Spike");
+
 /*
   this->weaponMan = new WeaponManager(dynamic_cast<WorldEntity*>(this));
@@ -118,5 +122,29 @@
   this->setDamage(5);
   this->setHealth(0);
-  this->rotationVector = VECTOR_RAND(1);
+  this->setRotationAxis(VECTOR_RAND(1));
+  this->setAngle();
+
+  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->getFragments() / 2;
+  for (int i = 0; i < tmp; i++)
+  {
+    this->launcher[i].normalize();
+    this->launcher[tmp + i] =  this->launcher[i] * (-1);
+  }
 }
 
@@ -143,28 +171,73 @@
 //   this->deactivate();
 }
+
+
+void SpikeBall::blow()
+{
+  Spike* pj = NULL;
+
+  for ( int i = 0; i < this->getFragments(); i++)
+  {
+    pj  = new Spike();
+    if (pj == NULL)
+      return;
+
+    pj->setParent(PNode::getNullParent());
+
+    pj->setVelocity(this->launcher[i].getNormalized() * 250.0);
+
+    pj->setParent(PNode::getNullParent());
+    pj->setAbsCoor(this->getAbsCoor() + this->launcher[i] * this->size);
+    Quaternion q;
+    pj->setAbsDir(q.lookAt(Vector(), this->launcher[i], VECTOR_RAND(1)));
 /*
-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();
-      }
-  }
-}*/
+    pj->setAbsCoor(this->getAbsCoor() + VECTOR_RAND(3));
+    pj->setAbsDir(this->getAbsDir());*/
+    pj->activate();
+  }
+}
+
+
+void SpikeBall::updateFireDir(){
+
+  float** m = new float* [3];
+  for( int i = 0; i < 3 ; i++)
+    m[i] = new float;
+
+  float nx, ny, nz, ca, sa;
+
+  nx = this->getRotationAxis().x;
+  ny = this->getRotationAxis().y;
+  nz = this->getRotationAxis().z;
+
+  ca = cos (this->getAngle());
+  sa = sin (this->getAngle());
+// final version below... easier to to cheat with the one above.
+
+  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->getFragments(); i++){
+//     printf("%i ", 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);
+  }
+//   printf("\n");
+
+  for( int i = 0; i < 3 ; i++)
+    delete m[i];
+  delete m;
+}
 
 
@@ -180,6 +253,7 @@
 
   if(this->lifeCycle > .9){
-    printf("called by spikeball  ");
-    this->weaponMan->fire();
+//     printf("called by spikeball  ");
+//     this->weaponMan->fire();
+//     this->blow();
   }
 
@@ -187,5 +261,6 @@
       this->deactivate();
 
-  angle += rotationSpeed * dt;
+  this->updateAngle( dt );
+//   angle += rotationSpeed * dt;
 }
 
Index: branches/playability/src/world_entities/projectiles/spike_ball.h
===================================================================
--- branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10251)
+++ branches/playability/src/world_entities/projectiles/spike_ball.h	(revision 10252)
@@ -1,5 +1,5 @@
 /*!
- * @file lbolt.h
- * @brief light blaster lbolt
+ * @file spike_ball.h
+ * @brief Noxonian SpikeBall Projectile; 2 stage weapon, splits into spikes
 */
 
@@ -8,4 +8,5 @@
 
 #include "projectile_weapon.h"
+#include "spike.h"
 #include "effects/billboard.h"
 
@@ -19,5 +20,4 @@
 class SpriteParticles;
 class ParticleEmitter;
-class FastFactory;
 class FastFactory;
 
@@ -41,8 +41,6 @@
     virtual void draw () const;
 
-    inline Vector getRotationVector() { return this->rotationVector; }
-    inline float getAngle() { return this->angle; }
-
-//     virtual void blow();
+//     inline Vector getRotationVector() { return this->rotationVector; }
+//     inline float getAngle() { return this->angle; }
 
   private:
@@ -63,5 +61,13 @@
     WorldEntity* hitEntity; // FIXME TEMPORARY
 
-    WeaponManager*                   weaponMan;
+//     WeaponManager*                   weaponMan;
+
+    void updateFireDir();
+    virtual void blow();
+
+//     int           spikes;
+    Vector*       launcher;
+    float         size;
+
 };
 
Index: branches/playability/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10251)
+++ branches/playability/src/world_entities/space_ships/space_ship.cc	(revision 10252)
@@ -166,5 +166,5 @@
   wpLeft2->setName( "MediumBlaster");
   //wpLeft2->setParent( this);
-  
+
   Weapon* wpRight3 = new HeavyBlaster (1);
   wpRight3->setName( "HeavyBlaster");
@@ -177,6 +177,6 @@
   cannon->setName( "SwarmLauncher");
 
-//   Weapon* spike = new SpikeThrower();
-//   spike->setName( "SpikeThrower" );
+  Weapon* spike = new SpikeThrower();
+  spike->setName( "SpikeThrower" );
 
   Weapon* spike2 = new SpikeLauncher();
@@ -202,8 +202,8 @@
 
   this->secWeaponMan.addWeapon( cannon, 0, 0);
-/*  this->secWeaponMan.addWeapon( spike, 1, 1);*/
+  this->secWeaponMan.addWeapon( spike, 1, 1);
   this->secWeaponMan.addWeapon( spike2, 2, 2);
 
-  
+
   this->weaponMan.changeWeaponConfig(3);
   this->secWeaponMan.changeWeaponConfig(2);
@@ -226,5 +226,5 @@
   shieldCur         = 20;
   shieldMax         = 100;
-  shieldTH          = .2* shieldMax;   // shield power must be 20% before shield kicks in again
+  shieldTH          = .2 * shieldMax;   // shield power must be 20% before shield kicks in again
 
   this->setHealth( 20);
Index: branches/playability/src/world_entities/weapons/spike_thrower.cc
===================================================================
--- branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10251)
+++ branches/playability/src/world_entities/weapons/spike_thrower.cc	(revision 10252)
@@ -20,4 +20,5 @@
 #include "world_entities/projectiles/projectile.h"
 #include "world_entities/projectiles/spike_ball.h"
+#include "world_entities/projectiles/spike.h"
 
 #include "model.h"
@@ -96,5 +97,5 @@
 
   this->setCapability(WTYPE_ALLDIRS | WTYPE_TURRET | WTYPE_DIRECTIONAL | WTYPE_LIGHT);
-  this->setProjectileTypeC("SpikeBall");
+  this->setProjectileTypeC("Spike");
 
 //   this->loadModel("models/guns/turret1.obj", 1.0);
Index: branches/playability/src/world_entities/weapons/weapon.cc
===================================================================
--- branches/playability/src/world_entities/weapons/weapon.cc	(revision 10251)
+++ branches/playability/src/world_entities/weapons/weapon.cc	(revision 10252)
@@ -586,5 +586,5 @@
 bool Weapon::fireW()
 {
-  printf("fireW Weapon\n");
+//   printf("fireW Weapon\n");
   //if (likely(this->currentState != WS_INACTIVE))
   if (this->minCharge <= this->energy)
Index: branches/playability/src/world_entities/weapons/weapon_manager.cc
===================================================================
--- branches/playability/src/world_entities/weapons/weapon_manager.cc	(revision 10251)
+++ branches/playability/src/world_entities/weapons/weapon_manager.cc	(revision 10252)
@@ -431,14 +431,14 @@
 void WeaponManager::fire()
 {
-  printf("firing WM: ");
+//   printf("firing WM: ");
   Weapon* firingWeapon;
   for(int i = 0; i < this->slotCount; i++)
   {
-    printf("%i ", i);
+//     printf("%i ", i);
 	  firingWeapon = this->currentSlotConfig[i].currentWeapon;
       if( firingWeapon != NULL && firingWeapon->getCurrentState() == WS_SHOOTING) continue;
 	  if( firingWeapon != NULL) firingWeapon->requestAction(WA_SHOOT);
   }
-  printf("\n");
+//   printf("\n");
   /*
 	this->crosshair->setRotationSpeed(500);
