#include #include #include "vars.h" #include "pline.h" #include "structs.h" #include "util.h" /* * None of these seem to me to call for remark beyond util.h's * descriptions of their interface contracts. */ LOC *movecell(LOC *lc, int dx, int dy, int alwayswrap) { int x; int y; LEVEL *lv; x = lc->x + dx; y = lc->y + dy; lv = lc->on; if ((x < 0) || (y < 0) || (x >= LEV_X) || (y >= LEV_Y)) { if (alwayswrap || (lv->flags & LVF_WRAPAROUND)) { if (x < 0) x += LEV_X; else if (x >= LEV_X) x -= LEV_X; if (y < 0) y += LEV_Y; else if (y >= LEV_Y) y -= LEV_Y; } else { panic("moving off edge in movecell"); } } return(&lv->cells[x][y]); } int distance2(LOC *l1, LOC *l2) { int dx; int dy; if (l1->on != l2->on) { panic("different levels to distance2"); } dx = l1->x - l2->x; dy = l1->y - l2->y; if (l1->on->flags & LVF_WRAPAROUND) { if (dx < -LEV_X/2) dx += LEV_X; else if (dx > LEV_X/2) dx -= LEV_X; if (dy < -LEV_X/2) dy += LEV_Y; else if (dy > LEV_Y/2) dy -= LEV_Y; } return((dx*dx)+(dy*dy)); } int distancei(LOC *l1, LOC *l2) { int dx; int dy; if (l1->on != l2->on) { panic("different levels to distance2"); } dx = l1->x - l2->x; dy = l1->y - l2->y; if (l1->on->flags & LVF_WRAPAROUND) { if (dx < -LEV_X/2) dx += LEV_X; else if (dx > LEV_X/2) dx -= LEV_X; if (dy < -LEV_X/2) dy += LEV_Y; else if (dy > LEV_Y/2) dy -= LEV_Y; } dx = abs(dx); dy = abs(dy); return((dx>dy)?dx:dy); } int vowel(char c) { return(!!index("aeiouAEIOU",c)); } int dirkey(int ch, int *xp, int *yp, XY *xyp, int *flagp, int flags) { int x; int y; int f; switch (ch) { case 'h': x = -1; y = 0; f = 0; break; case 'j': x = 0; y = 1; f = 0; break; case 'k': x = 0; y = -1; f = 0; break; case 'l': x = 1; y = 0; f = 0; break; case 'y': x = -1; y = -1; f = 0; break; case 'u': x = 1; y = -1; f = 0; break; case 'b': x = -1; y = 1; f = 0; break; case 'n': x = 1; y = 1; f = 0; break; case 'H': x = -1; y = 0; f = DK_CAPS; break; case 'J': x = 0; y = 1; f = DK_CAPS; break; case 'K': x = 0; y = -1; f = DK_CAPS; break; case 'L': x = 1; y = 0; f = DK_CAPS; break; case 'Y': x = -1; y = -1; f = DK_CAPS; break; case 'U': x = 1; y = -1; f = DK_CAPS; break; case 'B': x = -1; y = 1; f = DK_CAPS; break; case 'N': x = 1; y = 1; f = DK_CAPS; break; case '\010'/*^H*/: x = -1; y = 0; f = DK_CTL; break; case '\012'/*^J*/: x = 0; y = 1; f = DK_CTL; break; case '\013'/*^K*/: x = 0; y = -1; f = DK_CTL; break; case '\014'/*^L*/: x = 1; y = 0; f = DK_CTL; break; case '\031'/*^Y*/: x = -1; y = -1; f = DK_CTL; break; case '\025'/*^U*/: x = 1; y = -1; f = DK_CTL; break; case '\002'/*^B*/: x = -1; y = 1; f = DK_CTL; break; case '\016'/*^N*/: x = 1; y = 1; f = DK_CTL; break; default: return(0); break; } if ((flags & DK_NOCTL) && (f & DK_CTL)) return(0); if ((flags & DK_NOCAPS) && (f & DK_CAPS)) return(0); if (xp) *xp = x; if (yp) *yp = y; if (xyp) { xyp->x = x; xyp->y = y; } if (flagp) *flagp = f; return(1); } int never_collapsible( OBJ *o1 __attribute__((__unused__)), OBJ *o2 __attribute__((__unused__)) ) { return(0); } int never_identical( OBJ *o1 __attribute__((__unused__)), OBJ *o2 __attribute__((__unused__)) ) { return(0); } /* d x y r rx ry l lx ly r45 x y l45 x y h -1 0 k 0 -1 j 0 1 y -1 -1 b -1 1 k 0 -1 l 1 0 h -1 0 u 1 -1 y -1 -1 l 1 0 j 0 1 k 0 -1 n 1 1 u 1 -1 j 0 1 h -1 0 l 1 0 b -1 1 n 1 1 y -1 -1 u 1 -1 b -1 1 k 0 -1 h -1 0 u 1 -1 n 1 1 y -1 -1 l 1 0 k 0 -1 n 1 1 b -1 1 u 1 -1 j 0 1 l 1 0 b -1 1 y -1 -1 n 1 1 h -1 0 j 0 1 */ XY turn_r(XY d) { return((XY){ .x = -d.y, .y = d.x }); } XY turn_l(XY d) { return((XY){ .x = d.y, .y = -d.x }); } XY turn_r45(XY d) { if (d.x && d.y) { return((XY){ .x = (d.x-d.y)/2, .y = (d.y+d.x)/2 }); } else { return((XY){ .x = d.x-d.y, .y = d.y+d.x }); } } XY turn_l45(XY d) { if (d.x && d.y) { return((XY){ .x = (d.x+d.y)/2, .y = (d.y-d.x)/2 }); } else { return((XY){ .x = d.x+d.y, .y = d.y-d.x }); } } const char *pickverb(MONST *m, const char *ifyou, const char *notyou) { return((m==you)?ifyou:notyou); }