/** * @file gendung.h * * Interface of general dungeon generation code. */ #pragma once #include #include #include "engine.h" #include "engine/cel_sprite.hpp" #include "engine/point.hpp" #include "scrollrt.h" #include "utils/stdcompat/optional.hpp" namespace devilution { #define DMAXX 40 #define DMAXY 40 #define MAXDUNX (16 + DMAXX * 2 + 16) #define MAXDUNY (16 + DMAXY * 2 + 16) #define MAXTHEMES 50 #define MAXTILES 2048 enum _setlevels : int8_t { SL_NONE, SL_SKELKING, SL_BONECHAMB, SL_MAZE, SL_POISONWATER, SL_VILEBETRAYER, }; enum dungeon_type : int8_t { DTYPE_TOWN, DTYPE_CATHEDRAL, DTYPE_CATACOMBS, DTYPE_CAVES, DTYPE_HELL, DTYPE_NEST, DTYPE_CRYPT, DTYPE_NONE = -1, }; enum lvl_entry : uint8_t { ENTRY_MAIN, ENTRY_PREV, ENTRY_SETLVL, ENTRY_RTNLVL, ENTRY_LOAD, ENTRY_WARPLVL, ENTRY_TWARPDN, ENTRY_TWARPUP, }; enum { // clang-format off DLRG_HDOOR = 1 << 0, DLRG_VDOOR = 1 << 1, DLRG_CHAMBER = 1 << 6, DLRG_PROTECTED = 1 << 7, // clang-format on }; enum { // clang-format off BFLAG_MISSILE = 1 << 0, BFLAG_VISIBLE = 1 << 1, BFLAG_DEAD_PLAYER = 1 << 2, BFLAG_POPULATED = 1 << 3, BFLAG_MONSTLR = 1 << 4, BFLAG_PLAYERLR = 1 << 5, BFLAG_LIT = 1 << 6, BFLAG_EXPLORED = 1 << 7, // clang-format on }; enum _difficulty : uint8_t { DIFF_NORMAL, DIFF_NIGHTMARE, DIFF_HELL, }; struct ScrollStruct { /** @brief Tile offset of camera. */ Point tile; /** @brief Pixel offset of camera. */ Displacement offset; /** @brief Move direction of camera. */ _scroll_direction _sdir; }; struct THEME_LOC { int16_t x; int16_t y; int16_t ttval; int16_t width; int16_t height; }; struct MegaTile { uint16_t micro1; uint16_t micro2; uint16_t micro3; uint16_t micro4; }; struct MICROS { uint16_t mt[16]; }; struct ShadowStruct { uint8_t strig; uint8_t s1; uint8_t s2; uint8_t s3; uint8_t nv1; uint8_t nv2; uint8_t nv3; }; extern uint8_t dungeon[DMAXX][DMAXY]; extern uint8_t pdungeon[DMAXX][DMAXY]; extern char dflags[DMAXX][DMAXY]; extern int setpc_x; extern int setpc_y; extern int setpc_w; extern int setpc_h; extern std::unique_ptr pSetPiece; extern bool setloadflag; extern std::optional pSpecialCels; extern std::unique_ptr pMegaTiles; extern std::unique_ptr pLevelPieces; extern std::unique_ptr pDungeonCels; /** * List of transparancy masks to use for dPieces */ extern std::array block_lvid; /** * List of light blocking dPieces */ extern std::array nBlockTable; /** * List of path blocking dPieces */ extern std::array nSolidTable; /** * List of transparent dPieces */ extern std::array nTransTable; /** * List of missile blocking dPieces */ extern std::array nMissileTable; extern std::array nTrapTable; extern int dminx; extern int dminy; extern int dmaxx; extern int dmaxy; extern dungeon_type leveltype; extern BYTE currlevel; extern bool setlevel; extern _setlevels setlvlnum; extern dungeon_type setlvltype; extern int ViewX; extern int ViewY; extern int ViewBX; extern int ViewBY; extern int ViewDX; extern int ViewDY; extern ScrollStruct ScrollInfo; extern int LvlViewX; extern int LvlViewY; extern int MicroTileLen; extern char TransVal; extern bool TransList[256]; extern int dPiece[MAXDUNX][MAXDUNY]; extern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY]; extern int8_t dTransVal[MAXDUNX][MAXDUNY]; extern char dLight[MAXDUNX][MAXDUNY]; extern char dPreLight[MAXDUNX][MAXDUNY]; extern int8_t dFlags[MAXDUNX][MAXDUNY]; extern int8_t dPlayer[MAXDUNX][MAXDUNY]; extern int16_t dMonster[MAXDUNX][MAXDUNY]; extern int8_t dDead[MAXDUNX][MAXDUNY]; extern char dObject[MAXDUNX][MAXDUNY]; extern int8_t dItem[MAXDUNX][MAXDUNY]; extern char dMissile[MAXDUNX][MAXDUNY]; extern char dSpecial[MAXDUNX][MAXDUNY]; extern int themeCount; extern THEME_LOC themeLoc[MAXTHEMES]; void FillSolidBlockTbls(); void SetDungeonMicros(); void DRLG_InitTrans(); void DRLG_MRectTrans(int x1, int y1, int x2, int y2); void DRLG_RectTrans(int x1, int y1, int x2, int y2); void DRLG_CopyTrans(int sx, int sy, int dx, int dy); void DRLG_ListTrans(int num, BYTE *List); void DRLG_AreaTrans(int num, BYTE *List); void DRLG_InitSetPC(); void DRLG_SetPC(); void Make_SetPC(int x, int y, int w, int h); void DRLG_PlaceThemeRooms(int minSize, int maxSize, int floor, int freq, bool rndSize); void DRLG_HoldThemeRooms(); bool SkipThemeRoom(int x, int y); void InitLevels(); } // namespace devilution