From 0c2940a807a5e1c01fb95e05ff9aa47d5eeac037 Mon Sep 17 00:00:00 2001 From: qndel Date: Wed, 13 Mar 2019 03:45:42 +0100 Subject: [PATCH 01/11] AddRhino bin exact --- Source/missiles.cpp | 71 ++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index df4b4bb1a..cf48caaa5 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2571,50 +2571,37 @@ void __fastcall miss_null_13(int mi, int sx, int sy, int dx, int dy, int midir, void __fastcall AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - CMonster *v10; // eax - char v11; // cl - AnimStruct *v12; // edi - int v13; // eax - CMonster *v14; // ecx - char v15; // cl - BOOLEAN v16; // zf - int i; // [esp+8h] [ebp-4h] + AnimStruct *anim; - v9 = id; - i = mi; - v10 = monster[id].MType; - v11 = v10->mtype; - if (v10->mtype < MT_HORNED || v11 > MT_OBLORD) { - if (v11 < MT_NSNAKE || (v12 = &v10->Anims[MA_ATTACK], v11 > MT_GSNAKE)) - v12 = &v10->Anims[MA_WALK]; + if (monster[id].MType->mtype < MT_HORNED || monster[id].MType->mtype > MT_OBLORD) { + if (monster[id].MType->mtype < MT_NSNAKE || monster[id].MType->mtype > MT_GSNAKE) { + anim = &monster[id].MType->Anims[MA_WALK]; + } else { + anim = &monster[id].MType->Anims[MA_ATTACK]; + } } else { - v12 = &v10->Anims[MA_SPECIAL]; - } - GetMissileVel(i, sx, sy, dx, dy, 18); - v13 = i; - missile[v13]._miAnimFlags = 0; - missile[v13]._mimfnum = midir; - missile[v13]._miAnimData = v12->Data[midir]; - missile[v13]._miAnimDelay = v12->Rate; - missile[v13]._miAnimLen = v12->Frames; - v14 = monster[v9].MType; - missile[v13]._miAnimWidth = v14->width; - missile[v13]._miAnimWidth2 = v14->width2; - missile[v13]._miAnimAdd = 1; - v15 = v14->mtype; - if (v15 >= MT_NSNAKE && v15 <= MT_GSNAKE) - missile[v13]._miAnimFrame = 7; - missile[v13]._miVar1 = 0; - missile[v13]._miVar2 = 0; - v16 = monster[v9]._uniqtype == 0; - missile[v13]._miLightFlag = 1; - if (!v16) { - missile[v13]._miUniqTrans = (unsigned char)monster[v9]._uniqtrans + 1; - missile[v13]._mlid = (unsigned char)monster[v9].mlid; - } - missile[v13]._mirange = 256; - PutMissile(i); + anim = &monster[id].MType->Anims[MA_SPECIAL]; + } + GetMissileVel(mi, sx, sy, dx, dy, 18); + missile[mi]._miAnimFlags = 0; + missile[mi]._mimfnum = midir; + missile[mi]._miAnimData = anim->Data[midir]; + missile[mi]._miAnimDelay = anim->Rate; + missile[mi]._miAnimLen = anim->Frames; + missile[mi]._miAnimWidth = monster[id].MType->width; + missile[mi]._miAnimWidth2 = monster[id].MType->width2; + missile[mi]._miAnimAdd = 1; + if (monster[id].MType->mtype >= MT_NSNAKE && monster[id].MType->mtype <= MT_GSNAKE) + missile[mi]._miAnimFrame = 7; + missile[mi]._miVar1 = 0; + missile[mi]._miVar2 = 0; + missile[mi]._miLightFlag = 1; + if (monster[id]._uniqtype != 0) { + missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1; + missile[mi]._mlid = monster[id].mlid; + } + missile[mi]._mirange = 256; + PutMissile(mi); } void __fastcall miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From 3e9b7962633c5f44da95b959eceae6aae69b1efd Mon Sep 17 00:00:00 2001 From: qndel Date: Sat, 16 Mar 2019 13:30:44 +0100 Subject: [PATCH 02/11] miLightFlag changed from 1/0 to TRUE/FALSE (#659) --- Source/missiles.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 20a45e7d1..e4fac062b 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2437,7 +2437,7 @@ void __fastcall miss_null_11(int mi, int sx, int sy, int dx, int dy, int midir, SetMissDir(mi, dx); v10 = v9; missile[v10]._midam = 0; - missile[v10]._miLightFlag = 1; + missile[v10]._miLightFlag = TRUE; missile[v10]._mirange = 250; } @@ -2454,7 +2454,7 @@ void __fastcall miss_null_12(int mi, int sx, int sy, int dx, int dy, int midir, SetMissDir(mi, v9); v11 = v10; missile[v11]._midam = 0; - missile[v11]._miLightFlag = 1; + missile[v11]._miLightFlag = TRUE; missile[v11]._mirange = 250; } @@ -2473,7 +2473,7 @@ void __fastcall miss_null_13(int mi, int sx, int sy, int dx, int dy, int midir, v11 = v10; v12 = missile[v10]._miAnimLen; missile[v11]._midam = 0; - missile[v11]._miLightFlag = 1; + missile[v11]._miLightFlag = TRUE; missile[v11]._mirange = v12; } @@ -2503,7 +2503,7 @@ void __fastcall AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, int missile[mi]._miAnimFrame = 7; missile[mi]._miVar1 = 0; missile[mi]._miVar2 = 0; - missile[mi]._miLightFlag = 1; + missile[mi]._miLightFlag = TRUE; if (monster[id]._uniqtype != 0) { missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1; missile[mi]._mlid = monster[id].mlid; @@ -2528,7 +2528,7 @@ void __fastcall miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, missile[mi]._miAnimAdd = 1; missile[mi]._miVar1 = 0; missile[mi]._miVar2 = 0; - missile[mi]._miLightFlag = 1; + missile[mi]._miLightFlag = TRUE; if (monster[id]._uniqtype != 0) missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1; dMonster[monster[id]._mx][monster[id]._my] = 0; @@ -2606,7 +2606,7 @@ void __fastcall AddAcidpud(int mi, int sx, int sy, int dx, int dy, int midir, in missile[v9]._miyvel = 0; missile[v9]._mixoff = 0; missile[v9]._miyoff = 0; - missile[v9]._miLightFlag = 1; + missile[v9]._miLightFlag = TRUE; v11 = random(50, 15); missile[v9]._miPreFlag = TRUE; missile[v9]._mirange = v11 + 40 * ((unsigned char)monster[v10]._mint + 1); @@ -2752,7 +2752,7 @@ void __fastcall miss_null_23(int mi, int sx, int sy, int dx, int dy, int midir, SetMissDir(mi, 0); else SetMissDir(mi, 1); - missile[mi]._miLightFlag = 1; + missile[mi]._miLightFlag = TRUE; missile[mi]._mirange = missile[mi]._miAnimLen; } @@ -3275,7 +3275,7 @@ int __fastcall AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, missile[mi]._mityoff = 0; missile[mi]._miDelFlag = FALSE; missile[mi]._miAnimAdd = 1; - missile[mi]._miLightFlag = 0; + missile[mi]._miLightFlag = FALSE; missile[mi]._miPreFlag = FALSE; missile[mi]._miUniqTrans = 0; missile[mi]._midam = midam; From ea9993e5b7c18f3f9a8e8de8fd45734cd2a96572 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 16 Mar 2019 13:32:09 +0100 Subject: [PATCH 03/11] Update structs.h --- structs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/structs.h b/structs.h index 0dce86953..d70b2db20 100644 --- a/structs.h +++ b/structs.h @@ -413,7 +413,7 @@ typedef struct MissileStruct { int _miAnimAdd; int _miAnimFrame; BOOL _miDrawFlag; - int _miLightFlag; + BOOL _miLightFlag; BOOL _miPreFlag; int _miUniqTrans; int _mirange; From 6ad0c235921a08c7326cdf249edd4fd9ec153203 Mon Sep 17 00:00:00 2001 From: qndel Date: Sat, 16 Mar 2019 13:23:27 +0100 Subject: [PATCH 04/11] MI_Firemove bin exact --- MakefileVC | 2 +- Source/missiles.cpp | 93 +++++++++++++++------------------------------ 2 files changed, 32 insertions(+), 63 deletions(-) diff --git a/MakefileVC b/MakefileVC index d7759ad6b..eb1a64f93 100644 --- a/MakefileVC +++ b/MakefileVC @@ -36,7 +36,7 @@ else VC6_LINK = wine $(VC6_BIN_DIR)/link.exe endif -CFLAGS=/nologo /c /TC /GX /W3 /O1 /I $(VC6_INC_DIR) /FD /MT /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fp"Diablo.pch" /YX /Gm /Zi /FA +CFLAGS=/nologo /c /TC /GX /W3 /O1 /I $(VC6_INC_DIR) /FD /MT /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fp"Diablo.pch" /YX /Gm /Zi /FAs LINKFLAGS=/nologo /subsystem:windows /machine:I386 /incremental:no ifeq ($(MAKE_BUILD),pdb) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index e4fac062b..c6cfaed96 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4265,75 +4265,44 @@ void __fastcall MI_Etherealize(int i) void __fastcall MI_Firemove(int i) { - int v1; // esi - int *v2; // eax - int v4; // ecx - int v5; // ebx - int v6; // ecx - int v7; // edx - int v8; // ecx - int v9; // ST10_4 - int v10; // ecx - int ExpLight[14]; // [esp+Ch] [ebp-3Ch] - int ia; // [esp+44h] [ebp-4h] + int j; + int ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12 }; - v1 = i; - ExpLight[3] = 5; - ExpLight[4] = 5; - missile[v1]._miyoff += 32; - ExpLight[11] = 12; - ExpLight[12] = 12; - --missile[v1]._mix; - --missile[v1]._miy; - ExpLight[0] = 2; - ExpLight[1] = 3; - ExpLight[2] = 4; - ExpLight[5] = 6; - ExpLight[6] = 7; - ExpLight[7] = 8; - ExpLight[8] = 9; - ExpLight[9] = 10; - ExpLight[10] = 11; - ia = i; - ExpLight[13] = 0; - v2 = &missile[i]._miVar1; - if (++*v2 == missile[i]._miAnimLen) { + missile[i]._mix--; + missile[i]._miy--; + missile[i]._miyoff += 32; + missile[i]._miVar1++; + if (missile[i]._miVar1 == missile[i]._miAnimLen) { SetMissDir(i, 1); - missile[v1]._miAnimFrame = random(82, 11) + 1; + missile[i]._miAnimFrame = random(82, 11) + 1; } - v4 = ia; - missile[v1]._mitxoff += missile[v1]._mixvel; - missile[v1]._mityoff += missile[v1]._miyvel; - GetMissilePos(v4); - v5 = missile[v1]._mirange; - CheckMissileCol(ia, missile[v1]._midam, missile[v1]._midam, 0, missile[v1]._mix, missile[v1]._miy, 0); - if (missile[v1]._miHitFlag) - missile[v1]._mirange = v5; - if (!missile[v1]._mirange) { - v6 = missile[v1]._mlid; - missile[v1]._miDelFlag = TRUE; - AddUnLight(v6); + missile[i]._mitxoff += missile[i]._mixvel; + missile[i]._mityoff += missile[i]._miyvel; + GetMissilePos(i); + j = missile[i]._mirange; + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 0, missile[i]._mix, missile[i]._miy, 0); + if (missile[i]._miHitFlag == TRUE) + missile[i]._mirange = j; + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + AddUnLight(missile[i]._mlid); } - if (missile[v1]._mimfnum || !missile[v1]._mirange) { - v7 = missile[v1]._mix; - if (v7 != missile[v1]._miVar3 || missile[v1]._miy != missile[v1]._miVar4) { - v8 = missile[v1]._mlid; - missile[v1]._miVar3 = v7; - v9 = missile[v1]._miy; - missile[v1]._miVar4 = v9; - ChangeLight(v8, v7, v9, 8); + if (missile[i]._mimfnum || !missile[i]._mirange) { + if (missile[i]._mix != missile[i]._miVar3 || missile[i]._miy != missile[i]._miVar4) { + missile[i]._miVar3 = missile[i]._mix; + missile[i]._miVar4 = missile[i]._miy; + ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, 8); } } else { - if (!missile[v1]._miVar2) - missile[v1]._mlid = AddLight(missile[v1]._mix, missile[v1]._miy, ExpLight[0]); - ChangeLight(missile[v1]._mlid, missile[v1]._mix, missile[v1]._miy, ExpLight[missile[v1]._miVar2]); - ++missile[v1]._miVar2; + if (!missile[i]._miVar2) + missile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, ExpLight[0]); + ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]); + missile[i]._miVar2++; } - ++missile[v1]._mix; - v10 = ia; - ++missile[v1]._miy; - missile[v1]._miyoff -= 32; - PutMissile(v10); + missile[i]._mix++; + missile[i]._miy++; + missile[i]._miyoff -= 32; + PutMissile(i); } void __fastcall MI_Guardian(int i) From f4a6de33b383bbba2f059e3e659b584f5d22205d Mon Sep 17 00:00:00 2001 From: qndel Date: Sat, 16 Mar 2019 18:06:50 +0100 Subject: [PATCH 05/11] MI_ResurrectBeam bin exact --- Source/missiles.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index c6cfaed96..18c024ba8 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -5451,14 +5451,9 @@ void __fastcall MI_Bonespirit(int i) void __fastcall MI_ResurrectBeam(int i) { - int v1; // eax - BOOLEAN v2; // zf - - v1 = i; - v2 = missile[i]._mirange == 1; - --missile[v1]._mirange; - if (v2) - missile[v1]._miDelFlag = TRUE; + missile[i]._mirange--; + if (missile[i]._mirange == 0) + missile[i]._miDelFlag = TRUE; PutMissile(i); } From aeb111c5fc074e4ca4d9cb5d4384affb58914b37 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Sat, 16 Mar 2019 20:01:02 -0500 Subject: [PATCH 06/11] Cleanup DRLG_L1Pass3 (#662) --- Source/drlg_l1.cpp | 152 ++++++++++++++++++++++++--------------------- Source/gendung.cpp | 2 +- Source/gendung.h | 2 +- 3 files changed, 83 insertions(+), 73 deletions(-) diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index d35470834..4fe2110c6 100644 --- a/Source/drlg_l1.cpp +++ b/Source/drlg_l1.cpp @@ -200,77 +200,87 @@ void __cdecl DRLG_L1Floor() void __cdecl DRLG_L1Pass3() { - int v0; // eax - int *v1; // edx - int *v2; // eax - signed int v3; // ecx - signed int v4; // ebx - int *v5; // ecx - unsigned char *v6; // edx - unsigned short *v7; // esi - unsigned short v8; // ax - int v9; // eax - int v10; // ST24_4 - int v11; // ST20_4 - int v12; // ST1C_4 - signed int v13; // [esp+Ch] [ebp-1Ch] - int *v14; // [esp+10h] [ebp-18h] - int v15; // [esp+14h] [ebp-14h] - int v16; // [esp+18h] [ebp-10h] - int v17; // [esp+1Ch] [ebp-Ch] - int v18; // [esp+20h] [ebp-8h] - - v0 = *((unsigned short *)pMegaTiles + 84) + 1; - v18 = *((unsigned short *)pMegaTiles + 84) + 1; - _LOWORD(v0) = *((_WORD *)pMegaTiles + 85); - v17 = ++v0; - _LOWORD(v0) = *((_WORD *)pMegaTiles + 86); - v16 = ++v0; - _LOWORD(v0) = *((_WORD *)pMegaTiles + 87); - v15 = v0 + 1; - v1 = dPiece[1]; - do { - v2 = v1; - v3 = 56; - do { - *(v2 - 112) = v18; - *v2 = v17; - *(v2 - 111) = v16; - v2[1] = v15; - v2 += 224; - --v3; - } while (v3); - v1 += 2; - } while ((signed int)v1 < (signed int)dPiece[2]); - v4 = 0; - v14 = &dPiece[17][16]; /* check */ - do { - v5 = v14; - v6 = (unsigned char *)dungeon + v4; - v13 = 40; - do { - v7 = (unsigned short *)((char *)pMegaTiles + 8 * (*v6 - 1)); - v8 = *v7; - ++v7; - v9 = v8 + 1; - v10 = v9; - _LOWORD(v9) = *v7; - ++v7; - v11 = ++v9; - _LOWORD(v9) = *v7; - v12 = ++v9; - _LOWORD(v9) = v7[1]; - v6 += 40; - *(v5 - 112) = v10; - *v5 = v11; - *(v5 - 111) = v12; - v5[1] = v9 + 1; - v5 += 224; - --v13; - } while (v13); - v14 += 2; - ++v4; - } while (v4 < 40); + int i, j, xx, yy; + long v1, v2, v3, v4, lv; + + lv = 22-1; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pMegaTiles + mov eax, lv + shl eax, 3 + add esi, eax + xor eax, eax + lodsw + inc eax + mov v1, eax + lodsw + inc eax + mov v2, eax + lodsw + inc eax + mov v3, eax + lodsw + inc eax + mov v4, eax + } +#else + v1 = *((WORD *)&pMegaTiles[lv*8])+1; + v2 = *((WORD *)&pMegaTiles[lv*8]+1)+1; + v3 = *((WORD *)&pMegaTiles[lv*8]+2)+1; + v4 = *((WORD *)&pMegaTiles[lv*8]+3)+1; +#endif + + for(j = 0; j < MAXDUNY; j += 2) { + for(i = 0; i < MAXDUNX; i += 2) { + dPiece[i][j] = v1; + dPiece[i+1][j] = v2; + dPiece[i][j+1] = v3; + dPiece[i+1][j+1] = v4; + } + } + + yy = 16; + for(j = 0; j < DMAXY; j++) { + xx = 16; + for(i = 0; i < DMAXX; i++) { + lv = (unsigned char)dungeon[i][j]-1; + /// ASSERT: assert(lv >= 0); +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pMegaTiles + mov eax, lv + shl eax, 3 + add esi, eax + xor eax, eax + lodsw + inc eax + mov v1, eax + lodsw + inc eax + mov v2, eax + lodsw + inc eax + mov v3, eax + lodsw + inc eax + mov v4, eax + } +#else + v1 = *((WORD *)&pMegaTiles[lv*8])+1; + v2 = *((WORD *)&pMegaTiles[lv*8]+1)+1; + v3 = *((WORD *)&pMegaTiles[lv*8]+2)+1; + v4 = *((WORD *)&pMegaTiles[lv*8]+3)+1; +#endif + dPiece[xx][yy] = v1; + dPiece[xx+1][yy] = v2; + dPiece[xx][yy+1] = v3; + dPiece[xx+1][yy+1] = v4; + xx += 2; + } + yy += 2; + } } void __cdecl DRLG_InitL1Vals() diff --git a/Source/gendung.cpp b/Source/gendung.cpp index c5e0df121..be001b97d 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -22,7 +22,7 @@ int dPiece[MAXDUNX][MAXDUNY]; char dTransVal[MAXDUNX][MAXDUNY]; int setloadflag_2; // weak int tile_defs[2048]; -void *pMegaTiles; +BYTE *pMegaTiles; void *pLevelPieces; int gnDifficulty; // idb char block_lvid[2049]; diff --git a/Source/gendung.h b/Source/gendung.h index 9381e8fb7..83067f16b 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -22,7 +22,7 @@ extern int dPiece[MAXDUNX][MAXDUNY]; extern char dTransVal[MAXDUNX][MAXDUNY]; extern int setloadflag_2; // weak extern int tile_defs[2048]; -extern void *pMegaTiles; +extern BYTE *pMegaTiles; extern void *pLevelPieces; extern int gnDifficulty; // idb extern char block_lvid[2049]; From 2c51f65d140bcbc7a8a930f7c4a3401d83353c97 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Sat, 16 Mar 2019 20:33:07 -0500 Subject: [PATCH 07/11] Cleanup ObjSetMini (#664) --- Source/objects.cpp | 66 ++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/Source/objects.cpp b/Source/objects.cpp index e45afa496..9881d75dc 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2629,34 +2629,44 @@ void __fastcall objects_set_door_piece(int x, int y) void __fastcall ObjSetMini(int x, int y, int v) { - unsigned short *v3; // esi - unsigned short v4; // ax - int v5; // eax - int pn; // ST1C_4 - int v7; // ST18_4 - int v8; // ST14_4 - int v9; // ST10_4 - int v10; // esi - int v11; // edi - - v3 = (unsigned short *)((char *)pMegaTiles + 8 * ((unsigned short)v - 1)); - v4 = *v3; - ++v3; - v5 = v4 + 1; - pn = v5; - _LOWORD(v5) = *v3; - ++v3; - v7 = ++v5; - _LOWORD(v5) = *v3; - v8 = ++v5; - _LOWORD(v5) = v3[1]; - v9 = v5 + 1; - v10 = 2 * x + 16; - v11 = 2 * y + 16; - ObjSetMicro(v10, v11, pn); - ObjSetMicro(v10 + 1, v11++, v7); - ObjSetMicro(v10, v11, v8); - ObjSetMicro(v10 + 1, v11, v9); + int xx, yy; + long v1, v2, v3, v4; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pMegaTiles + xor eax, eax + mov ax, word ptr v + dec eax + shl eax, 3 + add esi, eax + xor eax, eax + lodsw + inc eax + mov v1, eax + lodsw + inc eax + mov v2, eax + lodsw + inc eax + mov v3, eax + lodsw + inc eax + mov v4, eax + } +#else + v1 = *((WORD *)&pMegaTiles[((WORD)v-1)*8])+1; + v2 = *((WORD *)&pMegaTiles[((WORD)v-1)*8]+1)+1; + v3 = *((WORD *)&pMegaTiles[((WORD)v-1)*8]+2)+1; + v4 = *((WORD *)&pMegaTiles[((WORD)v-1)*8]+3)+1; +#endif + + 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); } void __fastcall ObjL1Special(int x1, int y1, int x2, int y2) From ae017aac791980f6f6389f6d1ed1975f9e17a874 Mon Sep 17 00:00:00 2001 From: qndel Date: Sun, 17 Mar 2019 02:46:52 +0100 Subject: [PATCH 08/11] mi_null_32 bin exact (#660) * mi_null_32 bin exact --- Source/missiles.cpp | 100 +++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 67 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 18c024ba8..62394d8c0 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4700,78 +4700,44 @@ void __fastcall MI_Rhino(int i) void __fastcall mi_null_32(int i) { - int v1; // edi - int v2; // esi - int v3; // ebx - int v4; // edi - int v5; // eax - int v6; // eax - int v7; // ecx - int v8; // eax - int v9; // eax - int v10; // ebx - int v11; // eax - //int v12; // eax - int v13; // ecx - int v14; // ecx - unsigned char *v15; // eax - int v16; // [esp+Ch] [ebp-14h] - int arglist; // [esp+10h] [ebp-10h] - int x; // [esp+14h] [ebp-Ch] - int y; // [esp+18h] [ebp-8h] - int a3; // [esp+1Ch] [ebp-4h] + int src, enemy, ax, ay, bx, by, cx, cy, j; - v1 = i; - arglist = i; GetMissilePos(i); - v2 = v1; - v3 = missile[v1]._mix; - a3 = missile[v1]._miy; - missile[v2]._mitxoff += missile[v1]._mixvel; - missile[v2]._mityoff += missile[v1]._miyvel; - GetMissilePos(v1); - v4 = missile[v1]._misource; - y = missile[v2]._miy; - v5 = monster[v4]._menemy; - x = missile[v2]._mix; - if (monster[v4]._mFlags & MFLAG_TARGETS_MONSTER) { - v9 = v5; - v7 = monster[v9]._mx; - v8 = monster[v9]._my; + ax = missile[i]._mix; + ay = missile[i]._miy; + missile[i]._mitxoff += missile[i]._mixvel; + missile[i]._mityoff += missile[i]._miyvel; + GetMissilePos(i); + src = missile[i]._misource; + bx = missile[i]._mix; + by = missile[i]._miy; + enemy = monster[src]._menemy; + if (!(monster[src]._mFlags & MFLAG_TARGETS_MONSTER)) { + cx = plr[enemy].WorldX; + cy = plr[enemy].WorldY; } else { - v6 = v5; - v7 = plr[v6].WorldX; - v8 = plr[v6].WorldY; - } - v16 = v8; - if ((missile[v2]._mix != v3 || y != a3) - && (missile[v2]._miVar1 & 1 && (abs(v3 - v7) >= 4 || abs(a3 - v16) >= 4) || missile[v2]._miVar2 > 1) - && PosOkMonst(missile[v2]._misource, v3, a3)) { - MissToMonst(arglist, v3, a3); - v10 = v16; - missile[v2]._miDelFlag = TRUE; + cx = monster[enemy]._mx; + cy = monster[enemy]._my; + } + if ((bx != ax || by != ay) && (missile[i]._miVar1 & 1 && (abs(ax - cx) >= 4 || abs(ay - cy) >= 4) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, ax, ay)) { + MissToMonst(i, ax, ay); + missile[i]._miDelFlag = TRUE; + } else if (!(monster[src]._mFlags & MFLAG_TARGETS_MONSTER)) { + j = dPlayer[bx][by]; } else { - v11 = x; - if (monster[v4]._mFlags & MFLAG_TARGETS_MONSTER) - v10 = dMonster[v11][y]; - else - v10 = dPlayer[v11][y]; - } - //_LOBYTE(v12) = PosOkMissile(x, y); - if (!PosOkMissile(x, y) || v10 > 0 && !(missile[v2]._miVar1 & 1)) { - missile[v2]._mixvel = -missile[v2]._mixvel; - v13 = missile[v2]._mimfnum; - missile[v2]._miyvel = -missile[v2]._miyvel; - v14 = opposite[v13]; - missile[v2]._mimfnum = v14; - v15 = monster[v4].MType->Anims[MA_WALK].Data[v14]; - ++missile[v2]._miVar2; - missile[v2]._miAnimData = v15; - if (v10 > 0) - missile[v2]._miVar1 |= 1u; + j = dMonster[bx][by]; } - MoveMissilePos(arglist); - PutMissile(arglist); + if (!PosOkMissile(bx, by) || j > 0 && !(missile[i]._miVar1 & 1)) { + missile[i]._mixvel *= -1; + missile[i]._miyvel *= -1; + missile[i]._mimfnum = opposite[missile[i]._mimfnum]; + missile[i]._miAnimData = monster[src].MType->Anims[MA_WALK].Data[missile[i]._mimfnum]; + missile[i]._miVar2++; + if (j > 0) + missile[i]._miVar1 |= 1; + } + MoveMissilePos(i); + PutMissile(i); } void __fastcall MI_FirewallC(int i) From 3114f4b2ba80c73524b985b0c7ac74932a38943b Mon Sep 17 00:00:00 2001 From: qndel Date: Sun, 17 Mar 2019 14:36:37 +0100 Subject: [PATCH 09/11] MI_Rportal bin exact (#666) --- Source/missiles.cpp | 59 ++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 44 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 62394d8c0..1b6887db6 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -5425,53 +5425,24 @@ void __fastcall MI_ResurrectBeam(int i) void __fastcall MI_Rportal(int i) { - int v1; // esi - int v2; // eax - int v3; // ecx - int ExpLight[17]; // [esp+8h] [ebp-48h] - int ia; // [esp+4Ch] [ebp-4h] + int ExpLight[17] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15 }; - v1 = i; - ExpLight[14] = 15; - ExpLight[15] = 15; - ExpLight[16] = 15; - v2 = missile[i]._mirange; - ia = i; - ExpLight[0] = 1; - ExpLight[1] = 2; - ExpLight[2] = 3; - ExpLight[3] = 4; - ExpLight[4] = 5; - ExpLight[5] = 6; - ExpLight[6] = 7; - ExpLight[7] = 8; - ExpLight[8] = 9; - ExpLight[9] = 10; - ExpLight[10] = 11; - ExpLight[11] = 12; - ExpLight[12] = 13; - ExpLight[13] = 14; - if (v2 > 1) - missile[v1]._mirange = v2 - 1; - if (missile[v1]._mirange == missile[v1]._miVar1) + if (missile[i]._mirange > 1) + missile[i]._mirange--; + if (missile[i]._mirange == missile[i]._miVar1) SetMissDir(i, 1); - if (currlevel && missile[v1]._mimfnum != 1) { - if (!missile[v1]._mirange) { - LABEL_12: - v3 = missile[v1]._mlid; - missile[v1]._miDelFlag = TRUE; - AddUnLight(v3); - goto LABEL_13; - } - if (!missile[v1]._miVar2) - missile[v1]._mlid = AddLight(missile[v1]._mix, missile[v1]._miy, 1); - ChangeLight(missile[v1]._mlid, missile[v1]._mix, missile[v1]._miy, ExpLight[missile[v1]._miVar2]); - ++missile[v1]._miVar2; + + if (currlevel && missile[i]._mimfnum != 1 && missile[i]._mirange != 0) { + if (!missile[i]._miVar2) + missile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 1); + ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]); + missile[i]._miVar2++; } - if (!missile[v1]._mirange) - goto LABEL_12; -LABEL_13: - PutMissile(ia); + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + AddUnLight(missile[i]._mlid); + } + PutMissile(i); } void __cdecl ProcessMissiles() From d002d9f4e060ec94a7ff3a1fb565d889d9c07b2e Mon Sep 17 00:00:00 2001 From: JustAnotherGuid <46401660+JustAnotherGuid@users.noreply.github.com> Date: Sun, 17 Mar 2019 17:40:35 +0100 Subject: [PATCH 10/11] Add TC to the VS projects (#667) --- Diablo.dsp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Diablo.dsp b/Diablo.dsp index 7aedd71d4..1fb138300 100644 --- a/Diablo.dsp +++ b/Diablo.dsp @@ -44,7 +44,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /TC /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" @@ -70,7 +70,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O1 /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /TC /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" @@ -97,7 +97,7 @@ LINK32=link.exe # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # SUBTRACT BASE CPP /WX -# ADD CPP /nologo /MT /W3 /GX /Zi /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FAs /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /Zi /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FAs /YX /FD /TC /c # SUBTRACT CPP /WX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 From 0bb9f666b3a63c89fdf644153b0349b1bc7dc0e8 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Sun, 17 Mar 2019 15:56:53 -0500 Subject: [PATCH 11/11] Clean remaining .CEL functions (#657) --- Source/control.cpp | 8 +- Source/engine.cpp | 1294 ++++++++++++++++++++++++++----------------- Source/engine.h | 18 +- Source/inv.cpp | 42 +- Source/scrollrt.cpp | 42 +- Source/town.cpp | 18 +- 6 files changed, 852 insertions(+), 570 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index ae45644eb..9b57322eb 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -1021,20 +1021,20 @@ void __cdecl InitControlPan() pSpellCels = LoadFileInMem("CtrlPan\\SpelIcon.CEL", 0); SetSpellTrans(RSPLTYPE_SKILL); pStatusPanel = LoadFileInMem("CtrlPan\\Panel8.CEL", 0); - CelDecodeRect((char *)pBtmBuff, 0, 143, 640, (char *)pStatusPanel, 1, 640); + CelDecodeRect((BYTE *)pBtmBuff, 0, 143, 640, (BYTE *)pStatusPanel, 1, 640); v1 = pStatusPanel; pStatusPanel = 0; mem_free_dbg(v1); pStatusPanel = LoadFileInMem("CtrlPan\\P8Bulbs.CEL", 0); - CelDecodeRect(pLifeBuff, 0, 87, 88, (char *)pStatusPanel, 1, 88); - CelDecodeRect(pManaBuff, 0, 87, 88, (char *)pStatusPanel, 2, 88); + CelDecodeRect((BYTE *)pLifeBuff, 0, 87, 88, (BYTE *)pStatusPanel, 1, 88); + CelDecodeRect((BYTE *)pManaBuff, 0, 87, 88, (BYTE *)pStatusPanel, 2, 88); v2 = pStatusPanel; pStatusPanel = 0; mem_free_dbg(v2); talkflag = 0; if (gbMaxPlayers != 1) { pTalkPanel = LoadFileInMem("CtrlPan\\TalkPanl.CEL", 0); - CelDecodeRect((char *)pBtmBuff, 0, 287, 640, (char *)pTalkPanel, 1, 640); + CelDecodeRect((BYTE *)pBtmBuff, 0, 287, 640, (BYTE *)pTalkPanel, 1, 640); v3 = pTalkPanel; pTalkPanel = 0; mem_free_dbg(v3); diff --git a/Source/engine.cpp b/Source/engine.cpp index 01086dbb1..7bc1189d7 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -599,163 +599,195 @@ void __fastcall CelDecodeLightOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int } // 69BEF8: using guessed type int light_table_index; -void __fastcall CelDecodeHdrLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction) +void __fastcall CelDecodeHdrLightOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v7; // esi - char *v8; // ecx - int v9; // edi - char *v10; // edx - int v11; // ebx - int v12; // ebx - char *v13; // edx - char *v14; // ecx - int v15; // [esp+Ch] [ebp-4h] - char *cel_buf; // [esp+18h] [ebp+8h] - - v7 = screen_y; - v15 = screen_x; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - v9 = *(_DWORD *)&pCelBuff[4 * frame]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + always_0]; - cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0]; - if (v11) { - if (direction != 8 && *(_WORD *)&v10[direction]) - v12 = *(unsigned short *)&v10[direction] - (_DWORD)cel_buf; - else - v12 = *(_DWORD *)&v8[4 * frame + 4] - v9 - (_DWORD)cel_buf; - v13 = &v10[(_DWORD)cel_buf]; - v14 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * always_0] + v15; - if (light_table_index) - CelDecDatLightOnly((BYTE *)v14, (BYTE *)v13, v12, frame_width); - else - CelDrawDatOnly((BYTE *)v14, (BYTE *)v13, v12, frame_width); - } - } - } + int hdr, nDataSize, v1, v2; + BYTE *pRLEBytes, *pDecodeTo, *tmp, *v9; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + v9 = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&v9[always_0]; + if(!hdr) + return; + + v1 = pFrameTable[1] - pFrameTable[0]; + if(dir == 8) + v2 = 0; + else + v2 = *(WORD *)&v9[dir]; + if(v2) + nDataSize = v2 - hdr; + else + nDataSize = v1 - hdr; + + pRLEBytes = &v9[hdr]; + tmp = (BYTE *)gpBuffer; + pDecodeTo = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + if(light_table_index) + CelDecDatLightOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); + else + CelDrawDatOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); } // 69BEF8: using guessed type int light_table_index; -void __fastcall CelDecodeHdrLightTrans(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction) +void __fastcall CelDecodeHdrLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - char *v6; // eax - int v7; // esi - char *v8; // edx - int v9; // ebx - int v10; // eax - int v11; // eax - char *v12; // edx - - v6 = pCelBuff; - if (pCelBuff) { - if (pBuff) { - v7 = *(_DWORD *)&pCelBuff[4 * frame]; - v8 = &pCelBuff[v7]; - v9 = *(unsigned short *)&v6[v7 + always_0]; - if (*(_WORD *)&v6[v7 + always_0]) { - v10 = *(_DWORD *)&v6[4 * frame + 4] - v7; - if (direction != 8 && *(_WORD *)&v8[direction]) - v11 = *(unsigned short *)&v8[direction] - v9; - else - v11 = v10 - v9; - v12 = &v8[v9]; - if (cel_transparency_active) { - CelDecDatLightTrans((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); - } else if (light_table_index) { - CelDecDatLightOnly((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); - } else { - CelDrawDatOnly((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); - } - } - } - } + int hdr, nDataSize, v1, v2; + BYTE *pRLEBytes, *v9; + DWORD *pFrameTable; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(pBuff != NULL); + if(!pBuff) + return; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + v9 = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&v9[always_0]; + if(!hdr) + return; + + v1 = pFrameTable[1] - pFrameTable[0]; + if(dir == 8) + v2 = 0; + else + v2 = *(WORD *)&v9[dir]; + if(v2) + nDataSize = v2 - hdr; + else + nDataSize = v1 - hdr; + + pRLEBytes = &v9[hdr]; + + if(cel_transparency_active) + CelDecDatLightTrans(pBuff, pRLEBytes, nDataSize, nWidth); + else if(light_table_index) + CelDecDatLightOnly(pBuff, pRLEBytes, nDataSize, nWidth); + else + CelDrawDatOnly(pBuff, pRLEBytes, nDataSize, nWidth); } // 69BEF8: using guessed type int light_table_index; // 69CF94: using guessed type int cel_transparency_active; -void __fastcall CelDrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1) +void __fastcall CelDrawHdrLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light) { - char *v8; // esi - int v9; // ebx - int v10; // eax - char *v11; // edi - int v12; // ecx - int v13; // esi - int v14; // eax - int v15; // eax - _BYTE *v16; // esi - char *v17; // edi - int v18; // edx - int v19; // eax - int v20; // ecx - int v21; // [esp+Ch] [ebp-4h] - char *v22; // [esp+Ch] [ebp-4h] - char *cel_buf; // [esp+18h] [ebp+8h] - char *cel_bufa; // [esp+18h] [ebp+8h] - int framea; // [esp+1Ch] [ebp+Ch] - int always_0a; // [esp+24h] [ebp+14h] - int directiona; // [esp+28h] [ebp+18h] - - v21 = screen_x; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - v9 = *(_DWORD *)&pCelBuff[4 * frame]; - v10 = always_0; - v11 = &pCelBuff[v9]; - v12 = *(unsigned short *)&pCelBuff[v9 + always_0]; - cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0]; - if (v12) { - v13 = *(_DWORD *)&v8[4 * frame + 4] - v9; - if (direction != 8 && *(_WORD *)&v11[direction]) - always_0a = *(unsigned short *)&v11[direction] - (_DWORD)cel_buf; - else - always_0a = v13 - (_DWORD)cel_buf; - directiona = (int)&v11[(_DWORD)cel_buf]; - cel_bufa = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * v10] + v21; - v14 = -(light4flag != 0); - _LOWORD(v14) = v14 & 0xF400; - v15 = v14 + 4096; - framea = v15; - if (always_1 == 2) { - v15 += 256; - framea = v15; + int w, hdr, idx, nDataSize, v1; + BYTE *src, *dst, *tbl, *tmp, *pRLEBytes; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + pRLEBytes = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + v1 = 0; + else + v1 = *(WORD *)&pRLEBytes[dir]; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize = pFrameTable[1] - pFrameTable[0] - hdr; + + src = &pRLEBytes[hdr]; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + idx = light4flag ? 1024 : 4096; + if(light == 2) + idx += 256; + if(light >= 4) + idx += (light - 1) << 8; + + tbl = (BYTE *)&pLightTbl[idx]; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, src + mov edi, dst + mov eax, 768 + add eax, nWidth + mov w, eax /* use C for w? w = 768 + nWidth */ + mov ebx, nDataSize + add ebx, esi + label1: + mov edx, nWidth + label2: + xor eax, eax + mov al, [esi] + inc esi + test al, al + js label4 + push ebx + mov ebx, tbl + sub edx, eax + mov ecx, eax + label3: + mov al, [esi] + inc esi + mov al, [ebx+eax] + mov [edi], al + dec ecx + lea edi, [edi+1] + jnz label3 + pop ebx + test edx, edx + jz label5 + jmp label2 + label4: + neg al + add edi, eax + sub edx, eax + jnz label2 + label5: + sub edi, w + cmp ebx, esi + jnz label1 + } +#else + BYTE width; + BYTE *end; + + end = &src[nDataSize]; + + for(; src != end; dst -= 768 + nWidth) { + for(w = nWidth; w;) { + width = *src++; + if(!(width & 0x80)) { + w -= width; + while(width) { + *dst = tbl[*src]; + src++; + dst++; + width--; } - if (always_1 >= 4) - framea = v15 + (always_1 << 8) - 256; - v22 = &pLightTbl[framea]; - v16 = (_BYTE *)directiona; - v17 = cel_bufa; - do { - v18 = frame_width; - do { - while (1) { - v19 = (unsigned char)*v16++; - if ((v19 & 0x80u) == 0) - break; - _LOBYTE(v19) = -(char)v19; - v17 += v19; - v18 -= v19; - if (!v18) - goto LABEL_20; - } - v18 -= v19; - v20 = v19; - do { - _LOBYTE(v19) = *v16++; - *v17 = v22[v19]; - --v20; - ++v17; - } while (v20); - } while (v18); - LABEL_20: - v17 += -frame_width - 768; - } while ((_BYTE *)(directiona + always_0a) != v16); + } else { + width = -(char)width; + dst += width; + w -= width; } } } +#endif } // 525728: using guessed type int light4flag; @@ -1316,388 +1348,638 @@ L_ODD: // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int gpBufEnd; -void __fastcall Cel2DecodeHdrLight(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction) +void __fastcall Cel2DecodeHdrLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v7; // esi - char *v8; // eax - int v9; // edi - char *v10; // edx - int v11; // ebx - int v12; // eax - int v13; // edi - int v14; // eax - char *v15; // edx - char *v16; // ecx - char *cel_buf; // [esp+18h] [ebp+8h] - - v7 = screen_y; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - v9 = *(_DWORD *)&pCelBuff[4 * frame]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + a6]; - cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + a6]; - if (v11) { - v12 = *(_DWORD *)&v8[4 * frame + 4] - v9; - v13 = *(unsigned short *)&v10[direction]; - if (direction == 8) - v13 = 0; - if (v13) - v14 = v13 - (_DWORD)cel_buf; - else - v14 = v12 - (_DWORD)cel_buf; - v15 = &v10[(_DWORD)cel_buf]; - v16 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x; - if (light_table_index) - Cel2DecDatLightOnly((BYTE *)v16, (BYTE *)v15, v14, frame_width); - else - Cel2DecDatOnly((BYTE *)v16, (BYTE *)v15, v14, frame_width); - } - } - } + int hdr, nDataSize, v1; + BYTE *pRLEBytes, *pDecodeTo, *tmp, *v9; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + v9 = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&v9[always_0]; + if(!hdr) + return; + + v1 = *(WORD *)&v9[dir]; + if(dir == 8) + v1 = 0; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize = pFrameTable[1] - pFrameTable[0] - hdr; + + pRLEBytes = &v9[hdr]; + tmp = (BYTE *)gpBuffer; + pDecodeTo = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + if(light_table_index) + Cel2DecDatLightOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); + else + Cel2DecDatOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); } // 69BEF8: using guessed type int light_table_index; -void __fastcall Cel2DecodeLightTrans(char *dst_buf, char *pCelBuff, int frame, int frame_width, int a5, int direction) +void __fastcall Cel2DecodeLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - char *v6; // eax - int v7; // esi - char *v8; // edx - int v9; // ebx - int v10; // eax - int v11; // esi - int v12; // eax - char *v13; // edx - - v6 = pCelBuff; - if (pCelBuff) { - v7 = *(_DWORD *)&pCelBuff[4 * frame]; - v8 = &pCelBuff[v7]; - v9 = *(unsigned short *)&v6[v7 + a5]; - if (*(_WORD *)&v6[v7 + a5]) { - v10 = *(_DWORD *)&v6[4 * frame + 4] - v7; - v11 = *(unsigned short *)&v8[direction]; - if (direction == 8) - v11 = 0; - if (v11) - v12 = v11 - v9; - else - v12 = v10 - v9; - v13 = &v8[v9]; - if (cel_transparency_active) { - Cel2DecDatLightTrans((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); - } else if (light_table_index) { - Cel2DecDatLightOnly((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); - } else { - Cel2DecDatOnly((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); - } - } - } + int hdr, nDataSize, v1, v2; + BYTE *pRLEBytes, *v9; + DWORD *pFrameTable; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + v9 = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&v9[always_0]; + if(!hdr) + return; + + v1 = pFrameTable[1] - pFrameTable[0]; + v2 = *(WORD *)&v9[dir]; + if(dir == 8) + v2 = 0; + if(v2) + nDataSize = v2 - hdr; + else + nDataSize = v1 - hdr; + + pRLEBytes = &v9[hdr]; + + if(cel_transparency_active) + Cel2DecDatLightTrans(pBuff, pRLEBytes, nDataSize, nWidth); + else if(light_table_index) + Cel2DecDatLightOnly(pBuff, pRLEBytes, nDataSize, nWidth); + else + Cel2DecDatOnly(pBuff, pRLEBytes, nDataSize, nWidth); } // 69BEF8: using guessed type int light_table_index; // 69CF94: using guessed type int cel_transparency_active; -void __fastcall Cel2DrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1) +void __fastcall Cel2DrawHdrLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light) { - char *v8; // esi - int v9; // ebx - char *v10; // edi - int v11; // ecx - int v12; // esi - int v13; // eax - int v14; // eax - _BYTE *v15; // esi - _BYTE *v16; // edi - int v17; // ecx - int v18; // edx - int v19; // ecx - int v20; // eax - _BYTE *v21; // [esp-4h] [ebp-14h] - int v22; // [esp+Ch] [ebp-4h] - char *cel_buf; // [esp+18h] [ebp+8h] - char *cel_bufa; // [esp+18h] [ebp+8h] - int framea; // [esp+1Ch] [ebp+Ch] - char *always_0a; // [esp+24h] [ebp+14h] - int directiona; // [esp+28h] [ebp+18h] - - v22 = screen_x; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - v9 = *(_DWORD *)&pCelBuff[4 * frame]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + always_0]; - cel_buf = (char *)*(unsigned short *)&pCelBuff[v9 + always_0]; - if (v11) { - v12 = *(_DWORD *)&v8[4 * frame + 4] - v9; - if (direction != 8 && *(_WORD *)&v10[direction]) - framea = *(unsigned short *)&v10[direction] - (_DWORD)cel_buf; - else - framea = v12 - (_DWORD)cel_buf; - directiona = (int)&v10[(_DWORD)cel_buf]; - always_0a = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * always_0] + v22; - v13 = -(light4flag != 0); - _LOWORD(v13) = v13 & 0xF400; - v14 = v13 + 4096; - if (always_1 == 2) - v14 += 256; - if (always_1 >= 4) - v14 = v14 + (always_1 << 8) - 256; - cel_bufa = &pLightTbl[v14]; - v15 = (_BYTE *)directiona; - v16 = (unsigned char *)always_0a; - v17 = directiona + framea; - do { - v21 = (_BYTE *)v17; - v18 = frame_width; - v19 = 0; - do { - while (1) { - v20 = (unsigned char)*v15++; - if ((v20 & 0x80u) == 0) - break; - _LOBYTE(v20) = -(char)v20; - v16 += v20; - v18 -= v20; - if (!v18) - goto LABEL_21; - } - v18 -= v20; - if (v16 < gpBufEnd) { - do { - _LOBYTE(v19) = *v15++; - *v16 = cel_bufa[v19]; - --v20; - ++v16; - } while (v20); - } else { - v15 += v20; - v16 += v20; - } - } while (v18); - LABEL_21: - v17 = (int)v21; - v16 += -frame_width - 768; - } while (v21 != v15); - } - } - } -} -// 525728: using guessed type int light4flag; -// 69CF0C: using guessed type int gpBufEnd; + int w, hdr, idx, nDataSize, v1; + BYTE *src, *dst, *tbl, *tmp, *pRLEBytes; + DWORD *pFrameTable; -void __fastcall CelDecodeRect(char *pBuff, int always_0, int dst_height, int dst_width, char *pCelBuff, int frame, int frame_width) -{ - char *v7; // ebx - char *v8; // esi - char *v9; // edi - int v10; // ebx - int v11; // edx - unsigned int v12; // eax - unsigned int v13; // ecx - char v14; // cf - unsigned int v15; // ecx - int dst_widtha; // [esp+14h] [ebp+Ch] - - if (pCelBuff && pBuff) { - v7 = &pCelBuff[4 * frame]; - v8 = &pCelBuff[*(_DWORD *)v7]; - v9 = &pBuff[dst_width * dst_height + always_0]; - dst_widtha = frame_width + dst_width; - v10 = (int)&v8[*((_DWORD *)v7 + 1) - *(_DWORD *)v7]; - do { - v11 = frame_width; - do { - while (1) { - v12 = (unsigned char)*v8++; - if ((v12 & 0x80u) == 0) - break; - _LOBYTE(v12) = -(char)v12; - v9 += v12; - v11 -= v12; - if (!v11) - goto LABEL_14; - } - v11 -= v12; - v13 = v12 >> 1; - if (v12 & 1) { - *v9++ = *v8++; - if (!v13) - continue; - } - v14 = v13 & 1; - v15 = v12 >> 2; - if (v14) { - *(_WORD *)v9 = *(_WORD *)v8; - v8 += 2; - v9 += 2; - if (!v15) - continue; - } - qmemcpy(v9, v8, 4 * v15); - v8 += 4 * v15; - v9 += 4 * v15; - } while (v11); - LABEL_14: - v9 -= dst_widtha; - } while ((char *)v10 != v8); - } -} + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; -void __fastcall CelDecodeClr(BYTE colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction) -{ - char *v8; // ebx - int v9; // eax - char *v10; // esi - char *v11; // edi - int v12; // edx - int v13; // eax - int v14; // ecx - char v15; // al - int v16; // [esp+Ch] [ebp-10h] - char *v17; // [esp+10h] [ebp-Ch] - int v18; // [esp+14h] [ebp-8h] - char v19; // [esp+18h] [ebp-4h] - - v19 = colour; - if (pCelBuff) { - if (gpBuffer) { - v8 = &pCelBuff[4 * frame]; - v17 = &pCelBuff[*(_DWORD *)v8]; - v16 = *(unsigned short *)&v17[a7]; - if (*(_WORD *)&v17[a7]) { - if (direction == 8) - v9 = 0; - else - v9 = *(unsigned short *)&v17[direction]; - if (v9) - v18 = v9 - v16; - else - v18 = *((_DWORD *)v8 + 1) - *(_DWORD *)v8 - v16; - v10 = &v17[v16]; - v11 = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + screen_x; - do { - v12 = frame_width; - do { - while (1) { - v13 = (unsigned char)*v10++; - if ((v13 & 0x80u) == 0) - break; - _LOBYTE(v13) = -(char)v13; - v11 += v13; - v12 -= v13; - if (!v12) - goto LABEL_20; - } - v12 -= v13; - v14 = v13; - do { - v15 = *v10++; - if (v15) { - *(v11 - 768) = v19; - *(v11 - 1) = v19; - v11[1] = v19; - v11[768] = v19; - } - ++v11; - --v14; - } while (v14); - } while (v12); - LABEL_20: - v11 += -frame_width - 768; - } while (&v17[v16 + v18] != v10); - } - } + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + pRLEBytes = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + v1 = 0; + else + v1 = *(WORD *)&pRLEBytes[dir]; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize = pFrameTable[1] - pFrameTable[0] - hdr; + + src = &pRLEBytes[hdr]; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + idx = light4flag ? 1024 : 4096; + if(light == 2) + idx += 256; + if(light >= 4) + idx += (light - 1) << 8; + + tbl = (BYTE *)&pLightTbl[idx]; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov eax, nWidth + add eax, 768 + mov w, eax /* use C for w? w = 768 + nWidth */ + mov esi, src + mov edi, dst + mov ecx, nDataSize + add ecx, esi + label1: + push ecx + mov edx, nWidth + xor ecx, ecx + label2: + xor eax, eax + mov al, [esi] + inc esi + test al, al + js label5 + mov ebx, tbl + sub edx, eax + cmp edi, gpBufEnd + jb label3 + add esi, eax + add edi, eax + jmp label4 + label3: + mov cl, [esi] + inc esi + mov cl, [ebx+ecx] + mov [edi], cl + dec eax + lea edi, [edi+1] + jnz label3 + label4: + test edx, edx + jz label6 + jmp label2 + label5: + neg al + add edi, eax + sub edx, eax + jnz label2 + label6: + pop ecx + sub edi, w + cmp ecx, esi + jnz label1 } -} +#else + BYTE width; + BYTE *end; -void __fastcall CelDrawHdrClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction) -{ - char *v8; // ebx - int v9; // eax - char *v10; // esi - char *v11; // edi - int v12; // edx - int v13; // eax - int v14; // ecx - char v15; // al - int v16; // ecx - char v17; // al - int v18; // [esp+Ch] [ebp-10h] - char *v19; // [esp+10h] [ebp-Ch] - int v20; // [esp+14h] [ebp-8h] - char v21; // [esp+18h] [ebp-4h] - - v21 = colour; - if (pCelBuff) { - if (gpBuffer) { - v8 = &pCelBuff[4 * frame]; - v19 = &pCelBuff[*(_DWORD *)v8]; - v18 = *(unsigned short *)&v19[a7]; - if (*(_WORD *)&v19[a7]) { - if (direction == 8) - v9 = 0; - else - v9 = *(unsigned short *)&v19[direction]; - if (v9) - v20 = v9 - v18; - else - v20 = *((_DWORD *)v8 + 1) - *(_DWORD *)v8 - v18; - v10 = &v19[v18]; - v11 = (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + screen_x; - do { - v12 = frame_width; - do { - while (1) { - v13 = (unsigned char)*v10++; - if ((v13 & 0x80u) == 0) - break; - _LOBYTE(v13) = -(char)v13; - v11 += v13; - v12 -= v13; - if (!v12) - goto LABEL_28; - } - v12 -= v13; - if (v11 < (char *)gpBufEnd) { - if (v11 >= (char *)gpBufEnd - 768) { - v16 = v13; - do { - v17 = *v10++; - if (v17) { - *(v11 - 768) = v21; - *(v11 - 1) = v21; - v11[1] = v21; - } - ++v11; - --v16; - } while (v16); - } else { - v14 = v13; - do { - v15 = *v10++; - if (v15) { - *(v11 - 768) = v21; - *(v11 - 1) = v21; - v11[1] = v21; - v11[768] = v21; - } - ++v11; - --v14; - } while (v14); + end = &src[nDataSize]; + + for(; src != end; dst -= 768 + nWidth) { + for(w = nWidth; w;) { + width = *src++; + if(!(width & 0x80)) { + w -= width; + if(dst < gpBufEnd) { + while(width) { + *dst = tbl[*src]; + src++; + dst++; + width--; + } + } else { + src += width; + dst += width; + } + } else { + width = -(char)width; + dst += width; + w -= width; + } + } + } +#endif +} +// 525728: using guessed type int light4flag; +// 69CF0C: using guessed type int gpBufEnd; + +void __fastcall CelDecodeRect(BYTE *pBuff, int always_0, int hgt, int wdt, BYTE *pCelBuff, int nCel, int nWidth) +{ + BYTE *src, *dst, *end; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(pBuff != NULL); + if(!pBuff) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov ebx, pCelBuff + mov eax, nCel + shl eax, 2 + add ebx, eax + mov eax, [ebx+4] + sub eax, [ebx] + mov end, eax + mov eax, pCelBuff + add eax, [ebx] + mov src, eax + } + + dst = &pBuff[hgt * wdt + always_0]; + + __asm { + mov esi, src + mov edi, dst + mov eax, wdt + add eax, nWidth + mov wdt, eax + mov ebx, end + add ebx, esi + label1: + mov edx, nWidth + label2: + xor eax, eax + lodsb + or al, al + js label6 + sub edx, eax + mov ecx, eax + shr ecx, 1 + jnb label3 + movsb + jecxz label5 + label3: + shr ecx, 1 + jnb label4 + movsw + jecxz label5 + label4: + rep movsd + label5: + or edx, edx + jz label7 + jmp label2 + label6: + neg al + add edi, eax + sub edx, eax + jnz label2 + label7: + sub edi, wdt + cmp ebx, esi + jnz label1 + } +#else + int i; + BYTE width; + DWORD *pFrameTable; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + src = &pCelBuff[pFrameTable[0]]; + end = &src[pFrameTable[1] - pFrameTable[0]]; + dst = &pBuff[hgt * wdt + always_0]; + + for(; src != end; dst -= wdt + nWidth) { + for(i = nWidth; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(width & 1) { + dst[0] = src[0]; + src++; + dst++; + } + width >>= 1; + if(width & 1) { + dst[0] = src[0]; + dst[1] = src[1]; + src += 2; + dst += 2; + } + width >>= 1; + while(width) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + src += 4; + dst += 4; + width--; + } + } else { + width = -(char)width; + dst += width; + i -= width; + } + } + } +#endif +} + +void __fastcall CelDecodeClr(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) +{ + int w, hdr, nDataSize, v1; + BYTE *src, *dst, *tmp; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov ebx, pCelBuff + mov eax, nCel + shl eax, 2 + add ebx, eax + mov eax, [ebx+4] + sub eax, [ebx] + mov nDataSize, eax + mov edx, pCelBuff + add edx, [ebx] + mov src, edx + add edx, always_0 + xor eax, eax + mov ax, [edx] + mov hdr, eax + mov edx, src + add edx, dir + mov ax, [edx] + mov v1, eax + } + + if(!hdr) + return; + + if(dir == 8) + v1 = 0; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize -= hdr; + + src += hdr; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + __asm { + mov esi, src + mov edi, dst + mov eax, 768 + add eax, nWidth + mov w, eax + mov ebx, nDataSize + add ebx, esi + label1: + mov edx, nWidth + label2: + xor eax, eax + lodsb + or al, al + js label5 + sub edx, eax + mov ecx, eax + mov ah, col + label3: + lodsb + or al, al + jz label4 + mov [edi-768], ah + mov [edi-1], ah + mov [edi+1], ah + mov [edi+768], ah + label4: + inc edi + loop label3 + or edx, edx + jz label6 + jmp label2 + label5: + neg al + add edi, eax + sub edx, eax + jnz label2 + label6: + sub edi, w + cmp ebx, esi + jnz label1 + } +#else + BYTE width; + BYTE *end, *pRLEBytes; + DWORD *pFrameTable; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + pRLEBytes = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + v1 = *(WORD *)&pRLEBytes[dir]; + if(dir == 8) + v1 = 0; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize = pFrameTable[1] - pFrameTable[0] - hdr; + + src = &pRLEBytes[hdr]; + end = &src[nDataSize]; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + for(; src != end; dst -= 768 + nWidth) { + for(w = nWidth; w;) { + width = *src++; + if(!(width & 0x80)) { + w -= width; + while(width) { + if(*src++) { + dst[-768] = col; + dst[-1] = col; + dst[1] = col; + dst[768] = col; + } + dst++; + width--; + } + } else { + width = -(char)width; + dst += width; + w -= width; + } + } + } +#endif +} + +void __fastcall CelDrawHdrClrHL(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) +{ + int w, hdr, nDataSize, v1; + BYTE *src, *dst, *tmp; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov ebx, pCelBuff + mov eax, nCel + shl eax, 2 + add ebx, eax + mov eax, [ebx+4] + sub eax, [ebx] + mov nDataSize, eax + mov edx, pCelBuff + add edx, [ebx] + mov src, edx + add edx, always_0 + xor eax, eax + mov ax, [edx] + mov hdr, eax + mov edx, src + add edx, dir + mov ax, [edx] + mov v1, eax + } + + if(!hdr) + return; + + if(dir == 8) + v1 = 0; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize -= hdr; + + src += hdr; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + __asm { + mov esi, src + mov edi, dst + mov eax, 768 + add eax, nWidth + mov w, eax + mov ebx, nDataSize + add ebx, esi + label1: + mov edx, nWidth + label2: + xor eax, eax + lodsb + or al, al + js label10 + sub edx, eax + mov ecx, gpBufEnd + cmp edi, ecx + jb label3 + add esi, eax + add edi, eax + jmp label9 + label3: + sub ecx, 768 + cmp edi, ecx + jnb label6 + mov ecx, eax + mov ah, col + label4: + lodsb + or al, al + jz label5 + mov [edi-768], ah + mov [edi-1], ah + mov [edi+1], ah + mov [edi+768], ah + label5: + inc edi + loop label4 + jmp label9 + label6: + mov ecx, eax + mov ah, col + label7: + lodsb + or al, al + jz label8 + mov [edi-768], ah + mov [edi-1], ah + mov [edi+1], ah + label8: + inc edi + loop label7 + label9: + or edx, edx + jz label11 + jmp label2 + label10: + neg al + add edi, eax + sub edx, eax + jnz label2 + label11: + sub edi, w + cmp ebx, esi + jnz label1 + } +#else + BYTE width; + BYTE *end, *pRLEBytes; + DWORD *pFrameTable; + + pFrameTable = (DWORD *)&pCelBuff[4 * nCel]; + pRLEBytes = &pCelBuff[pFrameTable[0]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + v1 = *(WORD *)&pRLEBytes[dir]; + if(dir == 8) + v1 = 0; + if(v1) + nDataSize = v1 - hdr; + else + nDataSize = pFrameTable[1] - pFrameTable[0] - hdr; + + src = &pRLEBytes[hdr]; + end = &src[nDataSize]; + tmp = (BYTE *)gpBuffer; + dst = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + for(; src != end; dst -= 768 + nWidth) { + for(w = nWidth; w;) { + width = *src++; + if(!(width & 0x80)) { + w -= width; + if(dst < gpBufEnd) { + if(dst >= gpBufEnd - 768) { + while(width) { + if(*src++) { + dst[-768] = col; + dst[-1] = col; + dst[1] = col; } - } else { - v10 += v13; - v11 += v13; + dst++; + width--; } - } while (v12); - LABEL_28: - v11 += -frame_width - 768; - } while (&v19[v18 + v20] != v10); + } else { + while(width) { + if(*src++) { + dst[-768] = col; + dst[-1] = col; + dst[1] = col; + dst[768] = col; + } + dst++; + width--; + } + } + } else { + src += width; + dst += width; + } + } else { + width = -(char)width; + dst += width; + w -= width; } } } +#endif } // 69CF0C: using guessed type int gpBufEnd; diff --git a/Source/engine.h b/Source/engine.h index f45abbbb9..037ce85cf 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -19,20 +19,20 @@ void __fastcall CelDecodeHdrOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWid void __fastcall CelDecDatLightOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); void __fastcall CelDecDatLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); void __fastcall CelDecodeLightOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth); -void __fastcall CelDecodeHdrLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction); -void __fastcall CelDecodeHdrLightTrans(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction); -void __fastcall CelDrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1); +void __fastcall CelDecodeHdrLightOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall CelDecodeHdrLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall CelDrawHdrLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light); void __fastcall Cel2DecDatOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); void __fastcall Cel2DrawHdrOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); void __fastcall Cel2DecodeHdrOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); void __fastcall Cel2DecDatLightOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); void __fastcall Cel2DecDatLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); -void __fastcall Cel2DecodeHdrLight(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction); -void __fastcall Cel2DecodeLightTrans(char *dst_buf, char *pCelBuff, int frame, int frame_width, int a5, int direction); -void __fastcall Cel2DrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction, char always_1); -void __fastcall CelDecodeRect(char *pBuff, int always_0, int dst_height, int dst_width, char *pCelBuff, int frame, int frame_width); -void __fastcall CelDecodeClr(BYTE colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction); -void __fastcall CelDrawHdrClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a7, int direction); +void __fastcall Cel2DecodeHdrLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cel2DecodeLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cel2DrawHdrLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light); +void __fastcall CelDecodeRect(BYTE *pBuff, int always_0, int hgt, int wdt, BYTE *pCelBuff, int nCel, int nWidth); +void __fastcall CelDecodeClr(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall CelDrawHdrClrHL(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); void __fastcall ENG_set_pixel(int screen_x, int screen_y, UCHAR pixel); void __fastcall engine_draw_pixel(int x, int y); void __fastcall DrawLine(int x0, int y0, int x1, int y1, UCHAR col); diff --git a/Source/inv.cpp b/Source/inv.cpp index 8d761f336..9b92fee6a 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -166,13 +166,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, 517, 219, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, 517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) { CelDrawHdrOnly(517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(517, 219, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -190,13 +190,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, 432, 365, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, 432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) { CelDrawHdrOnly(432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(432, 365, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -214,13 +214,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, 633, 365, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, 633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) { CelDrawHdrOnly(633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(633, 365, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -238,13 +238,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, 589, 220, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, 589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) { CelDrawHdrOnly(589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(589, 220, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -265,13 +265,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) { CelDrawHdrOnly(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) { @@ -281,9 +281,9 @@ void __cdecl DrawInv() CelDecodeHdrLightTrans( frame_width == INV_SLOT_SIZE_PX - ? &gpBuffer->row[160].pixels[581] - : &gpBuffer->row[160].pixels[567], - (char *)pCursCels, frame, frame_width, 0, 8); + ? (BYTE *)&gpBuffer->row[160].pixels[581] + : (BYTE *)&gpBuffer->row[160].pixels[567], + (BYTE *)pCursCels, frame, frame_width, 0, 8); cel_transparency_active = 0; } @@ -305,13 +305,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) { CelDrawHdrOnly(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(screen_x, screen_y, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -329,13 +329,13 @@ void __cdecl DrawInv() if (!plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) { colour = ICOL_RED; } - CelDecodeClr(colour, 517, 320, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, 517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) { CelDrawHdrOnly(517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { - CelDrawHdrLightRed(517, 320, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } @@ -370,7 +370,7 @@ void __cdecl DrawInv() colour, InvRect[j + SLOTXY_INV_FIRST].X + 64, InvRect[j + SLOTXY_INV_FIRST].Y + 159, - (char *)pCursCels, frame, frame_width, 0, 8); + (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].InvList[ii]._iStatFlag) { @@ -382,7 +382,7 @@ void __cdecl DrawInv() CelDrawHdrLightRed( InvRect[j + SLOTXY_INV_FIRST].X + 64, InvRect[j + SLOTXY_INV_FIRST].Y + 159, - (char *)pCursCels, frame, frame_width, 0, 8, 1); + (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); } } } @@ -418,13 +418,13 @@ void __cdecl DrawInvBelt() colour = ICOL_BLUE; if (!plr[myplr].SpdList[i]._iStatFlag) colour = ICOL_RED; - CelDecodeClr(colour, InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (char *)pCursCels, frame, frame_width, 0, 8); + CelDecodeClr(colour, InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8); } if (plr[myplr].SpdList[i]._iStatFlag) CelDrawHdrOnly(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8); else - CelDrawHdrLightRed(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (char *)pCursCels, frame, frame_width, 0, 8, 1); + CelDrawHdrLightRed(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (BYTE *)pCursCels, frame, frame_width, 0, 8, 1); if (AllItemsList[plr[myplr].SpdList[i].IDidx].iUsable && plr[myplr].SpdList[i]._iStatFlag diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 2a64a7853..d31d8d08a 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -871,8 +871,8 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, if (v18 >= 1 && *(_DWORD *)v17 <= 0x32u && v18 <= *(_DWORD *)v17) { v19 = a4 - v16->_iAnimWidth2; if (v49 - 1 == pcursitem) - CelDrawHdrClrHL(ICOL_BLUE, v19, a5, v17, v16->_iAnimFrame, v16->_iAnimWidth, 0, 8); - Cel2DecodeHdrLight(v19, a5, (char *)v16->_iAnimData, v16->_iAnimFrame, v16->_iAnimWidth, 0, 8); + CelDrawHdrClrHL(ICOL_BLUE, v19, a5, (BYTE *)v17, v16->_iAnimFrame, v16->_iAnimWidth, 0, 8); + Cel2DecodeHdrLight(v19, a5, v16->_iAnimData, v16->_iAnimFrame, v16->_iAnimWidth, 0, 8); } } } @@ -985,11 +985,11 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, if (v38 >= 1 && *(_DWORD *)v37 <= 0x32u && v38 <= *(_DWORD *)v37) { v39 = a4 - v36->_iAnimWidth2; if (v49 - 1 == pcursitem) - CelDrawHdrClrHL(ICOL_BLUE, v39, a5, v37, v36->_iAnimFrame, v36->_iAnimWidth, 0, 8); + CelDrawHdrClrHL(ICOL_BLUE, v39, a5, (BYTE *)v37, v36->_iAnimFrame, v36->_iAnimWidth, 0, 8); Cel2DecodeHdrLight( v39, a5, - (char *)v36->_iAnimData, + v36->_iAnimData, v36->_iAnimFrame, v36->_iAnimWidth, 0, @@ -1001,7 +1001,7 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, } if (v46) { cel_transparency_active = (unsigned char)TransList[v44]; - Cel2DecodeLightTrans(dst_buf, (char *)level_special_cel, v46, 64, 0, 8); + Cel2DecodeLightTrans((BYTE *)dst_buf, (BYTE *)level_special_cel, v46, 64, 0, 8); } } // 4B8CC0: using guessed type char pcursitem; @@ -1109,9 +1109,9 @@ void __fastcall DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int a6 } if(bv == pcursobj) - CelDrawHdrClrHL(194, sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + CelDrawHdrClrHL(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); if(object[bv]._oLight) - Cel2DecodeHdrLight(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + Cel2DecodeHdrLight(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); else Cel2DrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } @@ -1471,8 +1471,8 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int if (v21 >= 1 && *(_DWORD *)v20 <= 0x32u && v21 <= *(_DWORD *)v20) { v22 = v13 - v19->_iAnimWidth2; if (v52 - 1 == pcursitem) - CelDrawHdrClrHL(ICOL_BLUE, v22, sy, v20, v19->_iAnimFrame, v19->_iAnimWidth, a5, 8); - Cel2DecodeHdrLight(v22, sy, (char *)v19->_iAnimData, v19->_iAnimFrame, v19->_iAnimWidth, a5, 8); + CelDrawHdrClrHL(ICOL_BLUE, v22, sy, (BYTE *)v20, v19->_iAnimFrame, v19->_iAnimWidth, a5, 8); + Cel2DecodeHdrLight(v22, sy, v19->_iAnimData, v19->_iAnimFrame, v19->_iAnimWidth, a5, 8); } } } @@ -1587,11 +1587,11 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int if (v41 >= 1 && *(_DWORD *)v40 <= 0x32u && v41 <= *(_DWORD *)v40) { v42 = v13 - v39->_iAnimWidth2; if (v52 - 1 == pcursitem) - CelDrawHdrClrHL(ICOL_BLUE, v42, sy, v40, v41, v39->_iAnimWidth, a5, 8); + CelDrawHdrClrHL(ICOL_BLUE, v42, sy, (BYTE *)v40, v41, v39->_iAnimWidth, a5, 8); Cel2DecodeHdrLight( v42, sy, - (char *)v39->_iAnimData, + v39->_iAnimData, v39->_iAnimFrame, v39->_iAnimWidth, a5, @@ -1603,7 +1603,7 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int } if (v49) { cel_transparency_active = (unsigned char)TransList[v47]; - Cel2DecodeLightTrans(dst_buf, (char *)level_special_cel, v49, 64, a5, 8); + Cel2DecodeLightTrans((BYTE *)dst_buf, (BYTE *)level_special_cel, v49, 64, a5, 8); } } // 4B8CC0: using guessed type char pcursitem; @@ -2011,8 +2011,8 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 if (v20 >= 1 && *(_DWORD *)v19 <= 0x32u && v20 <= *(_DWORD *)v19) { v21 = sx - v18->_iAnimWidth2; if (v51 - 1 == pcursitem) - CelDecodeClr(ICOL_BLUE, v21, sy, v19, v18->_iAnimFrame, v18->_iAnimWidth, 0, a5); - CelDecodeHdrLightOnly(v21, sy, (char *)v18->_iAnimData, v18->_iAnimFrame, v18->_iAnimWidth, 0, a5); + CelDecodeClr(ICOL_BLUE, v21, sy, (BYTE *)v19, v18->_iAnimFrame, v18->_iAnimWidth, 0, a5); + CelDecodeHdrLightOnly(v21, sy, v18->_iAnimData, v18->_iAnimFrame, v18->_iAnimWidth, 0, a5); } } } @@ -2125,11 +2125,11 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 if (v40 >= 1 && *(_DWORD *)v39 <= 0x32u && v40 <= *(_DWORD *)v39) { v41 = sx - v38->_iAnimWidth2; if (v51 - 1 == pcursitem) - CelDecodeClr(ICOL_BLUE, v41, sy, v39, v38->_iAnimFrame, v38->_iAnimWidth, 0, a5); + CelDecodeClr(ICOL_BLUE, v41, sy, (BYTE *)v39, v38->_iAnimFrame, v38->_iAnimWidth, 0, a5); CelDecodeHdrLightOnly( v41, sy, - (char *)v38->_iAnimData, + v38->_iAnimData, v38->_iAnimFrame, v38->_iAnimWidth, 0, @@ -2141,7 +2141,7 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 } if (v48) { cel_transparency_active = (unsigned char)TransList[v46]; - CelDecodeHdrLightTrans(dst_buf, (char *)level_special_cel, v48, 64, 0, a5); + CelDecodeHdrLightTrans((BYTE *)dst_buf, (BYTE *)level_special_cel, v48, 64, 0, a5); } } // 4B8CC0: using guessed type char pcursitem; @@ -2249,9 +2249,9 @@ void __fastcall DrawObject(int x, int y, int ox, int oy, BOOL pre, int a6, int d } if(bv == pcursobj) - CelDecodeClr(194, sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + CelDecodeClr(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); if(object[bv]._oLight) { - CelDecodeHdrLightOnly(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + CelDecodeHdrLightOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } else { /// ASSERT: assert(object[bv]._oAnimData); if(object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant @@ -2723,10 +2723,10 @@ void __cdecl scrollrt_draw_cursor_item() if (!plr[myplr].HoldItem._iStatFlag) colour = ICOL_RED; v12 = v9 + 64; - CelDrawHdrClrHL(colour, v12, v1 + v10 + 159, (char *)pCursCels, pcurs, v0, 0, 8); + CelDrawHdrClrHL(colour, v12, v1 + v10 + 159, (BYTE *)pCursCels, pcurs, v0, 0, 8); v13 = cursH + v10 + 159; if (colour == ICOL_RED) - Cel2DrawHdrLightRed(v12, v13, (char *)pCursCels, pcurs, cursW, 0, 8, 1); + Cel2DrawHdrLightRed(v12, v13, (BYTE *)pCursCels, pcurs, cursW, 0, 8, 1); else Cel2DrawHdrOnly(v12, v13, (BYTE *)pCursCels, pcurs, cursW, 0, 8); } diff --git a/Source/town.cpp b/Source/town.cpp index 1c288311f..7aeec9a9c 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -146,7 +146,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s ICOL_BLUE, v11, sy, - (char *)item[v10]._iAnimData, + item[v10]._iAnimData, item[v10]._iAnimFrame, item[v10]._iAnimWidth, 0, @@ -161,7 +161,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s 166, v13, sy, - (char *)towner[v12]._tAnimData, + towner[v12]._tAnimData, towner[v12]._tAnimFrame, towner[v12]._tAnimWidth, 0, @@ -178,7 +178,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s 166, v17, sy, - (char *)towner[v16]._tAnimData, + towner[v16]._tAnimData, towner[v16]._tAnimFrame, towner[v16]._tAnimWidth, 0, @@ -406,7 +406,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i ICOL_BLUE, v13, sy, - (char *)item[v12]._iAnimData, + item[v12]._iAnimData, item[v12]._iAnimFrame, item[v12]._iAnimWidth, a5, @@ -421,7 +421,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i 166, v15, sy, - (char *)towner[v14]._tAnimData, + towner[v14]._tAnimData, towner[v14]._tAnimFrame, towner[v14]._tAnimWidth, a5, @@ -438,7 +438,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i 166, v19, sy, - (char *)towner[v18]._tAnimData, + towner[v18]._tAnimData, towner[v18]._tAnimFrame, towner[v18]._tAnimWidth, a5, @@ -653,21 +653,21 @@ void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, ii = dItem[x][y] - 1; xx = sx - item[ii]._iAnimWidth2; if (ii == pcursitem) - CelDecodeClr(ICOL_BLUE, xx, sy, (char *)item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir); + CelDecodeClr(ICOL_BLUE, xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir); CelDrawHdrOnly(xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir); } if (dFlags[x][y] & DFLAG_MONSTER) { mi = -1 - dMonster[x][y - 1]; xx = sx - towner[mi]._tAnimWidth2; if (mi == pcursmonst) - CelDecodeClr(PAL16_BEIGE + 6, xx, sy, (char *)towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); + CelDecodeClr(PAL16_BEIGE + 6, xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); CelDrawHdrOnly(xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); } if (dMonster[x][y] > 0) { mi = dMonster[x][y] - 1; xx = sx - towner[mi]._tAnimWidth2; if (mi == pcursmonst) - CelDecodeClr(PAL16_BEIGE + 6, xx, sy, (char *)towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); + CelDecodeClr(PAL16_BEIGE + 6, xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); CelDrawHdrOnly(xx, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); } if (dFlags[x][y] & DFLAG_PLAYER) {