1*18705Sedward /* 2*18705Sedward * Copyright (c) 1983 Regents of the University of California, 3*18705Sedward * All rights reserved. Redistribution permitted subject to 4*18705Sedward * the terms of the Berkeley Software License Agreement. 5*18705Sedward */ 6*18705Sedward 711595Sleres #ifndef lint 8*18705Sedward static char *sccsid = "@(#)misc.c 2.4 85/04/23"; 911595Sleres #endif 10*18705Sedward 1111595Sleres #include "externs.h" 1211595Sleres 1311595Sleres #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) 1411595Sleres 1514020Sedward /* XXX */ 1614020Sedward range(from, to) 1714020Sedward struct ship *from, *to; 1811595Sleres { 1914020Sedward register bow1r, bow1c, bow2r, bow2c; 2014020Sedward int stern1r, stern1c, stern2c, stern2r; 2114020Sedward register int bb, bs, sb, ss, result; 2211595Sleres 2314020Sedward if (!to->file->dir) 2415206Sedward return -1; 2514020Sedward stern1r = bow1r = from->file->row; 2614020Sedward stern1c = bow1c = from->file->col; 2714020Sedward stern2r = bow2r = to->file->row; 2814020Sedward stern2c = bow2c = to->file->col; 2914020Sedward result = bb = distance(bow2r - bow1r, bow2c - bow1c); 3014020Sedward if (bb < 5) { 3114020Sedward stern2r += dr[to->file->dir]; 3214020Sedward stern2c += dc[to->file->dir]; 3314020Sedward stern1r += dr[from->file->dir]; 3414020Sedward stern1c += dc[from->file->dir]; 3514020Sedward bs = distance((bow2r - stern1r), (bow2c - stern1c)); 3614020Sedward sb = distance((bow1r - stern2r), (bow1c - stern2c)); 3714020Sedward ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 3814020Sedward result = min(bb, min(bs, min(sb, ss))); 3911595Sleres } 4014020Sedward return result; 4111595Sleres } 4211595Sleres 4314020Sedward struct ship * 4414020Sedward closestenemy(from, side, anyship) 4514020Sedward register struct ship *from; 4614020Sedward char side, anyship; 4711595Sleres { 4814020Sedward register struct ship *sp; 4914020Sedward register char a; 5014020Sedward int olddist = 30000, dist; 5114020Sedward struct ship *closest = 0; 5214020Sedward 5314020Sedward a = capship(from)->nationality; 5414020Sedward foreachship(sp) { 5514020Sedward if (sp == from) 5614020Sedward continue; 5714020Sedward if (sp->file->dir == 0) 5814020Sedward continue; 5914020Sedward if (a == capship(sp)->nationality && !anyship) 6014020Sedward continue; 6114020Sedward if (side && gunsbear(from, sp) != side) 6214020Sedward continue; 6314020Sedward dist = range(from, sp); 6414020Sedward if (dist < olddist) { 6514020Sedward closest = sp; 6614020Sedward olddist = dist; 6714020Sedward } 6811595Sleres } 6914020Sedward return closest; 7011595Sleres } 7115206Sedward 7215206Sedward angle(dr, dc) 7315206Sedward register dr, dc; 7415206Sedward { 7515206Sedward register i; 7615206Sedward 7715206Sedward if (dc >= 0 && dr > 0) 7815206Sedward i = 0; 7915206Sedward else if (dr <= 0 && dc > 0) 8015206Sedward i = 2; 8115206Sedward else if (dc <= 0 && dr < 0) 8215206Sedward i = 4; 8315206Sedward else 8415206Sedward i = 6; 8515206Sedward dr = abs(dr); 8615206Sedward dc = abs(dc); 8715206Sedward if ((i == 0 || i == 4) && dc * 2.4 > dr) { 8815206Sedward i++; 8915206Sedward if (dc > dr * 2.4) 9015206Sedward i++; 9115206Sedward } else if ((i == 2 || i == 6) && dr * 2.4 > dc) { 9215206Sedward i++; 9315206Sedward if (dr > dc * 2.4) 9415206Sedward i++; 9515206Sedward } 9615206Sedward return i % 8 + 1; 9715206Sedward } 9815206Sedward 9915206Sedward gunsbear(from, to) /* checks for target bow or stern */ 10015206Sedward register struct ship *from, *to; 10115206Sedward { 10215206Sedward int Dr, Dc, i; 10315206Sedward register ang; 10415206Sedward 10515206Sedward Dr = from->file->row - to->file->row; 10615206Sedward Dc = to->file->col - from->file->col; 10715206Sedward for (i = 2; i; i--) { 10815206Sedward if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1) 10915206Sedward ang += 8; 11015206Sedward if (ang >= 2 && ang <= 4) 11115206Sedward return 'r'; 11215206Sedward if (ang >= 6 && ang <= 7) 11315206Sedward return 'l'; 11415206Sedward Dr += dr[to->file->dir]; 11515206Sedward Dc += dc[to->file->dir]; 11615206Sedward } 11715206Sedward return 0; 11815206Sedward } 11915206Sedward 12015206Sedward portside(from, on, quick) 12115206Sedward register struct ship *from, *on; 12215206Sedward int quick; /* returns true if fromship is */ 12315206Sedward { /* shooting at onship's starboard side */ 12415206Sedward register ang; 12515206Sedward register Dr, Dc; 12615206Sedward 12715206Sedward Dr = from->file->row - on->file->row; 12815206Sedward Dc = on->file->col - from->file->col; 12915206Sedward if (quick == -1) { 13015206Sedward Dr += dr[on->file->dir]; 13115206Sedward Dc += dc[on->file->dir]; 13215206Sedward } 13315206Sedward ang = angle(Dr, Dc); 13415206Sedward if (quick != 0) 13515206Sedward return ang; 13615206Sedward ang = (ang + 4 - on->file->dir - 1) % 8 + 1; 13715206Sedward return ang < 5; 13815206Sedward } 13915206Sedward 14015206Sedward colours(sp) 14115206Sedward register struct ship *sp; 14215206Sedward { 14315206Sedward register char flag; 14415206Sedward 14515206Sedward if (sp->file->struck) 14615206Sedward flag = '!'; 14715206Sedward if (sp->file->explode) 14815206Sedward flag = '#'; 14915206Sedward if (sp->file->sink) 15015206Sedward flag = '~'; 15115206Sedward if (sp->file->struck) 15215206Sedward return flag; 15315206Sedward flag = *countryname[capship(sp)->nationality]; 15415206Sedward return sp->file->FS ? flag : tolower(flag); 15515206Sedward } 15615206Sedward 15716088Sedward #include <sys/file.h> 15816088Sedward log(s) 15916088Sedward register struct ship *s; 16015206Sedward { 16116088Sedward FILE *fp; 16216088Sedward int persons; 16316088Sedward int n; 16416088Sedward struct logs log[NLOG]; 16516088Sedward float net; 16616088Sedward register struct logs *lp; 16715206Sedward 16816088Sedward if ((fp = fopen(LOGFILE, "r+")) == NULL) 16916088Sedward return; 17016088Sedward #ifdef LOCK_EX 17116090Sedward if (flock(fileno(fp), LOCK_EX) < 0) 17216090Sedward return; 17316088Sedward #endif 17416088Sedward net = (float)s->file->points / s->specs->pts; 17516088Sedward persons = getw(fp); 17616088Sedward n = fread((char *)log, sizeof(struct logs), NLOG, fp); 17716088Sedward for (lp = &log[n]; lp < &log[NLOG]; lp++) 17816088Sedward lp->l_name[0] = lp->l_uid = lp->l_shipnum 17916088Sedward = lp->l_gamenum = lp->l_netpoints = 0; 18016088Sedward rewind(fp); 18116088Sedward if (persons < 0) 18216088Sedward (void) putw(1, fp); 18316088Sedward else 18416088Sedward (void) putw(persons + 1, fp); 18516088Sedward for (lp = log; lp < &log[NLOG]; lp++) 18616088Sedward if (net > (float)lp->l_netpoints 18716088Sedward / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) { 18816088Sedward (void) fwrite((char *)log, 18916088Sedward sizeof (struct logs), lp - log, fp); 19016088Sedward (void) strcpy(log[NLOG-1].l_name, s->file->captain); 19116088Sedward log[NLOG-1].l_uid = getuid(); 19216088Sedward log[NLOG-1].l_shipnum = s->file->index; 19316088Sedward log[NLOG-1].l_gamenum = game; 19416088Sedward log[NLOG-1].l_netpoints = s->file->points; 19516088Sedward (void) fwrite((char *)&log[NLOG-1], 19616088Sedward sizeof (struct logs), 1, fp); 19716088Sedward (void) fwrite((char *)lp, 19816088Sedward sizeof (struct logs), &log[NLOG-1] - lp, fp); 19916088Sedward break; 20016088Sedward } 20116088Sedward #ifdef LOCK_EX 20216090Sedward (void) flock(fileno(fp), LOCK_UN); 20316088Sedward #endif 20416088Sedward (void) fclose(fp); 20515206Sedward } 206