Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ai/src/orxonox/interfaces/PickupCarrier.h @ 6858

Last change on this file since 6858 was 6782, checked in by gasserlu, 15 years ago

drone, dronecontroller implemented

File size: 7.5 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 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file PickupCarrier.h
31    @brief Definition of the PickupCarrier class.
32*/
33
34#ifndef _PickupCarrier_H__
35#define _PickupCarrier_H__
36
37#include "OrxonoxPrereqs.h"
38
39#include <list>
40#include <set>
41#include "Pickupable.h"
42#include "core/Identifier.h"
43#include "core/WeakPtr.h"
44
45#include "core/OrxonoxClass.h"
46
47namespace orxonox
48{
49
50    //! Pre-declarations.
51    class Pickup;
52    class HealthPickup;
53    class MetaPickup;
54    class DronePickup;
55
56    /**
57    @brief
58        The PickupCarrier interface provides the means, for any class implementing it, to possess Pickupables.
59    @author
60        Damian 'Mozork' Frick
61    */
62    class _OrxonoxExport PickupCarrier : virtual public OrxonoxClass
63    {
64        //! So that the different Pickupables have full access to their PickupCarrier.
65        //! Friends.
66        friend class Pickupable;
67        friend class Pickup;
68        friend class HealthPickup;
69        friend class MetaPickup;
70        friend class DronePickup;
71       
72        public:
73            PickupCarrier(); //!< Constructor.
74            virtual ~PickupCarrier(); //!< Destructor.
75           
76            /**
77            @brief Can be called to pick up a Pickupable.
78            @param pickup A pointer to the Pickupable.
79            @return Returns true if the Pickupable was picked up, false if not.
80            */
81            bool pickup(Pickupable* pickup)
82                {
83                    bool pickedUp = this->pickups_.insert(pickup).second;
84                    if(pickedUp)
85                    {
86                        COUT(4) << "Picked up Pickupable " << pickup->getIdentifier()->getName() << "(&" << pickup << ")." << std::endl;
87                        pickup->pickedUp(this);
88                    }
89                    return pickedUp;
90                }
91               
92            /**
93            @brief Can be called to drop a Pickupable.
94            @param pickup A pointer to the Pickupable.
95            @param drop If the Pickupable should just be removed from the PickupCarrier without further action, this can be set to false. true is default.
96            @return Returns true if the Pickupable has been dropped, false if not.
97            */
98            bool drop(Pickupable* pickup, bool drop = true)
99                { 
100                    bool dropped = this->pickups_.erase(pickup) == 1;
101                    if(dropped && drop)
102                    {
103                        COUT(4) << "Dropping Pickupable " << pickup->getIdentifier()->getName() << "(&" << pickup << ")." << std::endl;
104                        pickup->dropped();
105                    }
106                    return dropped;
107                }
108               
109            /**
110            @brief Can be used to check whether the PickupCarrier or a child of his is a target ot the input Pickupable.
111            @param pickup A pointer to the Pickupable.
112            @return Returns true if the PickupCarrier or one of its children is a target, false if not.
113            */
114            bool isTarget(const Pickupable* pickup)
115                {
116                    if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target.
117                        return true;
118                   
119                    //! Go recursively through all children to check whether they are a target.
120                    std::list<PickupCarrier*>* children = this->getCarrierChildren();
121                    for(std::list<PickupCarrier*>::const_iterator it = children->begin(); it != children->end(); it++)
122                    {
123                        if((*it)->isTarget(pickup))
124                            return true;
125                    }
126                   
127                    children->clear();
128                    delete children;
129                   
130                    return false;
131                }
132               
133            /**
134            @brief Get the carrier that is both a child of the PickupCarrier (or the PickupCarrier itself) and a target of the input Pickupable.
135            @param pickup A pounter to the Pickupable.
136            @return Returns a pointer to the PickupCarrier that is the target of the input Pickupable.
137            */
138            PickupCarrier* getTarget(const Pickupable* pickup)
139                {
140                    if(!this->isTarget(pickup))
141                        return NULL;
142                   
143                    if(pickup->isTarget(this)) //!< If the PickupCarrier itself is a target.
144                        return this;
145                   
146                    //! Go recursively through all children to check whether they are the target.
147                    std::list<PickupCarrier*>* children = this->getCarrierChildren();
148                    for(std::list<PickupCarrier*>::iterator it = children->begin(); it != children->end(); it++)
149                    {
150                        if(pickup->isTarget(*it))
151                            return *it;
152                    }
153                   
154                    children->clear();
155                    delete children;
156                   
157                    return NULL;
158                }
159               
160            /**
161            @brief Get the (absolute) position of the PickupCarrier.
162                   This method needs to be implemented by any direct derivative class of PickupCarrier.
163            @return Returns the position as a Vector3.
164            */
165            virtual const Vector3& getCarrierPosition(void) = 0;
166           
167        protected:       
168            /**
169            @brief Get all direct children of this PickupSpawner.
170                   This method needs to be implemented by any direct derivative class of PickupCarrier.
171                   The returned list will be deleted by the methods calling this function.
172            @return Returns a pointer to a list of all direct children.
173            */
174            virtual std::list<PickupCarrier*>* getCarrierChildren(void) = 0;
175            /**
176            @brief Get the parent of this PickupSpawner
177                   This method needs to be implemented by any direct derivative class of PickupCarrier.
178            @return Returns a pointer to the parent.
179            */
180            virtual PickupCarrier* getCarrierParent(void) = 0;
181                           
182            /**
183            @brief Get all Pickupables this PickupCarrier has.
184            @return  Returns the set of all Pickupables this PickupCarrier has.
185            */
186            std::set<Pickupable*>& getPickups(void)
187                { return this->pickups_; }
188       
189        private:
190            std::set<Pickupable*> pickups_; //!< The list of Pickupables carried by this PickupCarrier.
191           
192    };
193}
194
195#endif /* _PickupCarrier_H__ */
Note: See TracBrowser for help on using the repository browser.