diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 15a03a9be..ad22947fb 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1109,48 +1109,40 @@ void LoadLvlGFX() if (gbIsHellfire) { pDungeonCels = LoadFileInMem("NLevels\\TownData\\Town.CEL"); pMegaTiles = LoadFileInMem("NLevels\\TownData\\Town.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\TownData\\Town.MIN"); } else { pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL"); pMegaTiles = LoadFileInMem("Levels\\TownData\\Town.TIL"); - pLevelPieces = LoadFileInMem("Levels\\TownData\\Town.MIN"); } pSpecialCels = LoadCel("Levels\\TownData\\TownS.CEL", SpecialCelWidth); break; case DTYPE_CATHEDRAL: pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL"); pMegaTiles = LoadFileInMem("Levels\\L1Data\\L1.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L1Data\\L1.MIN"); pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth); break; case DTYPE_CATACOMBS: pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL"); pMegaTiles = LoadFileInMem("Levels\\L2Data\\L2.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L2Data\\L2.MIN"); pSpecialCels = LoadCel("Levels\\L2Data\\L2S.CEL", SpecialCelWidth); break; case DTYPE_CAVES: pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL"); pMegaTiles = LoadFileInMem("Levels\\L3Data\\L3.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L3Data\\L3.MIN"); pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth); break; case DTYPE_HELL: pDungeonCels = LoadFileInMem("Levels\\L4Data\\L4.CEL"); pMegaTiles = LoadFileInMem("Levels\\L4Data\\L4.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L4Data\\L4.MIN"); pSpecialCels = LoadCel("Levels\\L2Data\\L2S.CEL", SpecialCelWidth); break; case DTYPE_NEST: pDungeonCels = LoadFileInMem("NLevels\\L6Data\\L6.CEL"); pMegaTiles = LoadFileInMem("NLevels\\L6Data\\L6.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\L6Data\\L6.MIN"); pSpecialCels = LoadCel("Levels\\L1Data\\L1S.CEL", SpecialCelWidth); break; case DTYPE_CRYPT: pDungeonCels = LoadFileInMem("NLevels\\L5Data\\L5.CEL"); pMegaTiles = LoadFileInMem("NLevels\\L5Data\\L5.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\L5Data\\L5.MIN"); pSpecialCels = LoadCel("NLevels\\L5Data\\L5S.CEL", SpecialCelWidth); break; default: @@ -1711,7 +1703,6 @@ void FreeGameMem() { pDungeonCels = nullptr; pMegaTiles = nullptr; - pLevelPieces = nullptr; pSpecialCels = std::nullopt; FreeMonsters(); @@ -2093,6 +2084,7 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) SetRndSeed(glSeedTbl[currlevel]); IncProgress(); MakeLightTable(); + SetDungeonMicros(); LoadLvlGFX(); IncProgress(); @@ -2302,8 +2294,6 @@ void LoadGameLevel(bool firstflag, lvl_entry lvldir) } } - SetDungeonMicros(); - IncProgress(); IncProgress(); diff --git a/Source/gendung.cpp b/Source/gendung.cpp index 73afa8faa..f418e3950 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -28,7 +28,6 @@ Rectangle SetPiece; std::unique_ptr pSetPiece; std::optional pSpecialCels; std::unique_ptr pMegaTiles; -std::unique_ptr pLevelPieces; std::unique_ptr pDungeonCels; std::array SOLData; Point dminPosition; @@ -44,7 +43,7 @@ int MicroTileLen; char TransVal; bool TransList[256]; int dPiece[MAXDUNX][MAXDUNY]; -MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY]; +MICROS DPieceMicros[MAXTILES + 1]; int8_t dTransVal[MAXDUNX][MAXDUNY]; char dLight[MAXDUNX][MAXDUNY]; char dPreLight[MAXDUNX][MAXDUNY]; @@ -59,6 +58,30 @@ THEME_LOC themeLoc[MAXTHEMES]; namespace { +std::unique_ptr LoadMinData(size_t &tileCount) +{ + switch (leveltype) { + case DTYPE_TOWN: + if (gbIsHellfire) + return LoadFileInMem("NLevels\\TownData\\Town.MIN", &tileCount); + return LoadFileInMem("Levels\\TownData\\Town.MIN", &tileCount); + case DTYPE_CATHEDRAL: + return LoadFileInMem("Levels\\L1Data\\L1.MIN", &tileCount); + case DTYPE_CATACOMBS: + return LoadFileInMem("Levels\\L2Data\\L2.MIN", &tileCount); + case DTYPE_CAVES: + return LoadFileInMem("Levels\\L3Data\\L3.MIN", &tileCount); + case DTYPE_HELL: + return LoadFileInMem("Levels\\L4Data\\L4.MIN", &tileCount); + case DTYPE_NEST: + return LoadFileInMem("NLevels\\L6Data\\L6.MIN", &tileCount); + case DTYPE_CRYPT: + return LoadFileInMem("NLevels\\L5Data\\L5.MIN", &tileCount); + default: + app_fatal("LoadMinData"); + } +} + bool WillThemeRoomFit(int floor, int x, int y, int minSize, int maxSize, int *width, int *height) { bool yFlag = true; @@ -468,19 +491,13 @@ void SetDungeonMicros() blocks = 16; } - for (int y = 0; y < MAXDUNY; y++) { - for (int x = 0; x < MAXDUNX; x++) { - int lv = dPiece[x][y]; - MICROS µs = dpiece_defs_map_2[x][y]; - if (lv != 0) { - lv--; - uint16_t *pieces = &pLevelPieces[blocks * lv]; - for (int i = 0; i < blocks; i++) - micros.mt[i] = SDL_SwapLE16(pieces[blocks - 2 + (i & 1) - (i & 0xE)]); - } else { - for (int i = 0; i < blocks; i++) - micros.mt[i] = 0; - } + size_t tileCount; + std::unique_ptr levelPieces = LoadMinData(tileCount); + + for (int i = 0; i < tileCount / blocks; i++) { + uint16_t *pieces = &levelPieces[blocks * i]; + for (int block = 0; block < blocks; block++) { + DPieceMicros[i + 1].mt[block] = SDL_SwapLE16(pieces[blocks - 2 + (block & 1) - (block & 0xE)]); } } } diff --git a/Source/gendung.h b/Source/gendung.h index c750d4bd7..ada28de0b 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -150,7 +150,6 @@ extern std::unique_ptr pSetPiece; extern std::optional pSpecialCels; /** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */ extern DVL_API_FOR_TEST std::unique_ptr pMegaTiles; -extern std::unique_ptr pLevelPieces; extern std::unique_ptr pDungeonCels; /** * List tile properties @@ -178,8 +177,8 @@ extern char TransVal; extern bool TransList[256]; /** Contains the piece IDs of each tile on the map. */ extern DVL_API_FOR_TEST int dPiece[MAXDUNX][MAXDUNY]; -/** Specifies the dungeon piece information for a given coordinate and block number. */ -extern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY]; +/** Map of micros that comprises a full tile for any given dungeon piece. */ +extern MICROS DPieceMicros[MAXTILES + 1]; /** Specifies the transparency at each coordinate of the map. */ extern DVL_API_FOR_TEST int8_t dTransVal[MAXDUNX][MAXDUNY]; extern char dLight[MAXDUNX][MAXDUNY]; diff --git a/Source/objects.cpp b/Source/objects.cpp index faf786481..804ced551 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1020,16 +1020,6 @@ void AddChest(int i, int t) void ObjSetMicro(Point position, int pn) { dPiece[position.x][position.y] = pn; - pn--; - - int blocks = leveltype != DTYPE_HELL ? 10 : 16; - - uint16_t *piece = &pLevelPieces[blocks * pn]; - MICROS µs = dpiece_defs_map_2[position.x][position.y]; - - for (int i = 0; i < blocks; i++) { - micros.mt[i] = SDL_SwapLE16(piece[blocks - 2 + (i & 1) - (i & 0xE)]); - } } void InitializeL1Door(Object &door) @@ -1614,16 +1604,6 @@ void ObjL2Special(int x1, int y1, int x2, int y2) } } -void SetDoorPiece(Point position) -{ - int pn = dPiece[position.x][position.y] - 1; - - uint16_t *piece = &pLevelPieces[10 * pn + 8]; - - dpiece_defs_map_2[position.x][position.y].mt[0] = SDL_SwapLE16(piece[0]); - dpiece_defs_map_2[position.x][position.y].mt[1] = SDL_SwapLE16(piece[1]); -} - void DoorSet(Point position, bool isLeftDoor) { int pn = dPiece[position.x][position.y]; @@ -1753,7 +1733,6 @@ void OperateL1RDoor(int pnum, int oi, bool sendflag) PlaySfxLoc(IS_DOOROPEN, door.position); ObjSetMicro(door.position, 395); dSpecial[door.position.x][door.position.y] = 8; - SetDoorPiece(door.position + Direction::NorthEast); door._oAnimFrame += 2; door._oPreFlag = true; DoorSet(door.position + Direction::NorthWest, false); @@ -1808,7 +1787,6 @@ void OperateL1LDoor(int pnum, int oi, bool sendflag) else ObjSetMicro(door.position, 393); dSpecial[door.position.x][door.position.y] = 7; - SetDoorPiece(door.position + Direction::NorthWest); door._oAnimFrame += 2; door._oPreFlag = true; DoorSet(door.position + Direction::NorthEast, true); @@ -2028,7 +2006,6 @@ void OperateL5RDoor(int pnum, int oi, bool sendflag) PlaySfxLoc(IS_CROPEN, door.position); ObjSetMicro(door.position, 209); dSpecial[door.position.x][door.position.y] = 2; - SetDoorPiece(door.position + Direction::NorthEast); door._oAnimFrame += 2; door._oPreFlag = true; CryptDoorSet(door.position + Direction::NorthWest, false); @@ -2080,7 +2057,6 @@ void OperateL5LDoor(int pnum, int oi, bool sendflag) PlaySfxLoc(IS_CROPEN, door.position); ObjSetMicro(door.position, 206); dSpecial[door.position.x][door.position.y] = 1; - SetDoorPiece(door.position + Direction::NorthWest); door._oAnimFrame += 2; door._oPreFlag = true; CryptDoorSet(door.position + Direction::NorthEast, true); @@ -4181,12 +4157,10 @@ void SyncL1Doors(Object &door) if (isLeftDoor) { ObjSetMicro(door.position, door._oVar1 == 214 ? 408 : 393); dSpecial[door.position.x][door.position.y] = 7; - SetDoorPiece(door.position + Direction::NorthWest); DoorSet(door.position + Direction::NorthEast, isLeftDoor); } else { ObjSetMicro(door.position, 395); dSpecial[door.position.x][door.position.y] = 8; - SetDoorPiece(door.position + Direction::NorthEast); DoorSet(door.position + Direction::NorthWest, isLeftDoor); } } @@ -4244,12 +4218,10 @@ void SyncL5Doors(Object &door) if (isLeftDoor) { ObjSetMicro(door.position, 206); dSpecial[door.position.x][door.position.y] = 1; - SetDoorPiece(door.position + Direction::NorthWest); CryptDoorSet(door.position + Direction::NorthEast, isLeftDoor); } else { ObjSetMicro(door.position, 209); dSpecial[door.position.x][door.position.y] = 2; - SetDoorPiece(door.position + Direction::NorthEast); CryptDoorSet(door.position + Direction::NorthWest, isLeftDoor); } } @@ -5566,8 +5538,6 @@ void SyncNakrulRoom() dPiece[UberRow][UberCol - 1] = 301; dPiece[UberRow][UberCol - 2] = 300; dPiece[UberRow][UberCol + 1] = 299; - - SetDungeonMicros(); } void AddNakrulLeaver() diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 7dc2a2c57..35f100789 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -654,8 +654,8 @@ static void DrawDungeon(const Surface & /*out*/, Point /*tilePosition*/, Point / */ void DrawCell(const Surface &out, Point tilePosition, Point targetBufferPosition) { - MICROS *pMap = &dpiece_defs_map_2[tilePosition.x][tilePosition.y]; level_piece_id = dPiece[tilePosition.x][tilePosition.y]; + MICROS *pMap = &DPieceMicros[level_piece_id]; cel_transparency_active = TileHasAny(level_piece_id, TileProperties::Transparent) && TransList[dTransVal[tilePosition.x][tilePosition.y]]; cel_foliage_active = !TileHasAny(level_piece_id, TileProperties::Solid); for (int i = 0; i < (MicroTileLen / 2); i++) { @@ -686,12 +686,13 @@ void DrawFloor(const Surface &out, Point tilePosition, Point targetBufferPositio LightTableIndex = dLight[tilePosition.x][tilePosition.y]; arch_draw_type = 1; // Left - level_cel_block = dpiece_defs_map_2[tilePosition.x][tilePosition.y].mt[0]; + int pn = dPiece[tilePosition.x][tilePosition.y]; + level_cel_block = DPieceMicros[pn].mt[0]; if (level_cel_block != 0) { RenderTile(out, targetBufferPosition); } arch_draw_type = 2; // Right - level_cel_block = dpiece_defs_map_2[tilePosition.x][tilePosition.y].mt[1]; + level_cel_block = DPieceMicros[pn].mt[1]; if (level_cel_block != 0) { RenderTile(out, targetBufferPosition + Displacement { TILE_WIDTH / 2, 0 }); } diff --git a/Source/town.cpp b/Source/town.cpp index a5d06490a..38d2ff26b 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -127,7 +127,6 @@ void TownCloseHive() dPiece[86][61] = 0x18; dPiece[85][62] = 0x13; dPiece[84][64] = 0x118; - SetDungeonMicros(); } /** @@ -145,7 +144,6 @@ void TownCloseGrave() dPiece[37][24] = 0x532; dPiece[35][21] = 0x53b; dPiece[34][21] = 0x53c; - SetDungeonMicros(); } void InitTownPieces() @@ -303,7 +301,6 @@ void TownOpenHive() dPiece[86][61] = 0x18; dPiece[85][62] = 0x13; dPiece[84][64] = 0x118; - SetDungeonMicros(); } void TownOpenGrave() @@ -318,7 +315,6 @@ void TownOpenGrave() dPiece[37][24] = 0x53a; dPiece[35][21] = 0x53b; dPiece[34][21] = 0x53c; - SetDungeonMicros(); } void CreateTown(lvl_entry entry)