Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/presentation/src/world_entities/weapons/weapon_manager.h @ 9157

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

deleting weapons should be fixed

File size: 5.6 KB
Line 
1/*!
2 * @file weapon_manager.h
3 * every big WorldEntity has the ability to carry many different Weapons.
4 * for this to be easy there is the WeaponManager, that handels these weapons,
5 * and changes between them.
6 *
7 *
8 *
9 * @TODO 1. WeaponManager should also handle a List of availiableWeapons.
10 */
11
12#ifndef _WEAPON_MANAGER_H
13#define _WEAPON_MANAGER_H
14
15#include "base_object.h"
16
17#include "crosshair.h"
18#include "weapon.h"
19
20#include "count_pointer.h"
21#include "ammo_container.h"
22
23// FORWARD DECLARATION
24template <class T> class tAnimation;
25
26#define    WM_MAX_SLOTS            10             //!< How many slots the WeaponManager has at its max
27#define    WM_MAX_CONFIGS          4              //!< The maximum number of predefined Configurations
28#define    WM_MAX_LOADED_WEAPONS   20             //!< The
29
30//! This is a special class, that can handle many different Weapons of a ship/man/whatever.
31/**
32 * this class is designed to interactively changeing multiple weapons (or just one),
33 * and to allow the Weapon itself to enable/disable itself.
34 *
35 * How to configure
36 * 1. set the default values.
37 * 2. define weapons. connect them to the WeaponManager's configurations (have a look at "player.cc", to see how it works)
38 * 3. go on and run :)....
39 */
40class WeaponManager : public BaseObject {
41
42  //! an enumerator defining a Slot, where a Weapon can be stored inside.
43  typedef struct
44  {
45    PNode         position;               //!< the relative Position to the position of the carrying entity. (const PNode* parent; of WeaponManager)
46    long          capability;             //!< the capabilities of the Slot @see WM_SlotCapability.
47
48    Weapon*       currentWeapon;          //!< The current weapon this slot is carrying.
49    Weapon*       nextWeapon;             //!< either NULL or the next weapon that will be set (require currentWeapon to deactivate)
50  } WM_Slot;
51
52  public:
53    WeaponManager(WorldEntity* parent);
54    WeaponManager(const TiXmlElement* root);
55    virtual ~WeaponManager();
56
57    void init();
58    virtual void loadParams(const TiXmlElement* root);
59    void loadWeapons(const TiXmlElement* root);
60
61    void setSlotCount(unsigned int slotCount);
62    unsigned int getSlotCount() const { return this->slotCount; };
63    // setting up the WeaponManager with the following functions
64    void setSlotPosition(int slot, const Vector& position, PNode* parent = NULL);
65    void setSlotDirection(int slot, const Quaternion& rotation);
66    /** @param slot the slot to get the relative position from @returns the relative position of the Carrier to the Slot */
67    const Vector& getSlotPosition(int slot) const { return this->currentSlotConfig[slot].position.getRelCoor(); };
68    void setSlotCapability(int slot, long slotCapability);
69    /** @param slot the slot to get the capabilities from @returns the capabilies */
70    long getSlotCapability(int slot) const { return this->currentSlotConfig[slot].capability; };
71
72    void setParentEntity(WorldEntity* parent);
73    WorldEntity* getParentEntity() const { return this->parentEntity; };
74
75    void setParentNode(PNode* node);
76    /** @returns the Parent (carrier) of this WeaponManager */
77    PNode* getParentNode() const { return this->parentNode; };
78
79    bool addWeapon(Weapon* weapon, int configID = -1, int slotID = -1);
80    void removeWeapon(Weapon* weapon, int configID = -1);
81
82    Weapon* getWeapon(int slotID) const { return (slotID >= 0 && slotID < this->slotCount)? this->currentSlotConfig[slotID].nextWeapon: NULL; };
83
84    // FIXME ::
85//    bool hasFreeSlot(int configID, long capability = WTYPE_ALL) { return ( getNextFreeSlot(configID, capability ) != -1)? true : false; };
86
87    void nextWeaponConfig();
88    void previousWeaponConfig();
89    void changeWeaponConfig(int weaponConfig);
90
91    float increaseAmmunition(ClassID projectileType, float ammo);
92    float inclreaseAmmunition(const Weapon* weapon, float ammo);
93
94    /** @returns a fixed target namely the Crosshair's 3D position */
95    inline PNode* getFixedTarget() const { return this->crosshair; };
96
97    void fire();
98    //! @TODO: implement this function (maybe also in Weapon itself)
99    void releaseFire();
100
101    void tick(float dt);
102    void draw() const;
103
104    void debug() const;
105
106 // private:
107    int getNextFreeSlot(int configID, long capability = WTYPE_ALL);
108    CountPointer<AmmoContainer>& getAmmoContainer(ClassID projectileType);
109    CountPointer<AmmoContainer>& getAmmoContainer(const Weapon* weapon);
110
111  private:
112    WorldEntity*            parentEntity;                             //!< The parent, this WeaponManager is connected to.
113    PNode*                  parentNode;                               //!< The parented Node the WeaponManager is connected to. (by default == parentEntity).
114
115    int                     slotCount;                                //!< number of weapon slots the ship has.
116    int                     currentConfigID;                          //!< the currently selected config.
117    Weapon*                 configs[WM_MAX_CONFIGS][WM_MAX_SLOTS];    //!< An array of predefined configurations and assigned weapon.
118    WM_Slot                 currentSlotConfig[WM_MAX_SLOTS];          //!< The currentConfigureation.
119
120    Weapon*                 availiableWeapons[WM_MAX_LOADED_WEAPONS]; //!< The availiable Weapons of this WeaponManager
121
122    bool                    weaponChange;
123
124    Crosshair*              crosshair;                                //!< an aim.
125    tAnimation<Crosshair>*  crossHairSizeAnim;                        //!< An animation for the crosshair (scaling)
126
127    std::vector<CountPointer<AmmoContainer> > ammo;                   //!< Containers
128};
129
130
131#endif /* _WEAPON_MANAGER_H */
Note: See TracBrowser for help on using the repository browser.