Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2013-11-05 16:42:01 +0000
committerStijn Buys <ingar@osirion.org>2013-11-05 16:42:01 +0000
commit058f40a2e6dfd7e3498e7506c3ca82606f9b792e (patch)
treee4920eefb4c3fa1073d6604845724c4f56c23d26 /src/game
parent9a16c4b433bba4837bc98a90b446aa0726f0d447 (diff)
Have NPCs get cargo.
Diffstat (limited to 'src/game')
-rw-r--r--src/game/base/game.cc9
-rw-r--r--src/game/base/patrol.cc41
-rw-r--r--src/game/base/patrol.h9
-rw-r--r--src/game/base/ship.cc8
4 files changed, 55 insertions, 12 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index 6921f72..f227c2f 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -2168,8 +2168,13 @@ bool Game::load_zone(core::Zone *zone)
} else if (zoneini.got_key_string("target", strval)) {
patrol_waypoint->set_target_label(strval);
continue;
- } else if (zoneini.got_key_string("buy", strval)) {
- patrol_waypoint->set_buy_label(strval);
+ } else if (zoneini.got_key_label("cargo", strval)) {
+ Cargo *cargo = Cargo::find(strval);
+ if (!cargo) {
+ zoneini.unknown_error("unknown cargo '" + strval + "'");
+ } else {
+ patrol_waypoint->set_cargo(cargo);
+ }
continue;
} else if (zoneini.got_key_bool("dock", b)) {
patrol_waypoint->set_dock(b);
diff --git a/src/game/base/patrol.cc b/src/game/base/patrol.cc
index 4ad16df..a50abea 100644
--- a/src/game/base/patrol.cc
+++ b/src/game/base/patrol.cc
@@ -14,11 +14,13 @@ namespace game {
Patrol::WayPoint::WayPoint() {
waypoint_target = 0;
+ waypoint_cargo = 0;
waypoint_dock = false;
}
Patrol::WayPoint::~WayPoint() {
waypoint_target = 0;
+ waypoint_cargo = 0;
}
void Patrol::WayPoint::set_target_label(const std::string &label)
@@ -36,9 +38,9 @@ void Patrol::WayPoint::set_dock(const bool dock)
waypoint_dock = dock;
}
-void Patrol::WayPoint::set_buy_label(const std::string &label)
+void Patrol::WayPoint::set_cargo(Cargo *cargo)
{
- waypoint_buy_label.assign(label);
+ waypoint_cargo = cargo;
}
/* --- Patrol ------------------------------------------------------ */
@@ -327,11 +329,46 @@ void Patrol::frame(const unsigned long elapsed)
if (group_docked) {
if (patrol_launch_timeout > 0 ) {
if (core::server()->timestamp() > patrol_launch_timeout) {
+
+ // launch everyone
+ for (Members::iterator mit = patrol_members.begin(); mit != patrol_members.end(); ++mit) {
+ NPC *member = (*mit);
+ if (member->state() == core::Entity::Docked) {
+
+ // buy cargo if requested
+ if (waypoint()->dock() && waypoint()->cargo() && member->inventory()) {
+
+ // erase all cargo from inventory
+ for (core::Inventory::Items::iterator iit = member->inventory()->items().begin(); iit != member->inventory()->items().end(); ) {
+
+ if ((*iit)->info()->type() == Cargo::infotype()) {
+ member->inventory()->items().erase(iit++);
+ } else {
+ ++iit;
+ }
+
+ }
+
+ member->inventory()->recalculate();
+
+ core::Item *item = new core::Item(waypoint()->cargo());
+ item->set_amount( (long)(member->inventory()->capacity_available() / waypoint()->cargo()->volume()));
+ member->inventory()->add(item);
+
+ member->inventory()->recalculate();
+ }
+
+ member->launch();
+ }
+ }
+
patrol_waypoint_current++;
if (patrol_waypoint_current == patrol_waypoints.end()) {
patrol_waypoint_current = patrol_waypoints.begin();
}
patrol_leader->set_autopilot_target(waypoint()->target());
+
+
}
} else {
patrol_launch_timeout = core::server()->timestamp() + 15000 + (unsigned long) math::randomi(30000);
diff --git a/src/game/base/patrol.h b/src/game/base/patrol.h
index debd0e4..4c612fe 100644
--- a/src/game/base/patrol.h
+++ b/src/game/base/patrol.h
@@ -9,6 +9,7 @@
#include "core/entity.h"
#include "base/faction.h"
+#include "base/cargo.h"
#include "base/npc.h"
namespace game
@@ -49,15 +50,15 @@ public:
return waypoint_dock;
}
- inline const std::string & buy_label() const {
- return waypoint_buy_label;
+ inline const Cargo *cargo() const {
+ return waypoint_cargo;
}
void set_target(core::Entity *entity);
void set_target_label(const std::string &label);
- void set_buy_label(const std::string &label);
+ void set_cargo(Cargo *cargo);
void set_dock(const bool dock);
@@ -66,7 +67,7 @@ public:
core::Entity *waypoint_target;
- std::string waypoint_buy_label;
+ Cargo *waypoint_cargo;
bool waypoint_dock;
};
diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc
index cdc860a..5df0ced 100644
--- a/src/game/base/ship.cc
+++ b/src/game/base/ship.cc
@@ -88,12 +88,12 @@ Ship::Ship(core::Player *owner, const ShipModel *shipmodel) : core::EntityContro
str.assign(aux::text_strip(owner->name()));
aux::text_strip(str);
set_name(str);
-
- // add an inventory
- add_inventory();
- inventory()->set_capacity(ship_shipmodel->maxcargo());
}
+ // add an inventory
+ add_inventory();
+ inventory()->set_capacity(ship_shipmodel->maxcargo());
+
if (model()) {
add_slots();
slots()->load(model());