1 | /* SCCS Id: @(#)track.c 3.3 87/08/08 */
2 | /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 | /* NetHack may be freely redistributed. See license for details. */
4 | /* track.c - version 1.0.2 */
5 |
6 | #include "hack.h"
7 |
8 | #define UTSZ 50
9 |
10 | STATIC_VAR NEARDATA int utcnt, utpnt;
11 | STATIC_VAR NEARDATA coord utrack[UTSZ];
12 |
13 | #ifdef OVLB
14 |
15 | void
16 | initrack()
17 | {
18 | utcnt = utpnt = 0;
19 | }
20 |
21 | #endif /* OVLB */
22 | #ifdef OVL1
23 |
24 | /* add to track */
25 | void
26 | settrack()
27 | {
28 | if(utcnt < UTSZ) utcnt++;
29 | if(utpnt == UTSZ) utpnt = 0;
30 | utrack[utpnt].x = u.ux;
31 | utrack[utpnt].y = u.uy;
32 | utpnt++;
33 | }
34 |
35 | #endif /* OVL1 */
36 | #ifdef OVL0
37 |
38 | coord *
39 | gettrack(x, y)
40 | register int x, y;
41 | {
42 | register int cnt, ndist;
43 | register coord *tc;
44 | cnt = utcnt;
45 | for(tc = &utrack[utpnt]; cnt--; ){
46 | if(tc == utrack) tc = &utrack[UTSZ-1];
47 | else tc--;
48 | ndist = distmin(x,y,tc->x,tc->y);
49 |
50 | /* if far away, skip track entries til we're closer */
51 | if(ndist > 2) {
52 | ndist -= 2; /* be careful due to extra decrement at top of loop */
53 | cnt -= ndist;
54 | if(cnt <= 0)
55 | return (coord *) 0; /* too far away, no matches possible */
56 | if(tc < &utrack[ndist])
57 | tc += (UTSZ-ndist);
58 | else
59 | tc -= ndist;
60 | } else if(ndist <= 1)
61 | return(ndist ? tc : 0);
62 | }
63 | return (coord *)0;
64 | }
65 |
66 | #endif /* OVL0 */
67 |
68 | /*track.c*/