Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/orxyroad/OrxyRoad.cc @ 12349

Last change on this file since 12349 was 11998, checked in by jacobsr, 7 years ago

Changed names

File size: 9.6 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 *      Sebastian Hirsch
24 *      Robin Jacobs
25 *   Co-authors:
26 *
27 */
28
29/**
30    @file OrxyRoad.cc
31    @brief Implementation of the OrxyRoad class.
32*/
33
34#include "OrxyRoad.h"
35#include "OrxyRoadShip.h" // Necessary for getPlayer function. Do NOT include this in Header!
36#include "OrxyRoadCube.h"
37#include "core/CoreIncludes.h"
38#include "Highscore.h"
39#include "infos/PlayerInfo.h"
40
41namespace orxonox
42{
43    RegisterUnloadableClass(OrxyRoad);
44
45    OrxyRoad::OrxyRoad(Context* context) : Deathmatch(context)
46    {
47        RegisterObject(OrxyRoad);
48
49        bEndGame = false;
50        lives = 1;
51        level = 1;
52        point = 0;
53        bShowLevel = false;
54        multiplier = 1;
55        b_combo = false;
56        counter = 5000;
57        pattern = 3;
58        lastPosition = 0;
59        roadWidth = 3000;
60
61       
62
63
64
65        // spawn enemy every 3.5 seconds
66        //enemySpawnTimer.setTimer(3.5f, true, createExecutor(createFunctor(&OrxyRoad::spawnEnemy, this)));
67        comboTimer.setTimer(3.0f, true, createExecutor(createFunctor(&OrxyRoad::comboControll, this)));
68        this->numberOfBots_ = 0; //sets number of default bots temporarly to 0
69        this->center_ = nullptr;
70
71        this->setHUDTemplate("OrxyRoadHUD");
72    }
73
74    void OrxyRoad::levelUp()
75    {
76        level++;
77        if (getPlayer() != nullptr)
78        {
79            for (int i = 0; i < 7; i++)
80            {
81                WeakPtr<ExplosionPart> chunk5 = new ExplosionPart(this->center_->getContext());
82                chunk5->setPosition(Vector3(600, 0, 100.f * i - 300));
83                chunk5->setVelocity(Vector3(1000, 0, 0));  //player->getVelocity()
84                chunk5->setScale(10);
85                chunk5->setEffect1("Orxonox/explosion2b");
86                chunk5->setEffect2("Orxonox/smoke6");
87                chunk5->Explode();
88
89            }
90        }
91        addPoints(multiplier * 42);
92        multiplier *= 2;
93        toggleShowLevel();
94        showLevelTimer.setTimer(1.0f, false, createExecutor(createFunctor(&OrxyRoad::toggleShowLevel, this)));
95    }
96    int OrxyRoad::generateStreet(int type, OrxyRoadShip* player){
97        int trafficVelocities[]= {200,1400,500, 300};
98        int velocityVariation[] = {40,80,100,20};
99        int numObjects[] = {30,30,30,30}; // default, spaceship, satellite, asteroid per track
100        int streetSize[] = {3 , 1, 2, 4};
101        int trackWidth = 700;
102     
103        for(int j = 0; j < streetSize[type]; j++)//width of Street
104            {
105                int sign = rand()%2;
106
107                //orxout(internal_error) << sign<< endl;
108               
109               
110
111                for(int i = -numObjects[type]/2; i<numObjects[type]/2; i++)
112                {
113                        OrxyRoadCube* cube = new OrxyRoadCube(this->center_->getContext());
114                        cubeList.push_back(cube);
115                        int templateType = rand()%2;
116
117                        switch(type)
118                        {
119                        case 0 :
120                            if(templateType >=1){
121                                cube->addTemplate("asteroid1");//default
122                            }else {
123                                cube->addTemplate("satellite");//default
124                            }
125                        break;
126                        case 1:
127                         if(templateType >=1){
128                                cube->addTemplate("spaceshuttle");//spaceship1
129                            }else {
130                                cube->addTemplate("spaceshuttle");//spaceship2
131                            }                       
132                           
133
134                        break;
135                        case 2: 
136                            if(templateType >=1){
137                                cube->addTemplate("satellite");//satellite
138                            }else {
139                                cube->addTemplate("satellite");//satellite
140                            }                   
141
142                           
143                        break;
144                        case 3: 
145                            if(templateType >=1){
146                                cube->addTemplate("asteroid1");//asteroid
147                            }else {
148                                cube->addTemplate("asteroid2");//asteroid
149                            }                     
150
151
152                        }
153
154                        int posVar = rand()%2;
155                        int distance = trafficVelocities[type]*3 +posVar*trafficVelocities[type]/10; //Todo better calculation of distance between objects
156                       
157                        cube->setPosition(player->getWorldPosition() + Vector3(2000.0f+j*trackWidth, 0.0f, i*distance));
158                       
159                        /* experimental */
160                       
161
162                        if(sign>=1){
163                            cube->setVelocity(0,0,trafficVelocities[type]*level+velocityVariation[j%3]);
164                        } else{
165                             cube->setVelocity(0,0,-trafficVelocities[type]*level+velocityVariation[j%3]);
166                        }
167                       
168
169                       
170
171                        /* experimental */
172
173
174                        //stEntity->setScale3D(50,50,50);                   
175                }
176            }
177            return streetSize[type] * trackWidth;
178    }
179       
180
181
182
183    void OrxyRoad::tick(float dt)
184    {
185        SUPER(OrxyRoad, tick, dt);
186       
187        OrxyRoadShip* player = this->getPlayer();
188        if (player != nullptr)
189        {
190            currentPosition = player->getWorldPosition().x;
191            counter = counter + (currentPosition - lastPosition);
192            lastPosition = currentPosition;
193            point = (int) currentPosition;
194            player->speed = 830.0f - (point / 1000);
195
196            for(unsigned int i=0; i < cubeList.size();i++)
197            {
198                if(cubeList.at(i)->getPosition().x < currentPosition-500)
199                {
200                    cubeList.at(i)->destroy();
201                    cubeList.erase(cubeList.begin()+i);
202                }
203            }
204
205           
206
207
208            if(counter >= roadWidth-200)
209            {
210                int type  = rand() % 4;
211                //orxout(user_info) << "Random : "<<type<< endl;
212
213                roadWidth = generateStreet(type,player);//Generate street to specific type type = 0 default, type = 1 space ship type  = 2 statellite/cubes, type = 3 asteroids
214                counter = 0;               
215
216                //pattern %= 2;
217                //pattern ++;
218
219            }
220
221        }
222    }
223
224    OrxyRoadShip* OrxyRoad::getPlayer()
225    {
226        for (OrxyRoadShip* ship : ObjectList<OrxyRoadShip>())
227        {
228            return ship;
229        }
230        return nullptr;
231    }
232
233    void OrxyRoad::costLife()
234    {
235        //endGameTimer.setTimer(8.0f, false, createExecutor(createFunctor(&OrxyRoad::end, this)));
236        lives = 0;
237    };
238
239    void OrxyRoad::comboControll()
240    {
241        if (b_combo)
242            multiplier++;
243        // if no combo was performed before, reset multiplier
244        else
245            multiplier = 1;
246        b_combo = false;
247    }
248
249    void OrxyRoad::start()
250    {
251        orxout() << "start" << endl;
252        for(unsigned int i=0; i< cubeList.size();i++)
253        {
254            cubeList.at(i)->destroy();
255            cubeList.erase(cubeList.begin()+i);
256
257        }
258        cubeList.clear();
259        // Set variable to temporarily force the player to spawn.
260        this->bForceSpawn_ = false;
261
262        if (this->center_ == nullptr)  // abandon mission!
263        {
264            orxout(internal_error) << "OrxyRoad: No Centerpoint specified." << endl;
265            GSLevel::startMainMenu();
266            return;
267        }
268        Deathmatch::start();
269    }
270
271    void OrxyRoad::playerPreSpawn(PlayerInfo* player)
272    {
273        this->playerInfo_ = player;
274        if(lives <= 0)
275        {
276            this->end();
277        }
278
279        // Reset all the cubes
280        /*
281        orxout() << "prespawn" << endl;
282        for(int i=0; i< cubeList.size();i++)
283        {
284            cubeList.at(i)->destroy();
285            cubeList.erase(cubeList.begin()+i);
286        }
287        cubeList.clear();
288        lives = 1;
289        point = 0;
290        lastPosition = 0;
291        */
292    }
293
294    void OrxyRoad::addPoints(int numPoints)
295    {
296        if (!bEndGame)
297        {
298            point += numPoints * multiplier;
299            b_combo = true;
300        }
301    }
302
303    void OrxyRoad::end()
304    {
305        // DON'T CALL THIS!
306        //      Deathmatch::end();
307        // It will misteriously crash the game!
308        // Instead startMainMenu, this won't crash.
309        if (Highscore::exists())
310        {
311            int score = this->getPoints();
312            Highscore::getInstance().storeScore("Orxy Road ", score, this->playerInfo_);
313        }
314        GSLevel::startMainMenu();
315    }
316}
Note: See TracBrowser for help on using the repository browser.