111595Sleres #ifndef lint 2*15206Sedward static char *sccsid = "@(#)misc.c 1.3 83/10/10"; 311595Sleres #endif 411595Sleres #include "externs.h" 511595Sleres 611595Sleres #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) 711595Sleres 814020Sedward /* XXX */ 914020Sedward range(from, to) 1014020Sedward struct ship *from, *to; 1111595Sleres { 1214020Sedward register bow1r, bow1c, bow2r, bow2c; 1314020Sedward int stern1r, stern1c, stern2c, stern2r; 1414020Sedward register int bb, bs, sb, ss, result; 1511595Sleres 1614020Sedward if (!to->file->dir) 17*15206Sedward return -1; 1814020Sedward stern1r = bow1r = from->file->row; 1914020Sedward stern1c = bow1c = from->file->col; 2014020Sedward stern2r = bow2r = to->file->row; 2114020Sedward stern2c = bow2c = to->file->col; 2214020Sedward result = bb = distance(bow2r - bow1r, bow2c - bow1c); 2314020Sedward if (bb < 5) { 2414020Sedward stern2r += dr[to->file->dir]; 2514020Sedward stern2c += dc[to->file->dir]; 2614020Sedward stern1r += dr[from->file->dir]; 2714020Sedward stern1c += dc[from->file->dir]; 2814020Sedward bs = distance((bow2r - stern1r), (bow2c - stern1c)); 2914020Sedward sb = distance((bow1r - stern2r), (bow1c - stern2c)); 3014020Sedward ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 3114020Sedward result = min(bb, min(bs, min(sb, ss))); 3211595Sleres } 3314020Sedward return result; 3411595Sleres } 3511595Sleres 3614020Sedward struct ship * 3714020Sedward closestenemy(from, side, anyship) 3814020Sedward register struct ship *from; 3914020Sedward char side, anyship; 4011595Sleres { 4114020Sedward register struct ship *sp; 4214020Sedward register char a; 4314020Sedward int olddist = 30000, dist; 4414020Sedward struct ship *closest = 0; 4514020Sedward 4614020Sedward a = capship(from)->nationality; 4714020Sedward foreachship(sp) { 4814020Sedward if (sp == from) 4914020Sedward continue; 5014020Sedward if (sp->file->dir == 0) 5114020Sedward continue; 5214020Sedward if (a == capship(sp)->nationality && !anyship) 5314020Sedward continue; 5414020Sedward if (side && gunsbear(from, sp) != side) 5514020Sedward continue; 5614020Sedward dist = range(from, sp); 5714020Sedward if (dist < olddist) { 5814020Sedward closest = sp; 5914020Sedward olddist = dist; 6014020Sedward } 6111595Sleres } 6214020Sedward return closest; 6311595Sleres } 64*15206Sedward 65*15206Sedward angle(dr, dc) 66*15206Sedward register dr, dc; 67*15206Sedward { 68*15206Sedward register i; 69*15206Sedward 70*15206Sedward if (dc >= 0 && dr > 0) 71*15206Sedward i = 0; 72*15206Sedward else if (dr <= 0 && dc > 0) 73*15206Sedward i = 2; 74*15206Sedward else if (dc <= 0 && dr < 0) 75*15206Sedward i = 4; 76*15206Sedward else 77*15206Sedward i = 6; 78*15206Sedward dr = abs(dr); 79*15206Sedward dc = abs(dc); 80*15206Sedward if ((i == 0 || i == 4) && dc * 2.4 > dr) { 81*15206Sedward i++; 82*15206Sedward if (dc > dr * 2.4) 83*15206Sedward i++; 84*15206Sedward } else if ((i == 2 || i == 6) && dr * 2.4 > dc) { 85*15206Sedward i++; 86*15206Sedward if (dr > dc * 2.4) 87*15206Sedward i++; 88*15206Sedward } 89*15206Sedward return i % 8 + 1; 90*15206Sedward } 91*15206Sedward 92*15206Sedward gunsbear(from, to) /* checks for target bow or stern */ 93*15206Sedward register struct ship *from, *to; 94*15206Sedward { 95*15206Sedward int Dr, Dc, i; 96*15206Sedward register ang; 97*15206Sedward 98*15206Sedward Dr = from->file->row - to->file->row; 99*15206Sedward Dc = to->file->col - from->file->col; 100*15206Sedward for (i = 2; i; i--) { 101*15206Sedward if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1) 102*15206Sedward ang += 8; 103*15206Sedward if (ang >= 2 && ang <= 4) 104*15206Sedward return 'r'; 105*15206Sedward if (ang >= 6 && ang <= 7) 106*15206Sedward return 'l'; 107*15206Sedward Dr += dr[to->file->dir]; 108*15206Sedward Dc += dc[to->file->dir]; 109*15206Sedward } 110*15206Sedward return 0; 111*15206Sedward } 112*15206Sedward 113*15206Sedward portside(from, on, quick) 114*15206Sedward register struct ship *from, *on; 115*15206Sedward int quick; /* returns true if fromship is */ 116*15206Sedward { /* shooting at onship's starboard side */ 117*15206Sedward register ang; 118*15206Sedward register Dr, Dc; 119*15206Sedward 120*15206Sedward Dr = from->file->row - on->file->row; 121*15206Sedward Dc = on->file->col - from->file->col; 122*15206Sedward if (quick == -1) { 123*15206Sedward Dr += dr[on->file->dir]; 124*15206Sedward Dc += dc[on->file->dir]; 125*15206Sedward } 126*15206Sedward ang = angle(Dr, Dc); 127*15206Sedward if (quick != 0) 128*15206Sedward return ang; 129*15206Sedward ang = (ang + 4 - on->file->dir - 1) % 8 + 1; 130*15206Sedward return ang < 5; 131*15206Sedward } 132*15206Sedward 133*15206Sedward rmend(str) 134*15206Sedward char *str; 135*15206Sedward { 136*15206Sedward register char *p; 137*15206Sedward 138*15206Sedward for (p = str; *p; p++) 139*15206Sedward ; 140*15206Sedward if (p != str) 141*15206Sedward *--p = 0; 142*15206Sedward } 143*15206Sedward 144*15206Sedward colours(sp) 145*15206Sedward register struct ship *sp; 146*15206Sedward { 147*15206Sedward register char flag; 148*15206Sedward 149*15206Sedward if (sp->file->struck) 150*15206Sedward flag = '!'; 151*15206Sedward if (sp->file->explode) 152*15206Sedward flag = '#'; 153*15206Sedward if (sp->file->sink) 154*15206Sedward flag = '~'; 155*15206Sedward if (sp->file->struck) 156*15206Sedward return flag; 157*15206Sedward flag = *countryname[capship(sp)->nationality]; 158*15206Sedward return sp->file->FS ? flag : tolower(flag); 159*15206Sedward } 160*15206Sedward 161*15206Sedward #ifdef notdef 162*15206Sedward #define PI 3.1415926535 163*15206Sedward 164*15206Sedward float contable[8] = 165*15206Sedward { 1.5708, 0.7854, 0.0, -0.7854, -1.5708, -2.3562, -PI, 2.3562 }; 166*15206Sedward 167*15206Sedward int tantable[40] = { 168*15206Sedward 0,100,197,291,381, 169*15206Sedward 464,540,610,675,733, 170*15206Sedward 785,833,876,915,951, 171*15206Sedward 983,1012,1039,1064,1086, 172*15206Sedward 1107,1126,1144,1161,1176, 173*15206Sedward 1190,1204,1216,1227,1239, 174*15206Sedward 1249,1259,1268,1277,1285, 175*15206Sedward 1293,1300,1307,1313,1470 176*15206Sedward }; 177*15206Sedward 178*15206Sedward double 179*15206Sedward arctan(y,x) 180*15206Sedward int y,x; 181*15206Sedward { 182*15206Sedward int sx, sy; 183*15206Sedward register int index; 184*15206Sedward 185*15206Sedward sy = y < 0 ? -1 : 1; 186*15206Sedward sx = x < 0 ? -1 : 1; 187*15206Sedward y *= sy; 188*15206Sedward x *= sx; 189*15206Sedward if (!x) 190*15206Sedward return (double) PI/2 * sy; 191*15206Sedward index = 10 * y / x + 0.5; 192*15206Sedward if (index > 39) 193*15206Sedward index = 39; 194*15206Sedward return (double) 195*15206Sedward sy * (sx < 0 ? PI : 0 + sx*((float)tantable[index]/1000)); 196*15206Sedward } 197*15206Sedward #endif 198