| 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 | 
|---|
| 24 | class Projectile; | 
|---|
| 25 | class WeaponManager; | 
|---|
| 26 | class Animation3D; | 
|---|
| 27 | class TiXmlElement; | 
|---|
| 28 | class FastFactory; | 
|---|
| 29 | template<class T> class tFastFactory; | 
|---|
| 30 |  | 
|---|
| 31 | //! An enumerator defining Actions a Weapon can take | 
|---|
| 32 | typedef 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 | 
|---|
| 45 | typedef 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 | 
|---|
| 59 | typedef 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 |  */ | 
|---|
| 85 | class 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 |     inline int getPreferedSide() { return this->preferedSide; } | 
|---|
| 190 |     inline int getPreferedSlot() { return this->preferedSlot; } | 
|---|
| 191 |  | 
|---|
| 192 |     inline void setEnergyWidgetInitialized(bool b) {this->isEnergyWidgetInitialized = b;}; | 
|---|
| 193 |  | 
|---|
| 194 |  | 
|---|
| 195 |   protected: | 
|---|
| 196 |     //! ACTION: these functions are handled by the Weapon itself, and must be called by requestAction(WeaponAction); | 
|---|
| 197 |     virtual void activate() {}; | 
|---|
| 198 |     virtual void deactivate() {}; | 
|---|
| 199 |     virtual void charge() {}; | 
|---|
| 200 |     virtual void fire() {}; | 
|---|
| 201 |     virtual void reload() {}; | 
|---|
| 202 |  | 
|---|
| 203 |  | 
|---|
| 204 |     // utility: | 
|---|
| 205 |     static WeaponAction  charToAction(const std::string& action); | 
|---|
| 206 |     static const char*   actionToChar(WeaponAction action); | 
|---|
| 207 |     static WeaponState   charToState(const std::string& state); | 
|---|
| 208 |     static const char*   stateToChar(WeaponState state); | 
|---|
| 209 |  | 
|---|
| 210 |     void setPreferedSlot(int slot, int side) { this->preferedSlot = slot; this->preferedSide = side; } | 
|---|
| 211 |  | 
|---|
| 212 |     //gui | 
|---|
| 213 |     OrxGui::GLGuiEnergyWidgetVertical* energyWidget; | 
|---|
| 214 |     bool  isEnergyWidgetInitialized; | 
|---|
| 215 |  | 
|---|
| 216 |  | 
|---|
| 217 |   private: | 
|---|
| 218 |     /** executive functions, that handle timing with actions. | 
|---|
| 219 |      * This is for the action-functions in derived functions to be easy | 
|---|
| 220 |      * The main function is execute, that calls all the other functions | 
|---|
| 221 |      * for being fast, the Functions are private and as such will be inlined | 
|---|
| 222 |      * into the execute function. (this is work of the compiler) | 
|---|
| 223 |      */ | 
|---|
| 224 |     bool execute(); | 
|---|
| 225 |     bool activateW(); | 
|---|
| 226 |     bool deactivateW(); | 
|---|
| 227 |     bool chargeW(); | 
|---|
| 228 |     bool fireW(); | 
|---|
| 229 |     bool reloadW(); | 
|---|
| 230 |     inline void enterState(WeaponState state); | 
|---|
| 231 |  | 
|---|
| 232 |     void updateWidgets(); | 
|---|
| 233 |  | 
|---|
| 234 |   private: | 
|---|
| 235 |     // type of Weapon | 
|---|
| 236 |     long                 capability;                       //!< what capabilities the Weapon has @see W_Capability | 
|---|
| 237 |  | 
|---|
| 238 |     // it is all about energy | 
|---|
| 239 |     float                energy;                           //!< The energy stored in the weapons buffers | 
|---|
| 240 |     float                energyMax;                        //!< The maximal energy that can be stored in the secondary buffers (reserveMax) | 
|---|
| 241 |     CountPointer<AmmoContainer> ammoContainer;             //!< Pointer to the AmmoContainer this weapon grabs Energy from. | 
|---|
| 242 |     //! @todo move this to projectile | 
|---|
| 243 |     float                minCharge;                        //!< The minimal energy to be loaded onto one projectile if chargeable otherwise the power consumed by one projectile | 
|---|
| 244 |     float                maxCharge;                        //!< The maximal energy to be loaded onto one projectile (this is only availible if chargeable is enabled) | 
|---|
| 245 |  | 
|---|
| 246 |     //OrxGui::GLGuiEnergyWidgetVertical* energyWidget; | 
|---|
| 247 |  | 
|---|
| 248 |     PNode*               defaultTarget;                    //!< A target for targeting Weapons. | 
|---|
| 249 |  | 
|---|
| 250 |     //////////// | 
|---|
| 251 |     // PHASES // | 
|---|
| 252 |     //////////// | 
|---|
| 253 |     OrxSound::SoundSource* soundSource;                     //!< A SoundSource to play sound from (this is connected to the PNode of the Weapon) | 
|---|
| 254 |  | 
|---|
| 255 |     WeaponState            currentState;                    //!< The State the weapon is in. | 
|---|
| 256 |     WeaponAction           requestedAction;                 //!< An action to try to Engage after the currentState ends. | 
|---|
| 257 |     float                  stateDuration;                   //!< how long the state has taken until now. | 
|---|
| 258 |     float                  times[WS_STATE_COUNT];           //!< Times to stay in the different States @see WeaponState. | 
|---|
| 259 |     Animation3D*           animation[WS_STATE_COUNT];       //!< Animations for all the States (you can say yourself on what part of the gun this animation acts). | 
|---|
| 260 |     OrxSound::SoundBuffer  soundBuffers[WA_ACTION_COUNT];   //!< SoundBuffers for all actions @see WeaponAction. | 
|---|
| 261 |  | 
|---|
| 262 |     PNode**                emissionPoint;                   //!< The point, where the projectiles are emitted. (this is coppled with the Weapon by default) | 
|---|
| 263 |  | 
|---|
| 264 |     bool                   hideInactive;                    //!< Hides the Weapon if it is inactive | 
|---|
| 265 |     bool                   chargeable;                      //!< if the Weapon is charcheable (if true, the weapon will charge before it fires.) | 
|---|
| 266 |  | 
|---|
| 267 |     ClassID                projectile;                      //!< the projectile used for this weapon (since they should be generated via macro and the FastFactory, only the ClassID must be known.) | 
|---|
| 268 |     FastFactory*           projectileFactory;               //!< A factory, that produces and handles the projectiles. | 
|---|
| 269 |  | 
|---|
| 270 |     int                    barrels;                         //!< # of barrels | 
|---|
| 271 |     int                    segs;                             //!< # of segments, one barrel has | 
|---|
| 272 |     Animation3D***         shootAnim; | 
|---|
| 273 |  | 
|---|
| 274 |     int                    preferedSlot;                    //!< prefered slot to add | 
|---|
| 275 |     int                    preferedSide;                    //!< prefered side (left/right) to be added | 
|---|
| 276 |  | 
|---|
| 277 |   }; | 
|---|
| 278 |  | 
|---|
| 279 | #endif /* _WEAPON_H */ | 
|---|