Index: /orxonox/trunk/core/npc.cc
===================================================================
--- /orxonox/trunk/core/npc.cc	(revision 1930)
+++ /orxonox/trunk/core/npc.cc	(revision 1931)
@@ -25,5 +25,8 @@
 
 
-NPC::NPC () {}
+NPC::NPC () 
+{
+  hasDied = 0;
+}
 
 NPC::~NPC () {}
@@ -58,12 +61,26 @@
 }
 
-
 void NPC::drawNPC(void) 
 {
-  glPushMatrix();
-  glTranslatef(xCor, yCor, 3.0);
-  //glScalef(1.0, 3.0, 1.0);
-  glutWireSphere(1.0, 10, 10);
-  glPopMatrix();
-  //cout << "Player::drawNPC()" << endl;
+  /* fix: died flag approach is very stupid, just to show @ convention */
+  if( hasDied == 0 ) {
+    glPushMatrix();
+    glTranslatef(xCor, yCor, 3.0);
+    //glScalef(1.0, 3.0, 1.0);
+    glutWireSphere(1.0, 10, 10);
+    glPopMatrix();
+  }
 }
+
+
+/* define the reaction, if the ship is been hit */
+int NPC::hit()
+{
+  die();
+  return 0;
+}
+
+void NPC::die()
+{
+  hasDied = 1;
+}
Index: /orxonox/trunk/core/npc.h
===================================================================
--- /orxonox/trunk/core/npc.h	(revision 1930)
+++ /orxonox/trunk/core/npc.h	(revision 1931)
@@ -27,5 +27,7 @@
   void addAI(AI* ai);
   void setCollisionRadius(float r);
-  float getCollisionRadius();
+  float getCollisionRadius(void);
+  int hit(void);
+  void die(void);
 
  private:
@@ -33,4 +35,5 @@
 
   int npcType;
+  int hasDied;
 
 
Index: /orxonox/trunk/core/orxonox.cc
===================================================================
--- /orxonox/trunk/core/orxonox.cc	(revision 1930)
+++ /orxonox/trunk/core/orxonox.cc	(revision 1931)
@@ -136,6 +136,7 @@
   cout << "got " << fps << " fps" << endl;
   /* this is very very unsafe: io could be uninit */
-  io->setPlayerStep(19.2 / fps); /* set player to propper speed */
-  localPlayer->shootLaser->setShootStep(fps/48.0); /* set shoot speed */
+  io->setPlayerStep(19.2/fps); /* set player to propper speed */
+  localPlayer->shootLaser->setShootStep(20.0/fps); /* set shoot speed */
+  world->setWorldStep(7.0/fps); /* set the speed of the terrain moving away */
   fps = 0;
   inputEnabled = true;
Index: /orxonox/trunk/core/player.cc
===================================================================
--- /orxonox/trunk/core/player.cc	(revision 1930)
+++ /orxonox/trunk/core/player.cc	(revision 1931)
@@ -75,22 +75,8 @@
 void Player::shoot(int n) 
 {
-  if (shootLaser->inhibitor++ <= 100)
-    shootLaser->addShoot(xCor, yCor, zCor);
-  else if (shootLaser->inhibitor++ <= 200)
-    shootLaser->addShootExt(xCor, yCor, zCor, .1, .4, .0);
-  else if (shootLaser->inhibitor++ <= 300)
-    shootLaser->addShootExt(xCor, yCor, zCor, -0.1, .4, .0);
-  else
-    shootLaser->inhibitor =0;
-  
-  if (shootRocket->inhibitor++ >=80)
-    {
-      shootRocket->addBackParable(xCor, yCor, zCor);
-      shootRocket->addSideAcc(xCor, yCor, zCor, RIGHT);
-      shootRocket->addSideAcc(xCor, yCor, zCor, LEFT);
-      shootRocket->addRotater(xCor, yCor, zCor);
-      if (shootRocket->inhibitor >=90)
-	shootRocket->inhibitor =0;
-    }
+  shootLaser->addShoot(xCor, yCor, zCor);
+  shootLaser->addShootExt(xCor, yCor, zCor, .1, .4, .0);
+  shootLaser->addShootExt(xCor, yCor, zCor, -0.1, .4, .0);
+  shootRocket->addShoot(xCor, yCor, zCor);
   //cout << "Player::shoot" << endl;
 }
Index: /orxonox/trunk/core/world.cc
===================================================================
--- /orxonox/trunk/core/world.cc	(revision 1930)
+++ /orxonox/trunk/core/world.cc	(revision 1931)
@@ -33,4 +33,5 @@
   lastEnv = null;
   primitiveMove = 0;
+  step = 0;
 }
 
@@ -104,4 +105,41 @@
 
 /** 
+   \brief Remove Non-Player Character
+   \param player A reference to the new npc object
+   
+   Remove a new Non-Player-Character to the game.
+*/
+bool World::removeNPC(NPC* npc) {
+
+  npcList* npcRef = lastNPC;
+  npcList* lastRef = lastNPC;
+  while ( npcRef != null ) 
+    {
+      if ( npcRef->npc == npc ) {
+	cout << "found" << endl;
+	if ( npcRef == lastRef ) {
+	  lastNPC = lastNPC->next;
+	  delete npcRef;
+	  npcRef = lastNPC;
+	  lastRef = lastNPC;
+	}
+	else {
+	  lastRef->next = npcRef->next;
+	  delete npcRef;
+	  npcRef = lastRef->next;
+	}
+	cout << "killed ..." << endl;
+      }
+      else {
+	lastRef = npcRef;
+	npcRef = npcRef->next;
+      }
+    }
+  cout << "npc left" << endl;
+}
+
+
+
+/** 
    \brief Add environmental object
    \param player A reference to the new env object
@@ -126,17 +164,4 @@
 }
 
-
-
-
-
-/** 
-   \brief Remove Non-Player Character
-   \param player A reference to the new npc object
-   
-   Remove a new Non-Player-Character to the game.
-*/
-bool World::removeNPC(NPC* npc) {
-  cout << "World::removeNPC not implemented yet" << endl;
-}
 
 
@@ -167,5 +192,4 @@
     }
 
-
   /* now draw the rest of the world: environement */
   envList* tmpEnv = lastEnv;
@@ -175,5 +199,4 @@
       tmpEnv = tmpEnv->next;
     }
-  
   
   /* draw the ground grid  */
@@ -189,7 +212,6 @@
 	}
     }
- glEnd();
- //glPopMatrix();
- 
+  glEnd();
+  
   glBegin(GL_LINES);
   for (int x = 0; x < 60; x += 2)
@@ -204,10 +226,10 @@
 
   //primitiveMove+=0.07;
-  DataTank::yOffset += 0.07;
+  DataTank::yOffset += step;
 
   tmpPlayer = lastPlayer;
   while( tmpPlayer != null ) 
     {
-      tmpPlayer->player->yCor += 0.07;
+      tmpPlayer->player->yCor += step;
       tmpPlayer = tmpPlayer->next;
     }
@@ -228,4 +250,12 @@
     }
 }
+
+
+void World::setWorldStep(float step)
+{
+  this->step = step;
+  cout << "setting speed to " << step << endl;
+}
+
 
 
@@ -250,5 +280,5 @@
   //cout << "World::detectCollision" << endl;
   float xOff, yOff, zOff, radius;
-  npcList* tmpNPC;
+  npcList* tmpNPC, *tmpRef;
 
   //cout << "World::detectCollsions" << endl;
@@ -256,4 +286,5 @@
   playerList* tmpPlayer = lastPlayer;
   Player* player = tmpPlayer->player;
+  int state;
   while( tmpPlayer != null ) 
     {
@@ -261,5 +292,7 @@
       while( tmpNPC != null )
 	{
+	  //cout << "npc != null" << endl;
 	  radius = tmpNPC->npc->collisionRadius;
+	  //cout << "worki" << endl;
 	  ShootLaser::shoot* shoota = tmpPlayer->player->shootLaser->lastShoot;
 	  while( shoota != null )
@@ -268,17 +301,33 @@
 	      yOff = shoota->yCor - tmpNPC->npc->yCor;
 	      zOff = shoota->zCor - tmpNPC->npc->zCor;
-	      if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius )
-		cout << "COLLISION " << endl;
+	      if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius ) 
+		{
+		  //cout << "COLLISION " << endl;
+		  int state = tmpNPC->npc->hit();
+		  /* state is a value that marks if the ship dies or not */
+		  /* if state == 0 the ship dies and we have to remove it */
+		  /*
+		  if ( state == 0 ) {
+		    tmpRef = tmpNPC;
+		    tmpNPC = tmpNPC->next;
+		    removeNPC(tmpRef->npc);
+		    break;
+		  }
+		  */
+		}
 	      shoota = shoota->next;
 	    }
+	  //cout << "changing npc..." << endl;
 	  tmpNPC = tmpNPC->next;
-	}
-      
+	  //cout << "..changing npc done" << endl;
+	}
+      //cout << "changing play..." << endl;
       tmpPlayer = tmpPlayer->next;
-    }
+      //cout << "changing play done" << endl;
+    }
+
+  //cout << "World::detectCollisions middle" << endl;
 
   /* second: check if any player hits an enemy */
-
-  
   tmpPlayer = lastPlayer;
   while( tmpPlayer != null ) 
@@ -291,6 +340,8 @@
 	  yOff = tmpPlayer->player->yCor - tmpNPC->npc->yCor;
 	  zOff = tmpPlayer->player->zCor - tmpNPC->npc->zCor;
-	  if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius )
-	    cout << "COLLISION " << endl;
+	  if ( sqrt(xOff*xOff + yOff*yOff + zOff*zOff) < radius ) {
+	    //cout << "COLLISION " << endl;
+	    tmpNPC->npc->hit();
+	  }
 	  
 	  tmpNPC = tmpNPC->next;
Index: /orxonox/trunk/core/world.h
===================================================================
--- /orxonox/trunk/core/world.h	(revision 1930)
+++ /orxonox/trunk/core/world.h	(revision 1931)
@@ -65,4 +65,5 @@
   void drawWorld(void);
   void initEnvironement(void);
+  void setWorldStep(float step);
   void updateWorld(void);
   void detectCollision(void);
@@ -71,4 +72,5 @@
  private:
   float surface[120][120];
+  float step;
 
 
