Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2012-11-21 20:49:58 +0000
committerStijn Buys <ingar@osirion.org>2012-11-21 20:49:58 +0000
commit5e4ef80dc29a69e1f5f185d1efab323af4a77292 (patch)
tree3f741a160a9f62d392ef0116df9f9925d55da557 /src/game/base
parent3dc60689b9327190eeecd42f6920299ef3e7b52c (diff)
Added get/set methods for the weapon-slot API.
Diffstat (limited to 'src/game/base')
-rw-r--r--src/game/base/ship.cc40
-rw-r--r--src/game/base/weapon.cc55
-rw-r--r--src/game/base/weapon.h80
3 files changed, 139 insertions, 36 deletions
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