Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 5379 was 5356, checked in by bensch, 19 years ago

orxonox/trunk: saver Weapon-Projectile-generation and Stuff

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