nireco@212: #ifndef WEAPON_HH nireco@212: #define WEAPON_HH nireco@212: terom@221: // forward-declare terom@221: class Weapon; terom@271: typedef unsigned int WeaponID; terom@221: terom@221: #include "GameState.hh" ekku@222: #include "Projectile.hh" nireco@212: #include "Timer.hh" nireco@212: #include nireco@212: terom@283: /** terom@283: * A Weapon is something that a Player has in their list of weapons. It has a name, some parameters related to the terom@283: * weapon itself (name, reload time), and some parameters related to the projectiles that it creates (velocity, terom@283: * radius, etc). terom@283: */ nireco@212: class Weapon { terom@221: protected: terom@271: /** terom@271: * weapon's index in player's weapons list terom@271: */ terom@271: WeaponID id; terom@271: terom@271: /** terom@271: * weapon name terom@271: */ terom@221: std::string name; terom@271: terom@271: /** terom@271: * projectile velocity terom@271: */ nireco@212: float velocity; terom@271: terom@271: /** ekku@305: * Damage it does to player's health. ekku@305: */ ekku@305: int damage; ekku@305: ekku@305: /** terom@271: * radius of damage done on impact terom@271: */ terom@271: float explosionRadius; terom@271: terom@271: /** terom@271: * radius of projectile itself terom@271: */ terom@271: float radius; terom@271: terom@271: /** terom@271: * how long it takes to reload terom@271: */ terom@271: TimeMS reloadTime; terom@271: terom@271: /** terom@271: * recoil force, backwards terom@271: */ saiam@251: float recoil; terom@271: terom@271: /** terom@271: * XXX: unused terom@271: */ nireco@212: int clipSize; nireco@212: terom@271: /** terom@271: * How many ticks projectiles last terom@271: */ terom@271: TickCount expire; terom@271: terom@271: /** terom@423: * Remaining reload time terom@271: */ terom@423: TimeMS reloadTimer; nireco@212: terom@279: /** terom@279: * If nonzero, projectiles bounce off walls (it's the elasticity factor), else they explode on contact terom@279: */ terom@279: float bounce; terom@279: terom@338: /** terom@338: * Projectile mass terom@338: */ terom@338: float mass; terom@338: terom@221: public: terom@271: /** terom@271: * Create a weapon with the given parameters terom@271: */ terom@338: Weapon (WeaponID id, TickCount expire, float velocity, float recoil, int damage, float explosionRadius, float radius, TimeMS reloadTime, std::string name, float bounce, float mass); terom@221: terom@271: /** terom@271: * Decrement the reload timer, if it's still going terom@271: */ terom@221: void tickReload (TimeMS dt); terom@221: terom@271: /** terom@271: * Can the weapon be fired (not reloading, have a clip, etc) terom@271: */ terom@271: bool canShoot (void) const; terom@221: terom@271: /* terom@271: * Get weapon parameters terom@271: */ terom@276: WeaponID getID (void) const { return id; } terom@271: std::string getName (void) const { return name; } terom@271: float getSpeed (void) const { return velocity; } terom@271: float getRecoil (void) const { return recoil; } terom@271: float getExplosionRadius (void) const { return explosionRadius; } terom@423: terom@423: // XXX: int -> Health terom@423: Health getDamage (void) const { return (Health) damage; } terom@271: float getRadius (void) const { return radius; } terom@271: TickCount getExpire (void) const { return expire; } terom@279: float getBounce (void) const { return bounce; } terom@338: float getMass (void) const { return mass; } terom@423: terom@423: // XXX: remove one of these terom@423: TimeMS getReloadTimer(void) const { return reloadTimer; } terom@423: TimeMS getReloadTime(void) const { return reloadTime; } terom@223: terom@271: /** terom@271: * Start reloading terom@271: */ terom@223: void reload (void); nireco@212: }; nireco@212: nireco@212: #endif