Annotation of 43BSDReno/games/sail/misc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.