#overview enhancements (trunk only)

1) add graves to the dungeon features being tracked;
2) report on known bones (determined by seeing map spot(s) where previous
   hero(es) died since there's no guarantee of graves or ghosts);
3) add automatic annotations for oracle, sokoban, bigroom, rogue level,
   Ft.Ludios, castle, valley, and Moloch's sanctum.  For bigroom and rogue
   level you just need to visit that level, for the others you need to get
   far enough along to learn something specific (oracle: her room, sokoban:
   annotation is either "solved" or "unsolved" depending upon whether all
   the holes and pits have been filled, fort and castle: see the drawbridge,
   valley and sanctum: see inside the tended temple).  Discovering the
   relevant locations via magic mapping counts as "far enough along".

     There should probably also be automatic annotations for Medusa and the
vibrating square but I'm not sure what criteria should be used for the
former or what phrasing to use for the latter.  Demon lord/prince lairs fall
into similar category as Medusa.

     TODO: add final #overview as an end of game disclosure option.  (I was
planning this even before I saw that nitrohack has implemented it....)
This commit is contained in:
nethack.rankin
2012-02-16 02:40:24 +00:00
parent 6540843cbf
commit 337e158009
9 changed files with 409 additions and 178 deletions

View File

@@ -22,7 +22,6 @@ int dotcnt, dotrow; /* also used in restore */
#endif
STATIC_DCL void FDECL(savelevchn, (int,int));
STATIC_DCL void FDECL(savecemetery, (int,int));
STATIC_DCL void FDECL(savedamage, (int,int));
STATIC_DCL void FDECL(saveobj, (int,struct obj *));
STATIC_DCL void FDECL(saveobjchn, (int,struct obj *,int));
@@ -521,7 +520,7 @@ int mode;
#else
bwrite(fd,(genericptr_t) &lev,sizeof(lev));
#endif
savecemetery(fd, mode);
savecemetery(fd, mode, &level.bonesinfo);
savelevl(fd, (boolean)((sfsaveinfo.sfi1 & SFI1_RLECOMP) == SFI1_RLECOMP));
#ifdef DUNGEON_OVERVIEW
bwrite(fd,(genericptr_t) lastseentyp,sizeof(lastseentyp));
@@ -540,6 +539,8 @@ int mode;
/* from here on out, saving also involves allocated memory cleanup */
skip_lots:
/* this comes before the map, so need cleanup here if we skipped */
if (mode == FREE_SAVE) savecemetery(fd, mode, &level.bonesinfo);
/* must be saved before mons, objs, and buried objs */
save_timers(fd, mode, RANGE_LEVEL);
save_light_sources(fd, mode, RANGE_LEVEL);
@@ -556,7 +557,7 @@ int mode;
fobj = 0;
level.buriedobjlist = 0;
billobjs = 0;
level.bonesinfo = 0;
/* level.bonesinfo = 0; -- handled by savecemetery() */
}
save_engravings(fd, mode);
savedamage(fd, mode);
@@ -921,18 +922,20 @@ register int fd, mode;
sp_levchn = 0;
}
STATIC_OVL void
savecemetery(fd, mode)
/* used when saving a level and also when saving dungeon overview data */
void
savecemetery(fd, mode, cemeteryaddr)
int fd;
int mode;
struct cemetery **cemeteryaddr;
{
struct cemetery *thisbones, *nextbones;
int flag;
flag = level.bonesinfo ? 0 : -1;
flag = *cemeteryaddr ? 0 : -1;
if (perform_bwrite(mode))
bwrite(fd, (genericptr_t)&flag, sizeof flag);
nextbones = level.bonesinfo;
nextbones = *cemeteryaddr;
while ((thisbones = nextbones) != 0) {
nextbones = thisbones->next;
if (perform_bwrite(mode))
@@ -940,6 +943,8 @@ int mode;
if (release_data(mode))
free((genericptr_t)thisbones);
}
if (release_data(mode))
*cemeteryaddr = 0;
}
STATIC_OVL void