Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/interfaces/Pickupable.h @ 8866

Last change on this file since 8866 was 8866, checked in by dafrick, 13 years ago

Moved clone base method into Pickupable to avoid ambiguity.

  • Property svn:eol-style set to native
File size: 9.0 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 Pickupable.h
31    @brief Definition of the Pickupable class.
32    @ingroup Pickup
33*/
34
35#ifndef _Pickupable_H__
36#define _Pickupable_H__
37
38#include "OrxonoxPrereqs.h"
39
40#include <list>
41#include "core/Super.h"
42
43#include "core/OrxonoxClass.h"
44#include "Rewardable.h"
45
46namespace orxonox
47{
48
49    /**
50    @brief
51        An Interface (or more precisely an abstract class) to model and represent different (all kinds of) pickups.
52
53        Pickups (@ref orxonox::Pickupable "Pickupables") are objects that (quite unsurprisingly) can be picked up. Additionally they can be used and unused (transition from used to not used), and also dropped.
54
55        A class of Pickups can incorporate many different types of pickups (see @ref orxonox::PickupIdentifier "PickupIdentifier"), each type is uniquely defined by a @ref orxonox::PickupIdentifier "PickupIdentifier". Each pickup has such an identifier identiying its type. This means that two pickups of the same type have identifiers which are equal.
56
57    @author
58        Damian 'Mozork' Frick
59
60    @ingroup Pickup
61    */
62    class _OrxonoxExport Pickupable : virtual public OrxonoxClass, public Rewardable
63    {
64        friend class PickupCarrier;
65
66        protected:
67            Pickupable(); //!< Default constructor.
68
69        public:
70            virtual ~Pickupable(); //!< Default destructor.
71
72            /**
73            @brief Get whether the Pickupable is currently in use or not.
74            @return Returns true if the Pickupable is currently in use.
75            */
76            inline bool isUsed(void) const
77                { return this->used_; }
78            /**
79            @brief  Should be called when the Pickupable has transited from used to unused or the other way around.
80                    Any Class overwriting this method must call its SUPER function by adding SUPER(Classname, changedUsed); to their changdeUsed method.
81            */
82            virtual void changedUsed(void) {}
83
84            /**
85            @brief Get the carrier of the Pickupable.
86            @return Returns a pointer to the carrier of the Pickupable.
87            */
88            inline PickupCarrier* getCarrier(void)
89                { return this->carrier_; }
90            /**
91            @brief Should be called when the Pickupable has changed its PickupCarrier.
92                   Any Class overwriting this method must call its SUPER function by adding SUPER(Classname, changedCarrier); to their changedCarrier method.
93            */
94            virtual void changedCarrier(void) {}
95
96            /**
97            @brief Returns whether the Pickupable is currently picked up.
98            @return Returns true if the Pickupable is currently picked up, false if not.
99            */
100            inline bool isPickedUp(void) const
101                { return this->pickedUp_; }
102            /**
103            @brief  Should be called when the Pickupable has transited from picked up to dropped or the other way around.
104                    Any Class overwriting this method must call its SUPER function by adding SUPER(Classname, changedPickedUp); to their changedPickedUp method.
105            */
106            virtual void changedPickedUp(void) {}
107
108            /**
109            @brief Returns whether the Pickupable can be used.
110            @return Returns true if it can be used.
111            */
112            inline bool isUsable(void) const
113                { return this->enabled_; }
114
115            /**
116            @brief Returns whether the Pickupable can be unused.
117            @return Returns true if it can be unused.
118            */
119            inline bool isUnusable(void) const
120                { return this->enabled_; }
121
122            /**
123            @brief Returns whether the Pickupable is enabled.
124                   Once a Pickupable is disabled it cannot be enabled again. A Pickupable that is disabled can neither be used nor unused.
125            @return Returns true if the Pickupable is enabled.
126            */
127            inline bool isEnabled(void) const
128                { return this->enabled_; }
129
130            bool pickup(PickupCarrier* carrier); //!< Can be called to pick up a Pickupable.
131            bool drop(bool createSpawner = true); //!< Can be called to drop a Pickupable.
132
133            virtual bool isTarget(const PickupCarrier* carrier) const; //!< Get whether the given PickupCarrier is a target of this Pickupable.
134            bool isTarget(const Identifier* identifier) const; //!< Get whether a given class, represented by the input Identifier, is a target of this Pickupable.
135            bool addTarget(PickupCarrier* target); //!< Add a PickupCarrier as target of this Pickupable.
136            bool addTarget(Identifier* identifier); //!< Add a class, representetd by the input Identifier, as target of this Pickupable.
137
138            Pickupable* clone(void); //!< Creates a duplicate of the Pickupable.
139            /**
140            @brief Creates a duplicate of the input OrxonoxClass.
141                   This method needs to be implemented by any Class inheriting from Pickupable.
142            @param item A reference to a pointer to the OrxonoxClass that is to be duplicated.
143            */
144            virtual void clone(OrxonoxClass*& item) {}
145
146            /**
147            @brief Get the PickupIdentifier of this Pickupable.
148            @return Returns a pointer to the PickupIdentifier of this Pickupable.
149            */
150            virtual const PickupIdentifier* getPickupIdentifier(void) const
151                { return this->pickupIdentifier_; }
152
153            bool setUsed(bool used); //!< Sets the Pickupable to used or unused, depending on the input.
154            bool setPickedUp(bool pickedUp); //!< Helper method to set the Pickupable to either picked up or not picked up.
155            bool setCarrier(PickupCarrier* carrier, bool tell = true); //!< Sets the carrier of the Pickupable.
156
157            void destroy(void); //!< Is called internally within the Pickupable module to destroy pickups.
158
159        protected:
160            /**
161            @brief Helper method to initialize the PickupIdentifier.
162            */
163            void initializeIdentifier(void) {}
164
165            virtual void preDestroy(void); //!< A method that is called by OrxonoxClass::destroy() before the object is actually destroyed.
166            virtual void destroyPickup(void); //!< Destroys a Pickupable.
167            virtual void carrierDestroyed(void); //!< Is called by the PickupCarrier when it is being destroyed.
168
169            /**
170            @brief Sets the Pickuapble to disabled.
171            */
172            inline void setDisabled(void)
173                { this->enabled_ = false; }
174
175            /**
176            @brief Facilitates the creation of a PickupSpawner upon dropping of the Pickupable.
177                   This method must be implemented by any class directly inheriting from Pickupable. It is most easily done by just creating a new DroppedPickup, e.g.:
178                   DroppedPickup(BaseObject* creator, Pickupable* pickup, PickupCarrier* carrier, float triggerDistance);
179            @return Returns true if a spawner was created, false if not.
180            */
181            virtual bool createSpawner(void) = 0;
182
183            PickupIdentifier* pickupIdentifier_; //!< The PickupIdentifier of this Pickupable.
184
185        private:
186
187            bool used_; //!< Whether the Pickupable is currently in use or not.
188            bool pickedUp_; //!< Whether the Pickupable is currently picked up or not.
189
190            bool enabled_; //!< Whether the Pickupable is enabled or not.
191
192            PickupCarrier* carrier_; //!< The PickupCarrier of the Pickupable.
193            std::list<Identifier*> targets_; //!< The possible targets of this Pickupable.
194
195            bool beingDestroyed_; //!< Is true if the Pickupable is in the process of being destroyed.
196
197        // For implementing the Rewardable interface:
198        public:
199            virtual bool reward(PlayerInfo* player); //!< Method to transcribe a Pickupable as a Rewardable to the player.
200
201    };
202
203    //! SUPER functions.
204    SUPER_FUNCTION(10, Pickupable, changedUsed, false);
205    SUPER_FUNCTION(12, Pickupable, changedCarrier, false);
206    SUPER_FUNCTION(13, Pickupable, changedPickedUp, false);
207    SUPER_FUNCTION(11, Pickupable, clone, false);
208}
209
210#endif /* _Pickupable_H__ */
Note: See TracBrowser for help on using the repository browser.