The g? structs had a mix of variables that were written to
the savefile, and those that were not.
For better clarity and to distinguish those that end up in
the savefile, relocate some g? variables that get written
directly to the savefile into different structs.
This updates EDITLEVEL, although technically it probably
didn't need to, since savefile contents are not changing.
Details:
gb.bases -> svb.bases
gb.bbubbles -> svb.bbubbles
gb.branches -> svb.branches
gc.context -> svc.context
gd.disco -> svd.disco
gd.dndest -> svd.dndest
gd.doors -> svd.doors
gd.doors_alloc -> svd.doors_alloc
gd.dungeon_topology -> svd.dungeon_topology
gd.dungeons -> svd.dungeons
ge.exclusion_zones -> sve.exclusion_zones
gh.hackpid -> svh.hackpid
gi.inv_pos -> svi.inv_pos
gk.killer -> svk.killer
gl.lastseentyp -> svl.lastseentyp
gl.level -> svl.level
gl.level_info -> svl.level_info
gm.mapseenchn -> svm.mapseenchn
gm.moves -> svm.moves
gm.mvitals -> svm.mvitals
gn.n_dgns -> svn.n_dgns
gn.n_regions -> svn.n_regions
gn.nroom -> svn.nroom
go.oracle_cnt -> svo.oracle_cnt
gp.pl_character -> svp.pl_character
gp.pl_fruit -> svp.pl_fruit
gp.plname -> svp.plname
gp.program_state -> svp.program_state
gq.quest_status -> svq.quest_status
gr.rooms -> svr.rooms
gs.sp_levchn -> svs.sp_levchn
gs.spl_book -> svs.spl_book
gt.timer_id -> svt.timer_id
gt.tune -> svt.tune
gu.updest -> svu.updest
gx.xmax -> svx.xmax
gx.xmin -> svx.xmin
gy.ymax -> svy.ymax
gy.ymin -> svy.ymin
Related note:
There are some pointer variables that are heads of chains that were not
moved from 'g?' to 'sv?', because they are not actually written to the
savefile directly, but the objects/monst/trap/lightsource/timer in the
chains they point to are. That can be changed, if desired.
Examples: gi.invent, gm.migrating_objs, gb.billobjs, gm.migrating_mons,
gf.ftrap, gl.light_base, gt.timer_base
71 lines
2.5 KiB
C
71 lines
2.5 KiB
C
/* NetHack 3.7 align.h $NHDT-Date: 1604269810 2020/11/01 22:30:10 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.15 $ */
|
|
/* Copyright (c) Mike Stephenson, Izchak Miller 1991. */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#ifndef ALIGN_H
|
|
#define ALIGN_H
|
|
|
|
typedef schar aligntyp; /* basic alignment type */
|
|
|
|
typedef struct align { /* alignment & record */
|
|
aligntyp type;
|
|
int record;
|
|
unsigned abuse;
|
|
} align;
|
|
|
|
/* bounds for "record" -- respect initial alignments of 10 */
|
|
#define ALIGNLIM (10L + (svm.moves / 200L))
|
|
|
|
#define A_NONE (-128) /* the value range of type */
|
|
|
|
#define A_CHAOTIC (-1)
|
|
#define A_NEUTRAL 0
|
|
#define A_LAWFUL 1
|
|
|
|
#define A_COALIGNED 1
|
|
#define A_OPALIGNED (-1)
|
|
|
|
/* align masks */
|
|
#define AM_NONE 0x00
|
|
#define AM_CHAOTIC 0x01
|
|
#define AM_NEUTRAL 0x02
|
|
#define AM_LAWFUL 0x04
|
|
#define AM_MASK 0x07 /* mask for "normal" alignment values */
|
|
|
|
/* Some altars are considered shrines, add a flag for that
|
|
for the altarmask field of struct rm. */
|
|
#define AM_SHRINE 0x08
|
|
/* High altar on Astral plane or Moloch's sanctum */
|
|
#define AM_SANCTUM 0x10
|
|
|
|
/* special level flags, gone by the time the level has been loaded */
|
|
#define AM_SPLEV_CO 0x20 /* co-aligned: force alignment to match hero's */
|
|
#define AM_SPLEV_NONCO 0x40 /* non-co-aligned: force alignment to not match */
|
|
#define AM_SPLEV_RANDOM 0x80
|
|
|
|
#define Amask2align(x) \
|
|
((aligntyp) ((((x) & AM_MASK) == 0) ? A_NONE \
|
|
: (((x) & AM_MASK) == AM_LAWFUL) ? A_LAWFUL \
|
|
: ((int) ((x) & AM_MASK)) - 2)) /* 2 => 0, 1 => -1 */
|
|
#define Align2amask(x) \
|
|
((unsigned) (((x) == A_NONE) ? AM_NONE \
|
|
: ((x) == A_LAWFUL) ? AM_LAWFUL \
|
|
: ((x) + 2))) /* -1 => 1, 0 => 2 */
|
|
|
|
/* Because clearly Nethack needs more ways to specify alignment...
|
|
Amask2msa(): 1, 2, 4 converted to 1, 2, 3 to fit within a width 2 bitfield;
|
|
Msa2amask(): 1, 2, 3 converted back to 1, 2, 4;
|
|
For Amask2msa(), 'x' might have the shrine bit set so strip that off. */
|
|
#define Amask2msa(x) ((((x) & AM_MASK) == 4) ? 3 : (x) & AM_MASK)
|
|
#define Msa2amask(x) (((x) == 3) ? 4 : (x))
|
|
#define MSA_NONE 0 /* unaligned or multiple alignments */
|
|
|
|
/* alignment change reasons for uchangealign(attrib.c) */
|
|
enum uchangealign_reasons {
|
|
A_CG_CONVERT = 0, /* permanently converted */
|
|
A_CG_HELM_ON = 1, /* donned helm of opposite alignment */
|
|
A_CG_HELM_OFF = 2, /* doffed helm of opposite alignment */
|
|
};
|
|
|
|
#endif /* ALIGN_H */
|