ldmud-3.2.9/doc/
ldmud-3.2.9/doc/efun/
ldmud-3.2.9/mud/
ldmud-3.2.9/mud/heaven7/
ldmud-3.2.9/mud/heaven7/lib/
ldmud-3.2.9/mud/lp-245/
ldmud-3.2.9/mud/lp-245/banish/
ldmud-3.2.9/mud/lp-245/doc/
ldmud-3.2.9/mud/lp-245/doc/examples/
ldmud-3.2.9/mud/lp-245/doc/sefun/
ldmud-3.2.9/mud/lp-245/log/
ldmud-3.2.9/mud/lp-245/obj/Go/
ldmud-3.2.9/mud/lp-245/players/lars/
ldmud-3.2.9/mud/lp-245/room/death/
ldmud-3.2.9/mud/lp-245/room/maze1/
ldmud-3.2.9/mud/lp-245/room/sub/
ldmud-3.2.9/mud/lp-245/secure/
ldmud-3.2.9/mud/morgengrauen/
ldmud-3.2.9/mud/morgengrauen/lib/
ldmud-3.2.9/mud/sticklib/
ldmud-3.2.9/mud/sticklib/src/
ldmud-3.2.9/mudlib/uni-crasher/
ldmud-3.2.9/pkg/
ldmud-3.2.9/pkg/debugger/
ldmud-3.2.9/pkg/diff/
ldmud-3.2.9/pkg/misc/
ldmud-3.2.9/src/autoconf/
ldmud-3.2.9/src/bugs/
ldmud-3.2.9/src/bugs/MudCompress/
ldmud-3.2.9/src/bugs/b-020916-files/
ldmud-3.2.9/src/bugs/doomdark/
ldmud-3.2.9/src/bugs/ferrycode/ferry/
ldmud-3.2.9/src/bugs/ferrycode/obj/
ldmud-3.2.9/src/bugs/psql/
ldmud-3.2.9/src/done/
ldmud-3.2.9/src/done/order_alist/
ldmud-3.2.9/src/done/order_alist/obj/
ldmud-3.2.9/src/done/order_alist/room/
ldmud-3.2.9/src/gcc/
ldmud-3.2.9/src/gcc/2.7.0/
ldmud-3.2.9/src/gcc/2.7.1/
ldmud-3.2.9/src/hosts/
ldmud-3.2.9/src/hosts/GnuWin32/
ldmud-3.2.9/src/hosts/amiga/NetIncl/
ldmud-3.2.9/src/hosts/amiga/NetIncl/netinet/
ldmud-3.2.9/src/hosts/amiga/NetIncl/sys/
ldmud-3.2.9/src/hosts/i386/
ldmud-3.2.9/src/hosts/msdos/byacc/
ldmud-3.2.9/src/hosts/msdos/doc/
ldmud-3.2.9/src/hosts/os2/
ldmud-3.2.9/src/hosts/win32/
ldmud-3.2.9/src/util/
ldmud-3.2.9/src/util/erq/
ldmud-3.2.9/src/util/indent/hosts/next/
ldmud-3.2.9/src/util/xerq/
ldmud-3.2.9/src/util/xerq/lpc/
ldmud-3.2.9/src/util/xerq/lpc/www/
#include <mudlib.h>
#include <daemons.h>
#include <ships.h>

inherit ROOM;

#define RN this_player()->query_real_name()
#define PURCHASE_CLOSED 0

// Varibles
static string * masPorts;
int * maiAvailShips;
string msPortName;

// Predefined Functions
object find_in_port(string str);

// Room Code
void reset(int arg) {
  ::reset(arg);
  if (arg) return;
  masPorts = ({ });
  maiAvailShips = ({0,0,0});
}

void init() {
  ::init();
  add_action("lookup_func","lookup");
  add_action("inquire_func","inquire");
  add_action("request_func","request");
  add_action("turnin_func","turnin");
  add_action("read_func","read");
}

status is_available(string sClass) {
  if(sClass == "cog") {
    if(maiAvailShips[0])
      return 1;
    return 0;
  }
  if(sClass == "galley") {
    if(maiAvailShips[1])
      return 1;
    return 0;
  }
  if(sClass == "carrack") {
    if(maiAvailShips[2])
      return 1;
    return 0;
  }
  return 0;
}

status read_func(string sArg) {
  if(sArg != "sign") {
    notify_fail("Read what?\n");
    return 0;
  }
  write("\
Current classes of ships available:\n\
Ship Class                       Price                Available\n\
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\
Cog -------------------------- 120,000 coins             " + maiAvailShips[0] + "\n\
Lateen Galley ---------------- 180,000 coins             " + maiAvailShips[1] + "\n\
Carrack ---------------------- 400,000 coins             " + maiAvailShips[2] + "\n\n\
There is a scribbled note below about possible future classes of ships.\n\
To purchase a ship, you must fill out an application. If you are\n\
interested, please <request application> and get started. For deck\n\
plans of the current classes of ships, you may <lookup [class]>.\n");
  return 1;
}

status inquire_func(string sArg) {
  string sShipName;
  string sGarbage;
  object oShip;
  object oEnv;

  if(!sArg) {
    write("What ship did you want to inquire about?\n");
  return 1;
  }
  if(sscanf(sArg,"about %s",sShipName) != 1)
    sShipName = sArg;
  if(sscanf(sShipName,"%s %s",sArg,sGarbage) == 2) {
    write("The name of the ship must be one word only.\n");
    return 1;
  }
  if(!SHIP_D->is_ship_name(sArg)) {
    write("That is not a currently registered ship.\n");
    return 1;
  }
  if(!SHIP_D->is_loaded(sArg))
    SHIP_D->load_ship(SHIP_D->query_owner(sArg));
  oShip = SHIP_D->query_ship_object(sArg);
  if(!oShip) {
    write("That ship is not currently anywhere in Darkwind.\n");
    return 1;
  }
  oEnv = SHIP_D->query_ship_environment(sArg);
  if(!oEnv) {
    write("That ship is appears to be lost.\n");
    return 1;
  }
  switch(object_name(oEnv)) {
  case "domains/darkwind/wharf/port":
  case "domains/darkwind/wharf/hidden_port":
    write("That ship is at the south Darkwind port.\n");
    break;

  case "objects/ships/upgrade_shop/dock":
    write("That ship is at Erison's dock.\n");
    break;

  case "objects/ships/upgrade_shop/holding_room":
    write("That ship is currently being worked on and is unavailable.\n");
    break;

  case "vrrooms/east_sea/dock9":
    write("That ship is at the north Darkwind port.\n");
    break;

  case "domains/hyperborea/firei/jetty1a":
  case "domains/hyperborea/firei/jetty1b":
  case "domains/hyperborea/firei/jetty2a":
  case "domains/hyperborea/firei/jetty2b":
    write("That ship is at the port of Grimsfjord.\n");
    break;

  case "domains/souvrael/beach/souvrael_dock":
    write("That ship is docked in Souvrael.\n");
    break;

  case "domains/kerei/river/dock1":
    write("That ship is in far-off Kerei.\n");
    break;

  case "domains/darkwind/pirate/rooms/docks":
    write("That ship is docked in Pirate Town!\n");
    break;

  case "vrrooms/east_sea/beach":
    write("That ship was last heard from at Dwork Island.\n");
    break;

  case "vrrooms/east_sea/island1":
    write("That ship last registered at Volcano Island.\n");
    break;

  case "players/rampage/area/town/dock":
    write("That ship is at the Sunken Island of Gwent.\n");
    break;

  default:
    write("That ship is currently at sea.\n");
    break;
  }
  write("That ship is owned by " +
    capitalize(SHIP_D->query_owner(sArg)) + ".\n");
  return 1;
}

status lookup_func(string sArg) {
  object oPlans;

  if(!sArg) {
    notify_fail("You must specify the class of ship you want plans for.\n");
    return 0;
  }
  if(sArg != "cog" && sArg != "galley" && sArg != "carrack") {
    notify_fail(capitalize(sArg) + " is not a valid class of ship.\n");
    return 0;
  }
  switch(sArg) {
  case "cog":
    oPlans = clone_object("/objects/ships/obj/cog_plan");
    break;
  case "galley":
    oPlans = clone_object("/objects/ships/obj/galley_plan");
    break;
  case "carrack":
    oPlans = clone_object("/objects/ships/obj/carr_plan");
    break;
  }
  write("\
You rummage around in the files and pull out a set of plans.\n");
  say(this_player()->query_cap_name() + " \
rummages around in the files and takes something.\n");
  move_object(oPlans, this_player());
  return 1;
}

status request_func(string sArg) {
  object oApp;

  if(sArg != "application") {
    notify_fail("What do you want to request? Maybe an application?\n");
    return 0;
  }
  if(SHIP_D->is_banished(this_player()->query_real_name())) {
    write("You are not allowed to apply for a ship.\n");
    return 1;
  }
  if(SHIP_D->is_owner(this_player()->query_real_name())) {
    write("\
You already own a ship, and are ineligible to purchase a new one\n\
until you sell your present ship.\n");
    return 1;
  }
#if PURCHASE_CLOSED
  write("I'm sorry: Ship purchasing is currently closed.\n");
  return 1;
#endif
  oApp = clone_object("/objects/ships/obj/application");
  write("You take an application from the stack.\n");
  say(this_player()->query_cap_name() + " takes an application.\n");
  move_object(oApp,this_player());
  oApp->setup(this_player());
  return 1;
}

void add_port(string sFile) {
  masPorts += ({ sFile });
  return;
}

void set_port_name(string sName) {
  msPortName = sName;
  maiAvailShips = SHIP_D->query_available_ships(sName);
}


object find_in_port(string str) {
  object ob;
  int i, siz;

  siz = sizeof(masPorts);

  for(i = 0; i < siz; i++) {
    if(find_object(masPorts[i]))
      // lexicon, 3-28-98.  temp fix to some bug (bad arg 2 to present) //
      ob = present(str, find_object(masPorts[i]));
    if (ob) break;
  }

  return ob;
}

int rescue_func(string sName) {
  object oShip;

  if (!sName) {
    write("Rescue what?\n");
    return 1;
  }
  if(sizeof(masPorts) < 1) {
    write("This shop shop has no port!\n");
    return 1;
  }
  if(!SHIP_D->is_ship_name(sName)) {
    write("That is not the name of any ship.\n");
    return 1;
  }
  if(!SHIP_D->is_loaded(sName)) {
    write("That ship has not been seen on Darkwind thus far.\n");
    return 1;
  }
  oShip = SHIP_D->query_ship_object(sName);
  if (!oShip) {
    write("The ship " + capitalize(sName) + " appears to have been destroyed.\n");
    SHIP_D->destroy_ship(sName);
    return 1;
  }
  if(oShip->query_docked()) {
    write("\
That ship is already docked somewhere and is not in need of a rescue.\n");
    return 1;
  }
  if(oShip->query_ship_sailing()) {
    write("\
That ship is being sailed right now! It is not in need of a rescue.\n");
    return 1;
  }
  move_object(oShip,masPorts[0]);
  oShip->set_docked(1,masPorts[0]);
  write("That ship was re-docked.\n");
  return 1;
}

int get_cost(string sArg) {
  switch(sArg) {
  case "cog":
    return 120000;
  case "galley":
    return 180000;
  case "carrack":
    return 400000;
  default:
    return 0;
  }
}

status turnin_func(string sArg) {
  object oApp;
  string sPlayer;
  string sShipName;
  string sShipClass;
  int iCost;

  if(sArg != "application") {
    notify_fail("Turnin what?\n");
    return 0;
  }
  if(sizeof(masPorts) < 1) {
    write("The ship shop has no port! It cannot build ships.\n");
    return 1;
  }
  oApp = present("application",this_player());
  if(!oApp) {
    write("You don't have an application to turn in!\n");
    return 1;
  }
  if(!oApp->query_finished()) {
    write("That application is not finished.\n");
    return 1;
  }
  sPlayer = oApp->query_player();
  sShipName = oApp->query_ship_name();
  sShipClass = oApp->query_ship_class();
  write("You turn in your application.\n");
  destruct(oApp);

  iCost = get_cost(sShipClass);
  if(!is_available(sShipClass)) {
    write("\
The application is rejected because no ships of that class are currently\n\
available.\n");
    write("\
New ships will be available " + ctime(SHIP_D->query_next_build_time()) + ".\n");
    return 1;
  }
  if(find_player(sPlayer) != this_player()) {
    write("The application is rejected because it is another's application.\n");
    return 1;
  }
  if(this_player()->query_money() < iCost) {
    write("The application is rejected because you do not have enough money.\n");
    return 1;
  }
  if(SHIP_D->is_owner(this_player()->query_real_name())) {
    write("The application is rejected because you already own a ship.\n");
    return 1;
  }
  write("The application is accepted after you pay the requisite fee.\n");
  this_player()->add_money(-iCost);
  SHIP_D->add_owner(sPlayer, sShipName,sShipClass);
  SHIP_D->setup_ship(sShipName,sPlayer, masPorts[0]);
  SHIP_D->load_ship(sPlayer);
  iCost = (sShipClass == "cog" ? 0 : (sShipClass == "galley" ? 1 : 2));
  SHIP_D->reduce_available(msPortName,iCost);
  write("Your new ship, the " + capitalize(sShipName) + ", is waiting for you in port.\n");
  return 1;
}