Browse Source

Fix dpiece_defs, clean up LoadLvlGFX (#105)

Thanks to @MadHed, implements #102
pull/4/head
galaxyhaxz 8 years ago committed by GitHub
parent
commit
7d06ca540c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 89
      Source/diablo.cpp
  2. 10
      Source/gendung.cpp
  3. 2
      Source/gendung.h
  4. 16
      Source/objects.cpp
  5. 6
      Source/town.cpp
  6. 5
      structs.h

89
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;

10
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 )
{

2
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;

16
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;
}

6
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 );

5
structs.h

@ -404,11 +404,6 @@ struct Tile
short bottom;
};
struct DPiece
{
short blocks;
};
struct _SNETVERSIONDATA
{
int size;

Loading…
Cancel
Save