diff options
Diffstat (limited to 'src/game/base/game.cc')
-rw-r--r-- | src/game/base/game.cc | 119 |
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); |