Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/towerdefenseFabien/src/modules/towerdefense/TowerDefenseField.cc @ 10586

Last change on this file since 10586 was 10586, checked in by fvultier, 9 years ago

Removed unuses classes and templates. The enemies move now along a path defined in the XML level file and no more along a static hard coded path.

File size: 7.5 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      ...
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file TowerDefenseField.cc
31    @brief Implementation of the TowerDefenseField class.
32*/
33
34#include "TowerDefenseField.h"
35#include "core/CoreIncludes.h"
36#include "core/XMLPort.h"
37#include "TowerDefense.h"
38
39namespace orxonox
40{
41    RegisterClass(TowerDefenseField);
42
43    /**
44    @brief
45        Constructor. Registers and initializes the object and checks whether the gametype is actually TowerDefense.
46    */
47    TowerDefenseField::TowerDefenseField(Context* context) : MovableEntity(context)
48    {
49        RegisterObject(TowerDefenseField);
50
51        tower_ = NULL;
52        type_ = FREE;
53        center_ = NULL;
54        upgrade_ = 0;
55        setPosition(0,0,0);       
56        model_ = new Model(getContext());
57        model_->setScale(25);
58        model_->pitch(Degree(90));
59        attach(model_);
60        setAngle(0); 
61    }
62
63    /**
64    @brief
65        Method to create a TowerDefenseField through XML.
66    */
67    void TowerDefenseField::XMLPort(Element& xmlelement, XMLPort::Mode mode)
68    {
69        SUPER(TowerDefenseField, XMLPort, xmlelement, mode);
70
71        //XMLPortParam(TowerDefenseField, "width", setWidth, getWidth, xmlelement, mode);
72
73    }
74
75    void TowerDefenseField::setCenterpoint(TowerDefenseCenterpoint* center)
76    {
77        center_ = center;
78    }
79
80    void TowerDefenseField::upgrade()
81    {
82        if (canUpgrade() == true)
83        {
84            destroyTower();
85            createTower(getUpgrade() + 1);
86        }
87    }
88
89    int TowerDefenseField::getUpgrade()
90    {
91        return upgrade_;
92    }
93
94    TowerDefenseFieldType TowerDefenseField::getType()
95    {
96        return type_;
97    }
98
99    void TowerDefenseField::setUpgrade(int upgrade)
100    {
101        if (upgrade < 0)
102        {
103            upgrade_ = 0;
104        }   
105        else if (upgrade > 5)
106        {
107            upgrade = 5;
108        }
109        else
110        {
111            upgrade_ = upgrade;
112        }                           
113    }
114
115    bool TowerDefenseField::canUpgrade()
116    {
117        if (tower_ != NULL && upgrade_ < 5)
118        {
119            return true;
120        }
121
122        return false;
123    }
124
125    void TowerDefenseField::setAngle(int newAngle)
126    {
127        if (model_ == NULL)
128        {
129            return;
130        }
131
132        switch (newAngle)
133        {
134            case 0:
135                model_->yaw(Degree(0));
136                angle_ = 0;
137                break;
138            case 1:
139                model_->yaw(Degree(90));
140                angle_ = 1;
141                break;   
142            case 2:
143                model_->yaw(Degree(180));
144                angle_ = 2;
145                break;   
146            case 3:
147                model_->yaw(Degree(270));
148                angle_ = 3;
149                break;                                           
150        }
151    }
152
153    int TowerDefenseField::getAngle()
154    {
155        return angle_;
156    }
157
158    void TowerDefenseField::createFree(int orientation)
159    {           
160        model_->setMeshSource("TD_F1.mesh");
161        tower_ = NULL;
162        type_ = FREE;
163        setUpgrade(0);
164        setAngle(orientation);
165    }
166
167    void TowerDefenseField::createStart(int orientation)
168    {     
169        model_->setMeshSource("TD_S5.mesh");
170        tower_ = NULL;
171        type_ = START;
172        setUpgrade(0);
173        setAngle(orientation);   
174    }
175
176
177    void TowerDefenseField::createEnd(int orientation)
178    {     
179        model_->setMeshSource("TD_S4.mesh");
180        tower_ = NULL;
181        type_ = END;
182        setUpgrade(0);
183        setAngle(orientation);
184    }   
185
186    void TowerDefenseField::createStraight(int orientation)
187    {     
188        model_->setMeshSource("TD_S1.mesh");
189        tower_ = NULL;
190        type_ = STREET;
191        setUpgrade(0);
192        setAngle(orientation);
193    } 
194
195    void TowerDefenseField::createRCurve(int orientation)
196    {     
197        model_->setMeshSource("TD_S2.mesh");
198        tower_ = NULL;
199        type_ = STREET;
200        setUpgrade(0);
201        setAngle(orientation);
202    } 
203
204    void TowerDefenseField::createLCurve(int orientation)
205    {   
206        model_->setMeshSource("TD_S3.mesh");
207        tower_ = NULL;
208        type_ = STREET;
209        setUpgrade(0);
210        setAngle(orientation);
211    } 
212
213    void TowerDefenseField::createTower(int upgrade)
214    {       
215        if (tower_ == NULL)
216        {
217            tower_ = new TowerDefenseTower(center_->getContext());
218            attach(tower_);
219            type_ = TOWER;
220            setUpgrade(upgrade);
221            if (upgrade_ > 0 && model_ != NULL)
222            {
223                switch (upgrade_)
224                {
225                    case 1:
226                        model_->setMeshSource("TD_T1.mesh");                   
227                        tower_->addTemplate(center_->getTower1Template());
228                        break;
229                    case 2:
230                        model_->setMeshSource("TD_T2.mesh");
231                        tower_->addTemplate(center_->getTower2Template());
232                        break;
233                    case 3:
234                        model_->setMeshSource("TD_T3.mesh");
235                        tower_->addTemplate(center_->getTower3Template());
236                        break;
237                    case 4:
238                        model_->setMeshSource("TD_T4.mesh");
239                        tower_->addTemplate(center_->getTower4Template());
240                        break;
241                    case 5:
242                        model_->setMeshSource("TD_T5.mesh");
243                        tower_->addTemplate(center_->getTower5Template());
244                        break;
245                }
246            }
247        }                           
248    }
249
250    void TowerDefenseField::destroyTower()
251    {
252        if (tower_ != NULL)
253        {
254            tower_->destroy();
255            tower_ = NULL;
256        }
257    }
258
259    void TowerDefenseField::create(char object, char param)
260    {
261        int paramInt = atoi(&param);
262        switch (object)
263        {
264            case 'F':
265                createFree(paramInt);
266                break;
267            case 'I':               
268                createStraight(paramInt);
269                break;
270            case 'R':               
271                createRCurve(paramInt);
272                break; 
273            case 'L':               
274                createLCurve(paramInt);
275                break;
276            case 'X':               
277                createStart(paramInt);
278                break;     
279            case 'O':               
280                createEnd(paramInt);
281                break;   
282            case 'T':                               
283                createTower(paramInt);               
284                break;                                                                                                         
285        }
286    }
287}
Note: See TracBrowser for help on using the repository browser.