118705Sedward /* 221238Sdist * Copyright (c) 1983 Regents of the University of California. 333695Sbostic * All rights reserved. 433695Sbostic * 533695Sbostic * Redistribution and use in source and binary forms are permitted 6*34795Sbostic * provided that the above copyright notice and this paragraph are 7*34795Sbostic * duplicated in all such forms and that any documentation, 8*34795Sbostic * advertising materials, and other materials related to such 9*34795Sbostic * distribution and use acknowledge that the software was developed 10*34795Sbostic * by the University of California, Berkeley. The name of the 11*34795Sbostic * University may not be used to endorse or promote products derived 12*34795Sbostic * from this software without specific prior written permission. 13*34795Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14*34795Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15*34795Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1618705Sedward */ 1718705Sedward 1811595Sleres #ifndef lint 19*34795Sbostic static char sccsid[] = "@(#)misc.c 5.3 (Berkeley) 06/18/88"; 2033695Sbostic #endif /* not lint */ 2118705Sedward 2211595Sleres #include "externs.h" 2311595Sleres 2411595Sleres #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) 2511595Sleres 2614020Sedward /* XXX */ 2714020Sedward range(from, to) 2814020Sedward struct ship *from, *to; 2911595Sleres { 3014020Sedward register bow1r, bow1c, bow2r, bow2c; 3114020Sedward int stern1r, stern1c, stern2c, stern2r; 3214020Sedward register int bb, bs, sb, ss, result; 3311595Sleres 3414020Sedward if (!to->file->dir) 3515206Sedward return -1; 3614020Sedward stern1r = bow1r = from->file->row; 3714020Sedward stern1c = bow1c = from->file->col; 3814020Sedward stern2r = bow2r = to->file->row; 3914020Sedward stern2c = bow2c = to->file->col; 4014020Sedward result = bb = distance(bow2r - bow1r, bow2c - bow1c); 4114020Sedward if (bb < 5) { 4214020Sedward stern2r += dr[to->file->dir]; 4314020Sedward stern2c += dc[to->file->dir]; 4414020Sedward stern1r += dr[from->file->dir]; 4514020Sedward stern1c += dc[from->file->dir]; 4614020Sedward bs = distance((bow2r - stern1r), (bow2c - stern1c)); 4714020Sedward sb = distance((bow1r - stern2r), (bow1c - stern2c)); 4814020Sedward ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 4914020Sedward result = min(bb, min(bs, min(sb, ss))); 5011595Sleres } 5114020Sedward return result; 5211595Sleres } 5311595Sleres 5414020Sedward struct ship * 5514020Sedward closestenemy(from, side, anyship) 5614020Sedward register struct ship *from; 5714020Sedward char side, anyship; 5811595Sleres { 5914020Sedward register struct ship *sp; 6014020Sedward register char a; 6114020Sedward int olddist = 30000, dist; 6214020Sedward struct ship *closest = 0; 6314020Sedward 6414020Sedward a = capship(from)->nationality; 6514020Sedward foreachship(sp) { 6614020Sedward if (sp == from) 6714020Sedward continue; 6814020Sedward if (sp->file->dir == 0) 6914020Sedward continue; 7014020Sedward if (a == capship(sp)->nationality && !anyship) 7114020Sedward continue; 7214020Sedward if (side && gunsbear(from, sp) != side) 7314020Sedward continue; 7414020Sedward dist = range(from, sp); 7514020Sedward if (dist < olddist) { 7614020Sedward closest = sp; 7714020Sedward olddist = dist; 7814020Sedward } 7911595Sleres } 8014020Sedward return closest; 8111595Sleres } 8215206Sedward 8315206Sedward angle(dr, dc) 8415206Sedward register dr, dc; 8515206Sedward { 8615206Sedward register i; 8715206Sedward 8815206Sedward if (dc >= 0 && dr > 0) 8915206Sedward i = 0; 9015206Sedward else if (dr <= 0 && dc > 0) 9115206Sedward i = 2; 9215206Sedward else if (dc <= 0 && dr < 0) 9315206Sedward i = 4; 9415206Sedward else 9515206Sedward i = 6; 9615206Sedward dr = abs(dr); 9715206Sedward dc = abs(dc); 9815206Sedward if ((i == 0 || i == 4) && dc * 2.4 > dr) { 9915206Sedward i++; 10015206Sedward if (dc > dr * 2.4) 10115206Sedward i++; 10215206Sedward } else if ((i == 2 || i == 6) && dr * 2.4 > dc) { 10315206Sedward i++; 10415206Sedward if (dr > dc * 2.4) 10515206Sedward i++; 10615206Sedward } 10715206Sedward return i % 8 + 1; 10815206Sedward } 10915206Sedward 11015206Sedward gunsbear(from, to) /* checks for target bow or stern */ 11115206Sedward register struct ship *from, *to; 11215206Sedward { 11315206Sedward int Dr, Dc, i; 11415206Sedward register ang; 11515206Sedward 11615206Sedward Dr = from->file->row - to->file->row; 11715206Sedward Dc = to->file->col - from->file->col; 11815206Sedward for (i = 2; i; i--) { 11915206Sedward if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1) 12015206Sedward ang += 8; 12115206Sedward if (ang >= 2 && ang <= 4) 12215206Sedward return 'r'; 12315206Sedward if (ang >= 6 && ang <= 7) 12415206Sedward return 'l'; 12515206Sedward Dr += dr[to->file->dir]; 12615206Sedward Dc += dc[to->file->dir]; 12715206Sedward } 12815206Sedward return 0; 12915206Sedward } 13015206Sedward 13115206Sedward portside(from, on, quick) 13215206Sedward register struct ship *from, *on; 13315206Sedward int quick; /* returns true if fromship is */ 13415206Sedward { /* shooting at onship's starboard side */ 13515206Sedward register ang; 13615206Sedward register Dr, Dc; 13715206Sedward 13815206Sedward Dr = from->file->row - on->file->row; 13915206Sedward Dc = on->file->col - from->file->col; 14015206Sedward if (quick == -1) { 14115206Sedward Dr += dr[on->file->dir]; 14215206Sedward Dc += dc[on->file->dir]; 14315206Sedward } 14415206Sedward ang = angle(Dr, Dc); 14515206Sedward if (quick != 0) 14615206Sedward return ang; 14715206Sedward ang = (ang + 4 - on->file->dir - 1) % 8 + 1; 14815206Sedward return ang < 5; 14915206Sedward } 15015206Sedward 15115206Sedward colours(sp) 15215206Sedward register struct ship *sp; 15315206Sedward { 15415206Sedward register char flag; 15515206Sedward 15615206Sedward if (sp->file->struck) 15715206Sedward flag = '!'; 15815206Sedward if (sp->file->explode) 15915206Sedward flag = '#'; 16015206Sedward if (sp->file->sink) 16115206Sedward flag = '~'; 16215206Sedward if (sp->file->struck) 16315206Sedward return flag; 16415206Sedward flag = *countryname[capship(sp)->nationality]; 16515206Sedward return sp->file->FS ? flag : tolower(flag); 16615206Sedward } 16715206Sedward 16816088Sedward #include <sys/file.h> 16916088Sedward log(s) 17016088Sedward register struct ship *s; 17115206Sedward { 17216088Sedward FILE *fp; 17316088Sedward int persons; 17416088Sedward int n; 17516088Sedward struct logs log[NLOG]; 17616088Sedward float net; 17716088Sedward register struct logs *lp; 17815206Sedward 17916088Sedward if ((fp = fopen(LOGFILE, "r+")) == NULL) 18016088Sedward return; 18116088Sedward #ifdef LOCK_EX 18216090Sedward if (flock(fileno(fp), LOCK_EX) < 0) 18316090Sedward return; 18416088Sedward #endif 18516088Sedward net = (float)s->file->points / s->specs->pts; 18616088Sedward persons = getw(fp); 18716088Sedward n = fread((char *)log, sizeof(struct logs), NLOG, fp); 18816088Sedward for (lp = &log[n]; lp < &log[NLOG]; lp++) 18916088Sedward lp->l_name[0] = lp->l_uid = lp->l_shipnum 19016088Sedward = lp->l_gamenum = lp->l_netpoints = 0; 19116088Sedward rewind(fp); 19216088Sedward if (persons < 0) 19316088Sedward (void) putw(1, fp); 19416088Sedward else 19516088Sedward (void) putw(persons + 1, fp); 19616088Sedward for (lp = log; lp < &log[NLOG]; lp++) 19716088Sedward if (net > (float)lp->l_netpoints 19816088Sedward / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) { 19916088Sedward (void) fwrite((char *)log, 20016088Sedward sizeof (struct logs), lp - log, fp); 20116088Sedward (void) strcpy(log[NLOG-1].l_name, s->file->captain); 20216088Sedward log[NLOG-1].l_uid = getuid(); 20316088Sedward log[NLOG-1].l_shipnum = s->file->index; 20416088Sedward log[NLOG-1].l_gamenum = game; 20516088Sedward log[NLOG-1].l_netpoints = s->file->points; 20616088Sedward (void) fwrite((char *)&log[NLOG-1], 20716088Sedward sizeof (struct logs), 1, fp); 20816088Sedward (void) fwrite((char *)lp, 20916088Sedward sizeof (struct logs), &log[NLOG-1] - lp, fp); 21016088Sedward break; 21116088Sedward } 21216088Sedward #ifdef LOCK_EX 21316090Sedward (void) flock(fileno(fp), LOCK_UN); 21416088Sedward #endif 21516088Sedward (void) fclose(fp); 21615206Sedward } 217