Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/world_entities/weapons/weapon.h @ 10180

Last change on this file since 10180 was 10152, checked in by nicolasc, 17 years ago

finished animation on heavy blaster, started light blaster
code needs some cleanup

File size: 13.1 KB
Line 
1/*!
2 * @file weapon.h
3 *
4 * Weapon is the mayor baseclass for all weapons. it is quite extensive, and expensive in use,
5 * because each weapon will know virutal functions for the WorldEntity's part, and also virtuals
6 * for Fireing/Reloading/...,
7 * quickly said: Weapon is a wrapper for weapons, that makes it easy to very quickly implement
8 * new Weapons, and with them make this game better, than any game before it, because still
9 * Weapons (GUNS) are the most important thing in life :?... no to be serious
10 * @see Weapon
11 */
12
13
14#ifndef _WEAPON_H
15#define _WEAPON_H
16
17#include "world_entity.h"
18#include "count_pointer.h"
19#include "ammo_container.h"
20
21#include "sound_buffer.h"
22
23// FORWARD DECLARATION
24class Projectile;
25class WeaponManager;
26class Animation3D;
27class TiXmlElement;
28class FastFactory;
29template<class T> class tFastFactory;
30
31//! An enumerator defining Actions a Weapon can take
32typedef enum {
33  WA_NONE          =    0,    //!< No Action taken
34  WA_SHOOT         =    1,    //!< emitting Shot
35  WA_CHARGE        =    2,    //!< charge action (one click before the shot)
36  WA_RELOAD        =    3,    //!< reload right after shoot is finished
37  WA_ACTIVATE      =    4,    //!< activate the GUN
38  WA_DEACTIVATE    =    5,    //!< deactivate the GUN
39  WA_SPECIAL1      =    6,    //!< Special Action taken
40
41  WA_ACTION_COUNT  =    7     //!< This must match the count of enumerations-members.
42} WeaponAction;
43
44//! An enumerator defining the States of a Weapon
45typedef enum {
46  WS_NONE          =    0,    //!< No State at all (if set, there is something wrong, or the weapon is not yet availiable)
47  WS_SHOOTING      =    1,    //!< The State of the Shooting
48  WS_CHARGING      =    2,    //!< The state of charging th weapon
49  WS_RELOADING     =    3,    //!< The State of the Reloading
50  WS_ACTIVATING    =    4,    //!< The State in which the weapon gets activated
51  WS_DEACTIVATING  =    5,    //!< The State in which the weapon gets deactivated
52  WS_INACTIVE      =    6,    //!< The State where the weapon is inactive (unable to shoot)
53  WS_IDLE          =    7,    //!< The State where the weapon is idle
54
55  WS_STATE_COUNT  =     8     //!< This must match the count of enumerations-members.
56} WeaponState;
57
58//! an enumerator defining capabilities of a WeaponSlot
59typedef enum
60{
61  WTYPE_DIRECTIONAL   = 0x00000001,           //!< Weapon is directional/Slot is able to carry directional weapons
62  WTYPE_TURRET        = 0x00000002,           //!< Weapon is a turret/slot is able to carry turrets
63  WTYPE_LIGHT         = 0x00000004,           //!< For light Armament.
64  WTYPE_HEAVY         = 0x00000008,           //!< The heavy Armament (Cannons).
65  WTYPE_ALLKINDS      = 0x0000000f,           //!< Weapon is all types/Slot is able to carry all kinds of weapons
66
67  WTYPE_FORWARD       = 0x00000010,           //!< Weapon fires forwards/Slot is able to carry weapons firing forwards
68  WTYPE_BACKWARD      = 0x00000020,           //!< Weapon fires backwards/Slot is able to carry weapons firing backwards
69  WTYPE_LEFT          = 0x00000040,           //!< Weapon fires to the left/Slot is able to carry weapons firing to the left
70  WTYPE_RIGHT         = 0x00000080,           //!< Weapon fires to the right/Slot is able to carry weapons firing to the right
71  WTYPE_ALLDIRS       = 0x000000f0,           //!< Weapon has no specific firing direction/Slot can fire into all directions
72
73  WTYPE_ALL           = 0x000000ff,           //!< Weapon has no limitations/Slot can handle all kinds of Weapon.
74} W_Capability;
75
76//! An abstract class, that describes weapons
77/**
78 * This is used as a container for all the different kinds of weapons that may exist
79 *
80 * Weapons have certain states, and actions, that can inflict them.
81 * ex. Action WA_SHOOT leeds to State WS_SHOOTING.
82 * each action has a sound connected to it,
83 * each state a time and an animation.
84 */
85class Weapon : public WorldEntity
86{
87  ObjectListDeclaration(Weapon);
88
89  public:
90    // INITIALISATION //
91    Weapon ();
92    virtual ~Weapon ();
93    static Weapon* createWeapon(const ClassID& weaponID);
94    static Weapon* createWeapon(const std::string& weaponName);
95
96    void init();
97    virtual void loadParams(const TiXmlElement* root);
98    ////////////////////
99
100    // INTERACTIVITY //
101    void requestAction(WeaponAction action);
102    float increaseEnergy(float energyToAdd);
103    ///////////////////
104
105    /** @returns true if the Weapon is Active  (this is used to check if the weapon must be drawn)*/
106    inline bool isActive() const { return (this->currentState == WS_INACTIVE)? false : true; };
107    /** @returns true if the weapon must be drawn */
108    inline bool isVisible() const { return (this->currentState != WS_INACTIVE || !this->hideInactive) ? true : false; };
109    /** @returns true if the Weapon is chargeable */
110    inline bool isChargeable() const { return this->chargeable; };
111
112    // FUNCTIONS TO SET THE WEAPONS PROPERTIES.
113    /** sets the Weapons Capabilities */
114    inline void setCapability(long capabilities) { this->capability = capabilities; };
115    /** @returns the Capabilities of this Weapon */
116    inline long getCapability() const { return this->capability; };
117    void setProjectileType(const ClassID& projectile);
118    void setProjectileTypeC(const std::string& projectile);
119    /** @returns The projectile's classID */
120    inline ClassID getProjectileType() { return this->projectile; };
121    /** @returns the FastFactory, that creates Projectiles of type getProjectile */
122    inline FastFactory* getProjectileFactory() { return this->projectileFactory; };
123    void prepareProjectiles(unsigned int count);
124    Projectile* getProjectile();
125
126
127    // EMISSION
128    /** keeping old functions*/
129    void setEmissionPoint(const Vector& point, int barrel);
130    void setEmissionPoint(const Vector& point);
131    /** @see void setEmissionPoint(const Vector& point); */
132    inline void setEmissionPoint(float x, float y, float z, int barrel) { this->setEmissionPoint(Vector(x, y, z), barrel); };
133    inline void setEmissionPoint(float x, float y, float z) { this->setEmissionPoint(Vector(x, y, z)); };
134    /** @returns the absolute Position of the EmissionPoint */
135    inline const Vector& getEmissionPoint(int barrel) const { return this->emissionPoint[barrel]->getAbsCoor(); };
136    inline const Vector& getEmissionPoint() const { return this->emissionPoint[0]->getAbsCoor(); };
137
138
139    inline void setDefaultTarget(PNode* defaultTarget) { this->defaultTarget = defaultTarget; };
140    inline PNode* getDefaultTarget() const { return this->defaultTarget; };
141
142    // STATE CHANGES //
143    /** @param state the State to time @param duration the duration of the State */
144    inline void setStateDuration(const std::string& state, float duration) { setStateDuration(charToState(state), duration); };
145    /** @param state the State to time @param duration the duration of the State */
146    inline void setStateDuration(WeaponState state, float duration) { /*(state < WS_STATE_COUNT)?*/this->times[state] = duration; };
147    /** @param state The state to query @returns the Time the queried State takes to complete */
148    inline float getStateDuration(WeaponState state) const { return (state < WS_STATE_COUNT)? this->times[state] : 0.0; };
149    /** @returns true if the time of the currentState is elapsed, false otherwise */
150    inline bool stateTimeElapsed() const { return (this->stateDuration > this->times[currentState])? true : false; };
151    /** @returns the current State of the Weapon */
152    inline WeaponState getCurrentState() const { return this->currentState; };
153
154    /** @param energyMax the maximum energy the Weapon can have */
155    inline void setEnergyMax(float energyMax) { this->energyMax = energyMax; };
156    inline float getEnergy() const { return this->energy; };
157    inline float getEnergyMax() const { return this->energyMax; };
158    inline void setAmmoContainer(const CountPointer<AmmoContainer>& ammoContainer) { this->ammoContainer = ammoContainer;}
159
160    void setActionSound(WeaponAction action, const std::string& soundFile);
161    /** @see void setActionSound(WeaponAction action, const std::string& soundFile); */
162    void setActionSound(const std::string& action, const std::string& soundFile) { this->setActionSound(charToAction(action), soundFile); };
163
164    Animation3D* getAnimation(WeaponState state, PNode* node = NULL);
165    Animation3D* getAnimation(int barrel, int seg, PNode* node);
166    Animation3D* copyAnimation(WeaponState from, WeaponState to);
167
168    OrxGui::GLGuiWidget* getEnergyWidget();
169
170    // FLOW
171    bool tickW(float dt); //!< this is a function that must be called by the weaponManager, or any other weaponHandler, all other functions are handled from within
172
173    virtual void tick(float dt) { tickW(dt); };
174
175    bool check() const;
176    void debug() const;
177
178    inline int getBarrels() {return this->barrels; };
179    inline int getSegs() { return this->segs; };
180    inline void setBarrels(int barrels) { this->barrels = barrels; };
181    inline void setSegs(int segs) { this->segs = segs; };
182
183    inline Animation3D* getShootAnim(int barrel, int seg) { return this->shootAnim[barrel][seg]; };
184    inline void setShootAnim(int barrel, int seg, PNode* component) { this->shootAnim[barrel][seg] = this->getAnimation(barrel, seg, component); };
185
186    void init2();
187    void deconstr();
188
189  protected:
190    //! ACTION: these functions are handled by the Weapon itself, and must be called by requestAction(WeaponAction);
191    virtual void activate() {};
192    virtual void deactivate() {};
193    virtual void charge() {};
194    virtual void fire() {};
195    virtual void reload() {};
196
197
198    // utility:
199    static WeaponAction  charToAction(const std::string& action);
200    static const char*   actionToChar(WeaponAction action);
201    static WeaponState   charToState(const std::string& state);
202    static const char*   stateToChar(WeaponState state);
203
204
205
206  private:
207    /** executive functions, that handle timing with actions.
208     * This is for the action-functions in derived functions to be easy
209     * The main function is execute, that calls all the other functions
210     * for being fast, the Functions are private and as such will be inlined
211     * into the execute function. (this is work of the compiler)
212     */
213    bool execute();
214    bool activateW();
215    bool deactivateW();
216    bool chargeW();
217    bool fireW();
218    bool reloadW();
219    inline void enterState(WeaponState state);
220
221    void updateWidgets();
222
223  private:
224    // type of Weapon
225    long                 capability;                       //!< what capabilities the Weapon has @see W_Capability
226
227    // it is all about energy
228    float                energy;                           //!< The energy stored in the weapons buffers
229    float                energyMax;                        //!< The maximal energy that can be stored in the secondary buffers (reserveMax)
230    CountPointer<AmmoContainer> ammoContainer;             //!< Pointer to the AmmoContainer this weapon grabs Energy from.
231    //! @todo move this to projectile
232    float                minCharge;                        //!< The minimal energy to be loaded onto one projectile if chargeable otherwise the power consumed by one projectile
233    float                maxCharge;                        //!< The maximal energy to be loaded onto one projectile (this is only availible if chargeable is enabled)
234
235    OrxGui::GLGuiEnergyWidget* energyWidget;
236
237    PNode*               defaultTarget;                    //!< A target for targeting Weapons.
238
239    ////////////
240    // PHASES //
241    ////////////
242    OrxSound::SoundSource* soundSource;                     //!< A SoundSource to play sound from (this is connected to the PNode of the Weapon)
243
244    WeaponState            currentState;                    //!< The State the weapon is in.
245    WeaponAction           requestedAction;                 //!< An action to try to Engage after the currentState ends.
246    float                  stateDuration;                   //!< how long the state has taken until now.
247    float                  times[WS_STATE_COUNT];           //!< Times to stay in the different States @see WeaponState.
248    Animation3D*           animation[WS_STATE_COUNT];       //!< Animations for all the States (you can say yourself on what part of the gun this animation acts).
249    OrxSound::SoundBuffer  soundBuffers[WA_ACTION_COUNT];   //!< SoundBuffers for all actions @see WeaponAction.
250
251    PNode**                emissionPoint;                   //!< The point, where the projectiles are emitted. (this is coppled with the Weapon by default)
252
253    bool                   hideInactive;                    //!< Hides the Weapon if it is inactive
254    bool                   chargeable;                      //!< if the Weapon is charcheable (if true, the weapon will charge before it fires.)
255
256    ClassID                projectile;                      //!< the projectile used for this weapon (since they should be generated via macro and the FastFactory, only the ClassID must be known.)
257    FastFactory*           projectileFactory;               //!< A factory, that produces and handles the projectiles.
258
259    int                    barrels;                         //!< # of barrels
260    int                    segs;                             //!< # of segments, one barrel has
261    Animation3D***         shootAnim;
262
263  };
264
265#endif /* _WEAPON_H */
Note: See TracBrowser for help on using the repository browser.