118705Sedward /*
260846Sbostic * Copyright (c) 1983, 1993
360846Sbostic * The Regents of the University of California. All rights reserved.
433695Sbostic *
542604Sbostic * %sccs.include.redist.c%
618705Sedward */
718705Sedward
811595Sleres #ifndef lint
9*69068Sbostic static char sccsid[] = "@(#)misc.c 8.2 (Berkeley) 04/28/95";
1033695Sbostic #endif /* not lint */
1118705Sedward
12*69068Sbostic #include "extern.h"
1341324Sbostic #include "pathnames.h"
1411595Sleres
1511595Sleres #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2)
1611595Sleres
1714020Sedward /* XXX */
1814020Sedward range(from, to)
1914020Sedward struct ship *from, *to;
2011595Sleres {
2114020Sedward register bow1r, bow1c, bow2r, bow2c;
2214020Sedward int stern1r, stern1c, stern2c, stern2r;
2314020Sedward register int bb, bs, sb, ss, result;
2411595Sleres
2514020Sedward if (!to->file->dir)
2615206Sedward return -1;
2714020Sedward stern1r = bow1r = from->file->row;
2814020Sedward stern1c = bow1c = from->file->col;
2914020Sedward stern2r = bow2r = to->file->row;
3014020Sedward stern2c = bow2c = to->file->col;
3114020Sedward result = bb = distance(bow2r - bow1r, bow2c - bow1c);
3214020Sedward if (bb < 5) {
3314020Sedward stern2r += dr[to->file->dir];
3414020Sedward stern2c += dc[to->file->dir];
3514020Sedward stern1r += dr[from->file->dir];
3614020Sedward stern1c += dc[from->file->dir];
3714020Sedward bs = distance((bow2r - stern1r), (bow2c - stern1c));
3814020Sedward sb = distance((bow1r - stern2r), (bow1c - stern2c));
3914020Sedward ss = distance((stern2r - stern1r) ,(stern2c - stern1c));
4014020Sedward result = min(bb, min(bs, min(sb, ss)));
4111595Sleres }
4214020Sedward return result;
4311595Sleres }
4411595Sleres
4514020Sedward struct ship *
closestenemy(from,side,anyship)4614020Sedward closestenemy(from, side, anyship)
4714020Sedward register struct ship *from;
4814020Sedward char side, anyship;
4911595Sleres {
5014020Sedward register struct ship *sp;
5114020Sedward register char a;
5214020Sedward int olddist = 30000, dist;
5314020Sedward struct ship *closest = 0;
5414020Sedward
5514020Sedward a = capship(from)->nationality;
5614020Sedward foreachship(sp) {
5714020Sedward if (sp == from)
5814020Sedward continue;
5914020Sedward if (sp->file->dir == 0)
6014020Sedward continue;
6114020Sedward if (a == capship(sp)->nationality && !anyship)
6214020Sedward continue;
6314020Sedward if (side && gunsbear(from, sp) != side)
6414020Sedward continue;
6514020Sedward dist = range(from, sp);
6614020Sedward if (dist < olddist) {
6714020Sedward closest = sp;
6814020Sedward olddist = dist;
6914020Sedward }
7011595Sleres }
7114020Sedward return closest;
7211595Sleres }
7315206Sedward
angle(dr,dc)7415206Sedward angle(dr, dc)
7515206Sedward register dr, dc;
7615206Sedward {
7715206Sedward register i;
7815206Sedward
7915206Sedward if (dc >= 0 && dr > 0)
8015206Sedward i = 0;
8115206Sedward else if (dr <= 0 && dc > 0)
8215206Sedward i = 2;
8315206Sedward else if (dc <= 0 && dr < 0)
8415206Sedward i = 4;
8515206Sedward else
8615206Sedward i = 6;
8715206Sedward dr = abs(dr);
8815206Sedward dc = abs(dc);
8915206Sedward if ((i == 0 || i == 4) && dc * 2.4 > dr) {
9015206Sedward i++;
9115206Sedward if (dc > dr * 2.4)
9215206Sedward i++;
9315206Sedward } else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
9415206Sedward i++;
9515206Sedward if (dr > dc * 2.4)
9615206Sedward i++;
9715206Sedward }
9815206Sedward return i % 8 + 1;
9915206Sedward }
10015206Sedward
gunsbear(from,to)10115206Sedward gunsbear(from, to) /* checks for target bow or stern */
10215206Sedward register struct ship *from, *to;
10315206Sedward {
10415206Sedward int Dr, Dc, i;
10515206Sedward register ang;
10615206Sedward
10715206Sedward Dr = from->file->row - to->file->row;
10815206Sedward Dc = to->file->col - from->file->col;
10915206Sedward for (i = 2; i; i--) {
11015206Sedward if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1)
11115206Sedward ang += 8;
11215206Sedward if (ang >= 2 && ang <= 4)
11315206Sedward return 'r';
11415206Sedward if (ang >= 6 && ang <= 7)
11515206Sedward return 'l';
11615206Sedward Dr += dr[to->file->dir];
11715206Sedward Dc += dc[to->file->dir];
11815206Sedward }
11915206Sedward return 0;
12015206Sedward }
12115206Sedward
portside(from,on,quick)12215206Sedward portside(from, on, quick)
12315206Sedward register struct ship *from, *on;
12415206Sedward int quick; /* returns true if fromship is */
12515206Sedward { /* shooting at onship's starboard side */
12615206Sedward register ang;
12715206Sedward register Dr, Dc;
12815206Sedward
12915206Sedward Dr = from->file->row - on->file->row;
13015206Sedward Dc = on->file->col - from->file->col;
13115206Sedward if (quick == -1) {
13215206Sedward Dr += dr[on->file->dir];
13315206Sedward Dc += dc[on->file->dir];
13415206Sedward }
13515206Sedward ang = angle(Dr, Dc);
13615206Sedward if (quick != 0)
13715206Sedward return ang;
13815206Sedward ang = (ang + 4 - on->file->dir - 1) % 8 + 1;
13915206Sedward return ang < 5;
14015206Sedward }
14115206Sedward
colours(sp)14215206Sedward colours(sp)
14315206Sedward register struct ship *sp;
14415206Sedward {
14515206Sedward register char flag;
14615206Sedward
14715206Sedward if (sp->file->struck)
14815206Sedward flag = '!';
14915206Sedward if (sp->file->explode)
15015206Sedward flag = '#';
15115206Sedward if (sp->file->sink)
15215206Sedward flag = '~';
15315206Sedward if (sp->file->struck)
15415206Sedward return flag;
15515206Sedward flag = *countryname[capship(sp)->nationality];
15615206Sedward return sp->file->FS ? flag : tolower(flag);
15715206Sedward }
15815206Sedward
15916088Sedward #include <sys/file.h>
log(s)16016088Sedward log(s)
16116088Sedward register struct ship *s;
16215206Sedward {
16316088Sedward FILE *fp;
16416088Sedward int persons;
16516088Sedward int n;
16616088Sedward struct logs log[NLOG];
16716088Sedward float net;
16816088Sedward register struct logs *lp;
16915206Sedward
17041324Sbostic if ((fp = fopen(_PATH_LOGFILE, "r+")) == NULL)
17116088Sedward return;
17216088Sedward #ifdef LOCK_EX
17316090Sedward if (flock(fileno(fp), LOCK_EX) < 0)
17416090Sedward return;
17516088Sedward #endif
17616088Sedward net = (float)s->file->points / s->specs->pts;
17716088Sedward persons = getw(fp);
17816088Sedward n = fread((char *)log, sizeof(struct logs), NLOG, fp);
17916088Sedward for (lp = &log[n]; lp < &log[NLOG]; lp++)
18016088Sedward lp->l_name[0] = lp->l_uid = lp->l_shipnum
18116088Sedward = lp->l_gamenum = lp->l_netpoints = 0;
18216088Sedward rewind(fp);
18316088Sedward if (persons < 0)
18416088Sedward (void) putw(1, fp);
18516088Sedward else
18616088Sedward (void) putw(persons + 1, fp);
18716088Sedward for (lp = log; lp < &log[NLOG]; lp++)
18816088Sedward if (net > (float)lp->l_netpoints
18916088Sedward / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) {
19016088Sedward (void) fwrite((char *)log,
19116088Sedward sizeof (struct logs), lp - log, fp);
19216088Sedward (void) strcpy(log[NLOG-1].l_name, s->file->captain);
19316088Sedward log[NLOG-1].l_uid = getuid();
19416088Sedward log[NLOG-1].l_shipnum = s->file->index;
19516088Sedward log[NLOG-1].l_gamenum = game;
19616088Sedward log[NLOG-1].l_netpoints = s->file->points;
19716088Sedward (void) fwrite((char *)&log[NLOG-1],
19816088Sedward sizeof (struct logs), 1, fp);
19916088Sedward (void) fwrite((char *)lp,
20016088Sedward sizeof (struct logs), &log[NLOG-1] - lp, fp);
20116088Sedward break;
20216088Sedward }
20316088Sedward #ifdef LOCK_EX
20416090Sedward (void) flock(fileno(fp), LOCK_UN);
20516088Sedward #endif
20616088Sedward (void) fclose(fp);
20715206Sedward }
208