Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/world_entities/weapons/weapon.h @ 9685

Last change on this file since 9685 was 9685, checked in by bensch, 18 years ago

adapted many classes to the new ClassID System, now comes the hard part… Scripting… then Network… wow this will be so bad :/

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