Files
nethack/src/track.c
Pasi Kallinen d8421aa219 Save and restore hero tracks
The tracks left by hero were cleared when player saved and
restored the game, or changed levels.  Now the tracks are
saved in the dungeon level, so changing levels keeps the tracks
left by hero in that level.

Also increased the length of tracks from 50 to 100, and
simplify the tracking function.

Thing not done: fade out old tracks when returning to a level.

Breaks saves and bones.
2023-12-04 17:50:48 +02:00

94 lines
2.3 KiB
C

/* NetHack 3.7 track.c $NHDT-Date: 1596498219 2020/08/03 23:43:39 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.12 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */
/* NetHack may be freely redistributed. See license for details. */
/* track.c - version 1.0.2 */
#include "hack.h"
#define UTSZ 100
static NEARDATA int utcnt, utpnt;
static NEARDATA coord utrack[UTSZ];
void
initrack(void)
{
utcnt = utpnt = 0;
(void) memset((genericptr_t) &utrack, 0, sizeof(utrack));
}
/* add to track */
void
settrack(void)
{
if (utcnt < UTSZ)
utcnt++;
if (utpnt == UTSZ)
utpnt = 0;
utrack[utpnt].x = u.ux;
utrack[utpnt].y = u.uy;
utpnt++;
}
/* get a track coord on or next to x,y and last tracked by hero,
returns null if no such track */
coord *
gettrack(coordxy x, coordxy y)
{
register int cnt, ndist;
register coord *tc;
cnt = utcnt;
for (tc = &utrack[utpnt]; cnt--;) {
if (tc == utrack)
tc = &utrack[UTSZ - 1];
else
tc--;
ndist = distmin(x, y, tc->x, tc->y);
if (ndist <= 1)
return (ndist ? tc : 0);
}
return (coord *) 0;
}
/* save the hero tracking info */
void
save_track(NHFILE *nhfp)
{
if (perform_bwrite(nhfp)) {
if (nhfp->structlevel) {
int i;
bwrite(nhfp->fd, (genericptr_t) &utcnt, sizeof utcnt);
bwrite(nhfp->fd, (genericptr_t) &utpnt, sizeof utpnt);
for (i = 0; i < utcnt; i++) {
bwrite(nhfp->fd, (genericptr_t) &utrack[i].x, sizeof utrack[i].x);
bwrite(nhfp->fd, (genericptr_t) &utrack[i].y, sizeof utrack[i].y);
}
}
}
if (release_data(nhfp))
initrack();
}
/* restore the hero tracking info */
void
rest_track(NHFILE *nhfp)
{
if (nhfp->structlevel) {
int i;
mread(nhfp->fd, (genericptr_t) &utcnt, sizeof utcnt);
mread(nhfp->fd, (genericptr_t) &utpnt, sizeof utpnt);
if (utcnt > UTSZ || utpnt > UTSZ)
panic("rest_track: impossible pt counts");
for (i = 0; i < utcnt; i++) {
mread(nhfp->fd, (genericptr_t) &utrack[i].x, sizeof utrack[i].x);
mread(nhfp->fd, (genericptr_t) &utrack[i].y, sizeof utrack[i].y);
}
}
}
/*track.c*/