221 lines
5.9 KiB
C
221 lines
5.9 KiB
C
/* NetHack 3.7 sp_lev.h $NHDT-Date: 1622361649 2021/05/30 08:00:49 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.47 $ */
|
|
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#ifndef SP_LEV_H
|
|
#define SP_LEV_H
|
|
|
|
/* wall directions */
|
|
#define W_NORTH 1
|
|
#define W_SOUTH 2
|
|
#define W_EAST 4
|
|
#define W_WEST 8
|
|
#define W_ANY (W_NORTH | W_SOUTH | W_EAST | W_WEST)
|
|
|
|
/* MAP limits */
|
|
#define MAP_X_LIM 76
|
|
#define MAP_Y_LIM 21
|
|
|
|
/* Per level flags */
|
|
#define NOTELEPORT 0x00000001L
|
|
#define HARDFLOOR 0x00000002L
|
|
#define NOMMAP 0x00000004L
|
|
#define SHORTSIGHTED 0x00000008L
|
|
#define ARBOREAL 0x00000010L
|
|
#define MAZELEVEL 0x00000020L
|
|
#define PREMAPPED 0x00000040L /* premapped level & sokoban rules */
|
|
#define SHROUD 0x00000080L
|
|
#define GRAVEYARD 0x00000100L
|
|
#define ICEDPOOLS 0x00000200L /* for ice locations: ICED_POOL vs ICED_MOAT \
|
|
*/
|
|
#define SOLIDIFY 0x00000400L /* outer areas are nondiggable & nonpasswall */
|
|
#define CORRMAZE 0x00000800L /* for maze levels only */
|
|
#define CHECK_INACCESSIBLES 0x00001000L /* check for inaccessible areas and
|
|
generate ways to escape from them */
|
|
|
|
/* different level layout initializers */
|
|
enum lvlinit_types {
|
|
LVLINIT_NONE = 0,
|
|
LVLINIT_SOLIDFILL,
|
|
LVLINIT_MAZEGRID,
|
|
LVLINIT_MAZE,
|
|
LVLINIT_MINES,
|
|
LVLINIT_ROGUE,
|
|
LVLINIT_SWAMP
|
|
};
|
|
|
|
/* max. nested depth of subrooms */
|
|
#define MAX_NESTED_ROOMS 5
|
|
|
|
/* When creating objects, we need to know whether
|
|
* it's a container and/or contents.
|
|
*/
|
|
#define SP_OBJ_CONTENT 0x1
|
|
#define SP_OBJ_CONTAINER 0x2
|
|
|
|
/* SPO_FILTER types */
|
|
#define SPOFILTER_PERCENT 0
|
|
#define SPOFILTER_SELECTION 1
|
|
#define SPOFILTER_MAPCHAR 2
|
|
|
|
/* gradient filter types */
|
|
#define SEL_GRADIENT_RADIAL 0
|
|
#define SEL_GRADIENT_SQUARE 1
|
|
|
|
/* light states for terrain replacements, specifically for SET_TYPLIT
|
|
* (not used for init_level) */
|
|
#define SET_LIT_RANDOM -1
|
|
#define SET_LIT_NOCHANGE -2
|
|
|
|
#define SP_COORD_IS_RANDOM 0x01000000L
|
|
/* Humidity flags for get_location() and friends, used with
|
|
* SP_COORD_PACK_RANDOM() */
|
|
#define DRY 0x01
|
|
#define WET 0x02
|
|
#define HOT 0x04
|
|
#define SOLID 0x08
|
|
#define ANY_LOC 0x10 /* even outside the level */
|
|
#define NO_LOC_WARN 0x20 /* no complaints and set x & y to -1, if no loc */
|
|
#define SPACELOC 0x40 /* like DRY, but accepts furniture too */
|
|
|
|
#define SP_COORD_X(l) (l & 0xff)
|
|
#define SP_COORD_Y(l) ((l >> 16) & 0xff)
|
|
#define SP_COORD_PACK(x, y) (((x) & 0xff) + (((y) & 0xff) << 16))
|
|
#define SP_COORD_PACK_RANDOM(f) (SP_COORD_IS_RANDOM | (f))
|
|
|
|
struct sp_coder {
|
|
int premapped;
|
|
boolean solidify;
|
|
struct mkroom *croom;
|
|
int room_stack;
|
|
struct mkroom *tmproomlist[MAX_NESTED_ROOMS + 1];
|
|
boolean failed_room[MAX_NESTED_ROOMS + 1];
|
|
int n_subroom;
|
|
boolean lvl_is_joined;
|
|
boolean check_inaccessibles;
|
|
int allow_flips;
|
|
};
|
|
|
|
/*
|
|
* Structures manipulated by the special levels loader & compiler
|
|
*/
|
|
|
|
#define packed_coord long
|
|
typedef struct {
|
|
xchar is_random;
|
|
long getloc_flags;
|
|
int x, y;
|
|
} unpacked_coord;
|
|
|
|
typedef struct {
|
|
xchar init_style; /* one of LVLINIT_foo */
|
|
long flags;
|
|
schar filling;
|
|
boolean init_present, padding;
|
|
char fg, bg;
|
|
boolean smoothed, joined;
|
|
xchar lit, walled;
|
|
boolean icedpools;
|
|
int corrwid, wallthick;
|
|
boolean rm_deadends;
|
|
} lev_init;
|
|
|
|
typedef struct {
|
|
xchar wall, pos, secret, mask;
|
|
} room_door;
|
|
|
|
typedef struct {
|
|
packed_coord coord;
|
|
xchar x, y, type;
|
|
boolean spider_on_web;
|
|
boolean seen;
|
|
} spltrap;
|
|
|
|
typedef struct {
|
|
Str_or_Len name, appear_as;
|
|
short id;
|
|
unsigned int sp_amask; /* splev amask */
|
|
packed_coord coord;
|
|
xchar x, y, class, appear;
|
|
schar peaceful, asleep;
|
|
short female, invis, cancelled, revived, avenge, fleeing, blinded,
|
|
paralyzed, stunned, confused, waiting;
|
|
long seentraps;
|
|
short has_invent;
|
|
long mm_flags; /* makemon flags */
|
|
} monster;
|
|
|
|
typedef struct {
|
|
Str_or_Len name;
|
|
int corpsenm;
|
|
short id, spe;
|
|
packed_coord coord;
|
|
xchar x, y, class, containment;
|
|
schar curse_state;
|
|
int quan;
|
|
short buried;
|
|
short lit;
|
|
short eroded, locked, trapped, recharged, invis, greased, broken,
|
|
achievement;
|
|
} object;
|
|
|
|
typedef struct {
|
|
packed_coord coord;
|
|
xchar x, y;
|
|
unsigned int sp_amask; /* splev amask */
|
|
xchar shrine;
|
|
} altar;
|
|
|
|
typedef struct {
|
|
xchar x1, y1, x2, y2;
|
|
xchar rtype, rlit, rirreg;
|
|
} region;
|
|
|
|
typedef struct {
|
|
xchar ter, tlit;
|
|
} terrain;
|
|
|
|
typedef struct {
|
|
struct {
|
|
xchar room;
|
|
xchar wall;
|
|
xchar door;
|
|
} src, dest;
|
|
} corridor;
|
|
|
|
typedef struct _room {
|
|
Str_or_Len name;
|
|
Str_or_Len parent;
|
|
xchar x, y, w, h;
|
|
xchar xalign, yalign;
|
|
xchar rtype, chance, rlit, needfill;
|
|
boolean joined;
|
|
} room;
|
|
|
|
struct mapfragment {
|
|
int wid, hei;
|
|
char *data;
|
|
};
|
|
|
|
#define CAN_OVERWRITE_TERRAIN(ttyp) \
|
|
(iflags.debug_overwrite_stairs || !((ttyp) == LADDER || (ttyp) == STAIRS))
|
|
|
|
#define SET_TYPLIT(x, y, ttyp, llit) \
|
|
do { \
|
|
if ((x) >= 1 && (y) >= 0 && (x) < COLNO && (y) < ROWNO) { \
|
|
if ((ttyp) < MAX_TYPE \
|
|
&& CAN_OVERWRITE_TERRAIN(levl[(x)][(y)].typ)) \
|
|
levl[(x)][(y)].typ = (ttyp); \
|
|
if ((ttyp) == LAVAPOOL) \
|
|
levl[(x)][(y)].lit = 1; \
|
|
else if ((schar)(llit) != SET_LIT_NOCHANGE) { \
|
|
if ((schar)(llit) == SET_LIT_RANDOM) \
|
|
levl[(x)][(y)].lit = rn2(2); \
|
|
else \
|
|
levl[(x)][(y)].lit = (llit); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#endif /* SP_LEV_H */
|