/*
* 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;
}