home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume4 / sail / part03 / misc.c < prev    next >
C/C++ Source or Header  |  1988-04-13  |  5KB  |  212 lines

  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 this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific prior written permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #ifndef lint
  14. static char sccsid[] = "@(#)misc.c    5.2 (Berkeley) 3/9/88";
  15. #endif /* not lint */
  16.  
  17. #include "externs.h"
  18.  
  19. #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2)
  20.  
  21. /* XXX */
  22. range(from, to)
  23. struct ship *from, *to;
  24. {
  25.     register bow1r, bow1c, bow2r, bow2c;
  26.     int stern1r, stern1c, stern2c, stern2r;
  27.     register int bb, bs, sb, ss, result;
  28.  
  29.     if (!to->file->dir)
  30.         return -1;
  31.     stern1r = bow1r = from->file->row;
  32.     stern1c = bow1c = from->file->col;
  33.     stern2r = bow2r = to->file->row;
  34.     stern2c = bow2c = to->file->col;
  35.     result = bb = distance(bow2r - bow1r, bow2c - bow1c);
  36.     if (bb < 5) {
  37.         stern2r += dr[to->file->dir];
  38.         stern2c += dc[to->file->dir];
  39.         stern1r += dr[from->file->dir];
  40.         stern1c += dc[from->file->dir];
  41.         bs = distance((bow2r - stern1r), (bow2c - stern1c));
  42.         sb = distance((bow1r - stern2r), (bow1c - stern2c));
  43.         ss = distance((stern2r - stern1r) ,(stern2c - stern1c));
  44.         result = min(bb, min(bs, min(sb, ss)));
  45.     }
  46.     return result;
  47. }
  48.  
  49. struct ship *
  50. closestenemy(from, side, anyship)
  51. register struct ship *from;
  52. char side, anyship;
  53. {
  54.     register struct ship *sp;
  55.     register char a;
  56.     int olddist = 30000, dist;
  57.     struct ship *closest = 0;
  58.  
  59.     a = capship(from)->nationality;
  60.     foreachship(sp) {
  61.         if (sp == from)
  62.             continue;
  63.         if (sp->file->dir == 0)
  64.             continue;
  65.         if (a == capship(sp)->nationality && !anyship)
  66.             continue;
  67.         if (side && gunsbear(from, sp) != side)
  68.             continue;
  69.         dist = range(from, sp);
  70.         if (dist < olddist) {
  71.             closest = sp;
  72.             olddist = dist;
  73.         }
  74.     }
  75.     return closest;
  76. }
  77.  
  78. angle(dr, dc)
  79. register dr, dc;
  80. {
  81.     register i;
  82.  
  83.     if (dc >= 0 && dr > 0)
  84.         i = 0;
  85.     else if (dr <= 0 && dc > 0)
  86.         i = 2;
  87.     else if (dc <= 0 && dr < 0)
  88.         i = 4;
  89.     else
  90.         i = 6;
  91.     dr = abs(dr);
  92.     dc = abs(dc);
  93.     if ((i == 0 || i == 4) && dc * 2.4 > dr) {
  94.         i++;
  95.         if (dc > dr * 2.4)
  96.             i++;
  97.     } else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
  98.         i++;
  99.         if (dr > dc * 2.4)
  100.             i++;
  101.     }
  102.     return i % 8 + 1;
  103. }
  104.  
  105. gunsbear(from, to)        /* checks for target bow or stern */
  106. register struct ship *from, *to;
  107. {
  108.     int Dr, Dc, i;
  109.     register ang;
  110.  
  111.     Dr = from->file->row - to->file->row;
  112.     Dc = to->file->col - from->file->col;
  113.     for (i = 2; i; i--) {
  114.         if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1)
  115.             ang += 8;
  116.         if (ang >= 2 && ang <= 4)
  117.             return 'r';
  118.         if (ang >= 6 && ang <= 7)
  119.             return 'l';
  120.         Dr += dr[to->file->dir];
  121.         Dc += dc[to->file->dir];
  122.     }
  123.     return 0;
  124. }
  125.  
  126. portside(from, on, quick)
  127. register struct ship *from, *on;
  128. int quick;            /* returns true if fromship is */
  129. {                /* shooting at onship's starboard side */
  130.     register ang;
  131.     register Dr, Dc;
  132.  
  133.     Dr = from->file->row - on->file->row;
  134.     Dc = on->file->col - from->file->col;
  135.     if (quick == -1) {
  136.         Dr += dr[on->file->dir];
  137.         Dc += dc[on->file->dir];
  138.     }
  139.     ang = angle(Dr, Dc);
  140.     if (quick != 0)
  141.         return ang;
  142.     ang = (ang + 4 - on->file->dir - 1) % 8 + 1;
  143.     return ang < 5;
  144. }
  145.  
  146. colours(sp)
  147. register struct ship *sp;
  148. {
  149.     register char flag;
  150.  
  151.     if (sp->file->struck)
  152.         flag = '!';
  153.     if (sp->file->explode)
  154.         flag = '#';
  155.     if (sp->file->sink)
  156.         flag = '~';
  157.     if (sp->file->struck)
  158.         return flag;
  159.     flag = *countryname[capship(sp)->nationality];
  160.     return sp->file->FS ? flag : tolower(flag);
  161. }
  162.  
  163. #include <sys/file.h>
  164. log(s)
  165. register struct ship *s;
  166. {
  167.     FILE *fp;
  168.     int persons;
  169.     int n;
  170.     struct logs log[NLOG];
  171.     float net;
  172.     register struct logs *lp;
  173.  
  174.     if ((fp = fopen(LOGFILE, "r+")) == NULL)
  175.         return;
  176. #ifdef LOCK_EX
  177.     if (flock(fileno(fp), LOCK_EX) < 0)
  178.         return;
  179. #endif
  180.     net = (float)s->file->points / s->specs->pts;
  181.     persons = getw(fp);
  182.     n = fread((char *)log, sizeof(struct logs), NLOG, fp);
  183.     for (lp = &log[n]; lp < &log[NLOG]; lp++)
  184.         lp->l_name[0] = lp->l_uid = lp->l_shipnum
  185.             = lp->l_gamenum = lp->l_netpoints = 0;
  186.     rewind(fp);
  187.     if (persons < 0)
  188.         (void) putw(1, fp);
  189.     else
  190.         (void) putw(persons + 1, fp);
  191.     for (lp = log; lp < &log[NLOG]; lp++)
  192.         if (net > (float)lp->l_netpoints
  193.             / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) {
  194.             (void) fwrite((char *)log,
  195.                 sizeof (struct logs), lp - log, fp);
  196.             (void) strcpy(log[NLOG-1].l_name, s->file->captain);
  197.             log[NLOG-1].l_uid = getuid();
  198.             log[NLOG-1].l_shipnum = s->file->index;
  199.             log[NLOG-1].l_gamenum = game;
  200.             log[NLOG-1].l_netpoints = s->file->points;
  201.             (void) fwrite((char *)&log[NLOG-1],
  202.                 sizeof (struct logs), 1, fp);
  203.             (void) fwrite((char *)lp,
  204.                 sizeof (struct logs), &log[NLOG-1] - lp, fp);
  205.             break;
  206.         }
  207. #ifdef LOCK_EX
  208.     (void) flock(fileno(fp), LOCK_UN);
  209. #endif
  210.     (void) fclose(fp);
  211. }
  212.