MudOSa4DGD/
MudOSa4DGD/bin/
MudOSa4DGD/data/
MudOSa4DGD/doc/
MudOSa4DGD/doc/driver/
MudOSa4DGD/doc/efun/bitstrings/
MudOSa4DGD/doc/efun/command/
MudOSa4DGD/doc/efun/communication/
MudOSa4DGD/doc/efun/heart_beat/
MudOSa4DGD/doc/efun/interactive/
MudOSa4DGD/doc/efun/inventory/
MudOSa4DGD/doc/efun/living/
MudOSa4DGD/doc/efun/mappings/
MudOSa4DGD/doc/efun/strings/
MudOSa4DGD/doc/efun/uid/
MudOSa4DGD/doc/funs/
MudOSa4DGD/doc/language/
MudOSa4DGD/mudlib/dgd/doc/
MudOSa4DGD/mudlib/dgd/lib/include/dgd/
MudOSa4DGD/mudlib/dgd/lib/std/
MudOSa4DGD/mudlib/dgd/lib/sys/
MudOSa4DGD/mudlib/dgd/log/
MudOSa4DGD/mudlib/log/
MudOSa4DGD/mudlib/std/include/
MudOSa4DGD/mudlib/std/obj/
/*
 * coord.c
 *
 * SFUN: 3D world coordinate functions
 *
 * (C) Frank Schmidt, Jesus@NorseMUD
 *
 */

#include <coord.h>


/* are we dealing with a coordinate? (slow) */
static int coordp(mixed v) {
  return (arrayp(v) && a_sizeof(v) == 3 && 
    coordtp(v[0]) && coordtp(v[1]) && coordtp(v[2]));
}


/* get direction between two coordinates */
static string get_dir_between(coord p1, coord p2) {
  coordt d0, d1, d2;
  string dir;
  dir = "";

  /* north/south? */
  d1 = p1[1]-p2[1];
  if (d1 > (coordt)0) dir = "north";
  else if (d1 < (coordt)0) dir = "south";

  /* east/west? */
  d0 = p1[0]-p2[0];
  if (d0 > (coordt)0) return dir + "west";
  else if (d0 < (coordt)0) return dir + "east";

  /* return north/south dir */
  if (dir != "") return dir;

  /* up/down? */
  d2 = p2[2]-p1[2];
  if (d2 > (coordt)0) return "up";
  else if (d2 < (coordt)0) return "down";

  /* return no dir */
  return dir;
}


/* get shortest distance between two coordinates */
static coordt get_dist_between(coord p1, coord p2) {
  return abs(p1[0]-p2[0])+abs(p1[1]-p2[1])+abs(p1[2]-p2[2]);
}


/* get new coordinates when moving in one dir */
static coord get_coords_in_dir(coord p, string dir) {
  switch (dir) {
  case "north":     --p[1]; return p;
  case "south":     ++p[1]; return p;
  case "west":      --p[0]; return p;
  case "east":      ++p[0]; return p;
  case "down":      --p[2]; return p;
  case "up":        ++p[2]; return p;
  case "northeast": ++p[0]; --p[1]; return p;
  case "northwest": --p[0]; --p[1]; return p;
  case "southeast": ++p[0]; ++p[1]; return p;
  case "southwest": --p[0]; ++p[1]; return p;
  }
  /* no such dir */
  return p;
}