Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/3DPacman_FS19/src/modules/pacman/PacmanGhost.cc @ 12293

Last change on this file since 12293 was 12272, checked in by rueegseb, 6 years ago

overload setnewTarget for Argument Vecor3 and implementation of the red ghost character

  • Property svn:executable set to *
File size: 20.0 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 *      Marc Dreher
24 *   Co-authors:
25 *      ..
26 *
27 */
28
29#include "PacmanGhost.h"
30
31#include "core/CoreIncludes.h"
32#include "BulletDynamics/Dynamics/btRigidBody.h"
33
34namespace orxonox
35{
36    RegisterClass(PacmanGhost);
37
38    /**
39    @brief
40        Constructor. Registers the object and initializes some default values.
41    @param creator
42        The creator of this object.
43    */
44    PacmanGhost::PacmanGhost(Context* context) : ControllableEntity(context)
45    {
46        RegisterObject(PacmanGhost);
47
48        this->velocity = Vector3(0, 0, 0);
49        this->colour = 1;
50        this->setCollisionType(CollisionType::Dynamic);
51       
52        this->actuelposition = this->getPosition();
53
54        if(findpos(actuelposition, Vector3(0,-20,0)))
55            dontmove = true;
56       
57        this->target_x = actuelposition.x;
58        this->target_z = actuelposition.z; 
59
60    }
61
62    /**
63    @brief
64        Destructor. Destroys ghost, if present.
65    */
66    PacmanGhost::~PacmanGhost()
67    {
68        // Deletes the controller if the object was initialized and the pointer to the controller is not NULL.
69    }
70
71    /**
72    @brief
73        Method for creating a ghost through XML.
74    */
75    void PacmanGhost::XMLPort(Element& xmlelement, XMLPort::Mode mode)
76    {
77        SUPER(PacmanGhost, XMLPort, xmlelement, mode);
78
79        XMLPortParam(PacmanGhost, "colour", setColour, getColour, xmlelement, mode);
80
81    }
82
83
84    //All positions in the map, see documentation
85    Vector3 possibleposition[] = {Vector3(20,10,245),Vector3(215,10,245),Vector3(215,10,195),Vector3(185,10,195),Vector3(135,10,195), //0-4
86        Vector3(185,10,150),Vector3(135,10,150),Vector3(215,10,150),Vector3(215,10,105),Vector3(135,10,105), //5-9
87        Vector3(135,10,15),Vector3(135,10,-85),Vector3(215,10,-85),Vector3(135,10,-135),Vector3(215,10,-135), //10-14
88        Vector3(215,10,-195),Vector3(135,10,-195),Vector3(20,10,195),Vector3(-20,10,195),Vector3(-20,10,245), //15-19
89        Vector3(-215,10,245),Vector3(-215,10,195),Vector3(-185,10,195),Vector3(-135,10,195),Vector3(-70,10,195), //20-24
90        Vector3(70,10,195),Vector3(70,10,150),Vector3(20,10,150),Vector3(-20,10,150),Vector3(-70,10,150), //25-29
91        Vector3(-135,10,150),Vector3(-185,10,150),Vector3(-215,10,150),Vector3(-215,10,105),Vector3(-135,10,105), //30-34
92        Vector3(-70,10,105),Vector3(-20,10,105),Vector3(20,10,105),Vector3(70,10,105),Vector3(70,10,60), //35-39
93        Vector3(0,10,60),Vector3(-70,10,60),Vector3(-135,10,15),Vector3(-70,10,60),Vector3(0,10,15), //40-44
94        Vector3(70,10,15),Vector3(-70,10,-35),Vector3(-20,10,-35),Vector3(20,10,-35),Vector3(70,10,-35), //45-49
95        Vector3(70,10,-85),Vector3(20,10,-85),Vector3(-20,10,-85),Vector3(-70,10,-85),Vector3(-135,10,-85), //50-54
96        Vector3(-215,10,-85),Vector3(-215,10,-135),Vector3(-135,10,-135),Vector3(-70,10,-135),Vector3(-20,10,-135), //55-59
97        Vector3(20,10,-135),Vector3(70,10,-135),Vector3(20,10,-195),Vector3(-20,10,-195),Vector3(-135,10,-195), //60-64
98        Vector3(-215,10,-195),Vector3(0,10,-35)}; //65-66
99
100    /**
101    @brief
102        Defines which actions the ghost has to take in each tick.
103    @param dt
104        The length of the tick.
105    */
106    void PacmanGhost::tick(float dt)
107    {
108        SUPER(PacmanGhost, tick, dt);
109
110        this->actuelposition = this->getPosition();
111       
112        //Stop, if target arrived
113        if((abs(this->actuelposition.x - this->target_x)<0.5) && (abs(this->actuelposition.z - this->target_z)<0.5)){
114                 this->ismoving = false;
115        }
116
117        //Move, if ghost hasn't arrived yet
118        if(this->ismoving){
119            if(!(abs(this->actuelposition.z-target_z)<0.5)) {
120                velocity = Vector3(0,0,-sgn(this->actuelposition.z-this->target_z));
121                move(dt, actuelposition, newGoal, velocity);
122            }   
123            if(!(abs(this->actuelposition.x-target_x)<0.5)){
124                velocity = Vector3(-sgn(this->actuelposition.x-this->target_x),0,0);
125                move(dt, actuelposition, velocity);
126            }
127        }
128
129        else{
130            while (lockmove){};
131            lockmove=true;
132            int goal_x = 0;     // faraway goal to dertmine the direction of the target
133            int goal_z =0;   
134
135            if(this.colour=1){//follow pacman
136                Vector3 newTar = getShortestPath(actuelposition, currentPosition) //acutuelPosition: ghost, currentPosition: Pacman
137                 setnewTarget(newTar)
138
139            }
140            //die uebrigen charakteren verhalten sich noch random
141            /*else if(this.colour=2){
142            }
143
144            else if(this.colour=3){
145
146            }
147
148            else if(this.colour=4){
149
150            }*/
151           
152       
153       
154            //Check on which position the ghost has arrived and set new target
155            else if{(this.colour=2) || (this.colour=3) || (this.colour=4)}
156                while(lockmove){};
157                lockmove = true;
158
159                if(findpos(actuelposition,possibleposition[0])){
160                        setnewTarget(1,17,19);
161                }
162                else if(findpos(actuelposition,possibleposition[1])){
163                        setnewTarget(0,2);
164                }
165                else if(findpos(actuelposition,possibleposition[2])){
166                        setnewTarget(1,3);
167                }
168                else if(findpos(actuelposition,possibleposition[3])){
169                            setnewTarget(2,4,5);
170                }
171                else if(findpos(actuelposition,possibleposition[4])){
172                                setnewTarget(3,6);
173                }
174                else if(findpos(actuelposition,possibleposition[5])){
175                        setnewTarget(3,7);
176                }
177                else if(findpos(actuelposition,possibleposition[6])){
178                    setnewTarget(4,9,26);
179                }
180                else if(findpos(actuelposition,possibleposition[7])){
181                    setnewTarget(5,8);
182                }
183                else if(findpos(actuelposition,possibleposition[8])){
184                    setnewTarget(7,9);
185                }
186                else if(findpos(actuelposition,possibleposition[9])){
187                    setnewTarget(6,8,10,38);
188                }
189                else if(findpos(actuelposition,possibleposition[10])){
190                    setnewTarget(9,11,45);
191                }
192                else if(findpos(actuelposition,possibleposition[11])){
193                    setnewTarget(10,12,13);
194                }
195                else if(findpos(actuelposition,possibleposition[12])){
196                    setnewTarget(11,14);
197                }
198                else if(findpos(actuelposition,possibleposition[13])){
199                    setnewTarget(11,14,16,61);
200                }
201                else if(findpos(actuelposition,possibleposition[14])){
202                    setnewTarget(12,13,15);
203                }
204                else if(findpos(actuelposition,possibleposition[15])){
205                    setnewTarget(14,16);
206                }
207                else if(findpos(actuelposition,possibleposition[16])){
208                    setnewTarget(13,15,62);
209                }
210                else if(findpos(actuelposition,possibleposition[17])){
211                    setnewTarget(0,25);
212                }
213                else if(findpos(actuelposition,possibleposition[18])){
214                    setnewTarget(19,24);
215                }
216                else if(findpos(actuelposition,possibleposition[19])){
217                    setnewTarget(0,18,20);
218                }
219                else if(findpos(actuelposition,possibleposition[20])){
220                    setnewTarget(19,21);
221                }
222                else if(findpos(actuelposition,possibleposition[21])){
223                    setnewTarget(20,22);
224                }
225                else if(findpos(actuelposition,possibleposition[22])){
226                    setnewTarget(21,23,31);
227                }
228                else if(findpos(actuelposition,possibleposition[23])){
229                    setnewTarget(22,30);
230                }
231                else if(findpos(actuelposition,possibleposition[24])){
232                    setnewTarget(18,29);
233                }
234                else if(findpos(actuelposition,possibleposition[25])){
235                    setnewTarget(17,26);
236                }
237                else if(findpos(actuelposition,possibleposition[26])){
238                    setnewTarget(6,25,27);
239                }
240                else if(findpos(actuelposition,possibleposition[27])){
241                    setnewTarget(26,28,37);
242                }
243                else if(findpos(actuelposition,possibleposition[28])){
244                    setnewTarget(27,29,36);
245                }
246                else if(findpos(actuelposition,possibleposition[29])){
247                    setnewTarget(24,28,30);
248                }
249                else if(findpos(actuelposition,possibleposition[30])){
250                    setnewTarget(23,29,34);
251                }
252                else if(findpos(actuelposition,possibleposition[31])){
253                    setnewTarget(22,32);
254                }
255                else if(findpos(actuelposition,possibleposition[32])){
256                    setnewTarget(31,33);
257                }
258                else if(findpos(actuelposition,possibleposition[33])){
259                    setnewTarget(32,34);
260                }
261                else if(findpos(actuelposition,possibleposition[34])){
262                    setnewTarget(30,33,35,42);
263                }
264                else if(findpos(actuelposition,possibleposition[35])){
265                    setnewTarget(34,36,41);
266                }
267                else if(findpos(actuelposition,possibleposition[36])){
268                    setnewTarget(28,35);
269                }
270                else if(findpos(actuelposition,possibleposition[37])){
271                    setnewTarget(27,38);
272                }
273                else if(findpos(actuelposition,possibleposition[38])){
274                    setnewTarget(9,37,39);
275                }
276                else if(findpos(actuelposition,possibleposition[39])){
277                    setnewTarget(38,40,45);
278                }
279                else if(findpos(actuelposition,possibleposition[40])){
280                    setnewTarget(39,41); //Shouldn't be able to return in center
281                }
282                else if(findpos(actuelposition,possibleposition[41])){
283                    setnewTarget(35,43);
284                }
285                else if(findpos(actuelposition,possibleposition[42])){
286                    setnewTarget(34,43,54);
287                }
288                else if(findpos(actuelposition,possibleposition[43])){
289                    setnewTarget(41,46);
290                }
291                else if(findpos(actuelposition,possibleposition[44])){
292                    setnewTarget(40,66);
293                }
294                else if(findpos(actuelposition,possibleposition[45])){
295                    setnewTarget(10,39,49);
296                }
297                else if(findpos(actuelposition,possibleposition[46])){
298                    setnewTarget(43,47);
299                }
300                else if(findpos(actuelposition,possibleposition[47])){
301                    setnewTarget(46,52,66);
302                }
303                else if(findpos(actuelposition,possibleposition[48])){
304                    setnewTarget(49,51,66);
305                }
306                else if(findpos(actuelposition,possibleposition[49])){
307                    setnewTarget(45,48);
308                }
309                else if(findpos(actuelposition,possibleposition[50])){
310                    setnewTarget(51,61);
311                }
312                else if(findpos(actuelposition,possibleposition[51])){
313                    setnewTarget(48,50);
314                }
315                else if(findpos(actuelposition,possibleposition[52])){
316                    setnewTarget(47,53);
317                }
318                else if(findpos(actuelposition,possibleposition[53])){
319                    setnewTarget(52,58);
320                }
321                else if(findpos(actuelposition,possibleposition[54])){
322                    setnewTarget(42,55,57);
323                }
324                else if(findpos(actuelposition,possibleposition[55])){
325                    setnewTarget(54,56);
326                }
327                else if(findpos(actuelposition,possibleposition[56])){
328                    setnewTarget(55,57,65);
329                }
330                else if(findpos(actuelposition,possibleposition[57])){
331                    setnewTarget(54,56,58,64);
332                }
333                else if(findpos(actuelposition,possibleposition[58])){
334                    setnewTarget(53,57,59);
335                }
336                else if(findpos(actuelposition,possibleposition[59])){
337                    setnewTarget(58,59,63);
338                }
339                else if(findpos(actuelposition,possibleposition[60])){
340                    setnewTarget(59,61,62);
341                }
342                else if(findpos(actuelposition,possibleposition[61])){
343                    setnewTarget(13,50,60);
344                }
345                else if(findpos(actuelposition,possibleposition[62])){
346                    setnewTarget(16,60);
347                }
348                else if(findpos(actuelposition,possibleposition[63])){
349                    setnewTarget(59,64);
350                }
351                else if(findpos(actuelposition,possibleposition[64])){
352                    setnewTarget(57,63,65);
353                }
354                else if(findpos(actuelposition,possibleposition[65])){
355                    setnewTarget(56,64);
356                }
357                else if(findpos(actuelposition,possibleposition[66])){
358                    setnewTarget(47,48);
359            }
360
361            else{
362                this->resetGhost(); //Shouldn't happen...
363            } //End of Position table
364                lockmove = false;
365            }
366        }
367    }
368    //set a specific newTarget
369    void PacmanGhost::setnewTarget(Vector3 newTarget){
370
371        this->target_x = newTarget.x;
372        this->target_z = newTarget.;
373        this->ismoving = true;
374    }
375
376    //Random choice of new target (not used in game, but useful)
377    void PacmanGhost::setnewTarget(int firstdec){
378       
379          decision = rand()%1;
380            switch(decision){
381                case 0:
382                    this->target_x = possibleposition[firstdec].x;
383                    this->target_z = possibleposition[firstdec].z; 
384                    this->ismoving = true;
385                    break;
386                }
387    }
388
389    //Random choice of new target
390    void PacmanGhost::setnewTarget(int firstdec, int seconddec){ 
391           decision = rand()%2;
392            switch(decision){
393                case 0:
394                    this->target_x = possibleposition[firstdec].x;
395                    this->target_z = possibleposition[firstdec].z; 
396                    this->ismoving = true;
397                    break;
398                case 1:
399                    this->target_x = possibleposition[seconddec].x;
400                    this->target_z = possibleposition[seconddec].z; 
401                    this->ismoving = true;
402                    break; 
403            }
404           
405    }
406
407    //Random choice of new target
408    void PacmanGhost::setnewTarget(int firstdec, int seconddec, int thirddec){
409       
410           decision = rand()%3;
411            switch(decision){
412                case 0:
413                    this->target_x = possibleposition[firstdec].x;
414                    this->target_z = possibleposition[firstdec].z; 
415                    this->ismoving = true;
416                    break;
417                case 1:
418                    this->target_x = possibleposition[seconddec].x;
419                    this->target_z = possibleposition[seconddec].z; 
420                    this->ismoving = true;
421                    break;
422                case 2:
423                    this->target_x = possibleposition[thirddec].x;
424                    this->target_z = possibleposition[thirddec].z; 
425                    this->ismoving = true;
426                    break;   
427                }
428           
429        }
430
431    //Random choice of new target
432    void PacmanGhost::setnewTarget(int firstdec, int seconddec, int thirddec, int fourthdec){
433       
434           decision = rand()%4;
435            switch(decision){
436                case 0:
437                    this->target_x = possibleposition[firstdec].x;
438                    this->target_z = possibleposition[firstdec].z; 
439                    this->ismoving = true;
440                    break;
441                case 1:
442                    this->target_x = possibleposition[seconddec].x;
443                    this->target_z = possibleposition[seconddec].z; 
444                    this->ismoving = true;
445                    break;
446                case 2:
447                    this->target_x = possibleposition[thirddec].x;
448                    this->target_z = possibleposition[thirddec].z; 
449                    this->ismoving = true;
450                    break;
451                case 3:
452                        this->target_x = possibleposition[fourthdec].x;
453                    this->target_z = possibleposition[fourthdec].z; 
454                    this->ismoving = true;
455                    break;   
456                }
457           
458        }
459
460    //Change this with other ghost
461    void PacmanGhost::changewith(PacmanGhost* otherghost){
462
463        while(lockmove){};
464        lockmove = true;    //Prevent change of target while ghost is changed
465
466        otherghost->setPosition(this->getPosition());
467        this->setPosition(0,-20,0);
468        otherghost->target_x = this->target_x;   
469        otherghost->target_z = this->target_z;
470        otherghost->ismoving = this->ismoving;
471
472        this->dontmove = true;
473        otherghost->dontmove = false;
474
475        lockmove = false;
476    }
477
478    //Move ghost with rotation
479    void PacmanGhost::move(float dt, Vector3 actuelposition, Vector3 velocity){
480        if(!dontmove){
481            this->setPosition(Vector3(actuelposition.x+speed*velocity.x*dt,10,actuelposition.z+speed*velocity.z*dt));
482       
483        //Rotate ghost in the direction of movement
484        if((abs(abs(velocity.x)-1)<0.1) && (abs(velocity.z-0)<0.1))
485            if(velocity.x<0){
486                 this->setOrientation(Quaternion(Radian(-1.57), Vector3(0, 1, 0))); 
487            }
488            else{
489                 this->setOrientation(Quaternion(Radian(1.57), Vector3(0, 1, 0))); 
490            }
491        if((abs(abs(velocity.z)-1)<0.1) && (abs(velocity.x-0)<0.1))
492            if(velocity.z<0){
493                 this->setOrientation(Quaternion(Radian(3.14), Vector3(0, 1, 0))); 
494            }
495            else{
496                 this->setOrientation(Quaternion(Radian(0), Vector3(0, 1, 0))); 
497            }
498                     
499     }
500    }
501
502    //Check if there is a collision
503    bool PacmanGhost::findpos(Vector3 one, Vector3 other){
504       if((abs(one.x - other.x)<0.5) && (abs(one.y - other.y)<0.5) && (abs(one.z - other.z)<0.5)) return true;
505        return false;
506    }
507
508    //Change ability to move
509    void PacmanGhost::changemovability(){
510        if(dontmove){
511         dontmove = false;}
512        else{
513         dontmove = true;   
514        }
515    }
516
517    //ResetGhost
518    void PacmanGhost::resetGhost(){
519   
520        this->setPosition(this->resetposition);
521        this->ismoving = false;
522        this->actuelposition = this->getPosition();
523       
524        this->target_x = actuelposition.x;
525        this->target_z = actuelposition.z;
526   
527    }
528
529    //Increase speed of ghosts
530    void PacmanGhost::levelupvelo(){
531        speed ++;
532    }
533}
Note: See TracBrowser for help on using the repository browser.