Index: code/branches/3DPacman_FS18/data/levels/3DPacman.oxw
===================================================================
--- code/branches/3DPacman_FS18/data/levels/3DPacman.oxw	(revision 11842)
+++ code/branches/3DPacman_FS18/data/levels/3DPacman.oxw	(revision 11843)
@@ -29,4 +29,12 @@
     <Light type=directional position="0,0,0" direction="0.253, 0.593, -0.765" diffuse="1.0, 0.9, 0.9, 1.0" specular="1.0, 0.9, 0.9, 1.0"/>
     <SpawnPoint team=0 position="0,10,245" lookat="0,0,0" spawnclass=SpaceShip pawndesign=spaceshipescort />
+
+
+<PacmanGhost position="0,20,245">
+    <attached>
+        <Model position="0,0,0" mesh="PacmanGhostRed.mesh" scale="5" />
+    </attached>
+</PacmanGhost>
+
 
 <StaticEntity position="0,0,25" direction="0,0,0" collisionType=static mass=100000 friction=0.01 >
@@ -83,6 +91,6 @@
 </StaticEntity>
 
-<PortalEndPoint position="-240,10,0" id="1" distance="40" target="Pawn" design="PortalBig"/>
-<PortalEndPoint position="240,10,0" id="2" distance="40" target="Pawn" design="PortalBig"/>
+<PortalEndPoint position="-240,10,0" id="1" distance="40" target="Pawn"/>
+<PortalEndPoint position="240,10,0" id="2" distance="40" target="Pawn"/>
 <PortalLink fromID="1" toID="2" />
 <PortalLink fromID="2" toID="1" />
Index: code/branches/3DPacman_FS18/src/modules/CMakeLists.txt
===================================================================
--- code/branches/3DPacman_FS18/src/modules/CMakeLists.txt	(revision 11842)
+++ code/branches/3DPacman_FS18/src/modules/CMakeLists.txt	(revision 11843)
@@ -49,2 +49,3 @@
 ADD_SUBDIRECTORY(asteroids2D)
 ADD_SUBDIRECTORY(flappyorx)
+ADD_SUBDIRECTORY(Pacman)
Index: code/branches/3DPacman_FS18/src/modules/Pacman/CMakeLists.txt
===================================================================
--- code/branches/3DPacman_FS18/src/modules/Pacman/CMakeLists.txt	(revision 11843)
+++ code/branches/3DPacman_FS18/src/modules/Pacman/CMakeLists.txt	(revision 11843)
@@ -0,0 +1,17 @@
+SET_SOURCE_FILES(PICKUP_SRC_FILES
+  PacmanGhost.cc
+)
+
+ORXONOX_ADD_LIBRARY(Pacman
+  MODULE
+  FIND_HEADER_FILES
+  TOLUA_FILES
+
+  PCH_FILE
+
+  LINK_LIBRARIES
+    orxonox
+    objects
+    pickup
+  SOURCE_FILES ${PICKUP_SRC_FILES}
+)
Index: code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.cc
===================================================================
--- code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.cc	(revision 11843)
+++ code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.cc	(revision 11843)
@@ -0,0 +1,223 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Oli Scheuss
+ *   Co-authors:
+ *      Damian 'Mozork' Frick
+ *
+ */
+
+#include "PacmanGhost.h"
+
+#include "core/CoreIncludes.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+
+namespace orxonox
+{
+    RegisterClass(PacmanGhost);
+
+    /**
+    @brief
+        Constructor. Registers the object and initializes some default values.
+    @param creator
+        The creator of this object.
+    */
+    PacmanGhost::PacmanGhost(Context* context) : ControllableEntity(context)
+    {
+        RegisterObject(PacmanGhost);
+
+        this->localLinearAcceleration_.setValue(1, 1, 1);
+        this->localAngularAcceleration_.setValue(1, 1, 1);
+
+        this->velocity.setValue(1, 0, 0);
+
+        this->setCollisionType(CollisionType::Dynamic);
+
+        this->resetposition = Vector3(0,20,245); //Set Default start position
+        
+        this->actuelposition = this->getPosition();
+        
+        this->target_x = actuelposition.x;
+        this->target_z = actuelposition.z; 
+
+    }
+
+    /**
+    @brief
+        Destructor. Destroys controller, if present.
+    */
+    PacmanGhost::~PacmanGhost()
+    {
+        // Deletes the controller if the object was initialized and the pointer to the controller is not NULL.
+    }
+
+    /**
+    @brief
+        Method for creating a AutonomousDrone through XML.
+    */
+    void PacmanGhost::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(PacmanGhost, XMLPort, xmlelement, mode);
+
+        XMLPortParam(PacmanGhost, "primaryThrust", setPrimaryThrust, getPrimaryThrust, xmlelement, mode);
+        XMLPortParam(PacmanGhost, "auxiliaryThrust", setAuxiliaryThrust, getAuxiliaryThrust, xmlelement, mode);
+        XMLPortParam(PacmanGhost, "rotationThrust", setRotationThrust, getRotationThrust, xmlelement, mode);
+        XMLPortParam(PacmanGhost, "resetposition", setResetPosition, getResetPosition, xmlelement, mode);
+    }
+
+
+    
+    Vector3 possibleposition[] = {Vector3(0,10,245),Vector3(215,0,240)};
+
+    /**
+    @brief
+        Defines which actions the AutonomousDrone has to take in each tick.
+    @param dt
+        The length of the tick.
+    */
+    void PacmanGhost::tick(float dt)
+    {
+        SUPER(PacmanGhost, tick, dt);
+
+        this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() * getMass() * this->auxiliaryThrust_);
+        this->localLinearAcceleration_.setY(this->localLinearAcceleration_.y() * getMass() * this->auxiliaryThrust_);
+        if (this->localLinearAcceleration_.z() > 0)
+            this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->auxiliaryThrust_);
+        else
+            this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->primaryThrust_);
+        this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * this->localLinearAcceleration_);
+        this->localLinearAcceleration_.setValue(0, 0, 0);
+
+        this->localAngularAcceleration_ *= this->getLocalInertia() * this->rotationThrust_;
+        this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * this->localAngularAcceleration_);
+        this->localAngularAcceleration_.setValue(0, 0, 0);
+
+
+        this->actuelposition = this->getPosition();
+        
+        move();
+
+
+        /*
+
+        //Calculate next move
+
+        this->actuelposition = this->getPosition();
+
+        if(((this->actuelposition.x - this->target_x)<0.1) && ((this->actuelposition.z - this->target_z)<0.1)){
+                 this->ismoving = false;
+        }
+
+        if(this->ismoving){
+            if(!((this->actuelposition.z-target_z)<0.1))
+                moveFrontBack(sgn(this->actuelposition.z-this->target_z)*dt*100);
+            if(!((this->actuelposition.x-target_x)<0.1))
+              moveRightLeft(sgn(this->actuelposition.x-this->target_x)*dt*100); //Assume dt is quite small
+        }
+        
+        else{ //Check on which position ghost is
+            if(((this->actuelposition.x - possibleposition[0].x)<0.1) && ((this->actuelposition.z - possibleposition[0].z)<0.1)){
+                this->target_x = possibleposition[1].x;
+                this->target_z = possibleposition[1].z; 
+                this->ismoving = true;
+            }
+            else if(((actuelposition.x - possibleposition[1].x)<0.1) && ((actuelposition.z - possibleposition[1].z)<0.1)){
+                this->target_x = possibleposition[0].x;
+                this->target_z = possibleposition[0].z; 
+                this->ismoving = true;
+            }
+            else{
+            } //End of Position table
+            }
+             */
+    }
+
+
+
+
+    /**
+    @brief
+        Moves the AutonomousDrone in the negative z-direction (Front/Back) by an amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the movement.
+    */
+    void PacmanGhost::moveFrontBack(const Vector2& value)
+    {
+        this->setPosition(dt*(actuelposition + velocity_));
+    }
+
+    /**
+    @brief
+        Moves the AutonomousDrone in the x-direction (Right/Left) by an amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the movement.
+    */
+    void PacmanGhost::moveRightLeft(const Vector2& value)
+    {
+        this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() + value.x);
+    }
+
+    /**
+    @brief
+        Moves the AutonomousDrone in the y-direction (Up/Down) by an amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the movement.
+    */
+    void PacmanGhost::moveUpDown(const Vector2& value)
+    {
+        this->localLinearAcceleration_.setY(this->localLinearAcceleration_.y() + value.x);
+    }
+
+    /**
+    @brief
+        Rotates the AutonomousDrone around the y-axis by the amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the angular movement.
+    */
+    void PacmanGhost::rotateYaw(const Vector2& value)
+    {
+        this->localAngularAcceleration_.setY(this->localAngularAcceleration_.y() - value.x);
+    }
+
+    /**
+    @brief
+        Rotates the AutonomousDrone around the x-axis by the amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the angular movement.
+    */
+    void PacmanGhost::rotatePitch(const Vector2& value)
+    {
+        this->localAngularAcceleration_.setX(this->localAngularAcceleration_.x() + value.x);
+    }
+
+    /**
+    @brief
+        Rotates the AutonomousDrone around the z-axis by the amount specified by the first component of the input 2-dim vector.
+    @param value
+        The vector determining the amount of the angular movement.
+    */
+    void PacmanGhost::rotateRoll(const Vector2& value)
+    {
+        this->localAngularAcceleration_.setZ(this->localAngularAcceleration_.z() + value.x);
+    }
+
+}
Index: code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.h
===================================================================
--- code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.h	(revision 11843)
+++ code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhost.h	(revision 11843)
@@ -0,0 +1,146 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Oli Scheuss
+ *   Co-authors:
+ *      Damian 'Mozork' Frick
+ *
+ */
+
+#ifndef _PacmanGhost_H__
+#define _PacmanGhost_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "core/XMLPort.h"
+
+#include "worldentities/ControllableEntity.h"
+
+namespace orxonox {
+
+    class _OrxonoxExport PacmanGhost : public ControllableEntity
+    {
+        public:
+            PacmanGhost(Context* context);
+            virtual ~PacmanGhost();
+
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating an AutonomousDrone through XML.
+            virtual void tick(float dt); //!< Defines which actions the AutonomousDrone has to take in each tick.
+
+            virtual void moveFrontBack(const Vector2& value);
+            virtual void moveRightLeft(const Vector2& value);
+            virtual void moveUpDown(const Vector2& value);
+
+            virtual void rotateYaw(const Vector2& value);
+            virtual void rotatePitch(const Vector2& value);
+            virtual void rotateRoll(const Vector2& value);
+            
+            //virtual void resetGhost();
+            /**
+            @brief Moves the Drone in the Front/Back-direction by the specifed amount.
+            @param value  The amount by which the drone is to be moved.
+            */
+            inline void moveFrontBack(float value)
+            { this->moveFrontBack(Vector2(value, 0)); }
+            /**
+            @brief Moves the Drone in the Right/Left-direction by the specifed amount.
+            @param value  The amount by which the drone is to be moved.
+            */
+            inline void moveRightLeft(float value)
+            { this->moveRightLeft(Vector2(value, 0)); }
+            /**
+            @brief Moves the Drone in the Up/Down-direction by the specifed amount.
+            @param value  The amount by which the drone is to be moved.
+            */
+            inline void moveUpDown(float value)
+            { this->moveUpDown(Vector2(value, 0)); }
+
+            /**
+            @brief Rotates the Drone around the y-axis by the specifed amount.
+            @param value  The amount by which the drone is to be rotated.
+            */
+            inline void rotateYaw(float value)
+            { this->rotateYaw(Vector2(value, 0)); }
+            /**
+            @brief Rotates the Drone around the x-axis by the specifed amount.
+            @param value  The amount by which the drone is to be rotated.
+            */
+            inline void rotatePitch(float value)
+            { this->rotatePitch(Vector2(value, 0)); }
+            /**
+            @brief Rotates the Drone around the z-axis by the specifed amount.
+            @param value  The amount by which the drone is to be rotated.
+            */
+            inline void rotateRoll(float value)
+            { this->rotateRoll(Vector2(value, 0)); }
+
+            /**
+            @brief Sets the primary thrust to the input amount.
+            @param thrust The amount of thrust.
+            */
+            inline void setPrimaryThrust( float thrust )
+                { this->primaryThrust_ = thrust; }
+            inline void setAuxiliaryThrust( float thrust )
+                { this->auxiliaryThrust_ = thrust; }
+            inline void setRotationThrust( float thrust )
+                { this->rotationThrust_ = thrust; }
+
+            inline void setResetPosition(Vector3 rpos)
+                { this->resetposition = rpos; }    
+      
+            /**
+            @brief Gets the primary thrust to the input amount.
+            @return The amount of thrust.
+            */
+            inline float getPrimaryThrust()
+                { return this->primaryThrust_; }
+            inline float getAuxiliaryThrust()
+                { return this->auxiliaryThrust_; }
+            inline float getRotationThrust()
+                { return this->rotationThrust_; }
+            
+            inline Vector3 getResetPosition()
+               { return this->resetposition; }        
+
+
+
+        private:
+            
+            btVector3 localLinearAcceleration_; //!< The linear acceleration that is used to move the AutonomousDrone the next tick.
+            btVector3 localAngularAcceleration_; //!< The linear angular acceleration that is used to move the AutonomousDrone the next tick.
+            float primaryThrust_=100; //!< The amount of primary thrust. This is just used, when moving forward.
+            float auxiliaryThrust_=100; //!< The amount of auxilliary thrust. Used for all other movements (except for rotations).
+            float rotationThrust_=100; //!< The amount of rotation thrust. Used for rotations only.s
+            //Vector3 resetposition; //Start position for Ghost
+        
+            PacmanGhost* myGhost = nullptr;
+
+            bool ismoving = false;
+            int target_x = 0; 
+            int target_z = 0; 
+            Vector3 actuelposition;
+            Vector3 velocity;
+    };
+
+}
+
+#endif
Index: code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.cc
===================================================================
--- code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.cc	(revision 11843)
+++ code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.cc	(revision 11843)
@@ -0,0 +1,122 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Oli Scheuss
+ *   Co-authors:
+ *      Damian 'Mozork' Frick
+ *
+ */
+
+#include "PacmanGhostController.h"
+
+#include "PacmanGhost.h"
+#include "util/Math.h"
+
+namespace orxonox
+{
+    // Create the factory for the drone controller.
+	RegisterClass(PacmanGhostController);
+
+    /**
+    @brief
+        Constructor.
+    @param context
+        The context of this object.
+    */
+    PacmanGhostController::PacmanGhostController(Context* context) : Controller(context)
+    {
+        RegisterObject(PacmanGhostController);
+
+        PacmanGhost* myGhost = nullptr;
+        this->actuelposition = myGhost.getPosition();
+
+        bool ismoving = false;
+        this->target_x = actuelposition.x;
+        this->target_z = actuelposition.z;     
+    }
+
+    void PacmanGhostController::setGhost(PacmanGhost ghost){
+        this->myGhost = ghost;
+    }
+
+    /**
+    @brief
+        Destructor.
+    */
+    PacmanGhostController::~PacmanGhostController()
+    {
+
+    }
+
+
+    static Vector3[] possibleposition = [new Vector3(0,10,245), new Vector3(215,0,240)];
+    /**
+    @brief
+        The controlling happens here. This method defines what the controller has to do each tick.
+    @param dt
+        The duration of the tick.
+    */
+    void PacmanGhostController::tick(float dt)
+    {
+        /* NOTE: Ugly hack by Sandro to make the tutorial work for the moment.
+         * This will be reverted once the framework update is complete
+         */
+        //AutonomousDrone *myDrone = static_cast<AutonomousDrone*>(this->getControllableEntity());
+        ObjectList<PacmanGhost> objectList;
+        ObjectList<PacmanGhost>::iterator it = objectList.begin();
+        PacmanGhost* myDrone = *it;
+
+        if (this->myGhost != nullptr)
+        {
+
+            this->actuelposition = this->myGhost.getPosition();
+
+        if(((this->actuelposition.x - this->target_x)<0.1) && ((this->actuelposition.z - this->target_z)<0.1)){
+            this->ismoving = false;
+        }
+
+        if(this->ismoving){
+            if(!((this->actuelposition.z-target_z)<0.1))
+                moveFrontBack(sgn(this->actuelposition.z-this->target_z)*dt*100);
+            if(!((this->actuelposition.x-target_x)<0.1))
+              moveRightLeft(sgn(this->actuelposition.x-this->target_x)*dt*100); //Assume dt is quite small
+        }
+        
+        else{ //Check on which position ghost is
+            if(((this->actuelposition.x - possibleposition[0].x)<0.1) && ((this->actuelposition.z - possibleposition[1].z)<0.1)){
+                this->target_x = possibleposition[1].x;
+                this->target_z = possibleposition[1].z; 
+                this->ismoving = true;
+            }
+            else if(((actuelposition.x - possibleposition[0].x)<0.1) && ((actuelposition.z - possibleposition[1].z)<0.1)){
+                this->target_x = 0
+                this->target_z =  
+                this->ismoving = true;
+            }
+            else{
+            }      
+            } //End of Position table
+
+        }
+    }
+
+}
Index: code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.h
===================================================================
--- code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.h	(revision 11843)
+++ code/branches/3DPacman_FS18/src/modules/Pacman/PacmanGhostController.h	(revision 11843)
@@ -0,0 +1,54 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Oli Scheuss
+ *   Co-authors:
+ *      Damian 'Mozork' Frick
+ *
+ */
+
+#ifndef _PacmanGhostController_H__
+#define _PacmanGhostController_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Controller.h"
+#include "tools/interfaces/Tickable.h"
+
+namespace orxonox
+{
+
+    class _OrxonoxExport PacmanGhostController : public Controller, public Tickable
+    {
+        public:
+            PacmanGhostController(Context* context);
+            virtual ~PacmanGhostController();
+
+            virtual void tick(float dt); 
+
+        protected:
+
+        private:
+    };
+}
+
+#endif 
