/
lib/banish/
lib/d/coronos/
lib/d/coronos/w/alena/
lib/d/coronos/w/angel/
lib/d/coronos/w/angel/caves/
lib/d/coronos/w/angel/caves/monst/
lib/d/coronos/w/angel/city/chambers/
lib/d/coronos/w/angel/city/monst/
lib/d/coronos/w/angel/city/obj/
lib/d/coronos/w/angel/city/streets/
lib/d/coronos/w/angel/farms/plains/
lib/d/coronos/w/angel/monst/
lib/d/tempus/
lib/d/tempus/w/angel/
lib/d/tempus/w/kingbill/
lib/d/tempus/w/mirak/
lib/d/tempus/w/mirak/monst/
lib/d/tempus/w/mirak/obj/
lib/d/tempus/w/relgar/planes/baat/
lib/d/tempus/w/sarak/
lib/d/tempus/w/serepion/mon/
lib/d/tempus/w/valrejn/
lib/doc/
lib/doc/domains/
lib/doc/efun/
lib/include/fn_specs/
lib/info/
lib/inherit/base/
lib/log/
lib/log/mailbox/
lib/log/main/
lib/news/
lib/obj/party/
lib/objects/componen/
lib/open/
lib/open/party/
lib/open/paste/
lib/open/spells/
lib/open/valrejn/
lib/players/
lib/players/alena/
lib/players/alena/obj/
lib/players/alena/open/
lib/players/alena/private/
lib/players/angel/
lib/players/angel/obj/
lib/players/ash/
lib/players/biggs/
lib/players/biggs/food/
lib/players/biggs/gobkeep/
lib/players/biggs/mnstr/
lib/players/biggs/town/caves/
lib/players/biggs/town/tower/
lib/players/biggs/wpns/
lib/players/calris/
lib/players/deathurg/
lib/players/deathurg/open/
lib/players/deathurg/private/thief/
lib/players/dogberry/
lib/players/dogberry/library/
lib/players/dogberry/open/
lib/players/epsilon/
lib/players/epsilon/private/
lib/players/farewell/
lib/players/hippo/
lib/players/hippo/open/
lib/players/hippo/tools/
lib/players/jimpa/
lib/players/josh/
lib/players/josh/room/
lib/players/josh/room/mage/dungeon/
lib/players/josh/room/mage/dungeon/obj/
lib/players/josh/wep/
lib/players/kingbill/
lib/players/metatron/
lib/players/miette/
lib/players/mirak/
lib/players/mirak/open/
lib/players/parsilan/
lib/players/relgar/
lib/players/relgar/private/
lib/players/sarak/
lib/players/sarak/bugs/
lib/players/sarak/feelings/
lib/players/sarak/magical/
lib/players/sarak/minotaur/island/
lib/players/sarak/open/
lib/players/sarak/private/
lib/players/serepion/
lib/players/serepion/open/
lib/players/serepion/private/
lib/players/spike/
lib/players/spike/open/
lib/players/spike/private/
lib/players/spike/seaworld/
lib/players/valrejn/
lib/players/valrejn/open/
lib/players/valrejn/private/
lib/players/virus/
lib/players/wrath/
lib/players/wrath/arm/
lib/players/wrath/mon/
lib/players/wrath/room/
lib/players/wrath/room/entry/
lib/players/wrath/room/zolgath/
lib/players/wrath/weap/
lib/players/zil/
lib/room/
lib/room/city/arena/
lib/room/city/creator/
lib/room/city/garden/monst/
lib/room/city/library/
lib/room/city/library/open/books/
lib/room/city/shop/
lib/room/death/
lib/room/death/open/
lib/room/island/
lib/room/keeps/
lib/room/registry/
lib/room/ships/crew/
lib/room/ships/open/
lib/room/ships/open/types/bounty/
lib/room/ships/open/types/nebula/
lib/room/ships/open/types/phoenix/
lib/secure/udp_cmd_/
lib/skills/
lib/skills/fighter/
lib/skills/psionici/
lib/skills/thief/
lib/usr/
lib/usr/creators/
lib/usr/no_banis/
lib/usr/players/
#include <mudlib.h>
#include <ansi.h>
#include "/room/ships/open/all_port.h"

void add_array_to_map (mixed * arr);
void add_ports_to_map();
void initialise_map();

#define WIDTH       60
#define SHIP_DIR    "/room/ships/open/types/"
#define MASTER_FILE "/stern"
#define PAGE        18
#define XYZ_COORDS  2

string map;

void initialise_map() {
  int i, j;

  map = "";

  for(j=0; j<PAGE; j++) {
    map += "\n";
    for(i=0; i<WIDTH; i++) {
      map += " ";
    }
  }
  map += "\n";
}

void add_ports_to_map() {
  add_array_to_map(ALL_PORTS);
}
  

void add_array_to_map(mixed * map_arr) {
  int *arr;
  int i, j, tmpi;
  int y_max, x_max, y_min, x_min;
  int x, y;
  string map_symbol;
  string symbol_name;
  string *amap;

  for(i=0; i<sizeof(map_arr); i++) {
    arr = map_arr[i][XYZ_COORDS];
    if(!i) {
      x_max = arr[0];        x_min = arr[0];
      y_max = arr[1];        y_min = arr[1];
    }
    else {
      if(arr[0] > x_max)      x_max = arr[0];
      else if(arr[0] < x_min) x_min = arr[0];
      if(arr[1] > y_max)      y_max = arr[1];
      else if(arr[1] < y_min) y_min = arr[1];
    }
  }
    
  amap = explode (map +"\n","\n");

  for(i=0; i<sizeof(map_arr); i++) {
    arr = map_arr[i][XYZ_COORDS];
    y = arr[1] - y_min;
    y = (y * PAGE)/(y_max - y_min);
    x = arr[0] - x_min;
    x = (x * WIDTH)/(x_max - x_min);
    j = (y * WIDTH) + x;
    map_symbol  = ((map_arr[i][0][0] == '^') ? "X" : ".");
    symbol_name = ((map_arr[i][0][0] == '^') ?
                  extract(map_arr[i][0], 1)  :
                  map_arr[i][0]);
    y = PAGE-y;
    tmpi = (y > PAGE/2) ? -1 : 1;
    if(x-1 >= WIDTH-1) x = WIDTH - 2;
    while (amap[y][x + 1] != ' ') {
      y += tmpi;
      if(map_symbol != ".") map_symbol = " ";
    }

    amap[y] = amap[y][0..x]+BOLD+map_symbol+OFF+symbol_name+
             amap[y][strlen(symbol_name)+(x+1)..strlen(amap[y])-1];
  }
  map = implode (amap,"\n") + "\n";    
}

string query_map() { return map; }
  
string make_map() {

  int i;
  string *files;
  int *ship_xyz;
  string ship_file, ship_name;
  mixed *total_arr;

  files = get_dir(SHIP_DIR);
  total_arr = ({});
  for(i=0; i<sizeof(files); i++) {
    ship_file = SHIP_DIR+files[i]+MASTER_FILE;
    ship_name = (string)ship_file->query_ship_name();
    ship_xyz  = (int *)ship_file->query_coordinates();
    if(!ship_name || !ship_xyz) continue;
    ship_name = "^"+ ship_name;
    total_arr += ({({ ship_name, ship_file, ship_xyz, })});
  }

  initialise_map();
  add_array_to_map(ALL_PORTS + total_arr);
  return query_map();
}