#ifndef _H_WEAPON_H #define _H_WEAPON_H #include #include #include #include "util.h" #include "gameplay/entity.h" #include "gameplay/weapons/bullet.h" #include "utility/direction.h" // TODO: Put all weapons inside of this base, we don't need a class for every weapon, we only need one class! class Shader; class Component; class Camera; class BulletManager; class EventManager; class ResourceManager; class GameActor; class WeaponScript; struct PhysicsComponent; struct WeaponData; class Weapon : public Entity, public std::enable_shared_from_this { public: Weapon(std::shared_ptr data, const std::shared_ptr& weaponShader, const std::shared_ptr& bulletShader, ResourceManager* resourceManager); void setWielder(const std::shared_ptr& wielder) { this->wielder = wielder; } void toggleInfiniteAmmo() { infiniteAmmo = !infiniteAmmo; } void wield() { wielded = true; } void putaway() { wielded = false; } void addComponent(const std::shared_ptr& component); void attachScript(const std::shared_ptr& script); void hookEventManager(const std::shared_ptr& eventManager); void shoot(); void reload(); void update(double deltaTime); void render(const std::shared_ptr& camera); struct BulletData { glm::vec3 origin; glm::vec2 direction; float mass = 1.f; float sizeMod = 1.f; float speedMod = 1.f; float dropMod = 1.f; }; void onHitCallback(std::shared_ptr target, std::shared_ptr bullet, const glm::vec2& normal); glm::vec2 getWeaponSize() const { return weaponSize; } // This is the offset from the center right point of the weapon to the barrel of the gun defined in // the XML file for the weapon glm::vec2 getWeaponOffset() const { return weaponOffset; } float getBulletSpeed() const { return bulletSpeed; } glm::vec2 getBulletSize() const { return bulletSize; } std::shared_ptr getWielder() const { return wielder; } const Uint32 getMagazine() const { return weaponMag; } const Uint32 getAmmo() const { return weaponAmmo; } Weapon::BulletData genBulletData (); void createBullet (const BulletData& data); private: void adjustWeapon(); glm::vec2 weaponSize; glm::vec2 weaponOffset; // TODO: Add reloading // weaponMag will be unused for now, but we will do a reload animation and reload the weapon eventually Uint16 weaponMag, weaponMagSize, weaponAmmo; bool reloading = false; bool wasReloading = false; bool infiniteAmmo = false; float bulletSpeed; float bulletDrop; // in ms float fireSpeed; glm::vec2 bulletSize; std::shared_ptr bulletShader; std::shared_ptr bulletSprite; std::shared_ptr bulletManager; std::shared_ptr eventManager; std::shared_ptr bulletSpread; std::shared_ptr bulletModifer; std::shared_ptr wielder; // is the weapon currently active bool wielded = false; int lastFireTime = 0; Direction lastDir; std::vector > components; std::shared_ptr weaponScript; }; #endif // _H_WEAPON_H