Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/AI_HS15/src/orxonox/controllers/CommonController.h @ 10803

Last change on this file since 10803 was 10803, checked in by gania, 9 years ago

Works for DivisionController for now. Almost balanced AI! Dodges bullets (still killable, which is good), but goes crazy when close. So to be destroyed when far away. TODO implement formation flight when not in fight

File size: 6.3 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 *      ...
26 *
27 */
28
29#ifndef _CommonController_H__
30#define _CommonController_H__
31
32
33#include "controllers/Controller.h"
34#include "worldentities/ControllableEntity.h"
35#include "worldentities/pawns/Pawn.h"
36#include "core/ClassTreeMask.h"
37
38
39namespace orxonox
40{
41
42    namespace FormationMode
43    {
44        enum Value
45        {
46            VEE, FINGER4, DIAMOND, WALL
47        };
48    }
49    namespace Rank
50    {
51        enum Value
52        { 
53            NONE, SECTIONLEADER, DIVISIONLEADER, WINGMAN
54        };
55
56    }
57    //none for a formation flight without attacking, neutral when opponent and this have no
58    //advantage over each other, offensive when this spotted opponent first,
59    //defensive otherwise
60    namespace ManeuverType
61    {
62        enum Value
63        { 
64            NONE, NEUTRAL, OFFENSIVE, DEFENCIVE
65        };
66
67    }
68    //none for a formation flight
69    namespace Maneuver
70    {
71        enum Value
72        {
73            NONE, GUNSD, SCISSORS, COMBATSPREAD, DEFENSIVESPLIT, BREAK, BARRELROLL, SWOOP, IMMELMANN, 
74            WINGOVER, LOWYOYO, HIGHYOYO, LAGDISPLACEMENTROLL
75        };
76    }
77
78
79    class _OrxonoxExport CommonController : public Controller
80    {
81
82        public:
83            static const float hardcoded_projectile_speed = 750;
84
85            static const float ACTION_INTERVAL = 1.0f;
86
87
88            CommonController(Context* context);
89            virtual ~CommonController();
90
91
92
93
94
95            virtual void setFormationMode(FormationMode::Value val)
96                { this->formationMode_ = val; }
97            inline FormationMode::Value getFormationMode() const
98                { return this->formationMode_; }
99            virtual void setFormationModeXML(std::string val);
100            virtual std::string getFormationModeXML();
101
102            virtual void setRank(Rank::Value val)
103                { this->rank_ = val; }
104            inline Rank::Value getRank() const
105                { return this->rank_; }
106
107            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
108
109
110
111            virtual bool setWingman(CommonController* wingman);
112            virtual bool hasWingman();
113
114            void setTarget(ControllableEntity* target);
115            bool hasTarget();
116            ControllableEntity* getTarget();
117            void setTargetOrientation(const Quaternion& orient);
118            void setTargetOrientation(ControllableEntity* target);
119            void setTargetPosition(const Vector3& target);
120
121            /*void spin();
122            void turn180();*/
123
124
125        protected:
126            void dodge(Vector3& thisPosition, Vector3& diffUnit);
127            int counter;
128            void moveToPoint(const Vector3& relativeTargetPosition, float angleRoll);
129            bool moveAndRoll(float dt);
130
131            void moveToPosition(const Vector3& target, float dt);
132            void moveToTargetPosition(float dt);
133            //enum Mode {ROCKET, ATTACK, MOVE, HOLD};//TODO; implement DEFENCE, MOVING modes
134
135            //Mode mode_;
136            void copyOrientation(const Quaternion& orient, float dt);
137            void copyTargetOrientation(float dt);
138
139            float squaredDistanceToTarget() const;
140            void doFire();
141            void aimAtTarget();
142            bool isLookingAtTarget(float angle) const;
143            bool isLooking( ControllableEntity* entityThatLooks, ControllableEntity* entityBeingLookedAt, float angle )const;
144
145            //checks if spaceship points at enemy and if there are allies inbetween
146            bool canFire();
147            std::map<std::string, int> weaponModes_; //<! Links each "weapon" to it's weaponmode - managed by setupWeapons()
148            //std::vector<int> projectiles_; //<! Displays amount of projectiles of each weapon. - managed by setupWeapons()
149            float timeout_; //<! Timeout for rocket usage. (If a rocket misses, a bot should stop using it.)
150            void setupWeapons(); //<! Defines which weapons are available for a bot. Is recalled whenever a bot was killed.
151            bool bSetupWorked; //<! If false, setupWeapons() is called.
152            int getFiremode(std::string name);
153
154            float randomInRange(float a, float b);
155            bool bHasTargetPosition_;
156            Vector3 targetPosition_;
157            bool bHasTargetOrientation_;
158            Quaternion targetOrientation_;
159
160            void stopMoving();
161            void setPositionOfTarget(const Vector3& target);
162            void setOrientationOfTarget(const Quaternion& orient);
163            bool bHasPositionOfTarget_;
164            Vector3 positionOfTarget_;
165            bool bHasOrientationOfTarget_;
166            Quaternion orientationOfTarget_;
167
168
169            WeakPtr<ControllableEntity> target_;
170            //WeakPtr<ControllableEntity> thisEntity_;
171
172            bool bEngaging_;
173            bool bShooting_;
174            WeakPtr<ControllableEntity> objectiveTarget_;
175
176            void lookAtTarget(float dt);
177            void stopLookingAtTarget();
178            void startLookingAtTarget();
179            bool bLookAtTarget_;
180            void maneuver();
181            void chooseManeuverType();
182            void gunsD();
183            void attack();
184            void scissors();
185            FormationMode::Value formationMode_;
186            Rank::Value rank_;
187            ManeuverType::Value maneuverType_;
188            Maneuver::Value maneuver_;
189
190            bool executingManeuver_;
191            bool executingMoveToPoint_;
192         
193        private:
194           
195               
196    };
197}
198
199#endif /* _CommonController_H__ */
Note: See TracBrowser for help on using the repository browser.