From fa0b286693cf300c16138a72b02ea0a2aaaf0190 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Mon, 3 May 2021 18:36:13 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FTyped=20file=20loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tthis gives us the option to specify what type a file should be loaded as, avoidng the need to case it and does some automatic checks on the fitness of the data, while making the process simpler. If no type is given then the type will be set to std::byte which limit what operations can be performed on the data. --- Source/DiabloUI/fonts.cpp | 10 +- Source/DiabloUI/fonts.h | 2 +- Source/DiabloUI/text.cpp | 7 +- Source/DiabloUI/text_draw.cpp | 2 +- Source/automap.cpp | 27 ++--- Source/diablo.cpp | 48 ++++---- Source/drlg_l1.cpp | 159 +++++++++++++------------- Source/drlg_l1.h | 2 +- Source/drlg_l2.cpp | 72 ++++++------ Source/drlg_l3.cpp | 89 +++++++-------- Source/drlg_l4.cpp | 136 +++++++--------------- Source/engine.cpp | 30 +++-- Source/engine.h | 42 ++++++- Source/gendung.cpp | 100 ++++++---------- Source/gendung.h | 42 +++++-- Source/lighting.cpp | 4 +- Source/missiles.cpp | 6 +- Source/monster.cpp | 81 +++++++------ Source/monster.h | 2 +- Source/objects.cpp | 207 +++++++++++++++------------------- Source/objects.h | 2 +- Source/palette.cpp | 24 ++-- Source/quests.cpp | 165 ++++++++++++--------------- Source/setmaps.cpp | 38 +++---- Source/town.cpp | 103 +++++++---------- Source/towners.cpp | 66 +++++------ Source/towners.h | 2 +- 27 files changed, 670 insertions(+), 798 deletions(-) diff --git a/Source/DiabloUI/fonts.cpp b/Source/DiabloUI/fonts.cpp index d00d5011f..acc48f567 100644 --- a/Source/DiabloUI/fonts.cpp +++ b/Source/DiabloUI/fonts.cpp @@ -8,7 +8,7 @@ namespace devilution { TTF_Font *font = nullptr; -std::unique_ptr FontTables[4]; +std::unique_ptr FontTables[4]; Art ArtFonts[4][2]; /** This is so we know ttf has been init when we get to the diablo_deinit() function */ bool was_fonts_init = false; @@ -24,10 +24,10 @@ void LoadArtFont(const char *pszFile, int size, int color) void LoadArtFonts() { - FontTables[AFT_SMALL] = LoadFileInMem("ui_art\\font16.bin"); - FontTables[AFT_MED] = LoadFileInMem("ui_art\\font24.bin"); - FontTables[AFT_BIG] = LoadFileInMem("ui_art\\font30.bin"); - FontTables[AFT_HUGE] = LoadFileInMem("ui_art\\font42.bin"); + FontTables[AFT_SMALL] = LoadFileInMem("ui_art\\font16.bin"); + FontTables[AFT_MED] = LoadFileInMem("ui_art\\font24.bin"); + FontTables[AFT_BIG] = LoadFileInMem("ui_art\\font30.bin"); + FontTables[AFT_HUGE] = LoadFileInMem("ui_art\\font42.bin"); LoadArtFont("ui_art\\font16s.pcx", AFT_SMALL, AFC_SILVER); LoadArtFont("ui_art\\font16g.pcx", AFT_SMALL, AFC_GOLD); LoadArtFont("ui_art\\font24s.pcx", AFT_MED, AFC_SILVER); diff --git a/Source/DiabloUI/fonts.h b/Source/DiabloUI/fonts.h index e3efc4050..ae6d4e82a 100644 --- a/Source/DiabloUI/fonts.h +++ b/Source/DiabloUI/fonts.h @@ -22,7 +22,7 @@ enum _artFontColors : uint8_t { }; extern TTF_Font *font; -extern std::unique_ptr FontTables[4]; +extern std::unique_ptr FontTables[4]; extern Art ArtFonts[4][2]; void LoadArtFonts(); diff --git a/Source/DiabloUI/text.cpp b/Source/DiabloUI/text.cpp index b79f4bcd7..52e343212 100644 --- a/Source/DiabloUI/text.cpp +++ b/Source/DiabloUI/text.cpp @@ -7,11 +7,8 @@ std::size_t GetArtStrWidth(const char *str, std::size_t size) int strWidth = 0; for (size_t i = 0, n = strlen(str); i < n; i++) { - BYTE w = FontTables[size][*(BYTE *)&str[i] + 2]; - if (w != 0) - strWidth += w; - else - strWidth += FontTables[size][0]; + uint8_t w = FontTables[size][*(BYTE *)&str[i] + 2]; + strWidth += (w != 0) ? w : FontTables[size][0]; } return strWidth; diff --git a/Source/DiabloUI/text_draw.cpp b/Source/DiabloUI/text_draw.cpp index f3b45022a..09ff1a946 100644 --- a/Source/DiabloUI/text_draw.cpp +++ b/Source/DiabloUI/text_draw.cpp @@ -89,7 +89,7 @@ void DrawArtStr(const char *text, const SDL_Rect &rect, int flags, bool drawText sy += ArtFonts[size][color].h(); continue; } - BYTE w = FontTables[size][*(BYTE *)&text[i] + 2] != 0 ? FontTables[size][*(BYTE *)&text[i] + 2] : FontTables[size][0]; + uint8_t w = FontTables[size][*(BYTE *)&text[i] + 2] != 0 ? FontTables[size][*(BYTE *)&text[i] + 2] : FontTables[size][0]; DrawArt(sx, sy, &ArtFonts[size][color], *(BYTE *)&text[i], w); sx += w; } diff --git a/Source/automap.cpp b/Source/automap.cpp index d29d7d051..6938a22ad 100644 --- a/Source/automap.cpp +++ b/Source/automap.cpp @@ -124,7 +124,7 @@ void DrawAutomapTile(const CelOutputBuffer &out, Point center, uint16_t automapT switch (automapType & MapFlagsType) { case 1: // stand-alone column or other unpassable object DrawSquare(out, { center.x, center.y - AmLine8 }, MapColorsDim); - break; + break; case 2: case 5: drawVertical = true; @@ -415,21 +415,21 @@ void DrawAutomapText(const CelOutputBuffer &out) } } -std::unique_ptr LoadAutomapData(uint32_t &dwTiles) +std::unique_ptr LoadAutomapData(size_t &tileCount) { switch (leveltype) { case DTYPE_CATHEDRAL: if (currlevel < 21) - return LoadFileInMem("Levels\\L1Data\\L1.AMP", &dwTiles); - return LoadFileInMem("NLevels\\L5Data\\L5.AMP", &dwTiles); + return LoadFileInMem("Levels\\L1Data\\L1.AMP", &tileCount); + return LoadFileInMem("NLevels\\L5Data\\L5.AMP", &tileCount); case DTYPE_CATACOMBS: - return LoadFileInMem("Levels\\L2Data\\L2.AMP", &dwTiles); + return LoadFileInMem("Levels\\L2Data\\L2.AMP", &tileCount); case DTYPE_CAVES: if (currlevel < 17) - return LoadFileInMem("Levels\\L3Data\\L3.AMP", &dwTiles); - return LoadFileInMem("NLevels\\L6Data\\L6.AMP", &dwTiles); + return LoadFileInMem("Levels\\L3Data\\L3.AMP", &tileCount); + return LoadFileInMem("NLevels\\L6Data\\L6.AMP", &tileCount); case DTYPE_HELL: - return LoadFileInMem("Levels\\L4Data\\L4.AMP", &dwTiles); + return LoadFileInMem("Levels\\L4Data\\L4.AMP", &tileCount); default: return nullptr; } @@ -460,17 +460,12 @@ void InitAutomapOnce() void InitAutomap() { - uint32_t tileCount = 0; - std::unique_ptr pAFile = LoadAutomapData(tileCount); - - tileCount /= 2; - auto tileTypes = reinterpret_cast(pAFile.get()); - + size_t tileCount = 0; + std::unique_ptr tileTypes = LoadAutomapData(tileCount); for (unsigned i = 0; i < tileCount; i++) { AutomapTypes[i + 1] = tileTypes[i]; } - - pAFile = nullptr; + tileTypes = nullptr; memset(AutomapView, 0, sizeof(AutomapView)); diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 87ff0cb98..d7f86d699 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -1503,51 +1503,51 @@ void LoadLvlGFX() switch (leveltype) { case DTYPE_TOWN: if (gbIsHellfire) { - pDungeonCels = LoadFileInMem("NLevels\\TownData\\Town.CEL"); - pMegaTiles = LoadFileInMem("NLevels\\TownData\\Town.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\TownData\\Town.MIN"); + 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"); + 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: if (currlevel < 21) { - pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL"); - pMegaTiles = LoadFileInMem("Levels\\L1Data\\L1.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L1Data\\L1.MIN"); + 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); } else { - pDungeonCels = LoadFileInMem("NLevels\\L5Data\\L5.CEL"); - pMegaTiles = LoadFileInMem("NLevels\\L5Data\\L5.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\L5Data\\L5.MIN"); + 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; case DTYPE_CATACOMBS: - pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL"); - pMegaTiles = LoadFileInMem("Levels\\L2Data\\L2.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L2Data\\L2.MIN"); + 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: if (currlevel < 17) { - pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL"); - pMegaTiles = LoadFileInMem("Levels\\L3Data\\L3.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L3Data\\L3.MIN"); + pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL"); + pMegaTiles = LoadFileInMem("Levels\\L3Data\\L3.TIL"); + pLevelPieces = LoadFileInMem("Levels\\L3Data\\L3.MIN"); } else { - pDungeonCels = LoadFileInMem("NLevels\\L6Data\\L6.CEL"); - pMegaTiles = LoadFileInMem("NLevels\\L6Data\\L6.TIL"); - pLevelPieces = LoadFileInMem("NLevels\\L6Data\\L6.MIN"); + 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_HELL: - pDungeonCels = LoadFileInMem("Levels\\L4Data\\L4.CEL"); - pMegaTiles = LoadFileInMem("Levels\\L4Data\\L4.TIL"); - pLevelPieces = LoadFileInMem("Levels\\L4Data\\L4.MIN"); + 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; default: diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index cabe2ed1f..90cd7113b 100644 --- a/Source/drlg_l1.cpp +++ b/Source/drlg_l1.cpp @@ -5,6 +5,7 @@ */ #include "drlg_l1.h" +#include "gendung.h" #include "lighting.h" #include "player.h" #include "quests.h" @@ -40,7 +41,7 @@ bool VR2; /** Specifies whether to generate a vertical room at position 3 in the Cathedral. */ bool VR3; /** Contains the contents of the single player quest DUN file. */ -std::unique_ptr L5pSetPiece; +std::unique_ptr L5pSetPiece; /** Contains shadows for 2x2 blocks of base tile IDs in the Cathedral. */ const ShadowStruct SPATS[37] = { @@ -1069,17 +1070,17 @@ static void DRLG_L1Floor() void DRLG_LPass3(int lv) { - auto *MegaTiles = (uint16_t *)&pMegaTiles[lv * 8]; - int v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1; - int v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1; - int v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1; - int v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1; + MegaTile mega = pMegaTiles[lv]; + int v1 = SDL_SwapLE16(mega.micro1) + 1; + int v2 = SDL_SwapLE16(mega.micro2) + 1; + int v3 = SDL_SwapLE16(mega.micro3) + 1; + int v4 = SDL_SwapLE16(mega.micro4) + 1; for (int j = 0; j < MAXDUNY; j += 2) { for (int i = 0; i < MAXDUNX; i += 2) { - dPiece[i][j] = v1; - dPiece[i + 1][j] = v2; - dPiece[i][j + 1] = v3; + dPiece[i + 0][j + 0] = v1; + dPiece[i + 1][j + 0] = v2; + dPiece[i + 0][j + 1] = v3; dPiece[i + 1][j + 1] = v4; } } @@ -1088,22 +1089,22 @@ void DRLG_LPass3(int lv) for (int j = 0; j < DMAXY; j++) { int xx = 16; for (int i = 0; i < DMAXX; i++) { - lv = dungeon[i][j] - 1; - if (lv >= 0) { - MegaTiles = (uint16_t *)&pMegaTiles[lv * 8]; - v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1; - v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1; - v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1; - v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1; - } else { - v1 = 0; - v2 = 0; - v3 = 0; - v4 = 0; + v1 = 0; + v2 = 0; + v3 = 0; + v4 = 0; + + int tileId = dungeon[i][j] - 1; + if (tileId >= 0) { + MegaTile mega = pMegaTiles[tileId]; + v1 = SDL_SwapLE16(mega.micro1) + 1; + v2 = SDL_SwapLE16(mega.micro2) + 1; + v3 = SDL_SwapLE16(mega.micro3) + 1; + v4 = SDL_SwapLE16(mega.micro4) + 1; } - dPiece[xx][yy] = v1; - dPiece[xx + 1][yy] = v2; - dPiece[xx][yy + 1] = v3; + dPiece[xx + 0][yy + 0] = v1; + dPiece[xx + 1][yy + 0] = v2; + dPiece[xx + 0][yy + 1] = v3; dPiece[xx + 1][yy + 1] = v4; xx += 2; } @@ -1120,15 +1121,15 @@ static void DRLG_LoadL1SP() { L5setloadflag = false; if (QuestStatus(Q_BUTCHER)) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\rnd6.DUN"); + L5pSetPiece = LoadFileInMem("Levels\\L1Data\\rnd6.DUN"); L5setloadflag = true; } if (QuestStatus(Q_SKELKING) && !gbIsMultiplayer) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\SKngDO.DUN"); + L5pSetPiece = LoadFileInMem("Levels\\L1Data\\SKngDO.DUN"); L5setloadflag = true; } if (QuestStatus(Q_LTBANNER)) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\Banner2.DUN"); + L5pSetPiece = LoadFileInMem("Levels\\L1Data\\Banner2.DUN"); L5setloadflag = true; } } @@ -1207,96 +1208,95 @@ static void DRLG_InitL1Vals() } } -void LoadL1Dungeon(const char *sFileName, int vx, int vy) +void LoadL1Dungeon(const char *path, int vx, int vy) { - int i, j, rw, rh; - BYTE *lm; - dminx = 16; dminy = 16; dmaxx = 96; dmaxy = 96; DRLG_InitTrans(); - auto pLevelMap = LoadFileInMem(sFileName); - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { + for (int j = 0; j < DMAXY; j++) { + for (int i = 0; i < DMAXX; i++) { dungeon[i][j] = 22; L5dflags[i][j] = 0; } } - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; + auto dunData = LoadFileInMem(path); - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(*tileLayer); + tileLayer++; + if (tileId != 0) { + dungeon[i][j] = tileId; L5dflags[i][j] |= DLRG_PROTECTED; } else { dungeon[i][j] = 13; } - lm += 2; } } DRLG_L1Floor(); + ViewX = vx; ViewY = vy; + DRLG_L1Pass3(); DRLG_Init_Globals(); + if (currlevel < 17) DRLG_InitL1Vals(); - SetMapMonsters(pLevelMap.get(), 0, 0); - SetMapObjects(pLevelMap.get(), 0, 0); + + SetMapMonsters(dunData.get(), 0, 0); + SetMapObjects(dunData.get(), 0, 0); } -void LoadPreL1Dungeon(const char *sFileName) +void LoadPreL1Dungeon(const char *path) { - int i, j, rw, rh; - BYTE *lm; + for (int j = 0; j < DMAXY; j++) { + for (int i = 0; i < DMAXX; i++) { + dungeon[i][j] = 22; + L5dflags[i][j] = 0; + } + } dminx = 16; dminy = 16; dmaxx = 96; dmaxy = 96; - auto pLevelMap = LoadFileInMem(sFileName); + auto dunData = LoadFileInMem(path); - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { - dungeon[i][j] = 22; - L5dflags[i][j] = 0; - } - } + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; + const uint16_t *tileLayer = &dunData[2]; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(*tileLayer); + tileLayer++; + if (tileId != 0) { + dungeon[i][j] = tileId; L5dflags[i][j] |= DLRG_PROTECTED; } else { dungeon[i][j] = 13; } - lm += 2; } } DRLG_L1Floor(); - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { + for (int j = 0; j < DMAXY; j++) { + for (int i = 0; i < DMAXX; i++) { pdungeon[i][j] = dungeon[i][j]; } } @@ -2038,28 +2038,25 @@ static void DRLG_L5Subs() static void DRLG_L5SetRoom(int rx1, int ry1) { - int rw, rh, i, j; - BYTE *sp; - - rw = L5pSetPiece[0]; - rh = L5pSetPiece[2]; + int width = SDL_SwapLE16(L5pSetPiece[0]); + int height = SDL_SwapLE16(L5pSetPiece[1]); setpc_x = rx1; setpc_y = ry1; - setpc_w = rw; - setpc_h = rh; + setpc_w = width; + setpc_h = height; - sp = &L5pSetPiece[4]; + uint16_t *tileLayer = &L5pSetPiece[2]; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp) { - dungeon[rx1 + i][ry1 + j] = *sp; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + dungeon[rx1 + i][ry1 + j] = tileId; L5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED; } else { dungeon[rx1 + i][ry1 + j] = 13; } - sp += 2; } } } diff --git a/Source/drlg_l1.h b/Source/drlg_l1.h index 60852dad3..e72800015 100644 --- a/Source/drlg_l1.h +++ b/Source/drlg_l1.h @@ -21,7 +21,7 @@ extern int UberDiabloMonsterIndex; void DRLG_LPass3(int lv); void DRLG_Init_Globals(); -void LoadL1Dungeon(const char *sFileName, int vx, int vy); +void LoadL1Dungeon(const char *path, int vx, int vy); void LoadPreL1Dungeon(const char *sFileName); void CreateL5Dungeon(uint32_t rseed, lvl_entry entry); void drlg_l1_set_crypt_room(int rx1, int ry1); diff --git a/Source/drlg_l2.cpp b/Source/drlg_l2.cpp index 721ca88a1..ca15df234 100644 --- a/Source/drlg_l2.cpp +++ b/Source/drlg_l2.cpp @@ -1843,15 +1843,15 @@ static void DRLG_LoadL2SP() setloadflag = false; if (QuestStatus(Q_BLIND)) { - pSetPiece = LoadFileInMem("Levels\\L2Data\\Blind1.DUN"); - pSetPiece[26] = 154; // Close outer wall - pSetPiece[200] = 154; // Close outer wall + pSetPiece = LoadFileInMem("Levels\\L2Data\\Blind1.DUN"); + pSetPiece[13] = SDL_SwapLE16(154); // Close outer wall + pSetPiece[100] = SDL_SwapLE16(154); // Close outer wall setloadflag = true; } else if (QuestStatus(Q_BLOOD)) { - pSetPiece = LoadFileInMem("Levels\\L2Data\\Blood1.DUN"); + pSetPiece = LoadFileInMem("Levels\\L2Data\\Blood1.DUN"); setloadflag = true; } else if (QuestStatus(Q_SCHAMB)) { - pSetPiece = LoadFileInMem("Levels\\L2Data\\Bonestr2.DUN"); + pSetPiece = LoadFileInMem("Levels\\L2Data\\Bonestr2.DUN"); setloadflag = true; } } @@ -1863,28 +1863,25 @@ static void DRLG_FreeL2SP() static void DRLG_L2SetRoom(int rx1, int ry1) { - int rw, rh, i, j; - BYTE *sp; - - rw = pSetPiece[0]; - rh = pSetPiece[2]; + int width = SDL_SwapLE16(pSetPiece[0]); + int height = SDL_SwapLE16(pSetPiece[1]); setpc_x = rx1; setpc_y = ry1; - setpc_w = rw; - setpc_h = rh; + setpc_w = width; + setpc_h = height; - sp = &pSetPiece[4]; + uint16_t *tileLayer = &pSetPiece[2]; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[i + rx1][j + ry1] = *sp; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + dungeon[i + rx1][j + ry1] = tileId; dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; } else { dungeon[i + rx1][j + ry1] = 3; } - sp += 2; } } } @@ -3227,7 +3224,7 @@ static void DRLG_InitL2Vals() } } -static void LoadL2DungeonData(BYTE *pLevelMap) +static void LoadL2DungeonData(const uint16_t *dunData) { InitDungeon(); DRLG_InitTrans(); @@ -3239,21 +3236,21 @@ static void LoadL2DungeonData(BYTE *pLevelMap) } } - BYTE *lm = pLevelMap; - int rw = *lm; - lm += 2; - int rh = *lm; - lm += 2; + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + const uint16_t *tileLayer = &dunData[2]; - for (int j = 0; j < rh; j++) { - for (int i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(*tileLayer); + tileLayer++; + if (tileId != 0) { + dungeon[i][j] = tileId; dflags[i][j] |= DLRG_PROTECTED; } else { dungeon[i][j] = 3; } - lm += 2; } } @@ -3266,11 +3263,11 @@ static void LoadL2DungeonData(BYTE *pLevelMap) } } -void LoadL2Dungeon(const char *sFileName, int vx, int vy) +void LoadL2Dungeon(const char *path, int vx, int vy) { - auto pLevelMap = LoadFileInMem(sFileName); + auto dunData = LoadFileInMem(path); - LoadL2DungeonData(pLevelMap.get()); + LoadL2DungeonData(dunData.get()); DRLG_L2Pass3(); DRLG_Init_Globals(); @@ -3310,15 +3307,16 @@ void LoadL2Dungeon(const char *sFileName, int vx, int vy) ViewX = vx; ViewY = vy; - SetMapMonsters(pLevelMap.get(), 0, 0); - SetMapObjects(pLevelMap.get(), 0, 0); + + SetMapMonsters(dunData.get(), 0, 0); + SetMapObjects(dunData.get(), 0, 0); } -void LoadPreL2Dungeon(const char *sFileName) +void LoadPreL2Dungeon(const char *path) { { - auto pLevelMap = LoadFileInMem(sFileName); - LoadL2DungeonData(pLevelMap.get()); + auto dunData = LoadFileInMem(path); + LoadL2DungeonData(dunData.get()); } for (int j = 0; j < DMAXY; j++) { diff --git a/Source/drlg_l3.cpp b/Source/drlg_l3.cpp index d653523fa..2e1ffcddb 100644 --- a/Source/drlg_l3.cpp +++ b/Source/drlg_l3.cpp @@ -2619,37 +2619,32 @@ void CreateL3Dungeon(uint32_t rseed, lvl_entry entry) DRLG_SetPC(); } -void LoadL3Dungeon(const char *sFileName, int vx, int vy) +void LoadL3Dungeon(const char *path, int vx, int vy) { - int i, j, rw, rh; - BYTE *lm; - - InitL3Dungeon(); dminx = 16; dminy = 16; dmaxx = 96; dmaxy = 96; + + InitL3Dungeon(); DRLG_InitTrans(); - auto pLevelMap = LoadFileInMem(sFileName); - - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; - } else { - dungeon[i][j] = 7; - } - lm += 2; + + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + dungeon[i][j] = (tileId != 0) ? tileId : 7; } } - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { + + for (int j = 0; j < DMAXY; j++) { + for (int i = 0; i < DMAXX; i++) { if (dungeon[i][j] == 0) { dungeon[i][j] = 8; } @@ -2658,13 +2653,15 @@ void LoadL3Dungeon(const char *sFileName, int vx, int vy) DRLG_L3Pass3(); DRLG_Init_Globals(); + ViewX = vx; ViewY = vy; - SetMapMonsters(pLevelMap.get(), 0, 0); - SetMapObjects(pLevelMap.get(), 0, 0); - for (j = 0; j < MAXDUNY; j++) { - for (i = 0; i < MAXDUNX; i++) { + SetMapMonsters(dunData.get(), 0, 0); + SetMapObjects(dunData.get(), 0, 0); + + for (int j = 0; j < MAXDUNY; j++) { + for (int i = 0; i < MAXDUNX; i++) { if (dPiece[i][j] >= 56 && dPiece[i][j] <= 147) { DoLighting(i, j, 7, -1); } else if (dPiece[i][j] >= 154 && dPiece[i][j] <= 161) { @@ -2678,33 +2675,27 @@ void LoadL3Dungeon(const char *sFileName, int vx, int vy) } } -void LoadPreL3Dungeon(const char *sFileName) +void LoadPreL3Dungeon(const char *path) { - int i, j, rw, rh; - BYTE *lm; - InitL3Dungeon(); DRLG_InitTrans(); - auto pLevelMap = LoadFileInMem(sFileName); - - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; - } else { - dungeon[i][j] = 7; - } - lm += 2; + + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + dungeon[i][j] = (tileId != 0) ? tileId : 7; } } - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { + + for (int j = 0; j < DMAXY; j++) { + for (int i = 0; i < DMAXX; i++) { if (dungeon[i][j] == 0) { dungeon[i][j] = 8; } diff --git a/Source/drlg_l4.cpp b/Source/drlg_l4.cpp index 65c53f48e..7d2d8b42c 100644 --- a/Source/drlg_l4.cpp +++ b/Source/drlg_l4.cpp @@ -202,11 +202,11 @@ void DRLG_LoadL4SP() { setloadflag = false; if (QuestStatus(Q_WARLORD)) { - pSetPiece = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); + pSetPiece = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); setloadflag = true; } if (currlevel == 15 && gbIsMultiplayer) { - pSetPiece = LoadFileInMem("Levels\\L4Data\\Vile1.DUN"); + pSetPiece = LoadFileInMem("Levels\\L4Data\\Vile1.DUN"); setloadflag = true; } } @@ -216,34 +216,36 @@ void DRLG_FreeL4SP() pSetPiece = nullptr; } -void DRLG_L4SetSPRoom(int rx1, int ry1) +void DRLG_L4SetRoom(const uint16_t *dunData, int rx1, int ry1) { - int rw, rh, i, j; - BYTE *sp; - - rw = pSetPiece[0]; - rh = pSetPiece[2]; - - setpc_x = rx1; - setpc_y = ry1; - setpc_w = rw; - setpc_h = rh; + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); - sp = &pSetPiece[4]; + const uint16_t *tileLayer = &dunData[2]; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[i + rx1][j + ry1] = *sp; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + dungeon[i + rx1][j + ry1] = tileId; dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; } else { dungeon[i + rx1][j + ry1] = 6; } - sp += 2; } } } +void DRLG_L4SetSPRoom(int rx1, int ry1) +{ + setpc_x = rx1; + setpc_y = ry1; + setpc_w = SDL_SwapLE16(pSetPiece[0]); + setpc_h = SDL_SwapLE16(pSetPiece[1]); + + DRLG_L4SetRoom(pSetPiece.get(), rx1, ry1); +} + static void L4makeDmt() { int i, j, idx, val, dmtx, dmty; @@ -1252,53 +1254,31 @@ void L4SaveQuads() } } -void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1) -{ - int rw, rh, i, j; - BYTE *sp; - - rw = pSetPiece[0]; - rh = pSetPiece[2]; - sp = &pSetPiece[4]; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[i + rx1][j + ry1] = *sp; - dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; - } else { - dungeon[i + rx1][j + ry1] = 6; - } - sp += 2; - } - } -} - void DRLG_LoadDiabQuads(bool preflag) { { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN"); + auto dunData = LoadFileInMem("Levels\\L4Data\\diab1.DUN"); diabquad1x = 4 + l4holdx; diabquad1y = 4 + l4holdy; - DRLG_L4SetRoom(lpSetPiece.get(), diabquad1x, diabquad1y); + DRLG_L4SetRoom(dunData.get(), diabquad1x, diabquad1y); } { - auto lpSetPiece = LoadFileInMem(preflag ? "Levels\\L4Data\\diab2b.DUN" : "Levels\\L4Data\\diab2a.DUN"); + auto dunData = LoadFileInMem(preflag ? "Levels\\L4Data\\diab2b.DUN" : "Levels\\L4Data\\diab2a.DUN"); diabquad2x = 27 - l4holdx; diabquad2y = 1 + l4holdy; - DRLG_L4SetRoom(lpSetPiece.get(), diabquad2x, diabquad2y); + DRLG_L4SetRoom(dunData.get(), diabquad2x, diabquad2y); } { - auto lpSetPiece = LoadFileInMem(preflag ? "Levels\\L4Data\\diab3b.DUN" : "Levels\\L4Data\\diab3a.DUN"); + auto dunData = LoadFileInMem(preflag ? "Levels\\L4Data\\diab3b.DUN" : "Levels\\L4Data\\diab3a.DUN"); diabquad3x = 1 + l4holdx; diabquad3y = 27 - l4holdy; - DRLG_L4SetRoom(lpSetPiece.get(), diabquad3x, diabquad3y); + DRLG_L4SetRoom(dunData.get(), diabquad3x, diabquad3y); } { - auto lpSetPiece = LoadFileInMem(preflag ? "Levels\\L4Data\\diab4b.DUN" : "Levels\\L4Data\\diab4a.DUN"); + auto dunData = LoadFileInMem(preflag ? "Levels\\L4Data\\diab4b.DUN" : "Levels\\L4Data\\diab4a.DUN"); diabquad4x = 28 - l4holdx; diabquad4y = 28 - l4holdy; - DRLG_L4SetRoom(lpSetPiece.get(), diabquad4x, diabquad4y); + DRLG_L4SetRoom(dunData.get(), diabquad4x, diabquad4y); } } @@ -1758,11 +1738,8 @@ void CreateL4Dungeon(uint32_t rseed, lvl_entry entry) DRLG_SetPC(); } -void LoadL4Dungeon(char *sFileName, int vx, int vy) +void LoadL4Dungeon(const char *path, int vx, int vy) { - int i, j, rw, rh; - BYTE *lm; - dminx = 16; dminy = 16; dmaxx = 96; @@ -1770,40 +1747,23 @@ void LoadL4Dungeon(char *sFileName, int vx, int vy) DRLG_InitTrans(); InitL4Dungeon(); - auto pLevelMap = LoadFileInMem(sFileName); - - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; - dflags[i][j] |= 0x80; - } else { - dungeon[i][j] = 6; - } - lm += 2; - } - } + + auto dunData = LoadFileInMem(path); + + DRLG_L4SetRoom(dunData.get(), 0, 0); ViewX = vx; ViewY = vy; + DRLG_L4Pass3(); DRLG_Init_Globals(); - SetMapMonsters(pLevelMap.get(), 0, 0); - SetMapObjects(pLevelMap.get(), 0, 0); + SetMapMonsters(dunData.get(), 0, 0); + SetMapObjects(dunData.get(), 0, 0); } -void LoadPreL4Dungeon(char *sFileName) +void LoadPreL4Dungeon(const char *path) { - int i, j, rw, rh; - BYTE *lm; - dminx = 16; dminy = 16; dmaxx = 96; @@ -1811,25 +1771,9 @@ void LoadPreL4Dungeon(char *sFileName) InitL4Dungeon(); - auto pLevelMap = LoadFileInMem(sFileName); - - lm = pLevelMap.get(); - rw = *lm; - lm += 2; - rh = *lm; - lm += 2; + auto dunData = LoadFileInMem(path); - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - dungeon[i][j] = *lm; - dflags[i][j] |= DLRG_PROTECTED; - } else { - dungeon[i][j] = 6; - } - lm += 2; - } - } + DRLG_L4SetRoom(dunData.get(), 0, 0); } } // namespace devilution diff --git a/Source/engine.cpp b/Source/engine.cpp index 62ef6749f..3c09d4c17 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -89,12 +89,12 @@ BYTE *GetLightTable(char light) CelSprite LoadCel(const char *pszName, int width) { - return CelSprite(LoadFileInMem(pszName), width); + return CelSprite(LoadFileInMem(pszName), width); } CelSprite LoadCel(const char *pszName, const int *widths) { - return CelSprite(LoadFileInMem(pszName), widths); + return CelSprite(LoadFileInMem(pszName), widths); } std::pair MeasureSolidHorizontalBounds(const CelSprite &cel, int frame) @@ -710,30 +710,26 @@ int32_t GenerateRnd(int32_t v) return AdvanceRndSeed() % v; } -/** - * @brief Load a file in to a buffer - * @param pszName Path of file - * @param pdwFileLen Will be set to file size if non-NULL - * @return Buffer with content of file - */ -std::unique_ptr LoadFileInMem(const char *pszName, DWORD *pdwFileLen) +size_t GetFileSize(const char *pszName) { HANDLE file; SFileOpenFile(pszName, &file); - const DWORD fileLen = SFileGetFileSize(file, nullptr); + const size_t fileLen = SFileGetFileSize(file, nullptr); + SFileCloseFile(file); - if (pdwFileLen != nullptr) - *pdwFileLen = fileLen; + return fileLen; +} + +void LoadFileData(const char *pszName, byte *buffer, size_t fileLen) +{ + HANDLE file; + SFileOpenFile(pszName, &file); if (fileLen == 0) app_fatal("Zero length SFILE:\n%s", pszName); - std::unique_ptr buf { new BYTE[fileLen] }; - - SFileReadFileThreadSafe(file, buf.get(), fileLen); + SFileReadFileThreadSafe(file, buffer, fileLen); SFileCloseFile(file); - - return buf; } /** diff --git a/Source/engine.h b/Source/engine.h index 8c66a08b0..fb25ba6a4 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -13,6 +13,7 @@ #pragma once #include +#include #include #include #include @@ -31,6 +32,12 @@ namespace devilution { +#if __cplusplus >= 201703L +using byte = std::byte; +#else +using byte = uint8_t; +#endif + #if defined(__cpp_lib_clamp) using std::clamp; #else @@ -598,7 +605,40 @@ void SetRndSeed(int32_t s); int32_t AdvanceRndSeed(); int32_t GetRndSeed(); int32_t GenerateRnd(int32_t v); -std::unique_ptr LoadFileInMem(const char *pszName, DWORD *pdwFileLen = nullptr); + +size_t GetFileSize(const char *pszName); +void LoadFileData(const char *pszName, byte *buffer, size_t bufferSize); + +template +void LoadFileInMem(const char *path, std::array &data) +{ + LoadFileData(path, reinterpret_cast(&data), N * sizeof(T)); +} + +/** + * @brief Load a file in to a buffer + * @param path Path of file + * @param elements Number of T elements read + * @return Buffer with content of file + */ +template +std::unique_ptr LoadFileInMem(const char *path, size_t *elements = nullptr) +{ + const size_t fileLen = GetFileSize(path); + + if ((fileLen % sizeof(T)) != 0) + app_fatal("File size does not align with type\n%s", path); + + if (elements != nullptr) + *elements = fileLen / sizeof(T); + + std::unique_ptr buf { new T[fileLen / sizeof(T)] }; + + LoadFileData(path, reinterpret_cast(buf.get()), fileLen); + + return buf; +} + DWORD LoadFileWithMem(const char *pszName, BYTE *p); void Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel); void PlayInGameMovie(const char *pszMovie); diff --git a/Source/gendung.cpp b/Source/gendung.cpp index ecfb98721..227992e1f 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -10,9 +10,9 @@ namespace devilution { /** Contains the tile IDs of the map. */ -BYTE dungeon[DMAXX][DMAXY]; +uint8_t dungeon[DMAXX][DMAXY]; /** Contains a backup of the tile IDs of the map. */ -BYTE pdungeon[DMAXX][DMAXY]; +uint8_t pdungeon[DMAXX][DMAXY]; char dflags[DMAXX][DMAXY]; /** Specifies the active set level X-coordinate of the map. */ int setpc_x; @@ -23,35 +23,20 @@ int setpc_w; /** Specifies the height of the active set level of the map. */ int setpc_h; /** Contains the contents of the single player quest DUN file. */ -std::unique_ptr pSetPiece; +std::unique_ptr pSetPiece; /** Specifies whether a single player quest DUN has been loaded. */ bool setloadflag; std::optional pSpecialCels; /** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */ -std::unique_ptr pMegaTiles; +std::unique_ptr pMegaTiles; std::unique_ptr pLevelPieces; std::unique_ptr pDungeonCels; -/** - * List of transparancy masks to use for dPieces - */ -char block_lvid[MAXTILES + 1]; -/** - * List of light blocking dPieces - */ -bool nBlockTable[MAXTILES + 1]; -/** - * List of path blocking dPieces - */ -bool nSolidTable[MAXTILES + 1]; -/** - * List of transparent dPieces - */ -bool nTransTable[MAXTILES + 1]; -/** - * List of missile blocking dPieces - */ -bool nMissileTable[MAXTILES + 1]; -bool nTrapTable[MAXTILES + 1]; +std::array block_lvid; +std::array nBlockTable; +std::array nSolidTable; +std::array nTransTable; +std::array nMissileTable; +std::array nTrapTable; /** Specifies the minimum X-coordinate of the map. */ int dminx; /** Specifies the minimum Y-coordinate of the map. */ @@ -125,62 +110,43 @@ char dSpecial[MAXDUNX][MAXDUNY]; int themeCount; THEME_LOC themeLoc[MAXTHEMES]; -void FillSolidBlockTbls() +std::unique_ptr LoadLevelSOLData(size_t &tileCount) { - BYTE bv; - DWORD i, dwTiles; - - memset(nBlockTable, 0, sizeof(nBlockTable)); - memset(nSolidTable, 0, sizeof(nSolidTable)); - memset(nTransTable, 0, sizeof(nTransTable)); - memset(nMissileTable, 0, sizeof(nMissileTable)); - memset(nTrapTable, 0, sizeof(nTrapTable)); - - std::unique_ptr pSBFile; switch (leveltype) { case DTYPE_TOWN: if (gbIsHellfire) - pSBFile = LoadFileInMem("NLevels\\TownData\\Town.SOL", &dwTiles); - else - pSBFile = LoadFileInMem("Levels\\TownData\\Town.SOL", &dwTiles); - break; + return LoadFileInMem("NLevels\\TownData\\Town.SOL", &tileCount); + return LoadFileInMem("Levels\\TownData\\Town.SOL", &tileCount); case DTYPE_CATHEDRAL: if (currlevel < 17) - pSBFile = LoadFileInMem("Levels\\L1Data\\L1.SOL", &dwTiles); - else - pSBFile = LoadFileInMem("NLevels\\L5Data\\L5.SOL", &dwTiles); - break; + return LoadFileInMem("Levels\\L1Data\\L1.SOL", &tileCount); + return LoadFileInMem("NLevels\\L5Data\\L5.SOL", &tileCount); case DTYPE_CATACOMBS: - pSBFile = LoadFileInMem("Levels\\L2Data\\L2.SOL", &dwTiles); - break; + return LoadFileInMem("Levels\\L2Data\\L2.SOL", &tileCount); case DTYPE_CAVES: if (currlevel < 17) - pSBFile = LoadFileInMem("Levels\\L3Data\\L3.SOL", &dwTiles); - else - pSBFile = LoadFileInMem("NLevels\\L6Data\\L6.SOL", &dwTiles); - break; + return LoadFileInMem("Levels\\L3Data\\L3.SOL", &tileCount); + return LoadFileInMem("NLevels\\L6Data\\L6.SOL", &tileCount); case DTYPE_HELL: - pSBFile = LoadFileInMem("Levels\\L4Data\\L4.SOL", &dwTiles); - break; + return LoadFileInMem("Levels\\L4Data\\L4.SOL", &tileCount); default: app_fatal("FillSolidBlockTbls"); } +} - const BYTE *pTmp = pSBFile.get(); - - for (i = 1; i <= dwTiles; i++) { - bv = *pTmp++; - if ((bv & 0x01) != 0) - nSolidTable[i] = true; - if ((bv & 0x02) != 0) - nBlockTable[i] = true; - if ((bv & 0x04) != 0) - nMissileTable[i] = true; - if ((bv & 0x08) != 0) - nTransTable[i] = true; - if ((bv & 0x80) != 0) - nTrapTable[i] = true; - block_lvid[i] = (bv & 0x70) >> 4; /* beta: (bv >> 4) & 7 */ +void FillSolidBlockTbls() +{ + size_t tileCount; + auto pSBFile = LoadLevelSOLData(tileCount); + + for (unsigned i = 0; i < tileCount; i++) { + uint8_t bv = pSBFile[i]; + nSolidTable[i + 1] = (bv & 0x01) != 0; + nBlockTable[i + 1] = (bv & 0x02) != 0; + nMissileTable[i + 1] = (bv & 0x04) != 0; + nTransTable[i + 1] = (bv & 0x08) != 0; + nTrapTable[i + 1] = (bv & 0x80) != 0 ; + block_lvid[i + 1] = (bv & 0x70) >> 4; } } diff --git a/Source/gendung.h b/Source/gendung.h index fc557d8bf..bb8e1d907 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -99,6 +99,13 @@ struct THEME_LOC { int16_t height; }; +struct MegaTile { + uint16_t micro1; + uint16_t micro2; + uint16_t micro3; + uint16_t micro4; +}; + struct MICROS { uint16_t mt[16]; }; @@ -113,25 +120,40 @@ struct ShadowStruct { uint8_t nv3; }; -extern BYTE dungeon[DMAXX][DMAXY]; -extern BYTE pdungeon[DMAXX][DMAXY]; +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 std::unique_ptr pSetPiece; extern bool setloadflag; extern std::optional pSpecialCels; -extern std::unique_ptr pMegaTiles; +extern std::unique_ptr pMegaTiles; extern std::unique_ptr pLevelPieces; extern std::unique_ptr pDungeonCels; -extern char block_lvid[MAXTILES + 1]; -extern bool nBlockTable[MAXTILES + 1]; -extern bool nSolidTable[MAXTILES + 1]; -extern bool nTransTable[MAXTILES + 1]; -extern bool nMissileTable[MAXTILES + 1]; -extern bool nTrapTable[MAXTILES + 1]; +/** + * 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; diff --git a/Source/lighting.cpp b/Source/lighting.cpp index 29ec91f9f..2bcd75c0f 100644 --- a/Source/lighting.cpp +++ b/Source/lighting.cpp @@ -894,14 +894,14 @@ void MakeLightTable() } { - auto trn = LoadFileInMem("PlrGFX\\Infra.TRN"); + auto trn = LoadFileInMem("PlrGFX\\Infra.TRN"); for (i = 0; i < 256; i++) { *tbl++ = trn[i]; } } { - auto trn = LoadFileInMem("PlrGFX\\Stone.TRN"); + auto trn = LoadFileInMem("PlrGFX\\Stone.TRN"); for (i = 0; i < 256; i++) { *tbl++ = trn[i]; } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 1a342fc4f..2d6b5de0e 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1140,16 +1140,16 @@ void LoadMissileGFX(BYTE mi) char pszName[256]; if ((mfd->mFlags & MFLAG_ALLOW_SPECIAL) != 0) { sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); - BYTE *file = LoadFileInMem(pszName, nullptr).release(); + BYTE *file = LoadFileInMem(pszName).release(); for (unsigned i = 0; i < mfd->mAnimFAmt; i++) mfd->mAnimData[i] = CelGetFrameStart(file, i); } else if (mfd->mAnimFAmt == 1) { sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); - mfd->mAnimData[0] = LoadFileInMem(pszName, nullptr).release(); + mfd->mAnimData[0] = LoadFileInMem(pszName).release(); } else { for (unsigned i = 0; i < mfd->mAnimFAmt; i++) { sprintf(pszName, "Missiles\\%s%u.CL2", mfd->mName, i + 1); - mfd->mAnimData[i] = LoadFileInMem(pszName, nullptr).release(); + mfd->mAnimData[i] = LoadFileInMem(pszName).release(); } } } diff --git a/Source/monster.cpp b/Source/monster.cpp index f9c1c382d..2ecfee205 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -351,7 +351,7 @@ void InitMonsterGFX(int monst) BYTE *celBuf; { - auto celData = LoadFileInMem(strBuff); + auto celData = LoadFileInMem(strBuff); celBuf = celData.get(); Monsters[monst].Anims[anim].CMem = std::move(celData); } @@ -384,7 +384,7 @@ void InitMonsterGFX(int monst) Monsters[monst].MData = &monsterdata[mtype]; if (monsterdata[mtype].has_trans) { - Monsters[monst].trans_file = LoadFileInMem(monsterdata[mtype].TransFile, nullptr).release(); + Monsters[monst].trans_file = LoadFileInMem(monsterdata[mtype].TransFile).release(); InitMonsterTRN(monst, monsterdata[mtype].has_special); delete[] Monsters[monst].trans_file; } @@ -950,24 +950,24 @@ void PlaceQuestMonsters() } if (QuestStatus(Q_LTBANNER)) { - auto setp = LoadFileInMem("Levels\\L1Data\\Banner1.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x, 2 * setpc_y); + auto dunData = LoadFileInMem("Levels\\L1Data\\Banner1.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x, 2 * setpc_y); } if (QuestStatus(Q_BLOOD)) { - auto setp = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x, 2 * setpc_y); + auto dunData = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x, 2 * setpc_y); } if (QuestStatus(Q_BLIND)) { - auto setp = LoadFileInMem("Levels\\L2Data\\Blind2.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x, 2 * setpc_y); + auto dunData = LoadFileInMem("Levels\\L2Data\\Blind2.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x, 2 * setpc_y); } if (QuestStatus(Q_ANVIL)) { - auto setp = LoadFileInMem("Levels\\L3Data\\Anvil.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x + 2, 2 * setpc_y + 2); + auto dunData = LoadFileInMem("Levels\\L3Data\\Anvil.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x + 2, 2 * setpc_y + 2); } if (QuestStatus(Q_WARLORD)) { - auto setp = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x, 2 * setpc_y); + auto dunData = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x, 2 * setpc_y); AddMonsterType(UniqMonst[UMT_WARLORD].mtype, PLACE_SCATTER); } if (QuestStatus(Q_VEIL)) { @@ -983,8 +983,8 @@ void PlaceQuestMonsters() PlaceUniqueMonst(UMT_LAZURUS, 0, 0); PlaceUniqueMonst(UMT_RED_VEX, 0, 0); PlaceUniqueMonst(UMT_BLACKJADE, 0, 0); - auto setp = LoadFileInMem("Levels\\L4Data\\Vile1.DUN"); - SetMapMonsters(setp.get(), 2 * setpc_x, 2 * setpc_y); + auto dunData = LoadFileInMem("Levels\\L4Data\\Vile1.DUN"); + SetMapMonsters(dunData.get(), 2 * setpc_x, 2 * setpc_y); } if (currlevel == 24) { @@ -1086,20 +1086,20 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader) void LoadDiabMonsts() { { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN"); - SetMapMonsters(lpSetPiece.get(), 2 * diabquad1x, 2 * diabquad1y); + auto dunData = LoadFileInMem("Levels\\L4Data\\diab1.DUN"); + SetMapMonsters(dunData.get(), 2 * diabquad1x, 2 * diabquad1y); } { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN"); - SetMapMonsters(lpSetPiece.get(), 2 * diabquad2x, 2 * diabquad2y); + auto dunData = LoadFileInMem("Levels\\L4Data\\diab2a.DUN"); + SetMapMonsters(dunData.get(), 2 * diabquad2x, 2 * diabquad2y); } { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN"); - SetMapMonsters(lpSetPiece.get(), 2 * diabquad3x, 2 * diabquad3y); + auto dunData = LoadFileInMem("Levels\\L4Data\\diab3a.DUN"); + SetMapMonsters(dunData.get(), 2 * diabquad3x, 2 * diabquad3y); } { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4a.DUN"); - SetMapMonsters(lpSetPiece.get(), 2 * diabquad4x, 2 * diabquad4y); + auto dunData = LoadFileInMem("Levels\\L4Data\\diab4a.DUN"); + SetMapMonsters(dunData.get(), 2 * diabquad4x, 2 * diabquad4y); } } @@ -1179,13 +1179,8 @@ void InitMonsters() } } -void SetMapMonsters(BYTE *pMap, int startx, int starty) +void SetMapMonsters(const uint16_t *dunData, int startx, int starty) { - uint16_t rw, rh; - uint16_t *lm; - int i, j; - int mtype; - AddMonsterType(MT_GOLEM, PLACE_SPECIAL); AddMonster(1, 0, DIR_S, 0, false); AddMonster(1, 0, DIR_S, 0, false); @@ -1199,21 +1194,25 @@ void SetMapMonsters(BYTE *pMap, int startx, int starty) PlaceUniqueMonst(UMT_RED_VEX, 0, 0); PlaceUniqueMonst(UMT_BLACKJADE, 0, 0); } - lm = (uint16_t *)pMap; - rw = SDL_SwapLE16(*lm++); - rh = SDL_SwapLE16(*lm++); - lm += rw * rh; - rw = rw * 2; - rh = rh * 2; - lm += rw * rh; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm != 0) { - mtype = AddMonsterType(MonstConvTbl[SDL_SwapLE16(*lm) - 1], PLACE_SPECIAL); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + int layer2Offset = 2 + width * height; + + // The rest of the layers are at dPiece scale + width *= 2; + height *= 2; + + const uint16_t *monsterLayer = &dunData[layer2Offset + width * height]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t monsterId = SDL_SwapLE16(monsterLayer[j * width + i]); + if (monsterId != 0) { + int mtype = AddMonsterType(MonstConvTbl[monsterId - 1], PLACE_SPECIAL); PlaceMonster(nummonsters++, mtype, i + startx + 16, j + starty + 16); } - lm++; } } } diff --git a/Source/monster.h b/Source/monster.h index 1d7d69c64..400285840 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -215,7 +215,7 @@ void ClrAllMonsters(); void monster_some_crypt(); void PlaceGroup(int mtype, int num, int leaderf, int leader); void InitMonsters(); -void SetMapMonsters(BYTE *pMap, int startx, int starty); +void SetMapMonsters(const uint16_t *dunData, int startx, int starty); void DeleteMonster(int i); int AddMonster(int x, int y, direction dir, int mtype, bool InMap); void monster_43C785(int i); diff --git a/Source/objects.cpp b/Source/objects.cpp index 171de60f3..4981ab29f 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -314,7 +314,7 @@ void InitObjectGFX() sprintf(filestr, "Objects\\%s.CEL", ObjHiveLoadList[i]); else if (currlevel >= 21) sprintf(filestr, "Objects\\%s.CEL", ObjCryptLoadList[i]); - pObjCels[numobjfiles] = LoadFileInMem(filestr); + pObjCels[numobjfiles] = LoadFileInMem(filestr); numobjfiles++; } } @@ -762,85 +762,75 @@ void AddChestTraps() } } -void LoadMapObjects(BYTE *pMap, int startx, int starty, int x1, int y1, int w, int h, int leveridx) +void LoadMapObjects(const char *path, int startx, int starty, int x1, int y1, int w, int h, int leveridx) { - int rw, rh, i, j, oi, type; - BYTE *lm; - long mapoff; - LoadMapObjsFlag = true; InitObjFlag = true; - lm = pMap; - rw = *lm; - lm += 2; - rh = *lm; - mapoff = (rw * rh + 1) * 2; - rw *= 2; - rh *= 2; - mapoff += rw * 2 * rh * 2; - lm += mapoff; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm) { - type = *lm; - AddObject(ObjTypeConv[type], startx + 16 + i, starty + 16 + j); - oi = ObjIndex(startx + 16 + i, starty + 16 + j); + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + int layer2Offset = 2 + width * height; + + // The rest of the layers are at dPiece scale + width *= 2; + height *= 2; + + const uint16_t *objectLayer = &dunData[layer2Offset + width * height * 2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t objectId = SDL_SwapLE16(objectLayer[j * width + i]); + if (objectId != 0) { + AddObject(ObjTypeConv[objectId], startx + 16 + i, starty + 16 + j); + int oi = ObjIndex(startx + 16 + i, starty + 16 + j); SetObjMapRange(oi, x1, y1, x1 + w, y1 + h, leveridx); } - lm += 2; } } + InitObjFlag = false; LoadMapObjsFlag = false; } -void LoadMapObjs(BYTE *pMap, int startx, int starty) +void LoadMapObjs(const char *path, int startx, int starty) { - int rw, rh; - int i, j; - BYTE *lm; - long mapoff; - LoadMapObjsFlag = true; InitObjFlag = true; - lm = pMap; - rw = *lm; - lm += 2; - rh = *lm; - mapoff = (rw * rh + 1) * 2; - rw *= 2; - rh *= 2; - mapoff += 2 * rw * rh * 2; - lm += mapoff; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm) { - AddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j); + + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + int layer2Offset = 2 + width * height; + + // The rest of the layers are at dPiece scale + width *= 2; + height *= 2; + + const uint16_t *objectLayer = &dunData[layer2Offset + width * height * 2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t objectId = SDL_SwapLE16(objectLayer[j * width + i]); + if (objectId != 0) { + AddObject(ObjTypeConv[objectId], startx + 16 + i, starty + 16 + j); } - lm += 2; } } + InitObjFlag = false; LoadMapObjsFlag = false; } void AddDiabObjs() { - { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN"); - LoadMapObjects(lpSetPiece.get(), 2 * diabquad1x, 2 * diabquad1y, diabquad2x, diabquad2y, 11, 12, 1); - } - { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN"); - LoadMapObjects(lpSetPiece.get(), 2 * diabquad2x, 2 * diabquad2y, diabquad3x, diabquad3y, 11, 11, 2); - } - { - auto lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN"); - LoadMapObjects(lpSetPiece.get(), 2 * diabquad3x, 2 * diabquad3y, diabquad4x, diabquad4y, 9, 9, 3); - } + LoadMapObjects("Levels\\L4Data\\diab1.DUN", 2 * diabquad1x, 2 * diabquad1y, diabquad2x, diabquad2y, 11, 12, 1); + LoadMapObjects("Levels\\L4Data\\diab2a.DUN", 2 * diabquad2x, 2 * diabquad2y, diabquad3x, diabquad3y, 11, 11, 2); + LoadMapObjects("Levels\\L4Data\\diab3a.DUN", 2 * diabquad3x, 2 * diabquad3y, diabquad4x, diabquad4y, 9, 9, 3); } void objects_add_lv22(int s) @@ -1117,10 +1107,7 @@ void InitObjects() } quests[Q_BLIND]._qmsg = sp_id; AddBookLever(setpc_x, setpc_y, setpc_w + setpc_x + 1, setpc_h + setpc_y + 1, sp_id); - { - auto mem = LoadFileInMem("Levels\\L2Data\\Blind2.DUN"); - LoadMapObjs(mem.get(), 2 * setpc_x, 2 * setpc_y); - } + LoadMapObjs("Levels\\L2Data\\Blind2.DUN", 2 * setpc_x, 2 * setpc_y); } if (QuestStatus(Q_BLOOD)) { _speech_id sp_id; @@ -1179,10 +1166,7 @@ void InitObjects() } quests[Q_WARLORD]._qmsg = sp_id; AddBookLever(setpc_x, setpc_y, setpc_x + setpc_w, setpc_y + setpc_h, sp_id); - { - auto mem = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); - LoadMapObjs(mem.get(), 2 * setpc_x, 2 * setpc_y); - } + LoadMapObjs("Levels\\L4Data\\Warlord.DUN", 2 * setpc_x, 2 * setpc_y); } if (QuestStatus(Q_BETRAYER) && !gbIsMultiplayer) AddLazStand(); @@ -1200,63 +1184,60 @@ void InitObjects() } } -void SetMapObjects(BYTE *pMap, int startx, int starty) +void SetMapObjects(const uint16_t *dunData, int startx, int starty) { - int rw, rh; - int i, j; - BYTE *lm, *h; - long mapoff; - int fileload[56]; + bool filesLoaded[56]; char filestr[32]; ClrAllObjects(); - for (i = 0; i < 56; i++) - fileload[i] = false; + for (auto &fileLoaded : filesLoaded) + fileLoaded = false; InitObjFlag = true; - for (i = 0; AllObjects[i].oload != -1; i++) { + for (int i = 0; AllObjects[i].oload != -1; i++) { if (AllObjects[i].oload == 1 && leveltype == AllObjects[i].olvltype) - fileload[AllObjects[i].ofindex] = true; + filesLoaded[AllObjects[i].ofindex] = true; } - lm = pMap; - rw = *lm; - lm += 2; - rh = *lm; - mapoff = (rw * rh + 1) * 2; - rw *= 2; - rh *= 2; - mapoff += 2 * rw * rh * 2; - lm += mapoff; - h = lm; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm) { - fileload[AllObjects[ObjTypeConv[*lm]].ofindex] = true; + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + int layer2Offset = 2 + width * height; + + // The rest of the layers are at dPiece scale + width *= 2; + height *= 2; + + const uint16_t *objectLayer = &dunData[layer2Offset + width * height * 2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t objectId = SDL_SwapLE16(objectLayer[j * width + i]); + if (objectId != 0) { + filesLoaded[AllObjects[ObjTypeConv[objectId]].ofindex] = true; } - lm += 2; } } - for (i = OFILE_L1BRAZ; i <= OFILE_LZSTAND; i++) { - if (!fileload[i]) + for (int i = OFILE_L1BRAZ; i <= OFILE_LZSTAND; i++) { + if (!filesLoaded[i]) continue; ObjFileList[numobjfiles] = (object_graphic_id)i; sprintf(filestr, "Objects\\%s.CEL", ObjMasterLoadList[i]); - pObjCels[numobjfiles] = LoadFileInMem(filestr); + pObjCels[numobjfiles] = LoadFileInMem(filestr); numobjfiles++; } - lm = h; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*lm) - AddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j); - lm += 2; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t objectId = SDL_SwapLE16(objectLayer[j * width + i]); + if (objectId != 0) { + AddObject(ObjTypeConv[objectId], startx + 16 + i, starty + 16 + j); + } } } + InitObjFlag = false; } @@ -2291,21 +2272,15 @@ void objects_set_door_piece(int x, int y) void ObjSetMini(int x, int y, int v) { - int xx, yy; - long v1, v2, v3, v4; + MegaTile mega = pMegaTiles[v - 1]; - uint16_t *MegaTiles = (uint16_t *)&pMegaTiles[((uint16_t)v - 1) * 8]; - v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1; - v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1; - v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1; - v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1; + int xx = 2 * x + 16; + int yy = 2 * y + 16; - xx = 2 * x + 16; - yy = 2 * y + 16; - ObjSetMicro(xx, yy, v1); - ObjSetMicro(xx + 1, yy, v2); - ObjSetMicro(xx, yy + 1, v3); - ObjSetMicro(xx + 1, yy + 1, v4); + ObjSetMicro(xx + 0, yy + 0, SDL_SwapLE16(mega.micro1) + 1); + ObjSetMicro(xx + 1, yy + 0, SDL_SwapLE16(mega.micro2) + 1); + ObjSetMicro(xx + 0, yy + 1, SDL_SwapLE16(mega.micro3) + 1); + ObjSetMicro(xx + 1, yy + 1, SDL_SwapLE16(mega.micro4) + 1); } void ObjL1Special(int x1, int y1, int x2, int y2) @@ -3349,10 +3324,7 @@ void OperatePedistal(int pnum, int i) if (!deltaload) PlaySfxLoc(LS_BLODSTAR, object[i].position.x, object[i].position.y); ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4); - { - auto mem = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); - LoadMapObjs(mem.get(), 2 * setpc_x, 2 * setpc_y); - } + LoadMapObjs("Levels\\L2Data\\Blood2.DUN", 2 * setpc_x, 2 * setpc_y); SpawnUnique(UITEM_ARMOFVAL, 2 * setpc_x + 25, 2 * setpc_y + 19); object[i]._oSelFlag = 0; } @@ -5368,8 +5340,7 @@ void SyncPedistal(int i) } if (object[i]._oVar6 == 3) { ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4); - auto setp = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); - LoadMapObjs(setp.get(), 2 * setpc_x, 2 * setpc_y); + LoadMapObjs("Levels\\L2Data\\Blood2.DUN", 2 * setpc_x, 2 * setpc_y); } } diff --git a/Source/objects.h b/Source/objects.h index 91e7a3c04..17739aee7 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -58,7 +58,7 @@ void FreeObjectGFX(); void AddL1Objs(int x1, int y1, int x2, int y2); void AddL2Objs(int x1, int y1, int x2, int y2); void InitObjects(); -void SetMapObjects(BYTE *pMap, int startx, int starty); +void SetMapObjects(const uint16_t *dunData, int startx, int starty); void SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v); void SetBookMsg(int i, _speech_id msg); void GetRndObjLoc(int randarea, int *xx, int *yy); diff --git a/Source/palette.cpp b/Source/palette.cpp index 017f41e68..9af2ade8b 100644 --- a/Source/palette.cpp +++ b/Source/palette.cpp @@ -120,20 +120,22 @@ static void GenerateBlendedLookupTable(SDL_Color *palette, int skipFrom, int ski void LoadPalette(const char *pszFileName) { - int i; - void *pBuf; - BYTE PalData[256][3]; - assert(pszFileName); - SFileOpenFile(pszFileName, &pBuf); - SFileReadFileThreadSafe(pBuf, (char *)PalData, sizeof(PalData)); - SFileCloseFile(pBuf); + struct Color { + uint8_t r; + uint8_t g; + uint8_t b; + }; + + std::array PalData; + + LoadFileInMem(pszFileName, PalData); - for (i = 0; i < 256; i++) { - orig_palette[i].r = PalData[i][0]; - orig_palette[i].g = PalData[i][1]; - orig_palette[i].b = PalData[i][2]; + for (int i = 0; i < PalData.size(); i++) { + orig_palette[i].r = PalData[i].r; + orig_palette[i].g = PalData[i].g; + orig_palette[i].b = PalData[i].b; #ifndef USE_SDL1 orig_palette[i].a = SDL_ALPHA_OPAQUE; #endif diff --git a/Source/quests.cpp b/Source/quests.cpp index 745b95435..1d5fbdc6f 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -378,137 +378,118 @@ void DrawSkelKing(int q, int x, int y) void DrawWarLord(int x, int y) { - int rw, rh; - int i, j; - BYTE *sp; - int v; - - auto setp = LoadFileInMem("Levels\\L4Data\\Warlord2.DUN"); - rw = setp[0]; - sp = &setp[2]; - rh = *sp; - sp += 2; - setpc_w = rw; - setpc_h = rh; + auto dunData = LoadFileInMem("Levels\\L4Data\\Warlord2.DUN"); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + setpc_x = x; setpc_y = y; - for (j = y; j < y + rh; j++) { - for (i = x; i < x + rw; i++) { - if (*sp != 0) { - v = *sp; - } else { - v = 6; - } - dungeon[i][j] = v; - sp += 2; + setpc_w = width; + setpc_h = height; + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + dungeon[x + i][y + j] = (tileId != 0) ? tileId : 6; } } } void DrawSChamber(int q, int x, int y) { - int i, j; - int rw, rh; - int xx, yy; - BYTE *sp; - int v; - - auto setp = LoadFileInMem("Levels\\L2Data\\Bonestr1.DUN"); - rw = setp[0]; - sp = &setp[2]; - rh = *sp; - sp += 2; - setpc_w = rw; - setpc_h = rh; + auto dunData = LoadFileInMem("Levels\\L2Data\\Bonestr1.DUN"); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + setpc_x = x; setpc_y = y; - for (j = y; j < y + rh; j++) { - for (i = x; i < x + rw; i++) { - if (*sp != 0) { - v = *sp; - } else { - v = 3; - } - dungeon[i][j] = v; - sp += 2; + setpc_w = width; + setpc_h = height; + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + dungeon[x + i][y + j] = (tileId != 0) ? tileId : 3; } } - xx = 2 * x + 22; - yy = 2 * y + 23; - quests[q].position = { xx, yy }; + + quests[q].position = { 2 * x + 22, 2 * y + 23 }; } void DrawLTBanner(int x, int y) { - int rw, rh; - int i, j; - BYTE *sp; - - auto setp = LoadFileInMem("Levels\\L1Data\\Banner1.DUN"); - rw = setp[0]; - sp = &setp[2]; - rh = *sp; - sp += 2; - setpc_w = rw; - setpc_h = rh; + auto dunData = LoadFileInMem("Levels\\L1Data\\Banner1.DUN"); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + setpc_x = x; setpc_y = y; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - pdungeon[x + i][y + j] = *sp; + setpc_w = width; + setpc_h = height; + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + pdungeon[x + i][y + j] = tileId; } - sp += 2; } } } void DrawBlind(int x, int y) { - int rw, rh; - int i, j; - BYTE *sp; + auto dunData = LoadFileInMem("Levels\\L2Data\\Blind1.DUN"); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); - auto setp = LoadFileInMem("Levels\\L2Data\\Blind1.DUN"); - rw = setp[0]; - sp = &setp[2]; - rh = *sp; - sp += 2; setpc_x = x; setpc_y = y; - setpc_w = rw; - setpc_h = rh; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - pdungeon[x + i][y + j] = *sp; + setpc_w = width; + setpc_h = height; + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + pdungeon[x + i][y + j] = tileId; } - sp += 2; } } } void DrawBlood(int x, int y) { - int rw, rh; - int i, j; - BYTE *sp; + auto dunData = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); - auto setp = LoadFileInMem("Levels\\L2Data\\Blood2.DUN"); - rw = setp[0]; - sp = &setp[2]; - rh = *sp; - sp += 2; setpc_x = x; setpc_y = y; - setpc_w = rw; - setpc_h = rh; - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[x + i][y + j] = *sp; + setpc_w = width; + setpc_h = height; + + const uint16_t *tileLayer = &dunData[2]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + uint8_t tileId = SDL_SwapLE16(tileLayer[j * width + i]); + if (tileId != 0) { + dungeon[x + i][y + j] = tileId; } - sp += 2; } } } diff --git a/Source/setmaps.cpp b/Source/setmaps.cpp index 1e28d1696..d25de28e0 100644 --- a/Source/setmaps.cpp +++ b/Source/setmaps.cpp @@ -117,27 +117,25 @@ void AddVileObjs() SetObjMapRange(ObjIndex(35, 36), 7, 11, 13, 18, 3); } -void DRLG_SetMapTrans(const char *sFileName) +void DRLG_SetMapTrans(const char *path) { - int x, y; - int i, j; - BYTE *d; - DWORD dwOffset; - - auto pLevelMap = LoadFileInMem(sFileName); - d = &pLevelMap[2]; - x = pLevelMap[0]; - y = *d; - dwOffset = (x * y + 1) * 2; - x *= 2; - y *= 2; - dwOffset += 3 * x * y * 2; - d += dwOffset; - - for (j = 0; j < y; j++) { - for (i = 0; i < x; i++) { - dTransVal[16 + i][16 + j] = *d; - d += 2; + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); + + int layer2Offset = 2 + width * height; + + // The rest of the layers are at dPiece scale + width *= 2; + height *= 2; + + const uint16_t *transparantLayer = &dunData[layer2Offset + width * height * 3]; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + dTransVal[16 + i][16 + j] = SDL_SwapLE16(*transparantLayer); + transparantLayer++; } } } diff --git a/Source/town.cpp b/Source/town.cpp index 3b74bfe76..40f32dcb1 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -17,47 +17,42 @@ namespace { /** * @brief Load level data into dPiece - * @param P3Tiles Tile set - * @param pSector Sector data + * @param megas Map from mega tiles to macro tiles + * @param path Path of dun file * @param xi upper left destination - * @param yi upper left destination - * @param w width of sector - * @param h height of sector + * @param yy upper left destination */ -void T_FillSector(BYTE *P3Tiles, BYTE *pSector, int xi, int yi, int w, int h) +void T_FillSector(MegaTile *megas, const char *path, int xi, int yy) { - int i, j, xx, yy, nMap; - int16_t v1, v2, v3, v4, ii; - uint16_t *Sector; + auto dunData = LoadFileInMem(path); + + int width = SDL_SwapLE16(dunData[0]); + int height = SDL_SwapLE16(dunData[1]); - ii = 4; - yy = yi; - for (j = 0; j < h; j++) { - xx = xi; - for (i = 0; i < w; i++) { - uint16_t *Map; + const uint16_t *tileLayer = &dunData[2]; - Map = (uint16_t *)&pSector[ii]; - nMap = SDL_SwapLE16(*Map); - if (nMap) { - Sector = (((uint16_t *)&P3Tiles[(nMap - 1) * 8])); - v1 = SDL_SwapLE16(*(Sector + 0)) + 1; - v2 = SDL_SwapLE16(*(Sector + 1)) + 1; - v3 = SDL_SwapLE16(*(Sector + 2)) + 1; - v4 = SDL_SwapLE16(*(Sector + 3)) + 1; + for (int j = 0; j < height; j++) { + int xx = xi; + for (int i = 0; i < width; i++) { + int v1 = 0; + int v2 = 0; + int v3 = 0; + int v4 = 0; - } else { - v1 = 0; - v2 = 0; - v3 = 0; - v4 = 0; + int tileId = SDL_SwapLE16(tileLayer[j * width + i]) - 1; + if (tileId >= 0) { + MegaTile mega = pMegaTiles[tileId]; + v1 = SDL_SwapLE16(mega.micro1) + 1; + v2 = SDL_SwapLE16(mega.micro2) + 1; + v3 = SDL_SwapLE16(mega.micro3) + 1; + v4 = SDL_SwapLE16(mega.micro4) + 1; } - dPiece[xx][yy] = v1; - dPiece[xx + 1][yy] = v2; - dPiece[xx][yy + 1] = v3; + + dPiece[xx + 0][yy + 0] = v1; + dPiece[xx + 1][yy + 0] = v2; + dPiece[xx + 0][yy + 1] = v3; dPiece[xx + 1][yy + 1] = v4; xx += 2; - ii += 2; } yy += 2; } @@ -65,26 +60,17 @@ void T_FillSector(BYTE *P3Tiles, BYTE *pSector, int xi, int yi, int w, int h) /** * @brief Load a tile in to dPiece - * @param P3Tiles Tile set + * @param megas Map from mega tiles to macro tiles * @param xx upper left destination * @param yy upper left destination * @param t tile id */ -void T_FillTile(BYTE *P3Tiles, int xx, int yy, int t) +void T_FillTile(MegaTile *megas, int xx, int yy, int t) { - long v1, v2, v3, v4; - uint16_t *Tiles; - - Tiles = ((uint16_t *)&P3Tiles[(t - 1) * 8]); - v1 = SDL_SwapLE16(*(Tiles + 0)) + 1; - v2 = SDL_SwapLE16(*(Tiles + 1)) + 1; - v3 = SDL_SwapLE16(*(Tiles + 2)) + 1; - v4 = SDL_SwapLE16(*(Tiles + 3)) + 1; - - dPiece[xx][yy] = v1; - dPiece[xx + 1][yy] = v2; - dPiece[xx][yy + 1] = v3; - dPiece[xx + 1][yy + 1] = v4; + dPiece[xx + 0][yy + 0] = SDL_SwapLE16(megas[t - 1].micro1) + 1; + dPiece[xx + 1][yy + 0] = SDL_SwapLE16(megas[t - 1].micro2) + 1; + dPiece[xx + 0][yy + 1] = SDL_SwapLE16(megas[t - 1].micro3) + 1; + dPiece[xx + 1][yy + 1] = SDL_SwapLE16(megas[t - 1].micro4) + 1; } /** @@ -175,23 +161,12 @@ void T_Pass3() } } - auto P3Tiles = LoadFileInMem("Levels\\TownData\\Town.TIL"); - { - auto pSector = LoadFileInMem("Levels\\TownData\\Sector1s.DUN"); - T_FillSector(P3Tiles.get(), pSector.get(), 46, 46, 25, 25); - } - { - auto pSector = LoadFileInMem("Levels\\TownData\\Sector2s.DUN"); - T_FillSector(P3Tiles.get(), pSector.get(), 46, 0, 25, 23); - } - { - auto pSector = LoadFileInMem("Levels\\TownData\\Sector3s.DUN"); - T_FillSector(P3Tiles.get(), pSector.get(), 0, 46, 23, 25); - } - { - auto pSector = LoadFileInMem("Levels\\TownData\\Sector4s.DUN"); - T_FillSector(P3Tiles.get(), pSector.get(), 0, 0, 23, 23); - } + auto P3Tiles = LoadFileInMem("Levels\\TownData\\Town.TIL"); + + T_FillSector(P3Tiles.get(), "Levels\\TownData\\Sector1s.DUN", 46, 46); + T_FillSector(P3Tiles.get(), "Levels\\TownData\\Sector2s.DUN", 46, 0); + T_FillSector(P3Tiles.get(), "Levels\\TownData\\Sector3s.DUN", 0, 46); + T_FillSector(P3Tiles.get(), "Levels\\TownData\\Sector4s.DUN", 0, 0); if (gbIsSpawn || !gbIsMultiplayer) { if (gbIsSpawn || (!(plr[myplr].pTownWarps & 1) && (!gbIsHellfire || plr[myplr]._pLevel < 10))) { diff --git a/Source/towners.cpp b/Source/towners.cpp index 6cd9bc775..615e18bd0 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -186,16 +186,16 @@ int GetActiveTowner(int t) return -1; } -void SetTownerGPtrs(BYTE *pData, BYTE **pAnim) +void SetTownerGPtrs(BYTE *pData, byte **pAnim) { for (int i = 0; i < 8; i++) { - pAnim[i] = CelGetFrameStart(pData, i); + pAnim[i] = (byte *)CelGetFrameStart(pData, i); } } -void NewTownerAnim(int tnum, BYTE *pAnim, uint8_t numFrames, int Delay) +void NewTownerAnim(int tnum, byte *pAnim, uint8_t numFrames, int Delay) { - towners[tnum]._tAnimData = pAnim; + towners[tnum]._tAnimData = (BYTE *)pAnim; towners[tnum]._tAnimLen = numFrames; towners[tnum]._tAnimFrame = 1; towners[tnum]._tAnimCnt = 0; @@ -232,9 +232,9 @@ void InitSmith() InitTownerInfo(numtowners, 96, true, TOWN_SMITH, 62, 63, 0); InitQstSnds(numtowners, TOWN_SMITH); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Smith\\SmithN.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Smith\\SmithN.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 16; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_SW], towners[numtowners]._tNFrames, 3); @@ -246,9 +246,9 @@ void InitBarOwner() { InitTownerInfo(numtowners, 96, true, TOWN_TAVERN, 55, 62, 3); InitQstSnds(numtowners, TOWN_TAVERN); - towners[numtowners]._tNData = LoadFileInMem("Towners\\TwnF\\TwnFN.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\TwnF\\TwnFN.CEL"); for (auto &towner : towners[numtowners]._tNAnim) { - towner = towners[numtowners]._tNData.get(); + towner = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 16; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_SW], towners[numtowners]._tNFrames, 3); @@ -262,9 +262,9 @@ void InitTownDead() InitTownerInfo(numtowners, 96, true, TOWN_DEADGUY, 24, 32, -1); InitQstSnds(numtowners, TOWN_DEADGUY); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Butch\\Deadguy.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Butch\\Deadguy.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 8; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_N], towners[numtowners]._tNFrames, 6); @@ -278,13 +278,13 @@ void InitWitch() InitTownerInfo(numtowners, 96, true, TOWN_WITCH, 80, 20, 5); InitQstSnds(numtowners, TOWN_WITCH); - towners[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\Witch.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\Witch.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 19; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 6); - towners[numtowners]._tName = _("Adria the Witch"); + towners[numtowners]._tName = _("Adria the Witch"); numtowners++; } @@ -294,9 +294,9 @@ void InitBarmaid() InitTownerInfo(numtowners, 96, true, TOWN_BMAID, 43, 66, -1); InitQstSnds(numtowners, TOWN_BMAID); - towners[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\WmnN.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\WmnN.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 18; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 6); @@ -310,9 +310,9 @@ void InitBoy() InitTownerInfo(numtowners, 96, true, TOWN_PEGBOY, 11, 53, -1); InitQstSnds(numtowners, TOWN_PEGBOY); - towners[numtowners]._tNData = LoadFileInMem("Towners\\TownBoy\\PegKid1.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\TownBoy\\PegKid1.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 20; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 6); @@ -326,9 +326,9 @@ void InitHealer() InitTownerInfo(numtowners, 96, true, TOWN_HEALER, 55, 79, 1); InitQstSnds(numtowners, TOWN_HEALER); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Healer\\Healer.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Healer\\Healer.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 20; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_SE], towners[numtowners]._tNFrames, 6); @@ -342,9 +342,9 @@ void InitTeller() InitTownerInfo(numtowners, 96, true, TOWN_STORY, 62, 71, 2); InitQstSnds(numtowners, TOWN_STORY); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Strytell\\Strytell.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Strytell\\Strytell.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 25; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 3); @@ -358,9 +358,9 @@ void InitDrunk() InitTownerInfo(numtowners, 96, true, TOWN_DRUNK, 71, 84, 4); InitQstSnds(numtowners, TOWN_DRUNK); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Drunk\\TwnDrunk.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Drunk\\TwnDrunk.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 18; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 3); @@ -375,7 +375,7 @@ void InitCows() //if ( pCowCels ) // assertion_failed(__LINE__, __FILE__, "! pCowCels"); - pCowCels = LoadFileInMem("Towners\\Animals\\Cow.CEL"); + pCowCels = LoadFileInMem("Towners\\Animals\\Cow.CEL"); for (i = 0; i < 3; i++) { x = TownCowX[i]; y = TownCowY[i]; @@ -408,9 +408,9 @@ void InitFarmer() InitTownerInfo(numtowners, 96, true, TOWN_FARMER, 62, 16, -1); InitQstSnds(numtowners, TOWN_FARMER); - towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\Farmrn2.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\Farmrn2.CEL"); for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 15; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 3); @@ -425,12 +425,12 @@ void InitCowFarmer() InitTownerInfo(numtowners, 96, true, TOWN_COWFARM, 61, 22, -1); InitQstSnds(numtowners, TOWN_COWFARM); if (quests[Q_JERSEY]._qactive != QUEST_DONE) { - towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\cfrmrn2.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\cfrmrn2.CEL"); } else { - towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\mfrmrn2.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Farmer\\mfrmrn2.CEL"); } for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 15; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_SW], towners[numtowners]._tNFrames, 3); @@ -445,16 +445,16 @@ void InitGirl() InitTownerInfo(numtowners, 96, true, TOWN_GIRL, 77, 43, -1); InitQstSnds(numtowners, TOWN_GIRL); if (quests[Q_GIRL]._qactive != QUEST_DONE) { - towners[numtowners]._tNData = LoadFileInMem("Towners\\Girl\\Girlw1.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Girl\\Girlw1.CEL"); } else { - towners[numtowners]._tNData = LoadFileInMem("Towners\\Girl\\Girls1.CEL"); + towners[numtowners]._tNData = LoadFileInMem("Towners\\Girl\\Girls1.CEL"); } for (i = 0; i < 8; i++) { - towners[numtowners]._tNAnim[i] = towners[numtowners]._tNData.get(); + towners[numtowners]._tNAnim[i] = (byte *)towners[numtowners]._tNData.get(); } towners[numtowners]._tNFrames = 20; NewTownerAnim(numtowners, towners[numtowners]._tNAnim[DIR_S], towners[numtowners]._tNFrames, 6); - towners[numtowners]._tName = {"Celia"}; + towners[numtowners]._tName = "Celia"; numtowners++; } diff --git a/Source/towners.h b/Source/towners.h index 4a56edba5..6f6eabb3b 100644 --- a/Source/towners.h +++ b/Source/towners.h @@ -41,7 +41,7 @@ struct TNQ { }; struct TownerStruct { - uint8_t *_tNAnim[8]; + byte *_tNAnim[8]; std::unique_ptr _tNData; uint8_t *_tAnimData; int16_t _tSeed;