111595Sleres #ifndef lint 2*16088Sedward static char *sccsid = "@(#)misc.c 2.2 84/02/23"; 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) 1715206Sedward 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 } 6415206Sedward 6515206Sedward angle(dr, dc) 6615206Sedward register dr, dc; 6715206Sedward { 6815206Sedward register i; 6915206Sedward 7015206Sedward if (dc >= 0 && dr > 0) 7115206Sedward i = 0; 7215206Sedward else if (dr <= 0 && dc > 0) 7315206Sedward i = 2; 7415206Sedward else if (dc <= 0 && dr < 0) 7515206Sedward i = 4; 7615206Sedward else 7715206Sedward i = 6; 7815206Sedward dr = abs(dr); 7915206Sedward dc = abs(dc); 8015206Sedward if ((i == 0 || i == 4) && dc * 2.4 > dr) { 8115206Sedward i++; 8215206Sedward if (dc > dr * 2.4) 8315206Sedward i++; 8415206Sedward } else if ((i == 2 || i == 6) && dr * 2.4 > dc) { 8515206Sedward i++; 8615206Sedward if (dr > dc * 2.4) 8715206Sedward i++; 8815206Sedward } 8915206Sedward return i % 8 + 1; 9015206Sedward } 9115206Sedward 9215206Sedward gunsbear(from, to) /* checks for target bow or stern */ 9315206Sedward register struct ship *from, *to; 9415206Sedward { 9515206Sedward int Dr, Dc, i; 9615206Sedward register ang; 9715206Sedward 9815206Sedward Dr = from->file->row - to->file->row; 9915206Sedward Dc = to->file->col - from->file->col; 10015206Sedward for (i = 2; i; i--) { 10115206Sedward if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1) 10215206Sedward ang += 8; 10315206Sedward if (ang >= 2 && ang <= 4) 10415206Sedward return 'r'; 10515206Sedward if (ang >= 6 && ang <= 7) 10615206Sedward return 'l'; 10715206Sedward Dr += dr[to->file->dir]; 10815206Sedward Dc += dc[to->file->dir]; 10915206Sedward } 11015206Sedward return 0; 11115206Sedward } 11215206Sedward 11315206Sedward portside(from, on, quick) 11415206Sedward register struct ship *from, *on; 11515206Sedward int quick; /* returns true if fromship is */ 11615206Sedward { /* shooting at onship's starboard side */ 11715206Sedward register ang; 11815206Sedward register Dr, Dc; 11915206Sedward 12015206Sedward Dr = from->file->row - on->file->row; 12115206Sedward Dc = on->file->col - from->file->col; 12215206Sedward if (quick == -1) { 12315206Sedward Dr += dr[on->file->dir]; 12415206Sedward Dc += dc[on->file->dir]; 12515206Sedward } 12615206Sedward ang = angle(Dr, Dc); 12715206Sedward if (quick != 0) 12815206Sedward return ang; 12915206Sedward ang = (ang + 4 - on->file->dir - 1) % 8 + 1; 13015206Sedward return ang < 5; 13115206Sedward } 13215206Sedward 13315206Sedward colours(sp) 13415206Sedward register struct ship *sp; 13515206Sedward { 13615206Sedward register char flag; 13715206Sedward 13815206Sedward if (sp->file->struck) 13915206Sedward flag = '!'; 14015206Sedward if (sp->file->explode) 14115206Sedward flag = '#'; 14215206Sedward if (sp->file->sink) 14315206Sedward flag = '~'; 14415206Sedward if (sp->file->struck) 14515206Sedward return flag; 14615206Sedward flag = *countryname[capship(sp)->nationality]; 14715206Sedward return sp->file->FS ? flag : tolower(flag); 14815206Sedward } 14915206Sedward 150*16088Sedward #include <sys/file.h> 151*16088Sedward log(s) 152*16088Sedward register struct ship *s; 15315206Sedward { 154*16088Sedward FILE *fp; 155*16088Sedward int persons; 156*16088Sedward int n; 157*16088Sedward struct logs log[NLOG]; 158*16088Sedward float net; 159*16088Sedward register struct logs *lp; 16015206Sedward 161*16088Sedward if ((fp = fopen(LOGFILE, "r+")) == NULL) 162*16088Sedward return; 163*16088Sedward #ifdef LOCK_EX 164*16088Sedward flock(fileno(fp), LOCK_EX); 165*16088Sedward #endif 166*16088Sedward net = (float)s->file->points / s->specs->pts; 167*16088Sedward persons = getw(fp); 168*16088Sedward n = fread((char *)log, sizeof(struct logs), NLOG, fp); 169*16088Sedward for (lp = &log[n]; lp < &log[NLOG]; lp++) 170*16088Sedward lp->l_name[0] = lp->l_uid = lp->l_shipnum 171*16088Sedward = lp->l_gamenum = lp->l_netpoints = 0; 172*16088Sedward rewind(fp); 173*16088Sedward if (persons < 0) 174*16088Sedward (void) putw(1, fp); 175*16088Sedward else 176*16088Sedward (void) putw(persons + 1, fp); 177*16088Sedward for (lp = log; lp < &log[NLOG]; lp++) 178*16088Sedward if (net > (float)lp->l_netpoints 179*16088Sedward / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) { 180*16088Sedward (void) fwrite((char *)log, 181*16088Sedward sizeof (struct logs), lp - log, fp); 182*16088Sedward (void) strcpy(log[NLOG-1].l_name, s->file->captain); 183*16088Sedward log[NLOG-1].l_uid = getuid(); 184*16088Sedward log[NLOG-1].l_shipnum = s->file->index; 185*16088Sedward log[NLOG-1].l_gamenum = game; 186*16088Sedward log[NLOG-1].l_netpoints = s->file->points; 187*16088Sedward (void) fwrite((char *)&log[NLOG-1], 188*16088Sedward sizeof (struct logs), 1, fp); 189*16088Sedward (void) fwrite((char *)lp, 190*16088Sedward sizeof (struct logs), &log[NLOG-1] - lp, fp); 191*16088Sedward break; 192*16088Sedward } 193*16088Sedward #ifdef LOCK_EX 194*16088Sedward flock(fileno(fp), LOCK_UN); 195*16088Sedward #endif 196*16088Sedward (void) fclose(fp); 19715206Sedward } 198