Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/ppspickups1/src/modules/pickup/items/SpeedPickup.cc @ 6607

Last change on this file since 6607 was 6607, checked in by ebeier, 15 years ago

first working version of the SpeedPickup, needs some more work for "onUse" type. Spaceship trails need to be looked at, because they don't show when a SpeedPickup with SpeedAdd is used.

File size: 6.7 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 *      Eric Beier
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file SpeedPickup.cc
31    @brief Implementation of the SpeedPickup class.
32*/
33
34#include "SpeedPickup.h"
35
36#include "core/CoreIncludes.h"
37#include "core/XMLPort.h"
38#include "util/StringUtils.h"
39
40#include "worldentities/pawns/SpaceShip.h"
41#include "items/Engine.h"
42#include "pickup/PickupIdentifier.h"
43
44#include <sstream>
45
46
47namespace orxonox
48{
49    CreateFactory(SpeedPickup);
50
51    /**
52    @brief
53        Constructor. Registers the object and initializes the member variables.
54    */
55    SpeedPickup::SpeedPickup(BaseObject* creator) : Pickup(creator)
56    {
57        RegisterObject(SpeedPickup);
58
59        this->initialize();
60    }
61
62    /**
63    @brief
64        Destructor.
65    */
66    SpeedPickup::~SpeedPickup()
67    {
68
69    }
70
71    /**
72    @brief
73        Initializes the member variables.
74    */
75    void SpeedPickup::initialize(void)
76    {
77        this->duration_ = 0.0;
78        this->speedAdd_ = 0.0;
79        this->speedMultiply_ = 1.0;
80
81        this->addTarget(ClassIdentifier<Pawn>::getIdentifier());
82    }
83
84    /**
85    @brief
86        Initializes the PickupIdentifier of this pickup.
87    */
88    void SpeedPickup::initializeIdentifier(void)
89    {
90        std::stringstream stream;
91        stream << this->getDuration();
92        std::string type1 = "duration";
93        std::string val1 = stream.str();
94        this->pickupIdentifier_->addParameter(type1, val1);
95
96        stream.clear();
97        stream << this->getSpeedAdd();
98        std::string type2 = "speedAdd";
99        std::string val2 = stream.str();
100        this->pickupIdentifier_->addParameter(type2, val2);
101
102        stream.clear();
103        stream << this->getSpeedMultiply();
104        std::string type3 = "speedMultiply";
105        std::string val3 = stream.str();
106        this->pickupIdentifier_->addParameter(type3, val3);
107    }
108
109    /**
110    @brief
111        Method for creating a SpeedPickup object through XML.
112    */
113    void SpeedPickup::XMLPort(Element& xmlelement, orxonox::XMLPort::Mode mode)
114    {
115        SUPER(SpeedPickup, XMLPort, xmlelement, mode);
116
117        XMLPortParam(SpeedPickup, "duration", setDuration, getDuration, xmlelement, mode);
118        XMLPortParam(SpeedPickup, "speedAdd", setSpeedAdd, getSpeedAdd, xmlelement, mode);
119        XMLPortParam(SpeedPickup, "speedMultiply", setSpeedMultiply, getSpeedMultiply, xmlelement, mode);
120
121        this->initializeIdentifier();
122    }
123
124    /**
125    @brief
126        Is called when the pickup has transited from used to unused or the other way around.
127    */
128    void SpeedPickup::changedUsed(void)
129    {
130        SUPER(SpeedPickup, changedUsed);
131
132        //! If the pickup is not picked up nothing must be done.
133        if(!this->isPickedUp())
134            return;
135
136        //! If the pickup has transited to used.
137        if(this->isUsed())
138        {
139            this->startPickupTimer(this->getDuration());
140
141            Engine* engine = this->carrierToEngineHelper();
142            if(engine == NULL) //!< If the PickupCarrier is no Pawn, then this pickup is useless and therefore is destroyed.
143                this->destroy();
144            engine->setSpeedAdd(this->getSpeedAdd());
145            engine->setSpeedMultiply(this->getSpeedMultiply());
146        }
147    }
148
149
150
151    /**
152    @brief
153        Helper to transform the PickupCarrier to a Pawn, and throw an error message if the conversion fails.
154    @return
155        A pointer to the Pawn, or NULL if the conversion failed.
156    */
157    Engine* SpeedPickup::carrierToEngineHelper(void)
158    {
159        PickupCarrier* carrier = this->getCarrier();
160        SpaceShip* ship = dynamic_cast<SpaceShip*>(carrier);
161
162        if(ship == NULL)
163        {
164            COUT(1) << "Invalid PickupCarrier in SpeedPickup." << std::endl;
165        }
166        else
167        {
168            return ship->getEngine();
169        }
170
171        return 0;
172    }
173
174    /**
175    @brief
176        Creates a duplicate of the input OrxonoxClass.
177    @param item
178        A pointer to the Orxonox class.
179    */
180    void SpeedPickup::clone(OrxonoxClass*& item)
181    {
182        if(item == NULL)
183            item = new SpeedPickup(this);
184
185        SUPER(SpeedPickup, clone, item);
186
187        SpeedPickup* pickup = dynamic_cast<SpeedPickup*>(item);
188        pickup->setDuration(this->getDuration());
189        pickup->setSpeedAdd(this->getSpeedAdd());
190        pickup->setSpeedMultiply(this->getSpeedMultiply());
191
192        pickup->initializeIdentifier();
193    }
194
195    /**
196    @brief
197        Sets the duration.
198    @param duration
199        The duration
200    */
201    void SpeedPickup::setDuration(float duration)
202    {
203        if(duration >= 0.0f)
204        {
205            this->duration_ = duration;
206        }
207        else
208        {
209            COUT(1) << "Invalid duration in SpeedPickup." << std::endl;
210            this->duration_ = 0;
211        }
212    }
213
214    /**
215    @brief
216        Sets the SpeedAdd
217    @param speedAdd
218        The added Speed
219    */
220    void SpeedPickup::setSpeedAdd(float speedAdd)
221    {
222        if(speedAdd >= 0.0f)
223        {
224            this->speedAdd_ = speedAdd;
225        }
226        else
227        {
228            COUT(1) << "Invalid speedAdd in SpeedPickup." << std::endl;
229            this->speedAdd_ = 0.0;
230        }
231    }
232
233    /**
234    @brief
235        Sets the SpeedMultiply
236    @param speedAdd
237        The multiplied Speed
238    */
239    void SpeedPickup::setSpeedMultiply(float speedMultiply)
240    {
241        if(speedMultiply != 0)
242        {
243            this->speedMultiply_ = speedMultiply;
244        }
245        else
246        {
247            COUT(1) << "Invalid speedMultiply in SpeedPickup." << std::endl;
248            this->speedMultiply_ = 1.0;
249        }
250    }
251
252    void SpeedPickup::PickupTimerCallBack(void) {
253        COUT(2) << "Timer ended!" << std::endl;
254    }
255}
Note: See TracBrowser for help on using the repository browser.