[Orxonox-commit 7577] r12182 - in code/branches/Merge_HS18: . data/levels src/modules/towerdefense
merholzl at orxonox.net
merholzl at orxonox.net
Tue Dec 11 18:20:24 CET 2018
Author: merholzl
Date: 2018-12-11 18:20:24 +0100 (Tue, 11 Dec 2018)
New Revision: 12182
Added:
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.cc
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.h
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h
Modified:
code/branches/Merge_HS18/
code/branches/Merge_HS18/data/levels/emptyLevel.oxw
code/branches/Merge_HS18/data/levels/towerDefense.oxw
code/branches/Merge_HS18/src/modules/towerdefense/CMakeLists.txt
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.cc
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.h
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseEnemy.cc
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseField.cc
code/branches/Merge_HS18/src/modules/towerdefense/TowerDefensePrereqs.h
code/branches/Merge_HS18/src/modules/towerdefense/towerdefensereadme.txt
Log:
RD merge
Index: code/branches/Merge_HS18
===================================================================
--- code/branches/Merge_HS18 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18 2018-12-11 17:20:24 UTC (rev 12182)
Property changes on: code/branches/Merge_HS18
___________________________________________________________________
Modified: svn:mergeinfo
## -28,6 +28,7 ##
/code/branches/SuperOrxoBros_FS17:11365-11448
/code/branches/SuperOrxoBros_FS18:11820-12030
/code/branches/TixyTaxyTorxy_HS18:12039-12178
+/code/branches/TowerDefense_HS18:12025-12181
/code/branches/Waypoints_HS17:11496-11773
/code/branches/WorldMap_HS18:12036-12179
/code/branches/ai:6592-7033
Modified: code/branches/Merge_HS18/data/levels/emptyLevel.oxw
===================================================================
--- code/branches/Merge_HS18/data/levels/emptyLevel.oxw 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/data/levels/emptyLevel.oxw 2018-12-11 17:20:24 UTC (rev 12182)
@@ -28,6 +28,7 @@
<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="-200,0,0" lookat="0,0,0" spawnclass=SpaceShip pawndesign=spaceshipescort />
+ <Model position=“0,0,0“ mesh="finalenemy2.mesh" scale="3" />
</Scene>
</Level>
Modified: code/branches/Merge_HS18/data/levels/towerDefense.oxw
===================================================================
--- code/branches/Merge_HS18/data/levels/towerDefense.oxw 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/data/levels/towerDefense.oxw 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/CMakeLists.txt
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/CMakeLists.txt 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/CMakeLists.txt 2018-12-11 17:20:24 UTC (rev 12182)
@@ -9,6 +9,8 @@
TowerDefenseSelecter.cc
TowerDefenseField.cc
TDCoordinate.cc
+ TowerDefenseController.cc
+ TowerDefenseRangeViewer.cc
)
ORXONOX_ADD_LIBRARY(towerdefense
Modified: code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.cc
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.cc 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.cc 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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);
}
@@ -279,6 +297,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)
{
@@ -294,24 +318,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)
{
@@ -331,16 +381,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;
+ }
}
}
@@ -352,9 +416,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());
@@ -415,6 +479,7 @@
return nextCoord;
}
+ //Falls kein anliegender Weg gefunden wurde.
delete nextCoord;
return nullptr;
}
Modified: code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.h
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.h 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefense.h 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.cc (from rev 12181, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseController.cc)
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.cc (rev 0)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.cc 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.h (from rev 12181, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseController.h)
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.h (rev 0)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseController.h 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseEnemy.cc
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseEnemy.cc 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseEnemy.cc 2018-12-11 17:20:24 UTC (rev 12182)
@@ -28,7 +28,6 @@
TowerDefenseEnemy::~TowerDefenseEnemy()
{
-
}
WeakPtr<TowerDefense> TowerDefenseEnemy::getGame()
Modified: code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseField.cc
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseField.cc 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseField.cc 2018-12-11 17:20:24 UTC (rev 12182)
@@ -1,3 +1,4 @@
+
/*
* ORXONOX - the hottest 3D action shooter ever to exist
* > www.orxonox.net <
@@ -281,6 +282,7 @@
break;
}
}
+
}
}
Modified: code/branches/Merge_HS18/src/modules/towerdefense/TowerDefensePrereqs.h
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefensePrereqs.h 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefensePrereqs.h 2018-12-11 17:20:24 UTC (rev 12182)
@@ -67,7 +67,7 @@
class TowerDefense;
class TowerDefenseTower;
-
+ class TowerDefenseRangeViewer;
class TowerDefenseCenterpoint;
class TowerDefenseHUDController;
class TowerDefensePlayerStats;
Copied: code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc (from rev 12181, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc)
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc (rev 0)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.cc 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h (from rev 12181, code/branches/TowerDefense_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h)
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h (rev 0)
+++ code/branches/Merge_HS18/src/modules/towerdefense/TowerDefenseRangeViewer.h 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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/branches/Merge_HS18/src/modules/towerdefense/towerdefensereadme.txt
===================================================================
--- code/branches/Merge_HS18/src/modules/towerdefense/towerdefensereadme.txt 2018-12-11 16:22:11 UTC (rev 12181)
+++ code/branches/Merge_HS18/src/modules/towerdefense/towerdefensereadme.txt 2018-12-11 17:20:24 UTC (rev 12182)
@@ -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