[Orxonox-commit 7594] r12190 - in code/trunk: . data/levels src/modules/towerdefense

merholzl at orxonox.net merholzl at orxonox.net
Thu Feb 21 15:02:00 CET 2019


Author: merholzl
Date: 2019-02-21 15:02:00 +0100 (Thu, 21 Feb 2019)
New Revision: 12190

Added:
   code/trunk/src/modules/towerdefense/TowerDefenseController.cc
   code/trunk/src/modules/towerdefense/TowerDefenseController.h
   code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.cc
   code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.h
Modified:
   code/trunk/
   code/trunk/data/levels/towerDefense.oxw
   code/trunk/src/modules/towerdefense/CMakeLists.txt
   code/trunk/src/modules/towerdefense/TowerDefense.cc
   code/trunk/src/modules/towerdefense/TowerDefense.h
   code/trunk/src/modules/towerdefense/TowerDefenseEnemy.cc
   code/trunk/src/modules/towerdefense/TowerDefenseField.cc
   code/trunk/src/modules/towerdefense/TowerDefensePrereqs.h
   code/trunk/src/modules/towerdefense/towerdefensereadme.txt
Log:
TD merge

Index: code/trunk
===================================================================
--- code/trunk	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk	2019-02-21 14:02:00 UTC (rev 12190)

Property changes on: code/trunk
___________________________________________________________________
Modified: svn:mergeinfo
## -27,6 +27,7 ##
 /code/branches/StoryModeMap_HS16:11221-11358
 /code/branches/SuperOrxoBros_FS17:11365-11448
 /code/branches/SuperOrxoBros_FS18:11820-12030
+/code/branches/TowerDefense_HS18:12025-12189
 /code/branches/Waypoints_HS17:11496-11773
 /code/branches/ai:6592-7033
 /code/branches/ai2:8721-8880
Modified: code/trunk/data/levels/towerDefense.oxw
===================================================================
--- code/trunk/data/levels/towerDefense.oxw	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/data/levels/towerDefense.oxw	2019-02-21 14:02:00 UTC (rev 12190)
@@ -22,7 +22,7 @@
 <Template name=selectercameras defaults=0>
   <TowerDefenseSelecter>
     <camerapositions>
-      <CameraPosition position="0,0,1300" lookat="0,0,0" absolute=true drag=true mouselook=true/>
+      <CameraPosition position="-50,-1300,1000" lookat="-50,0,-400" absolute=true drag=true mouselook=true/>
     </camerapositions>
   </TowerDefenseSelecter>
 </Template>
@@ -249,6 +249,216 @@
    spawnparticleduration  = 3
    explosionchunks        = 6
 
+   health            = 100
+   maxhealth         = 10000000000000
+   initialhealth     = 100
+
+   shieldhealth        = 1000
+   initialshieldhealth = 1000
+   maxshieldhealth     = 10000000000000
+   shieldabsorption    = 0.8
+   shieldrechargerate = 1
+   shieldrechargewaittime = 1
+
+   primaryThrust     = 100
+   auxilaryThrust    = 30
+   rotationThrust    = 80
+
+   lift = 1;
+   stallSpeed = 220;
+
+   boostPower            = 15
+   boostPowerRate        = 1
+   boostRate             = 5
+   boostCooldownDuration = 10
+
+   shakeFrequency = 15
+   shakeAmplitude = 9
+
+   collisionType     = "dynamic"
+   mass              = 100
+   linearDamping     = 0.7
+   angularDamping    = 0.9999999
+
+   explosionSound = "sounds/Explosion2.ogg"
+  >
+
+    <engines>
+      <Engine position=" 0, 0, 0" 
+        boostfactor    = 2
+        speedfront     = 400
+        speedback      =  50
+        speedleftright =  50
+        speedupdown    =  50        
+        accelerationfront     = 500
+        accelerationbrake     = 500
+        accelerationback      =  125
+        accelerationleftright =  125
+        accelerationupdown    =  125
+      />
+    </engines>
+    <attached>
+      <Model position="0,0,0" yaw=180 pitch=0 roll=0 scale=10 mesh="finalenemy1.mesh" /> 
+    </attached>
+    <collisionShapes>
+      <BoxCollisionShape position="0,0,0"      halfExtents="10, 3, 5" />
+      <BoxCollisionShape position="13,-1.3,0"  halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="-13,-1.3,0" halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="0,0,7"      halfExtents="3, 2, 2" />
+      <BoxCollisionShape position="0,0.1,-11"  halfExtents="2.2, 1.8, 6" />
+      <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
+    </collisionShapes> 
+    </TowerDefenseEnemy>
+</Template>
+
+<Template name=enemytowerdefense2>
+  <TowerDefenseEnemy
+   hudtemplate            = spaceshiphud
+   camerapositiontemplate = spaceshipassffcameras
+   spawnparticlesource    = "Orxonox/fairytwirl"
+   spawnparticleduration  = 3
+   explosionchunks        = 6
+
+   health            = 40
+   maxhealth         = 10000000000000
+   initialhealth     = 30
+
+   shieldhealth        = 0
+   initialshieldhealth = 0
+   maxshieldhealth     = 0
+   shieldabsorption    = 0.8
+   shieldrechargerate = 1
+   shieldrechargewaittime = 1
+
+   primaryThrust     = 100
+   auxilaryThrust    = 30
+   rotationThrust    = 80
+
+   lift = 1;
+   stallSpeed = 220;
+
+   boostPower            = 15
+   boostPowerRate        = 1
+   boostRate             = 5
+   boostCooldownDuration = 10
+
+   shakeFrequency = 15
+   shakeAmplitude = 9
+
+   collisionType     = "dynamic"
+   mass              = 100
+   linearDamping     = 0.7
+   angularDamping    = 0.9999999
+
+   explosionSound = "sounds/Explosion2.ogg"
+  >
+
+    <engines>
+      <Engine position=" 0, 0, 0" 
+        boostfactor    = 2
+        speedfront     = 100
+        speedback      =  50
+        speedleftright =  50
+        speedupdown    =  50        
+        accelerationfront     = 500
+        accelerationbrake     = 500
+        accelerationback      =  125
+        accelerationleftright =  125
+        accelerationupdown    =  125
+      />
+    </engines>
+    <attached>
+      <Model position="0,0,0" yaw=180 pitch=0 roll=0 scale=7.5 mesh="finalenemy2.mesh" /> 
+    </attached>
+    <collisionShapes>
+      <BoxCollisionShape position="0,0,0"      halfExtents="10, 3, 5" />
+      <BoxCollisionShape position="13,-1.3,0"  halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="-13,-1.3,0" halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="0,0,7"      halfExtents="3, 2, 2" />
+      <BoxCollisionShape position="0,0.1,-11"  halfExtents="2.2, 1.8, 6" />
+      <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
+    </collisionShapes> 
+    </TowerDefenseEnemy>
+</Template>
+
+<Template name=enemytowerdefense3>
+  <TowerDefenseEnemy
+   hudtemplate            = spaceshiphud
+   camerapositiontemplate = spaceshipassffcameras
+   spawnparticlesource    = "Orxonox/fairytwirl"
+   spawnparticleduration  = 3
+   explosionchunks        = 6
+
+   health            = 50
+   maxhealth         = 10000000000000
+   initialhealth     = 50
+
+   shieldhealth        = 20
+   initialshieldhealth = 20
+   maxshieldhealth     = 10000000000000
+   shieldabsorption    = 0.8
+   shieldrechargerate = 1
+   shieldrechargewaittime = 1
+
+   primaryThrust     = 100
+   auxilaryThrust    = 30
+   rotationThrust    = 80
+
+   lift = 1;
+   stallSpeed = 220;
+
+   boostPower            = 15
+   boostPowerRate        = 1
+   boostRate             = 5
+   boostCooldownDuration = 10
+
+   shakeFrequency = 15
+   shakeAmplitude = 9
+
+   collisionType     = "dynamic"
+   mass              = 100
+   linearDamping     = 0.7
+   angularDamping    = 0.9999999
+
+   explosionSound = "sounds/Explosion2.ogg"
+  >
+
+    <engines>
+      <Engine position=" 0, 0, 0" 
+        boostfactor    = 2
+        speedfront     = 100
+        speedback      =  50
+        speedleftright =  50
+        speedupdown    =  50        
+        accelerationfront     = 500
+        accelerationbrake     = 500
+        accelerationback      =  125
+        accelerationleftright =  125
+        accelerationupdown    =  125
+      />
+    </engines>
+    <attached>
+      <Model position="0,0,0" yaw=180 pitch=0 roll=0 scale=19 mesh="finalenemy3.mesh" /> 
+    </attached>
+    <collisionShapes>
+      <BoxCollisionShape position="0,0,0"      halfExtents="10, 3, 5" />
+      <BoxCollisionShape position="13,-1.3,0"  halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="-13,-1.3,0" halfExtents="3, 1, 2" />
+      <BoxCollisionShape position="0,0,7"      halfExtents="3, 2, 2" />
+      <BoxCollisionShape position="0,0.1,-11"  halfExtents="2.2, 1.8, 6" />
+      <BoxCollisionShape position="0,0.1,-19"  halfExtents="1.4, 1, 2" />
+    </collisionShapes> 
+   </TowerDefenseEnemy>
+</Template>
+
+<Template name=enemytowerdefense1*>
+  <TowerDefenseEnemy
+   hudtemplate            = spaceshiphud
+   camerapositiontemplate = spaceshipassffcameras
+   spawnparticlesource    = "Orxonox/fairytwirl"
+   spawnparticleduration  = 3
+   explosionchunks        = 6
+
    health            = 15
    maxhealth         = 15
    initialhealth     = 15
@@ -306,7 +516,7 @@
   </TowerDefenseEnemy>
 </Template>
 
-<Template name=enemytowerdefense2>
+<Template name=enemytowerdefense2*>
   <TowerDefenseEnemy
    hudtemplate            = spaceshiphud
    camerapositiontemplate = spaceshipassffcameras
@@ -363,7 +573,7 @@
       />
     </engines>
     <attached>
-      <Model position="0,0,0" yaw=0 pitch=0 roll=0 scale=2.5 mesh="JumpEnemy3.mesh" />
+      <Model position="0,0,0" yaw=0 pitch=0 roll=0 scale=9 mesh="finalenemy4.mesh" /> 
     </attached>
     <collisionShapes>
       <BoxCollisionShape position="0,0,0"      halfExtents="10, 3, 5" />
@@ -379,7 +589,7 @@
   </TowerDefenseEnemy>
 </Template>
 
-<Template name=enemytowerdefense3>
+<Template name=enemytowerdefense3*>
   <TowerDefenseEnemy
    hudtemplate            = spaceshiphud
    camerapositiontemplate = spaceshipassffcameras
@@ -436,7 +646,7 @@
       />
     </engines>
     <attached>
-      <Model position="0,0,0" yaw=0 pitch=0 roll=0 scale=2.5 mesh="JumpEnemy4.mesh" />
+      <Model position="0,0,0" yaw=0 pitch=0 roll=0 scale=2.5 mesh="JumpEnemy4.mesh" /> 
     </attached>
     <collisionShapes>
       <BoxCollisionShape position="0,0,0"      halfExtents="10, 3, 5" />
@@ -452,6 +662,15 @@
   </TowerDefenseEnemy>
 </Template>
 
+<Template name=therangeviewer>
+  <TowerDefenseRangeViewer>
+      <attached>
+        <Model yaw=0 pitch=0 roll=0 scale3D="1000,1000,10" mesh="cylinder.mesh" /> 
+      </attached>
+    </TowerDefenseRangeViewer>
+</Template>
+
+
 <Level plugins = "towerdefense" gametype = "TowerDefense">
   <templates>
     <Template link=lodtemplate_default />
@@ -494,22 +713,22 @@
     tower3Cost=100
     tower4Cost=100
     tower5Cost=100
-    fields="F1F1F1R1I1I1I1I1O1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1Y1Y1Y1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1I2F1F1F1F1F1F1F1Y1Y1Y1F1F1
-            F1F1F1R2I3I3I3I3L3F1F1F1F1F1F1F1
-            F1F1F1F1F1F1F1F1I2F1F1F1F1F1F1F1
-            F1F1F1F1F1F1F1F1I2F1F1F1F1F1F1F1
-            X1I1I1I1R0F1F1F1I2F1F1F1F1F1F1F1
-            F1F1F1F1I0F1F1F1I2F1F1F1F1F1F1F1
-            F1F1F1F1I0F1F1F1I2F1F1F1F1F1F1F1
-            F1F1F1F1L1I1I1I1L2F1F1F1F1F1F1F1
-            F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
-            F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1"
+    fields="F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1
+	        F1F1F1R1I1I1I1I1I1I1I1I1I1I1R0F1
+            F1F1F1I2F1F1F1Y1F1F1F1F1F1F1I0F1
+            F1Y1F1I2F1F1F1F1F1F1F1F1Y1F1I0F1
+            F1F1F1I2F1F1F1F1F1F1F1F1F1F1I0F1
+            F1F1F1I2F1Y1F1F1F1F1F1L0I3I3R3F1
+            F1F1F1I2F1F1F1F1F1F1F1I0F1F1F1F1
+            F1F1F1R2I3I3I3I3L3F1F1I0F1F1Y1F1
+            F1F1F1F1F1F1F1F1I2F1F1I0F1F1F1F1
+            F1F1F1F1F1F1F1F1I2F1F1I0F1F1F1F1
+            X1I1I1I1R0F1Y1F1I2F1F1I0F1F1F1F1
+            F1F1F1F1I0F1F1F1I2F1F1L1I1I1R0F1
+            F1F1F1F1I0F1F1F1I2F1F1F1F1F1I0F1
+            F1F1F1F1L1I1I1I1L2F1F1F1F1Y1I0F1
+            F1F1Y1F1F1F1F1F1F1F1F1F1F1F1I0F1
+            F1F1F1F1F1F1F1F1F1Y1F1F1F1F1O0F1"
     width=16
     height=16
     tileScale=100
@@ -519,7 +738,7 @@
     mass=100000
     >
       <camerapositions>
-        <CameraPosition position="0,0,1400" lookat="0,0,0" absolute=true />
+        <CameraPosition position="0,0,1500" lookat="0,0,0" absolute=true />
       </camerapositions>    
     </TowerDefenseCenterpoint>
 

Modified: code/trunk/src/modules/towerdefense/CMakeLists.txt
===================================================================
--- code/trunk/src/modules/towerdefense/CMakeLists.txt	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/CMakeLists.txt	2019-02-21 14:02:00 UTC (rev 12190)
@@ -9,6 +9,8 @@
   TowerDefenseSelecter.cc
   TowerDefenseField.cc
   TDCoordinate.cc
+  TowerDefenseController.cc
+  TowerDefenseRangeViewer.cc
 )
 
 ORXONOX_ADD_LIBRARY(towerdefense

Modified: code/trunk/src/modules/towerdefense/TowerDefense.cc
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefense.cc	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/TowerDefense.cc	2019-02-21 14:02:00 UTC (rev 12190)
@@ -75,13 +75,17 @@
 #include "TowerDefenseTower.h"
 #include "TowerDefenseCenterpoint.h"
 #include "worldentities/SpawnPoint.h"
-#include "controllers/WaypointController.h"
+#include "worldentities/StaticEntity.h"
+#include "TowerDefenseController.h" //muss ich noch in den richtigen Ordner verschieben
 #include "graphics/Model.h"
 #include "infos/PlayerInfo.h"
 #include "chat/ChatManager.h"
 #include "core/CoreIncludes.h"
 #include "Highscore.h"
+#include "util/Output.h"
+#include "TowerDefenseRangeViewer.h"
 
+
 namespace orxonox
 {
     RegisterUnloadableClass(TowerDefense);
@@ -91,6 +95,7 @@
         RegisterObject(TowerDefense);
 
         selecter = nullptr;
+        rangeViewer = nullptr;
         this->player_ = nullptr;
         this->setHUDTemplate("TowerDefenseHUD");
         this->waveNumber_ = 0;
@@ -123,8 +128,14 @@
             {
                 selecter = new TowerDefenseSelecter(this->center_->getContext());                
             }
+            if(rangeViewer == nullptr){
+                rangeViewer = new TowerDefenseRangeViewer(this->center_->getContext());
+            }
             selecter->addTemplate(center_->getSelecterTemplate());
+            rangeViewer->addTemplate("therangeviewer");
+            rangeViewer->setPosition(-10000,0,-500);
             center_->attach(selecter);
+            center_->attach(rangeViewer);
         }
         else // If no centerpoint was specified, an error is thrown and the level is exited.
         {
@@ -135,6 +146,7 @@
         enemies_.clear();
 
         createFields();
+
         TeamDeathmatch::start();
 
         //set initial credits, lifes and WaveNumber
@@ -156,27 +168,32 @@
         case 1 :
             en1->addTemplate("enemytowerdefense1");
             en1->setScale(3);
-            en1->setHealth(en1->getHealth() + this->getWaveNumber()*4);
+            en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.5*(en1->getHealth()));
+            en1->setShieldHealth(en1->getShieldHealth() + this->getWaveNumber()*1/3*0.5*(en1->getShieldHealth()));
             break;
 
         case 2 :
             en1->addTemplate("enemytowerdefense2");
             en1->setScale(2);
-            en1->setHealth(en1->getHealth() + this->getWaveNumber()*4);
+            en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.3*(en1->getHealth()));
             break;
 
         case 3 :
             en1->addTemplate("enemytowerdefense3");
             en1->setScale(1);
-            en1->setHealth(en1->getHealth() + this->getWaveNumber()*4);
+            en1->setHealth(en1->getHealth() + this->getWaveNumber()*1/3*0.2*(en1->getHealth()));
+            en1->setShieldHealth(en1->getShieldHealth() + this->getWaveNumber()*1/3*0.5*(en1->getShieldHealth()));
             break;
         }        
 
         en1->setTeam(2);
 
-        WaypointController* controller = (WaypointController*)(en1->getXMLController());
+        //Jedem Enemy wird ein eigener Controller uebergeben
+        TowerDefenseController* controller = new TowerDefenseController(this->center_->getContext()); 
+        controller->setControllableEntity(en1);
+        en1->setController(controller);
 
-        if (controller != nullptr && waypoints_.size() > 1)
+        if (waypoints_.size() > 1)
         {
             en1->setPosition(waypoints_.at(0)->getPosition() + offset_);
             en1->setOrientation(Vector3(0,0,10), Degree(0));
@@ -191,7 +208,8 @@
             }
         }
 
-        enemies_.push_back(en1);
+        auto pair = std::make_pair(orxonox::WeakPtr<TowerDefenseEnemy>(en1), controller);
+        enemies_.push_back(pair);
     }
 
 
@@ -276,6 +294,12 @@
         timeUntilNextWave_ -= dt;
         timeSinceLastSpawn_ += dt;
 
+        if(selecter != nullptr && getField(selecter->selectedPos_)->canUpgrade() == true ){
+            rangeViewer->setPosition(((selecter->selectedPos_->GetX())-8)*100, ((selecter->selectedPos_->GetY())-8)*100, 200);
+        } else {
+            rangeViewer->setPosition(-10000,0,-500);
+        }
+
         //build/upgrade tower at selecter position
         if (selecter != nullptr && selecter->buildTower_ == true)
         {
@@ -290,24 +314,50 @@
                 addTower(selecter->selectedPos_->GetX(), selecter->selectedPos_->GetY());
             }            
         }
+                
         
-        for (std::list<WeakPtr<TowerDefenseEnemy>>::iterator it = enemies_.begin(); it != enemies_.end(); )
+        for (EnemyList::iterator it = enemies_.begin(); it != enemies_.end(); )
         {
-            if (*it == nullptr)
+            WeakPtr<TowerDefenseEnemy> enemy = it->first;
+            TowerDefenseController* ctrl = it->second;
+
+            if (enemy == nullptr)
             {
-                // the enemy was destroyed by a tower - remove it from the list
-                enemies_.erase(it++);
-                addCredit(1);
+
+                // the enemy was destroyed by a tower - remove it from the list AND destroy the corresponding controler
+                ctrl->destroy();
+                it = enemies_.erase(it);
+                
+                int currentType = this->getWaveNumber() % 3 + 1;
+                switch (currentType){ //Entscheidet, wie viele Credits vergeben werden sollen
+                    case 1: //currently boss wave
+                        addCredit(100);
+                        if (this->getLifes() <= 90)
+                        {
+                            this->setLifes(this->getLifes() + 10);
+                        }
+                        break;
+
+                    case 2: //currently mass wave
+                        addCredit(5);
+                        break;
+
+                    case 3: //currently moderate wave
+                        addCredit(10);
+                        break;
+                }
             }
             else
             {
                 //if ships are at the end they get destroyed
-                Vector3 ship = (*it)->getRVWorldPosition();
+                Vector3 ship = enemy->getRVWorldPosition();
                 float distance = ship.distance(endpoint_);
                 if(distance < 40)
                 {
-                    (*it)->destroy();
-                    enemies_.erase(it++);
+                    enemy->getController()->destroy();
+                    enemy->destroy();
+
+                    it = enemies_.erase(it);
                     this->reduceLifes(1);
                     if (this->getLifes() == 0)
                     {
@@ -327,16 +377,30 @@
             // Add new enemy
             timeSinceLastSpawn_ -= 1.0;
             -- waveSize_;
-            addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1);
+            addTowerDefenseEnemy(this->getWaveNumber() % 3 + 1); //Gegnertyp rotiert durch die 3 moeglichen, er beginnt bei Typ 2!!!
         }
         else if (timeUntilNextWave_ <= 0.0 && waveSize_ <= 0)
         {
+            int currentType = this->getWaveNumber() % 3 + 1;
             //New wave
             ++ waveNumber_;
             timeSinceLastSpawn_ = 0.0;
 
             timeUntilNextWave_ = waveNumber_+20.0f;
-            waveSize_ = waveNumber_+5;
+            // Entscheidung, wie gross die einzelnen waves sein sollen.
+            switch (currentType){
+                case 1: //currently boss wave
+                    waveSize_ = waveNumber_+10;
+                    break;
+
+                case 2: //currently mass wave
+                    waveSize_ = (waveNumber_+10)/2;
+                    break;
+
+                case 3: //currently moderate wave
+                    waveSize_ = 1;
+                    break;
+            }
         }
 
     }
@@ -348,9 +412,9 @@
         TDCoordinate startCoord(0,0);
         std::string fields = center_->getFields();
         int pos = 0;
-        for (int j = 15; j >= 0; --j)
+        for (int j = 15; j >= 0; --j) //Vertical number of rows
         {
-            for (int i = 0; i < 16; ++i)
+            for (int i = 0; i <= 15; ++i) //Horizontal number of rows
             {
                 coord.Set(i,j);
                 fields_[i][j] = new TowerDefenseField(center_->getContext());
@@ -411,6 +475,7 @@
             return nextCoord;
         }
 
+        //Falls kein anliegender Weg gefunden wurde.
         delete nextCoord;
         return nullptr;
     }

Modified: code/trunk/src/modules/towerdefense/TowerDefense.h
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefense.h	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/TowerDefense.h	2019-02-21 14:02:00 UTC (rev 12190)
@@ -31,14 +31,18 @@
 #define _TowerDefense_H__
 #include "TDCoordinate.h"
 #include "TowerDefenseSelecter.h"
+#include "TowerDefenseController.h"
 #include "towerdefense/TowerDefensePrereqs.h"
 #include "gametypes/TeamDeathmatch.h"
 #include "TowerDefenseEnemy.h"
 #include "util/Output.h"
 #include "TowerDefenseField.h"
+#include "TowerDefenseRangeViewer.h"
 
 namespace orxonox
 {
+    using EnemyList = std::list<std::pair<orxonox::WeakPtr<TowerDefenseEnemy>, TowerDefenseController*>>;
+
     /**
     @brief
     GameType class for TowerDefense. See TowerDefenseReadme.txt for Information.
@@ -72,7 +76,8 @@
         void upgradeTower(int x, int y); 
         virtual TDCoordinate* getNextStreetCoord(TDCoordinate*);
         
-        TowerDefenseSelecter* selecter;        
+        TowerDefenseSelecter* selecter;   
+        TowerDefenseRangeViewer* rangeViewer;     
 
     private:
         void createFields();
@@ -85,7 +90,7 @@
         int credit_;
         int waveNumber_;
         int lifes_;
-        std::list<orxonox::WeakPtr<TowerDefenseEnemy>> enemies_;
+        EnemyList enemies_;
         TowerDefenseField* fields_[16][16];
         std::vector<orxonox::WeakPtr<TowerDefenseField>> waypoints_;
         Vector3 endpoint_;

Copied: code/trunk/src/modules/towerdefense/TowerDefenseController.cc (from rev 12189, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseController.cc)
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseController.cc	                        (rev 0)
+++ code/trunk/src/modules/towerdefense/TowerDefenseController.cc	2019-02-21 14:02:00 UTC (rev 12190)
@@ -0,0 +1,131 @@
+/*
+ *   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:
+ *      Michael Baumgartner
+ *   Co-authors:
+ *      Fabian 'x3n' Landau
+ *
+ */
+
+#include "TowerDefenseController.h"
+
+#include "core/CoreIncludes.h"
+#include "items/Engine.h"
+#include "worldentities/ControllableEntity.h"
+#include "worldentities/pawns/SpaceShip.h"
+#include "TowerDefense.h"
+#include "TowerDefenseTower.h"
+#include "TowerDefenseCenterpoint.h"
+#include "worldentities/SpawnPoint.h"
+#include "graphics/Model.h"
+#include "infos/PlayerInfo.h"
+#include "chat/ChatManager.h"
+#include "Highscore.h"
+#include <math.h>
+
+namespace orxonox
+{
+    RegisterClass(TowerDefenseController);
+
+    
+    //Offset fuer die Position der Entities auf der Map
+    Vector3 offset_ = Vector3(0,0,10);
+
+    TowerDefenseController::TowerDefenseController(Context* context) : ArtificialController(context)
+    {
+        RegisterObject(TowerDefenseController);
+    }
+
+    TowerDefenseController::~TowerDefenseController() //Destructor, ehrlich gesagt keine Ahnung was er genau loescht (nehme an den Controller, falls man am letzten Waypoint angekommen ist.)
+    {
+    }
+
+    void TowerDefenseController::tick(float dt)
+    {
+        if (!this->isActive())
+            return;
+
+        SpaceShip* ship = dynamic_cast<SpaceShip*>(this->getControllableEntity());
+       
+        if (this->waypoints_.size() == 0 || !ship)
+            return;
+
+        //Bewegung entlang der Verbindungslinie zweier Waypoints, bis die Distanz zwischen Ihnen zurueckgelegt 
+        //wurde, dann eine Drehung in Richtung des Verbindungsvektors zum naechsten Vektor, und Bewegung in diese Richtung. Iterationsfehler werden behoben, indem man zuweit zurueck-
+        //gelegte Wege direkt in die neue Richtung uebernimmt. Dafuer wird in der while-Schleife zuerst berechnet, in welchem Abschnitt man sich befindet, und anschliessend, welche Distanz
+        //man in diesem Abschnitt zurueckgelegt hat. Dann wird die Position des Schiffes einfach auf den entsprechenden Ort gelegt, und geschaut, dass es in die richtige Richtung zeigt.
+
+        //Die Position  kann iterativ bestimmt werden. this->waypoints ist der Array bestehend aus den Wegpunkten, sprich allen Ecken wobei an der Position 0 der SpawnPoint steht.
+
+        // Geschwindigkeit auslesen
+        float speed;
+        Engine* engine = ship->getEngine(0);
+        if(engine != nullptr) {
+            speed = engine->getMaxSpeedFront(); //Geschwindigkeit sollte ausgelesen werden, wird momentan aber noch NICHT -> ein Fehler mit den Engines
+
+        } else {
+            speed = 200; //Momentan wird hiermit die Geschwindigkeit ALLER Schiffe gesetzt!
+        }
+
+        //Zurueckgelegte Gesamtdistanz aktualisieren.
+        totalDistance += speed * dt;
+
+        float currentDistance = 0;
+        int waypointIdx = 0;
+        bool atEnd = true;
+        while (waypointIdx + 1 < this->waypoints_.size()) {
+            Vector3 prevWaypoint = this->waypoints_[waypointIdx]->getWorldPosition();
+            Vector3 nextWaypoint = this->waypoints_[waypointIdx + 1]->getWorldPosition();
+
+            float waypointDistance = prevWaypoint.distance(nextWaypoint);
+            if (currentDistance + waypointDistance < totalDistance) {
+                currentDistance += waypointDistance;
+                waypointIdx++;
+            } else {
+                atEnd = false;
+                break;
+            }
+        }
+
+        //Nun sollten wir wissen, zwischen welchen Waypoints sich unser Raumschiff befindet, uns welche Restdistanz wir haben. Wir koennen die Position unseres Raumschiffes nun setzten.
+        //Der Offset ist glaube ich fuer alle Tiles und Objekte noetig, damits am richtigen Ort ist.
+
+        //Berechnung des Richtungsvektors
+        Vector3 newPosition;
+        Vector3 newDirection;
+        if (atEnd) {
+            newPosition = this->waypoints_.back()->getWorldPosition();
+        } else {
+            Vector3 prevWaypoint = this->waypoints_[waypointIdx]->getWorldPosition();
+            Vector3 nextWaypoint = this->waypoints_[waypointIdx + 1]->getWorldPosition();
+
+            Vector3 direction = (nextWaypoint -  prevWaypoint).normalisedCopy();
+            newPosition = prevWaypoint + (totalDistance - currentDistance) * direction;
+            newDirection = direction;
+        }
+
+        this->getControllableEntity()->setPosition(offset_ + newPosition);
+        this->getControllableEntity()->lookAt(this->getControllableEntity()->getPosition() + newDirection);
+        this->getControllableEntity()->setVelocity(speed * newDirection);
+    }
+
+}
\ No newline at end of file

Copied: code/trunk/src/modules/towerdefense/TowerDefenseController.h (from rev 12189, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseController.h)
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseController.h	                        (rev 0)
+++ code/trunk/src/modules/towerdefense/TowerDefenseController.h	2019-02-21 14:02:00 UTC (rev 12190)
@@ -0,0 +1,56 @@
+/*
+ *   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:
+ *      Michael Baumgartner
+ *   Co-authors:
+ *      Fabian 'x3n' Landau
+ *
+ */
+
+#ifndef _TowerDefenseController_H__
+#define _TowerDefenseController_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include <vector>
+#include "tools/interfaces/Tickable.h"
+#include "controllers/ArtificialController.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport TowerDefenseController : public ArtificialController, public Tickable
+    {
+        public:
+            TowerDefenseController(Context* context);
+            virtual ~TowerDefenseController();
+
+            virtual void tick(float dt) override;
+
+        private:
+
+        	//Muessen festhalten, welche Distanz das Spaceship bereits zurueckgelegt hat.
+    		double totalDistance = 0;
+
+    };
+}
+
+#endif /* _TowerDefenseController_H__ */
\ No newline at end of file

Modified: code/trunk/src/modules/towerdefense/TowerDefenseEnemy.cc
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseEnemy.cc	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/TowerDefenseEnemy.cc	2019-02-21 14:02:00 UTC (rev 12190)
@@ -28,7 +28,6 @@
 
     TowerDefenseEnemy::~TowerDefenseEnemy()
     {
-
     }
 
     WeakPtr<TowerDefense> TowerDefenseEnemy::getGame()

Modified: code/trunk/src/modules/towerdefense/TowerDefenseField.cc
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseField.cc	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/TowerDefenseField.cc	2019-02-21 14:02:00 UTC (rev 12190)
@@ -1,3 +1,4 @@
+
 /*
  *   ORXONOX - the hottest 3D action shooter ever to exist
  *                    > www.orxonox.net <
@@ -281,6 +282,7 @@
                         break;
                 }
             }
+            
         }                           
     }
 

Modified: code/trunk/src/modules/towerdefense/TowerDefensePrereqs.h
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefensePrereqs.h	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/TowerDefensePrereqs.h	2019-02-21 14:02:00 UTC (rev 12190)
@@ -67,7 +67,7 @@
     class TowerDefense;
 
     class TowerDefenseTower;
-
+    class TowerDefenseRangeViewer;
     class TowerDefenseCenterpoint;
     class TowerDefenseHUDController;
     class TowerDefensePlayerStats;

Copied: code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.cc (from rev 12189, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc)
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.cc	                        (rev 0)
+++ code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.cc	2019-02-21 14:02:00 UTC (rev 12190)
@@ -0,0 +1,23 @@
+#include "core/CoreIncludes.h"
+#include "worldentities/StaticEntity.h"
+#include "TowerDefenseRangeViewer.h"
+
+
+#include "util/Output.h"
+
+namespace orxonox {
+	RegisterClass(TowerDefenseRangeViewer);
+	TowerDefenseRangeViewer::TowerDefenseRangeViewer(Context* context) : StaticEntity(context)
+	{
+		RegisterObject(TowerDefenseRangeViewer);
+	}
+
+	TowerDefenseRangeViewer::~TowerDefenseRangeViewer()
+    {
+
+    }
+
+	void TowerDefenseRangeViewer::XMLPort(Element& xmlelement, XMLPort::Mode mode){
+		SUPER(TowerDefenseRangeViewer, XMLPort, xmlelement, mode);
+	}
+}
\ No newline at end of file

Copied: code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.h (from rev 12189, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h)
===================================================================
--- code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.h	                        (rev 0)
+++ code/trunk/src/modules/towerdefense/TowerDefenseRangeViewer.h	2019-02-21 14:02:00 UTC (rev 12190)
@@ -0,0 +1,18 @@
+#ifndef _TowerDefenseRangeViewer_H__
+#define _TowerDefenseRangeViewer_H__
+#include "towerdefense/TowerDefensePrereqs.h"
+#include "util/Output.h"
+#include "worldentities/StaticEntity.h"
+
+namespace orxonox
+{
+    class _TowerDefenseExport TowerDefenseRangeViewer : public StaticEntity
+    {
+    public:
+        TowerDefenseRangeViewer(Context* context);
+        virtual ~TowerDefenseRangeViewer();
+        virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+    };
+}
+
+#endif /* _TowerDefenseRangeViewer_H__ */

Modified: code/trunk/src/modules/towerdefense/towerdefensereadme.txt
===================================================================
--- code/trunk/src/modules/towerdefense/towerdefensereadme.txt	2019-02-21 13:51:26 UTC (rev 12189)
+++ code/trunk/src/modules/towerdefense/towerdefensereadme.txt	2019-02-21 14:02:00 UTC (rev 12190)
@@ -11,7 +11,7 @@
 Tower
 Represents a Tower
 I'm not actually sure if you have to code C++ in order to have your result. I would suggest to simply create a new spaceship template or maybe better a
-new template for a pawn. (The tower don't need to be spaceships; pawn is just fine.)
+new template for a pawn. (The towers don't need to be spaceships; pawn is just fine.)
 Example for a template: /data/levels/templates/assff.oxt && /data/levels/include/weaponSettingsAssff.oxi
 @ assff.oxt: you don't need an engine (or your towers could fly away :-) and probably no Cameras. (just try what happens if you leave them out.) 
 @ weaponSettingsAssff.oxi:



More information about the Orxonox-commit mailing list