* Copyright (c) 1983 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)misc.c 5.3 (Berkeley) %G%";
#define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2)
register bow1r
, bow1c
, bow2r
, bow2c
;
int stern1r
, stern1c
, stern2c
, stern2r
;
register int bb
, bs
, sb
, ss
, result
;
stern1r
= bow1r
= from
->file
->row
;
stern1c
= bow1c
= from
->file
->col
;
stern2r
= bow2r
= to
->file
->row
;
stern2c
= bow2c
= to
->file
->col
;
result
= bb
= distance(bow2r
- bow1r
, bow2c
- bow1c
);
stern2r
+= dr
[to
->file
->dir
];
stern2c
+= dc
[to
->file
->dir
];
stern1r
+= dr
[from
->file
->dir
];
stern1c
+= dc
[from
->file
->dir
];
bs
= distance((bow2r
- stern1r
), (bow2c
- stern1c
));
sb
= distance((bow1r
- stern2r
), (bow1c
- stern2c
));
ss
= distance((stern2r
- stern1r
) ,(stern2c
- stern1c
));
result
= min(bb
, min(bs
, min(sb
, ss
)));
closestenemy(from
, side
, anyship
)
register struct ship
*from
;
register struct ship
*sp
;
int olddist
= 30000, dist
;
struct ship
*closest
= 0;
a
= capship(from
)->nationality
;
if (a
== capship(sp
)->nationality
&& !anyship
)
if (side
&& gunsbear(from
, sp
) != side
)
else if (dr
<= 0 && dc
> 0)
else if (dc
<= 0 && dr
< 0)
if ((i
== 0 || i
== 4) && dc
* 2.4 > dr
) {
} else if ((i
== 2 || i
== 6) && dr
* 2.4 > dc
) {
gunsbear(from
, to
) /* checks for target bow or stern */
register struct ship
*from
, *to
;
Dr
= from
->file
->row
- to
->file
->row
;
Dc
= to
->file
->col
- from
->file
->col
;
if ((ang
= angle(Dr
, Dc
) - from
->file
->dir
+ 1) < 1)
if (ang
>= 2 && ang
<= 4)
if (ang
>= 6 && ang
<= 7)
portside(from
, on
, quick
)
register struct ship
*from
, *on
;
int quick
; /* returns true if fromship is */
{ /* shooting at onship's starboard side */
Dr
= from
->file
->row
- on
->file
->row
;
Dc
= on
->file
->col
- from
->file
->col
;
ang
= (ang
+ 4 - on
->file
->dir
- 1) % 8 + 1;
register struct ship
*sp
;
flag
= *countryname
[capship(sp
)->nationality
];
return sp
->file
->FS
? flag
: tolower(flag
);
register struct logs
*lp
;
if ((fp
= fopen(LOGFILE
, "r+")) == NULL
)
if (flock(fileno(fp
), LOCK_EX
) < 0)
net
= (float)s
->file
->points
/ s
->specs
->pts
;
n
= fread((char *)log
, sizeof(struct logs
), NLOG
, fp
);
for (lp
= &log
[n
]; lp
< &log
[NLOG
]; lp
++)
lp
->l_name
[0] = lp
->l_uid
= lp
->l_shipnum
= lp
->l_gamenum
= lp
->l_netpoints
= 0;
(void) putw(persons
+ 1, fp
);
for (lp
= log
; lp
< &log
[NLOG
]; lp
++)
if (net
> (float)lp
->l_netpoints
/ scene
[lp
->l_gamenum
].ship
[lp
->l_shipnum
].specs
->pts
) {
(void) fwrite((char *)log
,
sizeof (struct logs
), lp
- log
, fp
);
(void) strcpy(log
[NLOG
-1].l_name
, s
->file
->captain
);
log
[NLOG
-1].l_uid
= getuid();
log
[NLOG
-1].l_shipnum
= s
->file
->index
;
log
[NLOG
-1].l_gamenum
= game
;
log
[NLOG
-1].l_netpoints
= s
->file
->points
;
(void) fwrite((char *)&log
[NLOG
-1],
sizeof (struct logs
), 1, fp
);
(void) fwrite((char *)lp
,
sizeof (struct logs
), &log
[NLOG
-1] - lp
, fp
);
(void) flock(fileno(fp
), LOCK_UN
);