Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/campaignHS15/src/orxonox/controllers/ActionpointController.h @ 10953

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

converted hack to a legal class

File size: 11.8 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 *      Gani Aliguzhinov
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#ifndef _ActionpointController_H__
30#define _ActionpointController_H__
31
32#include "controllers/FightingController.h"
33#include "tools/Timer.h"
34#include "tools/interfaces/Tickable.h"
35#include "../modules/pickup/PickupSpawner.h"
36#include <map>
37
38#include <boost/shared_ptr.hpp>
39
40
41namespace orxonox
42{
43    /**
44    @brief
45        ActionpointController is a state machine with states:
46            1) NONE
47            2) FLY: fly towards a point
48            3) FIGHT: fight enemies that are in attackRange_ (see FightingController)
49            4) PROTECT: follow this->protect_
50            5) FIGHTALL: fight all enemies on the map
51            6) ATTACK: fight a specific spaceship
52        This controller always executes an action that is in the back of the vector being used.
53        After current this->action_ is completed, next action becomes the top action (one that will
54        be returned by someVector.back()), and current action either will be removed (if not looping),
55        or moved to the top (if looping).
56
57        Every second action(), which is once in two seconds, this searches the area for enemies that are in attack range, if finds anyone,
58        pushes Action::FIGHT to the stack. That makes spaceship fight enemies inside of a sphere, and when all enemies in range are dead,
59        Action::FIGHT is removed from the stack, and spaceship resumes doing whatever action was being executed before.
60
61        In XML one has to attack Actionpoints in order to achieve any complex behaviour, but in Controller all actionpoints are effectively
62        being stored in an array of type Point::Value.
63    */
64    namespace Action
65    { 
66        enum Value
67        {
68            NONE, FLY, FIGHT, PROTECT, FIGHTALL, ATTACK
69        };
70       
71    }
72   
73    struct Point {
74        Action::Value action;
75        std::string name;
76        Vector3 position;
77        bool inLoop;
78    } ;
79    namespace PickupType
80    {
81        enum Value
82        { 
83            NONE, DAMAGE, HEALTH, SPEED, PORTAL
84        };
85    }
86
87    class _OrxonoxExport ActionpointController : public FightingController, public Tickable
88    {
89        public:
90           
91            ActionpointController(Context* context);
92            virtual ~ActionpointController();
93            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);         
94               
95            virtual void tick(float dt);
96            /**
97            @brief
98                XML method, example XML usage:
99                <SpaceShip position="-2000, 1500, -1000" lookat="0,0,0" team=0 name="ss2">
100                  <templates>
101                    <Template link=spaceshipassff />
102                  </templates>
103                  <controller>
104                    <DivisionController team=0 formationMode="finger4">
105                      <actionpoints>
106                        <Actionpoint position="0,0,0" action="FLY" />
107                        <Actionpoint position="-1000,750,-500" action="ATTACK" attack="attack" />
108                        <Actionpoint position="-1000,750,-500" action="PROTECt" protectMe=true />
109                        <Actionpoint position="-1000,750,-500" action="PROTECt" protect="protect" />
110                        <Actionpoint position="-1000,750,-500" action="FIGHTALL" />
111                       </actionpoints>
112                    </DivisionController>
113                  </controller>
114                </SpaceShip>
115               
116                Full description:
117                Adds an Actionpoint to this->actionpoints_. Actionpoint can take arguments like action="attack" attack="name".
118                For documentation on Actionpoint XML arguments, check out Actionpoint.h class
119                If any WorldEntity that is not Actionpoint or its child being sent to actionpoints through XML,
120                action would be assumed to be Action::FLY and target position to be position of the entity. Also, if not Actionpoint
121                is passed, it is assumed to be in a loop. How it works is: in <actionpoints> first all Actionpoints between
122                first Actionpoint with loopStart=true and first following Actionpoint with loopEnd=true are included in a single loop.
123                If they are adjacent (in the input array) with WorldEntity, then WorldEntity is also in a loop.
124                All the Worldentities are assumed to be in loop.
125               
126                Loop example:
127                <SpaceShip position="-1500, 1500, -1000" lookat="0,0,0" team=0 name="ss1">
128                  <templates>
129                    <Template link=spaceshipassff />
130                  </templates>
131                  <controller>
132                    <DivisionController team=0 formationMode="wall">
133                      <actionpoints>
134                        <Actionpoint position="  0,2000,-600" action="FLY" loopStart=true/>
135                        <Actionpoint position="  0,2000,-1000" action="FLY"  />
136                        <Actionpoint position="400,2000,-1000" action="FLY" />
137                        <Actionpoint position="400,2000,-600" action="FLY" loopEnd=true />
138                      </actionpoints>
139                    </DivisionController>
140                  </controller>
141                </SpaceShip>
142               
143                other loop example:
144                <SpaceShip position="-1500, -1500, -1500" lookat="0,0,0" team=0 name="ss1">
145                  <templates>
146                    <Template link=spaceshipassff />
147                  </templates>
148                  <controller>
149                    <DivisionController team=0 formationMode="diamond">
150                      <actionpoints>
151                        <Model mesh="cube.mesh" scale=8 position="  0,2000,-600" />
152                        <Model mesh="cube.mesh" scale=8 position="  0,2000,-1000" />
153                        <Model mesh="cube.mesh" scale=8 position="400,2000,-1000" />
154                        <Model mesh="cube.mesh" scale=8 position="400,2000,-600" />
155                      </actionpoints>
156                    </DivisionController>
157                  </controller>
158                </SpaceShip>
159
160            @note
161                Don't use several loops, and don't use WorldEntities as input to <actionpoints> as I didn't test it well, but you
162                can try if feeling lucky. 
163            */
164            void addActionpoint(WorldEntity* actionpoint); 
165            WorldEntity* getActionpoint(unsigned int index) const;   
166            void setDefaultFightAll(bool value)
167                { this->bDefaultFightAll_ = value; }
168            bool getDefaultFightAll ()
169                { return this->bDefaultFightAll_; }
170            void setDefaultPatrol(bool value)
171                { this->bDefaultPatrol_ = value; }
172            bool getDefaultPatrol ()
173                { return this->bDefaultPatrol_; }
174               
175
176            virtual void stayNearProtect();
177            virtual void action(); //<! action() is called in regular intervals managing the bot's behaviour.
178            virtual void takeActionpoints (const std::vector<Point>& vector, const std::vector<Point>& loop, bool b);
179
180            virtual Action::Value getAction ();
181            virtual std::string getActionName();
182
183            void setAction (Action::Value action);
184            void setAction (Action::Value action, ControllableEntity* target);
185            void setAction (Action::Value action, const Vector3& target);
186            void setAction (Action::Value action, const Vector3& target,  const Quaternion& orient );
187
188            virtual bool setWingman(ActionpointController* wingman)
189                { return false; }
190            virtual bool hasWingman()
191                { return true; }
192            virtual bool setFollower(ActionpointController* myFollower)
193                { return false; }
194            virtual bool hasFollower()
195                { return true; }
196
197
198        protected:
199                void startAttackingEnemiesThatAreClose();
200                WeakPtr<ActionpointController> myWingman_;
201                WeakPtr<ActionpointController> myFollower_;
202                WeakPtr<ActionpointController> myDivisionLeader_;
203            //----[Actionpoint information]----
204                Action::Value action_;
205                std::string protectName_;
206                std::string targetName_;
207                std::vector<WeakPtr<WorldEntity> > actionpoints_;
208                float squaredaccuracy_;
209                std::vector<Point > parsedActionpoints_;//<! actionpoints as they are stored here after being parsed from XML
210                std::vector<Point > loopActionpoints_;  //<! actionpoints that are to be looped
211                bool bInLoop_;
212                bool bLoop_;                            //<! is state machine looping?
213                bool bEndLoop_;                   
214                bool bTakenOver_;                       //<! are actionpoints taken over from the leader when he died? if yes, top actionpoint
215                                                        //<! is to be executed for the state machine to start working
216            //----[/Actionpoint information]----
217                void setProtect (ControllableEntity* protect);
218                ControllableEntity* getProtect (); 
219                WeakPtr<ControllableEntity> protect_;   //<! entity that is to be protected if this->action_ == Action::PROTECT
220                void fillLoop();                        //<! moves actionpoints that are should be in loop from parsedActionpoints_ to loopActionpoints_
221                void fillLoopReversed();
222                void moveBackToTop();                   //<! analog of removing back actionpoint for loopActionpoints_: instead of removing it,
223                                                        //<! move it to the top, so that it will be executed later on.
224                void setClosestTarget();
225                Pawn* closestTarget();
226            //----[Actionpoint methods]----
227                /**
228                @brief
229                    Sets this->target_, this->targetPosition_, this->protect_ and this->action_ depending
230                    on the current actionpoint in the vector parsedActionpoints_ if not looping or
231                    loopActionpoints_ if looping.
232                @note
233                */
234                void executeActionpoint(); 
235                /**
236                @brief
237                    If this->bLoop_, move back action to top (back is the current one, top is the last),
238                    otherwise remove back actionpoint.
239                @note
240                    actionpoints_ is only used for XML, real state stacks are parsedActionpoints_ and loopActionpoints_
241                */           
242                void nextActionpoint();                 
243            //----[Actionpoint methods]----         
244
245                bool bDefaultFightAll_;
246
247                bool bPatrolling_;
248                bool bDefaultPatrol_;
249                bool stop_;
250                unsigned int ticks_;     //<! local tick counter           
251
252    };
253}
254
255#endif /* _ActionpointController_H__ */
Note: See TracBrowser for help on using the repository browser.