Index: branches/presentation/src/world_entities/WorldEntities.am
===================================================================
--- branches/presentation/src/world_entities/WorldEntities.am	(revision 9129)
+++ branches/presentation/src/world_entities/WorldEntities.am	(revision 9131)
@@ -22,4 +22,5 @@
                 \
                 world_entities/weapons/test_gun.cc \
+                world_entities/weapons/laser_cannon.cc \
                 world_entities/weapons/turret.cc \
                 world_entities/weapons/aiming_turret.cc \
@@ -87,4 +88,5 @@
                 \
                 weapons/test_gun.h \
+                weapons/laser_cannon.cc \
                 weapons/cannon.h \
                 weapons/hyperblaster.h \
Index: branches/presentation/src/world_entities/space_ships/spacecraft_2d.cc
===================================================================
--- branches/presentation/src/world_entities/space_ships/spacecraft_2d.cc	(revision 9129)
+++ branches/presentation/src/world_entities/space_ships/spacecraft_2d.cc	(revision 9131)
@@ -301,5 +301,5 @@
         State::getCameraNode()->setRelCoorSoft(-3, 50,0);
         State::getCameraTargetNode()->setParentSoft(this->travelNode);
-        State::getCameraTargetNode()->setRelCoorSoft(0,0,0);
+        State::getCameraTargetNode()->setRelCoorSoft(5,0,1);
 
 
Index: branches/presentation/src/world_entities/weapons/laser_cannon.cc
===================================================================
--- branches/presentation/src/world_entities/weapons/laser_cannon.cc	(revision 9131)
+++ branches/presentation/src/world_entities/weapons/laser_cannon.cc	(revision 9131)
@@ -0,0 +1,219 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 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: Patrick Boenzli
+   co-programmer:
+
+
+   @todo: direction in which the projectile flights
+   @todo: a target to set/hit
+*/
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "laser_cannon.h"
+#include "world_entities/projectiles/projectile.h"
+
+#include "world_entity.h"
+#include "static_model.h"
+#include "weapon_manager.h"
+#include "util/loading/factory.h"
+
+#include "animation3d.h"
+
+#include "fast_factory.h"
+
+CREATE_FACTORY(LaserCannon, CL_LASER_CANNON);
+
+/**
+ *  standard constructor
+
+   creates a new weapon
+*/
+LaserCannon::LaserCannon ( int leftRight)
+  : Weapon()
+{
+  this->init();
+
+
+  this->leftRight = leftRight;
+
+  this->objectComponent1 = new PNode();
+  Animation3D* animation1 = this->getAnimation(WS_SHOOTING, this->objectComponent1);
+  Animation3D* animation2 = this->getAnimation(WS_ACTIVATING, this);
+  Animation3D* animation3 = this->getAnimation(WS_DEACTIVATING, this);
+  //parent->addChild(this->objectComponent1, PNODE_ALL);
+  this->addChild(this->objectComponent1);
+
+  animation1->setInfinity(ANIM_INF_CONSTANT);
+  animation2->setInfinity(ANIM_INF_CONSTANT);
+  animation3->setInfinity(ANIM_INF_CONSTANT);
+
+  if( this->leftRight == W_LEFT)
+  {
+    this->setEmissionPoint(1.0, -0.6, -0.2);
+
+    animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
+    animation1->addKeyFrame(Vector(-0.4, 0, 0), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
+    animation1->addKeyFrame(Vector(0, 0, 0), Quaternion(), 0.0, ANIM_LINEAR, ANIM_NULL);
+
+    animation2->addKeyFrame(Vector(0.0, 0.0, -1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+    animation2->addKeyFrame(Vector(0.0, 0.0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+
+    animation3->addKeyFrame(Vector(0.0, 0.0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+    animation3->addKeyFrame(Vector(0.0, 0.0, -1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+  }
+  else if( this->leftRight == W_RIGHT)
+  {
+    this->setEmissionPoint(1.0, -0.6, 0.3);
+
+    this->objectComponent1->setRelCoor(Vector(0,0,0.35));
+    animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
+    animation1->addKeyFrame(Vector(-0.4, 0, .5), Quaternion(), 0.1, ANIM_LINEAR, ANIM_NULL);
+    animation1->addKeyFrame(Vector(0, 0, .5), Quaternion(), 0.0, ANIM_LINEAR, ANIM_NULL);
+
+    animation2->addKeyFrame(Vector(.0, .0, 1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+    animation2->addKeyFrame(Vector(.0, .0, .0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+
+    animation3->addKeyFrame(Vector(.0, .0, 0.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+    animation3->addKeyFrame(Vector(.0, .0, 1.0), Quaternion(), 0.3, ANIM_LINEAR, ANIM_NULL);
+  }
+}
+
+
+LaserCannon::LaserCannon(const TiXmlElement* root)
+{
+  this->init();
+  if (root != NULL)
+    this->loadParams(root);
+}
+
+/**
+ *  standard deconstructor
+*/
+LaserCannon::~LaserCannon ()
+{
+  // model will be deleted from WorldEntity-destructor
+}
+
+
+void LaserCannon::init()
+{
+  this->setClassID(CL_LASER_CANNON, "LaserCannon");
+
+//  this->model = (Model*)ResourceManager::getInstance()->load("models/guns/laser_cannon.obj", OBJ, RP_CAMPAIGN);
+
+  this->loadModel("models/guns/laser_cannon.obj");
+
+  this->setStateDuration(WS_SHOOTING, .1);
+  this->setStateDuration(WS_RELOADING, .1);
+  this->setStateDuration(WS_ACTIVATING, .4);
+  this->setStateDuration(WS_DEACTIVATING, .4);
+
+  this->setEnergyMax(10000);
+  this->increaseEnergy(10000);
+  //this->minCharge = 2;
+
+  this->setActionSound(WA_SHOOT, "sound/laser.wav");
+  this->setActionSound(WA_ACTIVATE, "sound/voices/lasers.wav");
+
+
+  this->setCapability(WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
+  this->setProjectileType(CL_LASER);
+  this->prepareProjectiles(100);
+
+}
+
+
+void LaserCannon::loadParams(const TiXmlElement* root)
+{
+  Weapon::loadParams(root);
+
+}
+
+
+/**
+ *  this activates the weapon
+
+   This is needed, since there can be more than one weapon on a ship. the
+   activation can be connected with an animation. for example the weapon is
+   been armed out.
+*/
+void LaserCannon::activate()
+{
+}
+
+
+/**
+ *  this deactivates the weapon
+
+   This is needed, since there can be more than one weapon on a ship. the
+   activation can be connected with an animation. for example the weapon is
+   been armed out.
+*/
+void LaserCannon::deactivate()
+{
+}
+
+
+/**
+ *  fires the weapon
+
+   this is called from the player.cc, when fire-button is been pushed
+   @todo: the ObjectManager deliveres Projectiles not TestBullets! this should be diffrent
+*/
+void LaserCannon::fire()
+{
+  Projectile* pj =  this->getProjectile();
+  if (pj == NULL)
+    return;
+
+  pj->setParent(PNode::getNullParent());
+
+  pj->setVelocity(this->getAbsDir().apply(Vector(1,0,0))*250 + VECTOR_RAND(5));
+
+  pj->setAbsCoor(this->getEmissionPoint());
+  pj->setAbsDir(this->getAbsDir());
+  pj->activate();
+}
+
+
+
+/**
+ *  this will draw the weapon
+*/
+void LaserCannon::draw () const
+{
+  /* draw gun body */
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  glTranslatef (this->getAbsCoor ().x,
+                this->getAbsCoor ().y,
+                this->getAbsCoor ().z);
+
+  Vector tmpRot = this->getAbsDir().getSpacialAxis();
+  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
+
+  if( this->leftRight == W_RIGHT)
+    glScalef(1.0, 1.0, -1.0);
+  static_cast<StaticModel*>(this->getModel())->draw(1);
+  glPopMatrix();
+
+  /* draw objectComponent1: gun coil - animated stuff */
+  glPushMatrix();
+  glTranslatef (this->objectComponent1->getAbsCoor ().x,
+                this->objectComponent1->getAbsCoor ().y,
+                this->objectComponent1->getAbsCoor ().z);
+  tmpRot = this->objectComponent1->getAbsDir().getSpacialAxis();
+  glRotatef (this->objectComponent1->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
+  static_cast<StaticModel*>(this->getModel())->draw(0);
+  glPopMatrix();
+}
+
Index: branches/presentation/src/world_entities/weapons/laser_cannon.h
===================================================================
--- branches/presentation/src/world_entities/weapons/laser_cannon.h	(revision 9131)
+++ branches/presentation/src/world_entities/weapons/laser_cannon.h	(revision 9131)
@@ -0,0 +1,59 @@
+/*!
+    @file weapon.h
+  *  a weapon that a player can use
+
+    A Player has a list of weapons, that can be choosen to shoot projectiles
+    (projectiles.{cc,h}) at enemies. These weapons can be shooted sequentially
+    or (if able) combined. Therefore you can choose the weapon mode = choose
+    a weapon.
+
+    A weapon is characterized by:
+     o firing-rate: the initial firing rate of a weapon (1/s = Herz)
+     o slowdown-factor: this is a factor d: exp(-d*x), d is element of all positive R. it determines how fast the firing-rate will slow down. if no slowdown: d=0, the bigger d is, the faster the weapon will slow down!
+     o energy-consumption: this determines the energy that has to be used to produce this projectile = costs per projectile
+
+    Furthermore there are some other attributes, that will help to represent a firing
+    weapon in this world:
+     o sound file/ressource: this is a pointer to the sound-file/ressource. however it may be represented
+     o shooting animation
+
+*/
+
+
+#ifndef _LASER_CANNON_H
+#define _LASER_CANNON_H
+
+#include "weapon.h"
+
+
+//! a weapon can be left or right sided
+/**
+ * @todo this will be reset with mirror X/Y/Z
+ */
+#define    W_LEFT        0
+#define    W_RIGHT       1
+
+
+class LaserCannon : public Weapon
+  {
+  public:
+    LaserCannon (int leftRight);
+    LaserCannon (const TiXmlElement* root);
+    virtual ~LaserCannon ();
+
+    void init();
+    virtual void loadParams(const TiXmlElement* root);
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void fire();
+
+    virtual void draw() const;
+
+  private:
+    PNode* objectComponent1;         //<! the gun is made of multiple parts, these PNodes represent their location and orientation
+
+    int leftRight;   // this will become an enum
+  };
+#endif /* _LASER_CANNON_H */
