Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/weapons/weapon.h @ 10728

Last change on this file since 10728 was 10698, checked in by snellen, 17 years ago

merged adm, hud, vs-enhancements : beni's responsible for this commit. blame him!

File size: 13.9 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    inline void setScaling(float scaling) { this->scaling = scaling; };
127    inline float getScaling() { return this->scaling; };
128
129    // EMISSION
130    /** keeping old functions*/
131    void setEmissionPoint(const Vector& point, int barrel);
132    void setEmissionPoint(const Vector& point);
133    /** @see void setEmissionPoint(const Vector& point); */
134    inline void setEmissionPoint(float x, float y, float z, int barrel) { this->setEmissionPoint(Vector(x, y, z), barrel); };
135    inline void setEmissionPoint(float x, float y, float z) { this->setEmissionPoint(Vector(x, y, z)); };
136    /** @returns the absolute Position of the EmissionPoint */
137    inline const Vector& getEmissionPoint(int barrel) const { return this->emissionPoint[barrel]->getAbsCoor(); };
138    inline const Vector& getEmissionPoint() const { return this->emissionPoint[0]->getAbsCoor(); };
139
140
141    inline void setDefaultTarget(PNode* defaultTarget) { this->defaultTarget = defaultTarget; };
142    inline PNode* getDefaultTarget() const { return this->defaultTarget; };
143
144    // STATE CHANGES //
145    /** @param state the State to time @param duration the duration of the State */
146    inline void setStateDuration(const std::string& state, float duration) { setStateDuration(charToState(state), duration); };
147    /** @param state the State to time @param duration the duration of the State */
148    inline void setStateDuration(WeaponState state, float duration) { /*(state < WS_STATE_COUNT)?*/this->times[state] = duration; };
149    /** @param state The state to query @returns the Time the queried State takes to complete */
150    inline float getStateDuration(WeaponState state) const { return (state < WS_STATE_COUNT)? this->times[state] : 0.0; };
151    /** @returns true if the time of the currentState is elapsed, false otherwise */
152    inline bool stateTimeElapsed() const { return (this->stateDuration > this->times[currentState])? true : false; };
153    /** @returns the current State of the Weapon */
154    inline WeaponState getCurrentState() const { return this->currentState; };
155
156    /** @param energyMax the maximum energy the Weapon can have */
157    inline void setEnergyMax(float energyMax) { this->energyMax = energyMax; };
158    inline float getEnergy() const { return this->energy; };
159    inline float getEnergyMax() const { return this->energyMax; };
160    inline void setAmmoContainer(const CountPointer<AmmoContainer>& ammoContainer) { this->ammoContainer = ammoContainer;}
161
162    void setActionSound(WeaponAction action, const std::string& soundFile);
163    /** @see void setActionSound(WeaponAction action, const std::string& soundFile); */
164    void setActionSound(const std::string& action, const std::string& soundFile) { this->setActionSound(charToAction(action), soundFile); };
165
166    Animation3D* getAnimation(WeaponState state, PNode* node = NULL);
167    Animation3D* getAnimation(int barrel, int seg, PNode* node);
168    Animation3D* copyAnimation(WeaponState from, WeaponState to);
169
170    OrxGui::GLGuiWidget* getEnergyWidget();
171
172    // FLOW
173    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
174
175    virtual void tick(float dt) { tickW(dt); };
176
177    bool check() const;
178    void debug() const;
179
180    inline int getBarrels() {return this->barrels; };
181    inline int getSegs() { return this->segs; };
182    inline void setBarrels(int barrels) { this->barrels = barrels; };
183    inline void setSegs(int segs) { this->segs = segs; };
184
185//     inline Animation3D* getShootAnim(int barrel, int seg) { return this->shootAnim[barrel][seg]; };
186//     inline void setShootAnim(int barrel, int seg, PNode* component) { this->shootAnim[barrel][seg] = this->getAnimation(barrel, seg, component); };
187
188//     void init2();
189    void deconstr();
190
191    inline int getPreferedSide() { return this->preferedSide; }
192    inline int getPreferedSlot() { return this->preferedSlot; }
193
194    inline void setEnergyWidgetInitialized(bool b) {this->isEnergyWidgetInitialized = b;};
195
196
197  protected:
198    //! ACTION: these functions are handled by the Weapon itself, and must be called by requestAction(WeaponAction);
199    virtual void activate() {};
200    virtual void deactivate() {};
201    virtual void charge() {};
202    virtual void fire() {};
203    virtual void reload() {};
204
205
206    // utility:
207    static WeaponAction  charToAction(const std::string& action);
208    static const char*   actionToChar(WeaponAction action);
209    static WeaponState   charToState(const std::string& state);
210    static const char*   stateToChar(WeaponState state);
211
212    void setPreferedSlot(int slot, int side) { this->preferedSlot = slot; this->preferedSide = side; }
213
214    //gui
215    OrxGui::GLGuiEnergyWidgetVertical* energyWidget;
216    bool  isEnergyWidgetInitialized;
217
218
219  private:
220    /** executive functions, that handle timing with actions.
221     * This is for the action-functions in derived functions to be easy
222     * The main function is execute, that calls all the other functions
223     * for being fast, the Functions are private and as such will be inlined
224     * into the execute function. (this is work of the compiler)
225     */
226    bool execute();
227    bool activateW();
228    bool deactivateW();
229    bool chargeW();
230    bool fireW();
231    bool reloadW();
232    inline void enterState(WeaponState state);
233
234    void updateWidgets();
235
236  private:
237    // type of Weapon
238    long                 capability;                       //!< what capabilities the Weapon has @see W_Capability
239
240    // it is all about energy
241    float                energy;                           //!< The energy stored in the weapons buffers
242    float                energyMax;                        //!< The maximal energy that can be stored in the secondary buffers (reserveMax)
243    CountPointer<AmmoContainer> ammoContainer;             //!< Pointer to the AmmoContainer this weapon grabs Energy from.
244    //! @todo move this to projectile
245    float                minCharge;                        //!< The minimal energy to be loaded onto one projectile if chargeable otherwise the power consumed by one projectile
246    float                maxCharge;                        //!< The maximal energy to be loaded onto one projectile (this is only availible if chargeable is enabled)
247
248    //OrxGui::GLGuiEnergyWidgetVertical* energyWidget;
249
250    PNode*               defaultTarget;                    //!< A target for targeting Weapons.
251
252    float                scaling;                          //!< Local scaling factor. any scaling will be done through this vector.
253
254    ////////////
255    // PHASES //
256    ////////////
257    OrxSound::SoundSource* soundSource;                     //!< A SoundSource to play sound from (this is connected to the PNode of the Weapon)
258
259    WeaponState            currentState;                    //!< The State the weapon is in.
260    WeaponAction           requestedAction;                 //!< An action to try to Engage after the currentState ends.
261    float                  stateDuration;                   //!< how long the state has taken until now.
262    float                  times[WS_STATE_COUNT];           //!< Times to stay in the different States @see WeaponState.
263    Animation3D*           animation[WS_STATE_COUNT];       //!< Animations for all the States (you can say yourself on what part of the gun this animation acts).
264    OrxSound::SoundBuffer  soundBuffers[WA_ACTION_COUNT];   //!< SoundBuffers for all actions @see WeaponAction.
265
266    PNode**                emissionPoint;                   //!< The point, where the projectiles are emitted. (this is coppled with the Weapon by default)
267
268    bool                   hideInactive;                    //!< Hides the Weapon if it is inactive
269    bool                   chargeable;                      //!< if the Weapon is charcheable (if true, the weapon will charge before it fires.)
270
271    ClassID                projectile;                      //!< the projectile used for this weapon (since they should be generated via macro and the FastFactory, only the ClassID must be known.)
272    FastFactory*           projectileFactory;               //!< A factory, that produces and handles the projectiles.
273
274    int                    barrels;                         //!< # of barrels
275    int                    segs;                             //!< # of segments, one barrel has
276    Animation3D***         shootAnim;
277
278    int                    preferedSlot;                    //!< prefered slot to add
279    int                    preferedSide;                    //!< prefered side (left/right) to be added
280
281  };
282
283#endif /* _WEAPON_H */
Note: See TracBrowser for help on using the repository browser.