diff options
-rw-r--r-- | src/core/entity.cc | 1 | ||||
-rw-r--r-- | src/core/slot.cc | 53 | ||||
-rw-r--r-- | src/core/slot.h | 137 | ||||
-rw-r--r-- | src/core/slots.cc | 4 | ||||
-rw-r--r-- | src/game/base/ship.cc | 40 | ||||
-rw-r--r-- | src/game/base/weapon.cc | 55 | ||||
-rw-r--r-- | src/game/base/weapon.h | 80 |
7 files changed, 268 insertions, 102 deletions
diff --git a/src/core/entity.cc b/src/core/entity.cc index a53f8b8..462a46d 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -877,6 +877,7 @@ void EntityDynamic::reset() } /* Does not work + * Note: does not do what you'd think it does if (entity_mass) { diff --git a/src/core/slot.cc b/src/core/slot.cc index ace3be2..bb7b622 100644 --- a/src/core/slot.cc +++ b/src/core/slot.cc @@ -18,36 +18,44 @@ Slot::Slot() slot_timestamp = 0; slot_last_fired = 0; - slot_interval = 0; - slot_lifespan = 0; - slot_speed = 0.0f; + slot_projectile_interval = 0;; + slot_projectile_lifespan = 0; + slot_projectile_speed = 0.0f; + slot_projectile_damage = 0.0f; +} - +Slot::~Slot() +{ } -Slot::Slot(const math::Vector3f & location) : - slot_location(location) +void Slot::set_projectile_speed(const float projectile_speed) { - slot_item = 0; - slot_flags = 0; - slot_timestamp = 0; - slot_last_fired = 0; - - slot_interval = 0;; - slot_lifespan = 0; - slot_speed = 0.0f; + slot_projectile_speed = projectile_speed; + set_timestamp(game() ? game()->timestamp() : 1); } -Slot::~Slot() +void Slot::set_projectile_interval(unsigned long projectile_interval) { - slot_item = 0; - slot_flags = 0; - slot_timestamp = 0; - slot_last_fired = 0; + slot_projectile_interval = projectile_interval; + set_timestamp(game() ? game()->timestamp() : 1); +} + +void Slot::set_projectile_lifespan(unsigned long projectile_lifespan) +{ + slot_projectile_lifespan = projectile_lifespan; + set_timestamp(game() ? game()->timestamp() : 1); +} - slot_interval = 0; - slot_lifespan = 0; - slot_speed = 0.0f; +void Slot::set_projectile_damage(const float projectile_damage) +{ + slot_projectile_damage = projectile_damage; + set_timestamp(game() ? game()->timestamp() : 1); +} + +void Slot::set_projectile_modelname(const std::string & projectile_modelname) +{ + slot_projectile_modelname.assign(projectile_modelname); + set_timestamp(game() ? game()->timestamp() : 1); } void Slot::set_item(Item *item) @@ -57,4 +65,3 @@ void Slot::set_item(Item *item) } } // namespace core - diff --git a/src/core/slot.h b/src/core/slot.h index 6b6c47b..2d636b3 100644 --- a/src/core/slot.h +++ b/src/core/slot.h @@ -29,12 +29,7 @@ public: * Creates an empty slot * */ Slot(); - - /** - * @brief creates and empty slot at a given location - * */ - Slot(const math::Vector3f & location); - + /** * @brief default destructor * */ @@ -55,32 +50,63 @@ public: { return slot_axis; } - - /** - * @brief the name of the particlesystem used to render - * projectiles generated by this slot - * */ /** + * @brief timestamp indicating when the slot was last fired,server-side + * This is a server-side property * */ inline unsigned long last_fired() const { return slot_last_fired; } - inline unsigned long interval() const + /** + * @brief timestamp indicating when the slot was last fire, client-side + * This is a client-side property + * */ + inline unsigned long last_ejected() const + { + return slot_last_ejected; + } + + /** + * @brief interval between two consequtive shots by this slot, in milliseconds + * */ + inline unsigned long projectile_interval() const { - return slot_interval; + return slot_projectile_interval; } - inline unsigned long lifespan() const + /** + * @brief lifespan of a projectile generated by this slot, in milliseconds + * */ + inline unsigned long projectile_lifespan() const { - return slot_lifespan; + return slot_projectile_lifespan; } - inline float speed() const + /** + * @brief speed of a projectile generated by this slot, in game units per second + * */ + inline float projectile_speed() const { - return slot_speed; + return slot_projectile_speed; + } + + /** + * @brief damage done by a projectile generated by this slot + * */ + inline float projectile_damage() const + { + return slot_projectile_damage; + } + + /** + * @brief model name used to draw projectiles generated by this slot + * */ + inline const std::string & projectile_modelname() const + { + return slot_projectile_modelname; } /* --- mutators -------------------------------------------- */ @@ -111,27 +137,46 @@ public: } /** - * @brief + * @brief set the timestamp when the slot last ejected a projectile, server-side + * This is a server-side property, to be set by the game module * */ inline void set_last_fired(unsigned long last_fired) { slot_last_fired = last_fired; } - inline void set_interval(unsigned long interval) + /** + * @brief set the timestamp when the slat last ejected a projectile, client-side + * This is a client-side property, to be set by the client + * */ + inline void set_last_ejected(unsigned long last_ejected) { - slot_interval = interval; + slot_last_ejected = last_ejected; } - inline void set_lifespan(unsigned long lifespan) - { - slot_lifespan = lifespan; - } + /** + * @brief set the interval between two shots, in milliseconds + * */ + void set_projectile_interval(unsigned long projectile_interval); - inline void set_speed(float speed) - { - slot_speed = speed; - } + /** + * @brief set the lifespan of ejected projectiles, in milliseconds + * */ + void set_projectile_lifespan(unsigned long projectile_lifespan); + + /** + * @brief set the speed of ejected projectiles, in game units per second + * */ + void set_projectile_speed(float projectile_speed); + + /** + * @brief set the amount of damage done by a projectile generated by this slot + * */ + void set_projectile_damage(float projectile_damage); + /** + * @brief set the name of model used to draw projectiles generated by this slot + * */ + void set_projectile_modelname(const std::string & projectile_modelname); /** * @brief set the item this slot is holding @@ -139,33 +184,41 @@ public: void set_item(Item *item); private: - math::Vector3f slot_location; + math::Vector3f slot_location; - math::Axis slot_axis; + math::Axis slot_axis; // slot flags - unsigned int slot_flags; + unsigned int slot_flags; + + // timestamp indicating when the slot configuration was last changed + unsigned long slot_timestamp; - unsigned long slot_timestamp; + // timestamp indicating when the slot last generated a projectile, server-side + unsigned long slot_last_fired; - unsigned long slot_last_fired; + // timestamp indicating when the slot last generated a projectile, client-side + unsigned long slot_last_ejected; // interval between two shots, in milliseconds - unsigned long slot_interval; + unsigned long slot_projectile_interval; - // projectile lifespane - unsigned long slot_lifespan; + // projectile lifespan + unsigned long slot_projectile_lifespan; - // projectile speed, in gameunits / second - float slot_speed; + // projectile speed, in game units per second + float slot_projectile_speed; - // item mounted in this slot - Item *slot_item; + // projectile damage + float slot_projectile_damage; + + // name of the model used to draw projectiles generated by this slot + std::string slot_projectile_modelname; - std::string slot_particlesystem_name; + // item mounted in this slot + Item *slot_item; }; } // namespace core #endif // __INCLUDED_CORE_SLOTS_H__ - diff --git a/src/core/slots.cc b/src/core/slots.cc index 031aba2..9bf557f 100644 --- a/src/core/slots.cc +++ b/src/core/slots.cc @@ -22,7 +22,9 @@ Slots::~Slots() void Slots::load(model::Model *model) { for (model::Model::Weapons::iterator it = model->weapons().begin(); it != model->weapons().end(); ++it) { - Slot *slot = new Slot((*it)->location()); + Slot *slot = new Slot(); + slot->set_location((*it)->location()); + slot->set_axis((*it)->axis()); slots_container.push_back(slot); } //con_debug << " loaded " << slots_container.size() << " entity slots" << std::endl; diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc index dc039e4..7282fe1 100644 --- a/src/game/base/ship.cc +++ b/src/game/base/ship.cc @@ -88,9 +88,10 @@ Ship::Ship(core::Player *owner, const ShipModel *shipmodel) : core::EntityContro for (core::Slots::iterator it = slots()->begin(); it != slots()->end(); it++) { // default fire rate: 1 projectile / second - (*it)->set_interval(1000); - (*it)->set_lifespan(5000); - (*it)->set_speed(5.0f); + (*it)->set_projectile_interval(1000); + (*it)->set_projectile_lifespan(5000); + (*it)->set_projectile_speed(5.0f); + (*it)->set_projectile_damage(10.0f); } } @@ -442,6 +443,7 @@ void Ship::action (btScalar seconds) entity_speed = Game::g_impulsespeed->value() * 0.01f; body()->setLinearVelocity(math::to_btVector3(axis().forward() * entity_speed)); } + // FIXME set speed to 0 if below threshold } void Ship::collision(core::Entity *other) @@ -867,27 +869,31 @@ void Ship::frame(const unsigned long elapsed) EntityControlable::frame(elapsed); + + // TODO move to core:: if (model() && slots() && (state() == core::Entity::Normal) && has_controlflag(core::EntityControlable::ControlFlagFire)) { const float modelscale = radius() / model()->radius(); for (core::Slots::iterator it = slots()->begin(); it != slots()->end(); it++) { // create projectiles - if ((*it)->last_fired() + (*it)->interval() <= core::server()->timestamp()) { - (*it)->set_last_fired(core::server()->timestamp()); - Projectile * projectile = new Projectile((*it)->lifespan()); - projectile->set_damage(10.0f); - projectile->set_color(color()); - if (owner()) { - projectile->set_ownerid(owner()->id()); + if ((*it)->projectile_interval() > 0) { + if ((*it)->last_fired() + (*it)->projectile_interval() <= core::server()->timestamp()) { + (*it)->set_last_fired(core::server()->timestamp()); + Projectile * projectile = new Projectile((*it)->projectile_lifespan()); + projectile->set_damage((*it)->projectile_damage()); + projectile->set_color(color()); + if (owner()) { + projectile->set_ownerid(owner()->id()); + } + projectile->set_zone(zone()); + projectile->set_axis(axis() * (*it)->axis()); + projectile->set_location(location() + (axis() * (*it)->location() * modelscale) + projectile->axis().forward() * projectile->radius()); + + projectile->reset(); + projectile->body()->setDamping(0.0f, 0.0f); + projectile->body()->setLinearVelocity(math::to_btVector3(projectile->axis().forward() * (*it)->projectile_speed())); } - projectile->set_zone(zone()); - projectile->set_axis(axis() * (*it)->axis()); - projectile->set_location(location() + (axis() * (*it)->location() * modelscale) + projectile->axis().forward() * projectile->radius()); - - projectile->reset(); - projectile->body()->setDamping(0.0f, 0.0f); - projectile->body()->setLinearVelocity(math::to_btVector3(projectile->axis().forward() * (*it)->speed())); } } } diff --git a/src/game/base/weapon.cc b/src/game/base/weapon.cc index ec87b34..b4d236d 100644 --- a/src/game/base/weapon.cc +++ b/src/game/base/weapon.cc @@ -76,17 +76,18 @@ bool Weapon::init() weapon->set_volume(f); continue; - } else if (weaponsini.got_key_float("damage", f)) { - weapon->set_damage(f); - continue; - } else if (weaponsini.got_key_long("level", l)) { weapon->set_level(l); continue; + + } else if (weaponsini.got_key_float("damage", f)) { + weapon->set_damage(f); + continue; } else { weaponsini.unknown_key(); } + } else if (weaponsini.section().compare("cannon") == 0) { if (weaponsini.got_key_label("label", str)) { weapon->set_label(str); @@ -112,10 +113,6 @@ bool Weapon::init() weapon->set_volume(f); continue; - } else if (weaponsini.got_key_float("damage", f)) { - weapon->set_damage(f); - continue; - } else if (weaponsini.got_key_long("level", l)) { weapon->set_level(l); continue; @@ -147,11 +144,7 @@ bool Weapon::init() } else if (weaponsini.got_key_float("volume", f)) { weapon->set_volume(f); continue; - - } else if (weaponsini.got_key_float("damage", f)) { - weapon->set_damage(f); - continue; - + } else if (weaponsini.got_key_long("level", l)) { weapon->set_level(l); continue; @@ -159,8 +152,35 @@ bool Weapon::init() } else { weaponsini.unknown_key(); } + + } else if (weaponsini.section().compare("projectile") == 0) { + + if (weapon) { + if (weaponsini.got_key_float("speed", f)) { + // speed is in meters / second, one gameunit is 100 meters + weapon->set_projectile_speed(f * 0.01f); + continue; + + } else if (weaponsini.got_key_long("interval", l)) { + weapon->set_projectile_interval((unsigned long) l); + continue; + + } else if (weaponsini.got_key_long("lifespan", l)) { + weapon->set_projectile_lifespan((unsigned long) l); + continue; + + } else if (weaponsini.got_key_float("damage", f)) { + weapon->set_damage(f); + continue; + + } else if (weaponsini.got_key_string("model", str)) { + weapon->set_projectile_modelname(str); + continue; + } + } } + } else if (weaponsini.got_section()) { if (weaponsini.got_section("mine")) { @@ -181,6 +201,11 @@ bool Weapon::init() weapon->set_subtype(Turret); count++; + } else if (weaponsini.got_section("projectile")) { + if (!weapon) { + weaponsini.unknown_error("projectile section without weapon section"); + } + } else if (weaponsini.got_section()) { weaponsini.unknown_section(); } @@ -226,6 +251,10 @@ Weapon::Weapon() : core::Info(weapon_infotype) set_level(1); set_stackable(false); set_subtype(Ammo); + set_damage(0); + set_projectile_interval(0); + set_projectile_lifespan(0); + set_projectile_speed(0); } Weapon::~Weapon() diff --git a/src/game/base/weapon.h b/src/game/base/weapon.h index ba28810..94fdce6 100644 --- a/src/game/base/weapon.h +++ b/src/game/base/weapon.h @@ -24,10 +24,14 @@ public: inline SubType subtype() const { return weapon_subtype; } + inline bool stackable() const { return weapon_stackable; } + /** + * @brief player level required to buy this weapon + * */ inline int level() const { return weapon_level; } @@ -39,23 +43,79 @@ public: { return weapon_damage; } - - /* --- mutators -------------------------------------------- */ - + /** - * @brief set the amount of damage this weapon inflicts + * @brief speed of projectiles generated by this weapon * */ - inline void set_damage(const float damage) + inline const float projectile_speed() const { - weapon_damage = damage; + return weapon_projectile_speed; } + /** + * @brief interval between consequtive projectils fired by this weapon, in milliseconds + * */ + inline const unsigned long projectile_interval() const + { + return weapon_projectile_interval; + } + + /** + * @brief name of the model used for projectiles generated by this weapon + * */ + inline const std::string & projectile_modelname() const + { + return weapon_projectile_modelname; + } + + /* --- mutators -------------------------------------------- */ + void set_stackable(bool stackable); void set_level(const int level); void set_subtype(const SubType subtype); + /** + * @brief set the projectile lifespan, in milliseconds + * */ + inline void set_projectile_lifespan(const unsigned long projectile_lifespan) + { + weapon_projectile_lifespan = projectile_lifespan; + } + + /** + * @brief set the interval between two consecutive shots by this weapon + * */ + inline void set_projectile_interval(const unsigned long projectile_interval) + { + weapon_projectile_interval = projectile_interval; + } + + /** + * @brief set_projectile speed, in game units per second + * */ + inline void set_projectile_speed(const float projectile_speed) + { + weapon_projectile_speed = projectile_speed; + } + + /** + * @brief set the amount of damage this weapon inflicts + * */ + inline void set_damage(const float damage) + { + weapon_damage = damage; + } + + /** + * @brief set_projectile model name + * */ + inline void set_projectile_modelname(const std::string & projectile_modelname) + { + weapon_projectile_modelname.assign(projectile_modelname); + } + /* --- static registry functions ---------------------------------- */ static Weapon *find(const std::string & label); @@ -79,7 +139,15 @@ private: bool weapon_stackable; + unsigned long weapon_projectile_interval; + + unsigned long weapon_projectile_lifespan; + + float weapon_projectile_speed; + float weapon_damage; + + std::string weapon_projectile_modelname; }; } // namespace game |