From 7d06ca540c4294a2470f479f98bc42ef3364f0dc Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Fri, 29 Jun 2018 11:43:32 -0500 Subject: [PATCH] Fix dpiece_defs, clean up LoadLvlGFX (#105) Thanks to @MadHed, implements #102 --- Source/diablo.cpp | 89 ++++++++++++++++++---------------------------- Source/gendung.cpp | 10 +++--- Source/gendung.h | 2 +- Source/objects.cpp | 16 ++++----- Source/town.cpp | 6 ++-- structs.h | 5 --- 6 files changed, 52 insertions(+), 76 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 70e1bfe4a..95134281e 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -92,8 +92,8 @@ void __cdecl FreeGameMem() v1 = pMegaTiles; pMegaTiles = 0; mem_free_dbg(v1); - v2 = *(void **)&dpiece_defs[0].blocks; - *(_DWORD *)&dpiece_defs[0].blocks = 0; + v2 = pLevelPieces; + pLevelPieces = 0; mem_free_dbg(v2); v3 = level_special_cel; level_special_cel = 0; @@ -1797,61 +1797,42 @@ LABEL_27: void __cdecl LoadLvlGFX() { - unsigned char *v0; // eax - char *v1; // ecx - unsigned char *v2; // eax - char *v3; // ecx - unsigned char *v4; // eax - char *v5; // ecx - - if (leveltype == DTYPE_TOWN) + switch(leveltype) { - pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL", 0); - pMegaTiles = LoadFileInMem("Levels\\TownData\\Town.TIL", 0); - v4 = LoadFileInMem("Levels\\TownData\\Town.MIN", 0); - v5 = "Levels\\TownData\\TownS.CEL"; - goto LABEL_14; - } - if (leveltype == DTYPE_CATHEDRAL) - { - pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL", 0); - v2 = LoadFileInMem("Levels\\L1Data\\L1.TIL", 0); - v3 = "Levels\\L1Data\\L1.MIN"; - goto LABEL_12; - } - if (leveltype != DTYPE_CATACOMBS) - { - if (leveltype != DTYPE_CAVES) - { - if (leveltype != DTYPE_HELL) - { - TermMsg("LoadLvlGFX"); - return; - } + case DTYPE_TOWN: + pDungeonCels = LoadFileInMem("Levels\\TownData\\Town.CEL", 0); + pMegaTiles = LoadFileInMem("Levels\\TownData\\Town.TIL", 0); + pLevelPieces = LoadFileInMem("Levels\\TownData\\Town.MIN", 0); + level_special_cel = LoadFileInMem("Levels\\TownData\\TownS.CEL", 0); + break; + case DTYPE_CATHEDRAL: + pDungeonCels = LoadFileInMem("Levels\\L1Data\\L1.CEL", 0); + pMegaTiles = LoadFileInMem("Levels\\L1Data\\L1.TIL", 0); + pLevelPieces = LoadFileInMem("Levels\\L1Data\\L1.MIN", 0); + level_special_cel = LoadFileInMem("Levels\\L1Data\\L1S.CEL", 0); + break; + case DTYPE_CATACOMBS: + pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL", 0); + pMegaTiles = LoadFileInMem("Levels\\L2Data\\L2.TIL", 0); + pLevelPieces = LoadFileInMem("Levels\\L2Data\\L2.MIN", 0); + level_special_cel = LoadFileInMem("Levels\\L2Data\\L2S.CEL", 0); + break; + case DTYPE_CAVES: + pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL", 0); + pMegaTiles = LoadFileInMem("Levels\\L3Data\\L3.TIL", 0); + pLevelPieces = LoadFileInMem("Levels\\L3Data\\L3.MIN", 0); + level_special_cel = LoadFileInMem("Levels\\L1Data\\L1S.CEL", 0); + break; + case DTYPE_HELL: pDungeonCels = LoadFileInMem("Levels\\L4Data\\L4.CEL", 0); - v0 = LoadFileInMem("Levels\\L4Data\\L4.TIL", 0); - v1 = "Levels\\L4Data\\L4.MIN"; - goto LABEL_10; - } - pDungeonCels = LoadFileInMem("Levels\\L3Data\\L3.CEL", 0); - v2 = LoadFileInMem("Levels\\L3Data\\L3.TIL", 0); - v3 = "Levels\\L3Data\\L3.MIN"; -LABEL_12: - pMegaTiles = v2; - v4 = LoadFileInMem(v3, 0); - v5 = "Levels\\L1Data\\L1S.CEL"; - goto LABEL_14; + pMegaTiles = LoadFileInMem("Levels\\L4Data\\L4.TIL", 0); + pLevelPieces = LoadFileInMem("Levels\\L4Data\\L4.MIN", 0); + level_special_cel = LoadFileInMem("Levels\\L2Data\\L2S.CEL", 0); + break; + default: + TermMsg("LoadLvlGFX"); + return; } - pDungeonCels = LoadFileInMem("Levels\\L2Data\\L2.CEL", 0); - v0 = LoadFileInMem("Levels\\L2Data\\L2.TIL", 0); - v1 = "Levels\\L2Data\\L2.MIN"; -LABEL_10: - pMegaTiles = v0; - v4 = LoadFileInMem(v1, 0); - v5 = "Levels\\L2Data\\L2S.CEL"; -LABEL_14: - *(_DWORD *)&dpiece_defs[0].blocks = (unsigned int)v4; - level_special_cel = LoadFileInMem(v5, 0); } // 5BB1ED: using guessed type char leveltype; diff --git a/Source/gendung.cpp b/Source/gendung.cpp index b76871043..4a905a3e3 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -23,7 +23,7 @@ char dTransVal[112][112]; int setloadflag_2; // weak Tile tile_defs[1024]; void *pMegaTiles; -DPiece dpiece_defs[2]; +void *pLevelPieces; int gnDifficulty; // idb char block_lvid[2049]; //char byte_5B78EB; @@ -592,7 +592,7 @@ void __cdecl SetDungeonMicros() short (*v1)[112][112]; // edx int (*v2)[112]; // ebp int v3; // eax - int v4; // eax + char *v4; // eax signed int i; // ecx _WORD *v6; // edi int j; // ecx @@ -623,11 +623,11 @@ void __cdecl SetDungeonMicros() { v3 = (*v2)[0] - 1; if ( leveltype == DTYPE_HELL ) - v4 = *(_DWORD *)&dpiece_defs[0].blocks + 32 * v3; + v4 = (char *)pLevelPieces + 32 * v3; else - v4 = *(_DWORD *)&dpiece_defs[0].blocks + 20 * v3; + v4 = (char *)pLevelPieces + 20 * v3; for ( i = 0; i < v0; ++i ) - (*v1)[0][i] = *(_WORD *)(v4 + 2 * (v0 + (i & 1) - (i & 0xE)) - 4); + (*v1)[0][i] = *(_WORD *)&v4[2 * (v0 + (i & 1) - (i & 0xE)) - 4]; } else if ( v0 > 0 ) { diff --git a/Source/gendung.h b/Source/gendung.h index 97f20a63c..942bcc2ce 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -23,7 +23,7 @@ extern char dTransVal[112][112]; extern int setloadflag_2; // weak extern Tile tile_defs[1024]; extern void *pMegaTiles; -extern DPiece dpiece_defs[2]; +extern void *pLevelPieces; extern int gnDifficulty; // idb extern char block_lvid[2049]; //char byte_5B78EB; diff --git a/Source/objects.cpp b/Source/objects.cpp index 50dbbb2c5..b1c1d7399 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -3077,9 +3077,9 @@ void __fastcall ObjSetMicro(int dx, int dy, int pn) { int v3; // esi char *v4; // eax - int v5; // edx + char *v5; // edx signed int v6; // ecx - int v7; // esi + char *v7; // esi signed int v8; // ecx dPiece[0][dy + 112 * dx] = pn; @@ -3087,22 +3087,22 @@ void __fastcall ObjSetMicro(int dx, int dy, int pn) v4 = (char *)dpiece_defs_map_1 + 32 * gendung_get_dpiece_num_from_coord(dx, dy); if ( leveltype == DTYPE_HELL ) { - v7 = *(_DWORD *)&dpiece_defs[0].blocks + 32 * v3; + v7 = (char *)pLevelPieces + 32 * v3; v8 = 0; do { - *(_WORD *)&v4[2 * v8] = *(_WORD *)(v7 + 2 * ((v8 & 1) - (v8 & 0xE)) + 28); + *(_WORD *)&v4[2 * v8] = *(_WORD *)&v7[2 * ((v8 & 1) - (v8 & 0xE)) + 28]; ++v8; } while ( v8 < 16 ); } else { - v5 = *(_DWORD *)&dpiece_defs[0].blocks + 20 * v3; + v5 = (char *)pLevelPieces + 20 * v3; v6 = 0; do { - *(_WORD *)&v4[2 * v6] = *(_WORD *)(v5 + 2 * ((v6 & 1) - (v6 & 0xE)) + 16); + *(_WORD *)&v4[2 * v6] = *(_WORD *)&v5[2 * ((v6 & 1) - (v6 & 0xE)) + 16]; ++v6; } while ( v6 < 10 ); @@ -3121,8 +3121,8 @@ void __fastcall objects_set_door_piece(int x, int y) v2 = y; v3 = x; v4 = dPiece[0][y + 112 * x] - 1; - v5 = *(_WORD *)(20 * (unsigned short)v4 + *(_DWORD *)&dpiece_defs[0].blocks + 16); - v6 = *(_WORD *)(20 * (unsigned short)v4 + *(_DWORD *)&dpiece_defs[0].blocks + 18); + v5 = *((_WORD *)pLevelPieces + 10 * (unsigned short)v4 + 8); + v6 = *((_WORD *)pLevelPieces + 10 * (unsigned short)v4 + 9); dpiece_defs_map_1[0][0][16 * gendung_get_dpiece_num_from_coord(x, y)] = v5; dpiece_defs_map_1[0][0][16 * gendung_get_dpiece_num_from_coord(v3, v2) + 1] = v6; } diff --git a/Source/town.cpp b/Source/town.cpp index 3ccb40dd6..2295082ea 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -1365,7 +1365,7 @@ void __cdecl town_init_dpiece_defs_map() int v1; // ebp int v2; // esi char *v3; // edi - int v4; // ecx + char *v4; // ecx signed int v5; // eax int (*v6)[112]; // [esp+10h] [ebp-8h] int y; // [esp+14h] [ebp-4h] @@ -1382,11 +1382,11 @@ void __cdecl town_init_dpiece_defs_map() v3 = (char *)dpiece_defs_map_1 + 32 * gendung_get_dpiece_num_from_coord(v1, y); if ( v2 ) { - v4 = 32 * v2 + *(_DWORD *)&dpiece_defs[0].blocks - 32; + v4 = (char *)pLevelPieces + 32 * v2 - 32; v5 = 0; do { - *(_WORD *)&v3[2 * v5] = *(_WORD *)(v4 + 2 * ((v5 & 1) - (v5 & 0xE)) + 28); + *(_WORD *)&v3[2 * v5] = *(_WORD *)&v4[2 * ((v5 & 1) - (v5 & 0xE)) + 28]; ++v5; } while ( v5 < 16 ); diff --git a/structs.h b/structs.h index fbcf6e417..22c5f8a58 100644 --- a/structs.h +++ b/structs.h @@ -404,11 +404,6 @@ struct Tile short bottom; }; -struct DPiece -{ - short blocks; -}; - struct _SNETVERSIONDATA { int size;