Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ai2/src/orxonox/controllers/AIController.cc @ 8781

Last change on this file since 8781 was 8769, checked in by jo, 13 years ago

Moved intern waypoint functionallity from the waypointController to its base class ArtificialController. Further usage of this is planned.

  • Property svn:eol-style set to native
File size: 10.4 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 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      Dominik Solenicki
26 *
27 */
28
29#include "AIController.h"
30
31#include "util/Math.h"
32#include "core/CoreIncludes.h"
33#include "core/command/Executor.h"
34#include "worldentities/ControllableEntity.h"
35#include "worldentities/pawns/Pawn.h"
36
37namespace orxonox
38{
39    static const float ACTION_INTERVAL = 1.0f;
40
41    CreateFactory(AIController);
42
43    AIController::AIController(BaseObject* creator) : ArtificialController(creator)
44    {
45        RegisterObject(AIController);
46
47        this->actionTimer_.setTimer(ACTION_INTERVAL, true, createExecutor(createFunctor(&AIController::action, this)));
48    }
49
50    AIController::~AIController()
51    {
52    }
53
54    void AIController::action()
55    {
56        float random;
57        float maxrand = 100.0f / ACTION_INTERVAL;
58
59        if (this->state_ == FREE)
60        {
61
62            if (this->formationFlight_)
63            {
64                // return to Master after being forced free
65                if (this->freedomCount_ == 1)
66                {
67                    this->state_ = SLAVE;
68                    this->freedomCount_ = 0;
69                }
70
71                random = rnd(maxrand);
72                if (random < 90 && (((!this->target_) || (random < 50 && this->target_)) && !this->forcedFree()))
73                    this->searchNewMaster();
74            }
75
76            // search enemy
77            random = rnd(maxrand);
78            if (random < (15 + botlevel_* 20) && (!this->target_))
79                this->searchNewTarget();
80
81            // forget enemy
82            random = rnd(maxrand);
83            if (random < ((1-botlevel_)*6) && (this->target_))
84                this->forgetTarget();
85
86            // next enemy
87            random = rnd(maxrand);
88            if (random < (botlevel_*20) && (this->target_))
89                this->searchNewTarget();
90
91            // fly somewhere
92            random = rnd(maxrand);
93            if (random < 50 && (!this->bHasTargetPosition_ && !this->target_))
94                this->searchRandomTargetPosition();
95
96            // stop flying
97            random = rnd(maxrand);
98            if (random < 10 && (this->bHasTargetPosition_ && !this->target_))
99                this->bHasTargetPosition_ = false;
100
101            // fly somewhere else
102            random = rnd(maxrand);
103            if (random < 30 && (this->bHasTargetPosition_ && !this->target_))
104                this->searchRandomTargetPosition();
105
106            // shoot
107            random = rnd(maxrand);
108            if (!(this->passive_) && random < (75 + botlevel_*25) && (this->target_ && !this->bShooting_))
109                this->bShooting_ = true;
110
111            // stop shooting
112            random = rnd(maxrand);
113            if (random < ((1 - botlevel_)*25) && (this->bShooting_))
114                this->bShooting_ = false;
115
116        }
117
118        if (this->state_ == SLAVE)
119        {
120
121        }
122
123        if (this->state_ == MASTER)
124        {
125
126
127            this->commandSlaves();
128
129            if  (this->specificMasterAction_ != NONE)
130                    this->specificMasterActionHold();
131
132            else {
133
134                 // make 180 degree turn - a specific Master Action
135                random = rnd(1000.0f);
136                if (random < 5)
137                   this->turn180Init();
138
139                // spin around - a specific Master Action
140                random = rnd(1000.0f);
141                if (random < 5)
142                   this->spinInit();
143
144                // follow a randomly chosen human - a specific Master Action
145                random = rnd(1000.0f);
146                if (random < 1)
147                   this->followRandomHumanInit();
148
149                 // lose master status (only if less than 4 slaves in formation)
150                random = rnd(maxrand);
151                if(random < 15/(this->slaves_.size()+1) && this->slaves_.size() < 4 )
152                   this->loseMasterState();
153
154                // look out for outher masters if formation is small
155                random = rnd(maxrand);
156                if(this->slaves_.size() < 3 && random < 20)
157                    this->searchNewMaster();
158
159                // search enemy
160                random = rnd(maxrand);
161                if (random < (botlevel_)*25 && (!this->target_))
162                    this->searchNewTarget();
163
164                // forget enemy
165                random = rnd(maxrand);
166                if (random < (1-botlevel_)*6 && (this->target_))
167                    this->forgetTarget();
168
169                // next enemy
170                random = rnd(maxrand);
171                if (random < 10 && (this->target_))
172                    this->searchNewTarget();
173
174                // fly somewhere
175                random = rnd(maxrand);
176                if (random < 50 && (!this->bHasTargetPosition_ && !this->target_))
177                    this->searchRandomTargetPosition();
178
179
180                // fly somewhere else
181                random = rnd(maxrand);
182                if (random < 30 && (this->bHasTargetPosition_ && !this->target_))
183                    this->searchRandomTargetPosition();
184
185                // shoot
186                random = rnd(maxrand);
187                if (!(this->passive_) && random < 25*(botlevel_)+1 && (this->target_ && !this->bShooting_))
188                {
189                    this->bShooting_ = true;
190                    this->forceFreeSlaves();
191                }
192
193                // stop shooting
194                random = rnd(maxrand);
195                if (random < ( (1- botlevel_)*25 ) && (this->bShooting_))
196                    this->bShooting_ = false;
197
198                //boost
199                random = rnd(maxrand);
200                if (random < botlevel_*100 )
201                    this->boostControl(); //TEST
202            }
203        }
204
205    }
206
207    void AIController::tick(float dt)
208    {
209        if (!this->isActive())
210            return;
211
212        float random;
213        float maxrand = 100.0f / ACTION_INTERVAL;
214        if (this->waypoints_.size() > 0 && this->getControllableEntity() && this->mode_ == DEFAULT) //Waypoint functionality.
215        {
216            if (this->waypoints_[this->currentWaypoint_]->getWorldPosition().squaredDistance(this->getControllableEntity()->getPosition()) <= this->squaredaccuracy_)
217                this->currentWaypoint_ = (this->currentWaypoint_ + 1) % this->waypoints_.size();
218
219            this->moveToPosition(this->waypoints_[this->currentWaypoint_]->getWorldPosition());
220        }
221        if(this->mode_ == DEFAULT)
222            {
223            if (this->state_ == MASTER)
224            {
225                if (this->specificMasterAction_ ==  NONE)
226                {
227                    if (this->target_)
228                    {
229                        if (!this->target_->getRadarVisibility()) /* So AI won't shoot invisible Spaceships */
230                            this->forgetTarget();
231                        else
232                        {
233                            this->aimAtTarget();
234                            random = rnd(maxrand);
235                            if(this->botlevel_*100 > random && !this->isCloseAtTarget(20))
236                                this->follow();  //If a bot is shooting a player, it shouldn't let him go away easily.
237                        }
238                    }
239
240                    if (this->bHasTargetPosition_)
241                        this->moveToTargetPosition();
242
243                    this->doFire();
244                }
245
246                if (this->specificMasterAction_  == TURN180)
247                    this->turn180();
248
249                if (this->specificMasterAction_ == SPIN)
250                    this->spin();
251                if (this->specificMasterAction_ == FOLLOW)
252                    this->follow();
253            }
254
255            if (this->state_ == SLAVE)
256            {
257                if (this->bHasTargetPosition_)
258                    this->moveToTargetPosition();
259            }
260
261            if (this->state_ == FREE)
262            {
263                if (this->target_)
264                {
265                    if (!this->target_->getRadarVisibility()) /* So AI won't shoot invisible Spaceships */
266                        this->forgetTarget();
267                    else
268                    {
269                        this->aimAtTarget();
270                        random = rnd(maxrand);
271
272                        if(this->botlevel_*100 > random && !this->isCloseAtTarget(20))
273                            this->follow();//If a bot is shooting a player, it shouldn't let him go away easily.
274                     }
275                }
276
277                if (this->bHasTargetPosition_)
278                    this->moveToTargetPosition();
279
280                this->doFire();
281            }
282        }//END_OF DEFAULT MODE
283        else if (this->mode_ == ROCKET)//Rockets do not belong to a group of bots -> bot states are not relevant.
284        {   //Vector-implementation: mode_.back() == ROCKET;
285            ControllableEntity *controllable = this->getControllableEntity();
286            if(controllable)
287            {
288                if(controllable->getRocket())//Check wether the bot is controlling the rocket and if the timeout is over.
289                {
290                    this->follow();
291                    this->timeout_ -= dt;
292                    if((timeout_< 0)||(!target_))//Check if the timeout is over or target died.
293                    {
294                       controllable->fire(0);//kill the rocket
295                       this->setPreviousMode();//get out of rocket mode
296                    }
297                }
298                else
299                    this->setPreviousMode();//no rocket entity -> get out of rocket mode
300            }
301            else
302                this->setPreviousMode();//If bot dies -> getControllableEntity == NULL -> get out of ROCKET mode
303        }//END_OF ROCKET MODE
304
305        SUPER(AIController, tick, dt);
306    }
307
308}
Note: See TracBrowser for help on using the repository browser.