|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)misc.c 5.5 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include "externs.h" ! 25: #include "pathnames.h" ! 26: ! 27: #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) ! 28: ! 29: /* XXX */ ! 30: range(from, to) ! 31: struct ship *from, *to; ! 32: { ! 33: register bow1r, bow1c, bow2r, bow2c; ! 34: int stern1r, stern1c, stern2c, stern2r; ! 35: register int bb, bs, sb, ss, result; ! 36: ! 37: if (!to->file->dir) ! 38: return -1; ! 39: stern1r = bow1r = from->file->row; ! 40: stern1c = bow1c = from->file->col; ! 41: stern2r = bow2r = to->file->row; ! 42: stern2c = bow2c = to->file->col; ! 43: result = bb = distance(bow2r - bow1r, bow2c - bow1c); ! 44: if (bb < 5) { ! 45: stern2r += dr[to->file->dir]; ! 46: stern2c += dc[to->file->dir]; ! 47: stern1r += dr[from->file->dir]; ! 48: stern1c += dc[from->file->dir]; ! 49: bs = distance((bow2r - stern1r), (bow2c - stern1c)); ! 50: sb = distance((bow1r - stern2r), (bow1c - stern2c)); ! 51: ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); ! 52: result = min(bb, min(bs, min(sb, ss))); ! 53: } ! 54: return result; ! 55: } ! 56: ! 57: struct ship * ! 58: closestenemy(from, side, anyship) ! 59: register struct ship *from; ! 60: char side, anyship; ! 61: { ! 62: register struct ship *sp; ! 63: register char a; ! 64: int olddist = 30000, dist; ! 65: struct ship *closest = 0; ! 66: ! 67: a = capship(from)->nationality; ! 68: foreachship(sp) { ! 69: if (sp == from) ! 70: continue; ! 71: if (sp->file->dir == 0) ! 72: continue; ! 73: if (a == capship(sp)->nationality && !anyship) ! 74: continue; ! 75: if (side && gunsbear(from, sp) != side) ! 76: continue; ! 77: dist = range(from, sp); ! 78: if (dist < olddist) { ! 79: closest = sp; ! 80: olddist = dist; ! 81: } ! 82: } ! 83: return closest; ! 84: } ! 85: ! 86: angle(dr, dc) ! 87: register dr, dc; ! 88: { ! 89: register i; ! 90: ! 91: if (dc >= 0 && dr > 0) ! 92: i = 0; ! 93: else if (dr <= 0 && dc > 0) ! 94: i = 2; ! 95: else if (dc <= 0 && dr < 0) ! 96: i = 4; ! 97: else ! 98: i = 6; ! 99: dr = abs(dr); ! 100: dc = abs(dc); ! 101: if ((i == 0 || i == 4) && dc * 2.4 > dr) { ! 102: i++; ! 103: if (dc > dr * 2.4) ! 104: i++; ! 105: } else if ((i == 2 || i == 6) && dr * 2.4 > dc) { ! 106: i++; ! 107: if (dr > dc * 2.4) ! 108: i++; ! 109: } ! 110: return i % 8 + 1; ! 111: } ! 112: ! 113: gunsbear(from, to) /* checks for target bow or stern */ ! 114: register struct ship *from, *to; ! 115: { ! 116: int Dr, Dc, i; ! 117: register ang; ! 118: ! 119: Dr = from->file->row - to->file->row; ! 120: Dc = to->file->col - from->file->col; ! 121: for (i = 2; i; i--) { ! 122: if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1) ! 123: ang += 8; ! 124: if (ang >= 2 && ang <= 4) ! 125: return 'r'; ! 126: if (ang >= 6 && ang <= 7) ! 127: return 'l'; ! 128: Dr += dr[to->file->dir]; ! 129: Dc += dc[to->file->dir]; ! 130: } ! 131: return 0; ! 132: } ! 133: ! 134: portside(from, on, quick) ! 135: register struct ship *from, *on; ! 136: int quick; /* returns true if fromship is */ ! 137: { /* shooting at onship's starboard side */ ! 138: register ang; ! 139: register Dr, Dc; ! 140: ! 141: Dr = from->file->row - on->file->row; ! 142: Dc = on->file->col - from->file->col; ! 143: if (quick == -1) { ! 144: Dr += dr[on->file->dir]; ! 145: Dc += dc[on->file->dir]; ! 146: } ! 147: ang = angle(Dr, Dc); ! 148: if (quick != 0) ! 149: return ang; ! 150: ang = (ang + 4 - on->file->dir - 1) % 8 + 1; ! 151: return ang < 5; ! 152: } ! 153: ! 154: colours(sp) ! 155: register struct ship *sp; ! 156: { ! 157: register char flag; ! 158: ! 159: if (sp->file->struck) ! 160: flag = '!'; ! 161: if (sp->file->explode) ! 162: flag = '#'; ! 163: if (sp->file->sink) ! 164: flag = '~'; ! 165: if (sp->file->struck) ! 166: return flag; ! 167: flag = *countryname[capship(sp)->nationality]; ! 168: return sp->file->FS ? flag : tolower(flag); ! 169: } ! 170: ! 171: #include <sys/file.h> ! 172: log(s) ! 173: register struct ship *s; ! 174: { ! 175: FILE *fp; ! 176: int persons; ! 177: int n; ! 178: struct logs log[NLOG]; ! 179: float net; ! 180: register struct logs *lp; ! 181: ! 182: if ((fp = fopen(_PATH_LOGFILE, "r+")) == NULL) ! 183: return; ! 184: #ifdef LOCK_EX ! 185: if (flock(fileno(fp), LOCK_EX) < 0) ! 186: return; ! 187: #endif ! 188: net = (float)s->file->points / s->specs->pts; ! 189: persons = getw(fp); ! 190: n = fread((char *)log, sizeof(struct logs), NLOG, fp); ! 191: for (lp = &log[n]; lp < &log[NLOG]; lp++) ! 192: lp->l_name[0] = lp->l_uid = lp->l_shipnum ! 193: = lp->l_gamenum = lp->l_netpoints = 0; ! 194: rewind(fp); ! 195: if (persons < 0) ! 196: (void) putw(1, fp); ! 197: else ! 198: (void) putw(persons + 1, fp); ! 199: for (lp = log; lp < &log[NLOG]; lp++) ! 200: if (net > (float)lp->l_netpoints ! 201: / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) { ! 202: (void) fwrite((char *)log, ! 203: sizeof (struct logs), lp - log, fp); ! 204: (void) strcpy(log[NLOG-1].l_name, s->file->captain); ! 205: log[NLOG-1].l_uid = getuid(); ! 206: log[NLOG-1].l_shipnum = s->file->index; ! 207: log[NLOG-1].l_gamenum = game; ! 208: log[NLOG-1].l_netpoints = s->file->points; ! 209: (void) fwrite((char *)&log[NLOG-1], ! 210: sizeof (struct logs), 1, fp); ! 211: (void) fwrite((char *)lp, ! 212: sizeof (struct logs), &log[NLOG-1] - lp, fp); ! 213: break; ! 214: } ! 215: #ifdef LOCK_EX ! 216: (void) flock(fileno(fp), LOCK_UN); ! 217: #endif ! 218: (void) fclose(fp); ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.