Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/controllers/ArtificialController.cc @ 6652

Last change on this file since 6652 was 6502, checked in by rgrieder, 15 years ago

Removed a ton of msvc warnings revealed with OGRE v1.7 (they removed the warning suppressors in OgrePrerequisites.h).
All of them are conversions from one type to another that might be lossy (mostly double to float, please always use "3.7f" instead of "3.7" as constants when using floats).

  • Property svn:eol-style set to native
File size: 8.8 KB
RevLine 
[2362]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 *      ...
26 *
27 */
28
29#include "ArtificialController.h"
30
31#include "core/CoreIncludes.h"
[5735]32#include "worldentities/ControllableEntity.h"
33#include "worldentities/pawns/Pawn.h"
34#include "worldentities/pawns/TeamBaseMatchBase.h"
35#include "gametypes/TeamDeathmatch.h"
36#include "controllers/WaypointPatrolController.h"
[3049]37
[2362]38namespace orxonox
39{
40    ArtificialController::ArtificialController(BaseObject* creator) : Controller(creator)
41    {
42        RegisterObject(ArtificialController);
43
44        this->target_ = 0;
45        this->bShooting_ = false;
46        this->bHasTargetPosition_ = false;
47        this->targetPosition_ = Vector3::ZERO;
[6417]48
[5929]49        this->target_.setCallback(createFunctor(&ArtificialController::targetDied, this));
[2362]50    }
51
52    ArtificialController::~ArtificialController()
53    {
54    }
55
[3049]56    void ArtificialController::moveToPosition(const Vector3& target)
[2362]57    {
58        if (!this->getControllableEntity())
59            return;
60
[3049]61        Vector2 coord = get2DViewdirection(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->getControllableEntity()->getOrientation() * WorldEntity::UP, target);
62        float distance = (target - this->getControllableEntity()->getPosition()).length();
[2362]63
[2493]64        if (this->target_ || distance > 10)
[2362]65        {
66            // Multiply with 0.8 to make them a bit slower
[6502]67            this->getControllableEntity()->rotateYaw(-0.8f * sgn(coord.x) * coord.x*coord.x);
68            this->getControllableEntity()->rotatePitch(0.8f * sgn(coord.y) * coord.y*coord.y);
[2362]69        }
70
[2493]71        if (this->target_ && distance < 200 && this->getControllableEntity()->getVelocity().squaredLength() > this->target_->getVelocity().squaredLength())
[6502]72            this->getControllableEntity()->moveFrontBack(-0.5f); // They don't brake with full power to give the player a chance
[2362]73        else
[6502]74            this->getControllableEntity()->moveFrontBack(0.8f);
[2362]75    }
76
[3049]77    void ArtificialController::moveToTargetPosition()
78    {
79        this->moveToPosition(this->targetPosition_);
80    }
81
82    void ArtificialController::setTargetPosition(const Vector3& target)
83    {
84        this->targetPosition_ = target;
85        this->bHasTargetPosition_ = true;
86    }
87
[2362]88    void ArtificialController::searchRandomTargetPosition()
89    {
[2493]90        this->targetPosition_ = Vector3(rnd(-2000,2000), rnd(-2000,2000), rnd(-2000,2000));
[2362]91        this->bHasTargetPosition_ = true;
92    }
93
[3049]94    void ArtificialController::setTarget(Pawn* target)
95    {
96        this->target_ = target;
97
98        if (target)
99            this->targetPosition_ = target->getPosition();
100    }
101
[2362]102    void ArtificialController::searchNewTarget()
103    {
104        if (!this->getControllableEntity())
105            return;
106
107        this->targetPosition_ = this->getControllableEntity()->getPosition();
108        this->forgetTarget();
109
110        for (ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it; ++it)
111        {
[3049]112            if (ArtificialController::sameTeam(this->getControllableEntity(), static_cast<ControllableEntity*>(*it), this->getGametype()))
113                continue;
114
[2506]115            if (static_cast<ControllableEntity*>(*it) != this->getControllableEntity())
[2362]116            {
117                float speed = this->getControllableEntity()->getVelocity().length();
118                Vector3 distanceCurrent = this->targetPosition_ - this->getControllableEntity()->getPosition();
119                Vector3 distanceNew = it->getPosition() - this->getControllableEntity()->getPosition();
120                if (!this->target_ || it->getPosition().squaredDistance(this->getControllableEntity()->getPosition()) * (1.5f + acos((this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).dotProduct(distanceNew) / speed / distanceNew.length()) / (2 * Ogre::Math::PI))
121                        < this->targetPosition_.squaredDistance(this->getControllableEntity()->getPosition()) * (1.5f + acos((this->getControllableEntity()->getOrientation() * WorldEntity::FRONT).dotProduct(distanceCurrent) / speed / distanceCurrent.length()) / (2 * Ogre::Math::PI)) + rnd(-250, 250))
122                {
123                    this->target_ = (*it);
124                    this->targetPosition_ = it->getPosition();
125                }
126            }
127        }
128    }
129
130    void ArtificialController::forgetTarget()
131    {
132        this->target_ = 0;
133        this->bShooting_ = false;
134    }
135
136    void ArtificialController::aimAtTarget()
137    {
138        if (!this->target_ || !this->getControllableEntity())
139            return;
140
[2493]141        static const float hardcoded_projectile_speed = 1250;
[2362]142
[2493]143        this->targetPosition_ = getPredictedPosition(this->getControllableEntity()->getPosition(), hardcoded_projectile_speed, this->target_->getPosition(), this->target_->getVelocity());
[2362]144        this->bHasTargetPosition_ = (this->targetPosition_ != Vector3::ZERO);
[6417]145
146        Pawn* pawn = dynamic_cast<Pawn*>(this->getControllableEntity());
147        if (pawn)
148            pawn->setAimPosition(this->targetPosition_);
[2362]149    }
150
151    bool ArtificialController::isCloseAtTarget(float distance) const
152    {
153        if (!this->getControllableEntity())
154            return false;
155
156        if (!this->target_)
157            return (this->getControllableEntity()->getPosition().squaredDistance(this->targetPosition_) < distance*distance);
158        else
159            return (this->getControllableEntity()->getPosition().squaredDistance(this->target_->getPosition()) < distance*distance);
160    }
161
162    bool ArtificialController::isLookingAtTarget(float angle) const
163    {
164        if (!this->getControllableEntity())
165            return false;
166
167        return (getAngle(this->getControllableEntity()->getPosition(), this->getControllableEntity()->getOrientation() * WorldEntity::FRONT, this->targetPosition_) < angle);
168    }
169
[5929]170    void ArtificialController::abandonTarget(Pawn* target)
[2362]171    {
[5929]172        if (target == this->target_)
173            this->targetDied();
[2362]174    }
[3049]175
[5929]176    void ArtificialController::targetDied()
177    {
178        this->forgetTarget();
179        this->searchRandomTargetPosition();
180    }
181
[3049]182    bool ArtificialController::sameTeam(ControllableEntity* entity1, ControllableEntity* entity2, Gametype* gametype)
183    {
184        if (entity1 == entity2)
185            return true;
186
187        int team1 = -1;
188        int team2 = -1;
189
190        if (entity1->getXMLController())
191        {
[3325]192            WaypointPatrolController* wpc = orxonox_cast<WaypointPatrolController*>(entity1->getXMLController());
[3049]193            if (wpc)
194                team1 = wpc->getTeam();
195        }
196        if (entity2->getXMLController())
197        {
[3325]198            WaypointPatrolController* wpc = orxonox_cast<WaypointPatrolController*>(entity2->getXMLController());
[3049]199            if (wpc)
200                team2 = wpc->getTeam();
201        }
202
[3325]203        TeamDeathmatch* tdm = orxonox_cast<TeamDeathmatch*>(gametype);
[3049]204        if (tdm)
205        {
206            if (entity1->getPlayer())
207                team1 = tdm->getTeam(entity1->getPlayer());
208
209            if (entity2->getPlayer())
210                team2 = tdm->getTeam(entity2->getPlayer());
211        }
212
[3086]213        TeamBaseMatchBase* base = 0;
[3325]214        base = orxonox_cast<TeamBaseMatchBase*>(entity1);
[3086]215        if (base)
216        {
217            switch (base->getState())
218            {
[3280]219                case BaseState::ControlTeam1:
[3086]220                    team1 = 0;
221                    break;
[3280]222                case BaseState::ControlTeam2:
[3086]223                    team1 = 1;
224                    break;
[3280]225                case BaseState::Uncontrolled:
[3086]226                default:
227                    team1 = -1;
228            }
229        }
[3325]230        base = orxonox_cast<TeamBaseMatchBase*>(entity2);
[3086]231        if (base)
232        {
233            switch (base->getState())
234            {
[3280]235                case BaseState::ControlTeam1:
[3086]236                    team2 = 0;
237                    break;
[3280]238                case BaseState::ControlTeam2:
[3086]239                    team2 = 1;
240                    break;
[3280]241                case BaseState::Uncontrolled:
[3086]242                default:
243                    team2 = -1;
244            }
245        }
246
[3049]247        return (team1 == team2 && team1 != -1);
248    }
[2362]249}
Note: See TracBrowser for help on using the repository browser.