Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/base/game.cc')
-rw-r--r--src/game/base/game.cc119
1 files changed, 99 insertions, 20 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index ad6a28c..0bdf2cc 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -25,6 +25,7 @@
#include "base/navpoint.h"
#include "base/jumppoint.h"
#include "base/npc.h"
+#include "base/patrol.h"
#include "base/planet.h"
#include "base/savegame.h"
#include "base/spacemine.h"
@@ -1922,13 +1923,16 @@ bool Game::load_zone(core::Zone *zone)
core::Inventory *inventory = 0;
core::Item *item = 0;
- Station *station = 0;
- Planet *planet = 0;
- Star *star = 0;
- NavPoint *navpoint = 0;
- JumpPoint *jumppoint = 0;
- RaceTrack *racetrack = 0;
- CheckPoint *checkpoint = 0;
+ Station *station = 0;
+ Planet *planet = 0;
+ Star *star = 0;
+ NavPoint *navpoint = 0;
+ JumpPoint *jumppoint = 0;
+ RaceTrack *racetrack = 0;
+ CheckPoint *racetrack_checkpoint = 0;
+
+ Patrol *patrol = 0;
+ Patrol::WayPoint *patrol_waypoint = 0;
bool b;
long l;
@@ -1973,17 +1977,36 @@ bool Game::load_zone(core::Zone *zone)
entity = racetrack;
racetrack->set_zone(zone);
racetrack->set_radius(0);
+
+ racetrack_checkpoint = 0;
} else if (zoneini.got_section("checkpoint")) {
+ racetrack_checkpoint = 0;
if (!racetrack) {
- zoneini.unknown_error("checkpoint without racetrack");
- entity = 0;
- checkpoint = 0;
+ zoneini.unknown_error("checkpoint definition without racetrack");
+ } else {
+ racetrack_checkpoint = new CheckPoint(racetrack);
+ entity = racetrack_checkpoint;
+ racetrack_checkpoint->set_radius(0);
+ }
+
+ } else if (zoneini.got_section("patrol")) {
+ patrol = new Patrol();
+ entity = patrol;
+ patrol->set_zone(zone);
+
+ patrol_waypoint = 0;
+
+ } else if (zoneini.got_section("waypoint")) {
+ patrol_waypoint = 0;
+
+ if (!entity || !patrol) {
+ zoneini.unknown_error("waypoint definition without patrol");
+ } else if ((entity->moduletype() != patrol_enttype)) {
+ zoneini.unknown_error("waypoint definition for invalid entity type");
} else {
- checkpoint = new CheckPoint(racetrack);
- entity = checkpoint;
- checkpoint->set_radius(0);
+ patrol_waypoint = patrol->add_waypoint();
}
} else if (zoneini.got_section("planet")) {
@@ -2028,7 +2051,7 @@ bool Game::load_zone(core::Zone *zone)
if (!entity) {
zoneini.unknown_error("ship definition without entity");
- } else if ((entity->moduletype() != planet_enttype) && (entity->moduletype() != station_enttype)) {
+ } else if ((entity->moduletype() != planet_enttype) && (entity->moduletype() != station_enttype) && (entity->moduletype() != patrol_enttype)) {
zoneini.unknown_error("ship definition for invalid entity type");
} else {
inventory = entity->inventory();
@@ -2128,7 +2151,7 @@ bool Game::load_zone(core::Zone *zone)
if (core::Parser::got_entity_key(zoneini, jumppoint)) {
continue;
} else if (zoneini.got_key_string("target", strval)) {
- jumppoint->set_targetlabel(strval);
+ jumppoint->set_target_label(strval);
continue;
} else {
zoneini.unknown_key();
@@ -2152,11 +2175,48 @@ bool Game::load_zone(core::Zone *zone)
entitytemplate->apply(jumppoint);
}
} else if (zoneini.got_key_string("target", strval)) {
- jumppoint->set_targetlabel(strval);
+ jumppoint->set_target_label(strval);
continue;
} else {
zoneini.unknown_key();
}
+
+ } else if (zoneini.in_section("patrol")) {
+ if (core::Parser::got_entity_key(zoneini, patrol)) {
+ continue;
+ } else if (zoneini.got_key_label("profile", strval)) {
+ if (strval.compare("convoy")) {
+ patrol->set_profile(NPC::ProfileConvoy);
+ } else if (strval.compare("patrol")) {
+ patrol->set_profile(NPC::ProfilePatrol);
+ } else {
+ zoneini.unknown_error("unknown profile '" + strval + "'");
+ }
+ } else if (zoneini.got_key_label("faction", strval)) {
+ Faction *faction = Faction::find(strval);
+ if (!faction) {
+ zoneini.unknown_error("unknown faction '" + strval + "'");
+ } else {
+ faction->apply(patrol);
+ }
+ } else {
+ zoneini.unknown_key();
+ }
+
+ } else if (zoneini.in_section("waypoint")) {
+ if (!patrol_waypoint) {
+ continue;
+ } 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);
+ continue;
+ } else if (zoneini.got_key_bool("dock", b)) {
+ patrol_waypoint->set_dock(b);
+ } else {
+ zoneini.unknown_key();
+ }
} else if (zoneini.in_section("planet")) {
if (core::Parser::got_entity_key(zoneini, planet)) {
@@ -2223,7 +2283,9 @@ bool Game::load_zone(core::Zone *zone)
}
} else if (zoneini.in_section("checkpoint")) {
- if (core::Parser::got_entity_key(zoneini, checkpoint)) {
+ if (!racetrack_checkpoint) {
+ continue;
+ } else if (core::Parser::got_entity_key(zoneini, racetrack_checkpoint)) {
continue;
} else {
zoneini.unknown_key();
@@ -2357,17 +2419,30 @@ bool Game::load_zone(core::Zone *zone)
if (zoneini.got_key_label("label", strval)) {
ShipModel *shipmodel= ShipModel::find(strval);
if (shipmodel) {
- item = inventory->find(shipmodel);
+
+ if (entity->moduletype() == patrol_enttype) {
+ item = 0;
+ } else {
+ item = inventory->find(shipmodel);
+ }
+
if (!item) {
item = new core::Item(shipmodel);
- item->set_amount(-1);
+ if ((entity->moduletype() == patrol_enttype)) {
+ item->set_amount(1);
+ } else {
+ item->set_amount(-1);
+ }
item->set_price(shipmodel->price());
inventory->add(item);
}
} else {
zoneini.unknown_error("unknown ship type '" + strval + "'");
}
-
+ } else if ((entity->moduletype() == patrol_enttype) && zoneini.got_key_long("amount", l)) {
+ if (item) {
+ item->set_amount(l);
+ }
} else if (zoneini.got_key_long("price", l)) {
if (item) {
item->set_price(l);
@@ -2399,6 +2474,10 @@ bool Game::validate_zone(core::Zone *zone)
// validate jump gate
JumpGate *jumpgate = static_cast<JumpGate *>(entity);
jumpgate->validate();
+ } else if (entity->entity_moduletypeid == patrol_enttype) {
+ // validate jump gate
+ Patrol *patrol = static_cast<Patrol *>(entity);
+ patrol->validate();
} else {
if (entity->has_flag(core::Entity::Dockable)) {
generate_entity_menus(entity);