From d23f9db123966be7a4d6769e47f926f0eb7fc87c Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Mon, 11 Mar 2019 21:03:51 -0500 Subject: [PATCH 01/31] Cleanup FSBT (#631) * Cleanup FSBT * Update gendung.cpp --- Source/gendung.cpp | 88 +++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/Source/gendung.cpp b/Source/gendung.cpp index 301e63ced..c5e0df121 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -71,61 +71,55 @@ short dpiece_defs_map_2[16][MAXDUNX][MAXDUNY]; void __cdecl FillSolidBlockTbls() { - unsigned char *v0; // eax - char *v1; // ecx - unsigned char *v2; // esi - int v3; // edx - unsigned char v4; // bl - int size; // [esp+8h] [ebp-4h] + unsigned char bv; + unsigned int dwTiles; + unsigned char *pSBFile, *pTmp; + int i; 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)); - if (leveltype != DTYPE_TOWN) { - switch (leveltype) { - case DTYPE_CATHEDRAL: - v1 = "Levels\\L1Data\\L1.SOL"; - break; - case DTYPE_CATACOMBS: - v1 = "Levels\\L2Data\\L2.SOL"; - break; - case DTYPE_CAVES: - v1 = "Levels\\L3Data\\L3.SOL"; - break; - case DTYPE_HELL: - v1 = "Levels\\L4Data\\L4.SOL"; - break; - default: - TermMsg("FillSolidBlockTbls"); - // v0 = (unsigned char *)size; /* check error */ - goto LABEL_13; - } - } else { - v1 = "Levels\\TownData\\Town.SOL"; + + switch(leveltype) { + case DTYPE_TOWN: + pSBFile = LoadFileInMem("Levels\\TownData\\Town.SOL", (int *)&dwTiles); + break; + case DTYPE_CATHEDRAL: + pSBFile = LoadFileInMem("Levels\\L1Data\\L1.SOL", (int *)&dwTiles); + break; + case DTYPE_CATACOMBS: + pSBFile = LoadFileInMem("Levels\\L2Data\\L2.SOL", (int *)&dwTiles); + break; + case DTYPE_CAVES: + pSBFile = LoadFileInMem("Levels\\L3Data\\L3.SOL", (int *)&dwTiles); + break; + case DTYPE_HELL: + pSBFile = LoadFileInMem("Levels\\L4Data\\L4.SOL", (int *)&dwTiles); + break; + default: + TermMsg("FillSolidBlockTbls"); } - v0 = LoadFileInMem(v1, &size); -LABEL_13: - v2 = v0; - if ((unsigned int)size >= 1) { - v3 = 0; - do { - v4 = *v2++; - if (v4 & 1) - nSolidTable[v3 + 1] = 1; - if (v4 & 2) - nBlockTable[v3 + 1] = 1; - if (v4 & 4) - nMissileTable[v3 + 1] = 1; - if (v4 & 8) - nTransTable[v3 + 1] = 1; - if ((v4 & 0x80u) != 0) - nTrapTable[v3 + 1] = TRUE; - block_lvid[v3++ + 1] = (v4 >> 4) & 7; - } while (v3 + 1 <= (unsigned int)size); + + pTmp = pSBFile; + + for(i = 1; i <= dwTiles; i++) { + bv = *pTmp++; + if(bv & 1) + nSolidTable[i] = 1; + if(bv & 2) + nBlockTable[i] = 1; + if(bv & 4) + nMissileTable[i] = 1; + if(bv & 8) + nTransTable[i] = 1; + if(bv & 0x80) + nTrapTable[i] = 1; + block_lvid[i] = (bv & 0x70) >> 4; /* beta: (bv >> 4) & 7 */ } - mem_free_dbg(v0); + + mem_free_dbg(pSBFile); } void __cdecl gendung_418D91() From 94ce27302db3f941d140a654ce87aca4cc1a389e Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Mon, 11 Mar 2019 21:13:40 -0500 Subject: [PATCH 02/31] Bunch of cleanups (#629) --- Source/scrollrt.cpp | 942 +++++++++++++++++++++----------------------- Source/scrollrt.h | 20 +- 2 files changed, 462 insertions(+), 500 deletions(-) diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index eb3139c55..6ee6eb7da 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -17,7 +17,7 @@ DDSURFACEDESC DDS_desc; int cel_transparency_active; // weak int level_piece_id; // weak int sgdwCursWdt; -int(__fastcall *DrawPlrProc)(int player_num, int x, int y, int screen_x, int screen_y, void *cl2_buf, int frame, int frame_width, int a9, int a10); +void (__fastcall *DrawPlrProc)(int, int, int, int, int, BYTE *, int, int, int, int); char sgSaveBack[8192]; int draw_monster_num; // weak int sgdwCursHgtOld; // idb @@ -67,275 +67,233 @@ void __cdecl ClearCursor() // CODE_FIX: this was supposed to be in cursor.cpp sgdwCursWdtOld = 0; } -void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL del_flag) +void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL pre) { - int v7; // ebx - char v8; // al - int v9; // eax - int v10; // eax - MissileStruct *v11; // eax - char *v12; // edi - int v13; // edx - int v14; // esi - int v15; // ecx - MissileStruct *v16; // eax - char *v17; // edi - int v18; // edx - int v19; // esi - int v20; // ecx - int v21; // [esp-10h] [ebp-28h] - int v22; // [esp-10h] [ebp-28h] - int v23; // [esp-Ch] [ebp-24h] - int v24; // [esp-Ch] [ebp-24h] - int v25; // [esp+Ch] [ebp-Ch] - int v26; // [esp+10h] [ebp-8h] - int i; // [esp+14h] [ebp-4h] - - v26 = x; - v7 = y; - v8 = dMissile[x][y]; - v25 = y; - if (v8 == -1) { - v9 = 0; - for (i = 0; i < nummissiles; v9 = i++ + 1) { - v10 = missileactive[v9]; - if (v10 >= MAXMISSILES) + int i, mx, my, nCel; + MissileStruct *m; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if(dMissile[x][y] == -1) { + for(i = 0; i < nummissiles; i++) { + /// ASSERT: assert(missileactive[i] < MAXMISSILES) + if(missileactive[i] >= MAXMISSILES) break; - v11 = &missile[v10]; - if (v11->_mix == v26 && v11->_miy == v7 && v11->_miPreFlag == del_flag && v11->_miDrawFlag) { - v12 = (char *)v11->_miAnimData; - if (!v12) + m = &missile[missileactive[i]]; + if(m->_mix == x && m->_miy == y && m->_miPreFlag == pre && m->_miDrawFlag) { + pCelBuff = m->_miAnimData; + if(!pCelBuff) { + // TermMsg("Draw Missile type %d: NULL Cel Buffer", m->_mitype); return; - v13 = v11->_miAnimFrame; - if (v13 < 1 || (unsigned int)*v12 > 0x32 || v13 > *v12) + } + nCel = m->_miAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Missile: frame %d of %d, missile type==%d", nCel, pFrameTable[0], m->_mitype); return; - v14 = sy + v11->_miyoff; - v15 = sx + v11->_mixoff - v11->_miAnimWidth2; - if (v11->_miUniqTrans) { - Cl2DecodeFrm3(v15, v14, v12, v13, v11->_miAnimWidth, a5, a6, _LOBYTE(v11->_miUniqTrans) + 3); - v7 = v25; - } else { - v23 = v11->_miAnimWidth; - v21 = v11->_miAnimFrame; - if (v11->_miLightFlag) - Cl2DecodeLightTbl(v15, v14, v12, v21, v23, a5, a6); - else - Cl2DecodeFrm1(v15, v14, v12, v21, v23, a5, a6); } + mx = sx + m->_mixoff - m->_miAnimWidth2; + my = sy + m->_miyoff; + if(m->_miUniqTrans) + Cl2DecodeFrm3(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + else if(m->_miLightFlag) + Cl2DecodeLightTbl(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + else + Cl2DecodeFrm1(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } else { - v16 = &missile[v8 - 1]; - if (v16->_miPreFlag == del_flag) { - if (v16->_miDrawFlag) { - v17 = (char *)v16->_miAnimData; - if (v17) { - v18 = v16->_miAnimFrame; - if (v18 >= 1 && (unsigned int)*v17 <= 0x32 && v18 <= *v17) { - v19 = sy + v16->_miyoff; - v20 = sx + v16->_mixoff - v16->_miAnimWidth2; - if (v16->_miUniqTrans) { - Cl2DecodeFrm3(v20, v19, v17, v18, v16->_miAnimWidth, a5, a6, LOBYTE(v16->_miUniqTrans) + 3); - } else { - v24 = v16->_miAnimWidth; - v22 = v16->_miAnimFrame; - if (v16->_miLightFlag) - Cl2DecodeLightTbl(v20, v19, v17, v22, v24, a5, a6); - else - Cl2DecodeFrm1(v20, v19, v17, v22, v24, a5, a6); - } - } - } + m = &missile[dMissile[x][y] - 1]; + if(m->_miPreFlag == pre && m->_miDrawFlag) { + pCelBuff = m->_miAnimData; + if(!pCelBuff) { + // TermMsg("Draw Missile 2 type %d: NULL Cel Buffer", m->_mitype); + return; } + nCel = m->_miAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Missile 2: frame %d of %d, missile type==%d", nCel, pFrameTable[0], m->_mitype); + return; + } + mx = sx + m->_mixoff - m->_miAnimWidth2; + my = sy + m->_miyoff; + if(m->_miUniqTrans) + Cl2DecodeFrm3(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + else if(m->_miLightFlag) + Cl2DecodeLightTbl(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + else + Cl2DecodeFrm1(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } -void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL a7) +void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL pre) { - int v7; // ebx - char v8; // al - int v9; // eax - int v10; // eax - MissileStruct *v11; // eax - char *v12; // edi - int v13; // edx - int v14; // esi - int v15; // ecx - MissileStruct *v16; // eax - char *v17; // edi - int v18; // edx - int v19; // esi - int v20; // ecx - int v21; // [esp-10h] [ebp-28h] - int v22; // [esp-10h] [ebp-28h] - int v23; // [esp-Ch] [ebp-24h] - int v24; // [esp-Ch] [ebp-24h] - int v25; // [esp+Ch] [ebp-Ch] - int v26; // [esp+10h] [ebp-8h] - int i; // [esp+14h] [ebp-4h] - - v26 = x; - v7 = y; - v8 = dMissile[x][y]; - v25 = y; - if (v8 == -1) { - v9 = 0; - for (i = 0; i < nummissiles; v9 = i++ + 1) { - v10 = missileactive[v9]; - if (v10 >= MAXMISSILES) + int i, mx, my, nCel; + MissileStruct *m; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if(dMissile[x][y] == -1) { + for(i = 0; i < nummissiles; i++) { + /// ASSERT: assert(missileactive[i] < MAXMISSILES) + if(missileactive[i] >= MAXMISSILES) break; - v11 = &missile[v10]; - if (v11->_mix == v26 && v11->_miy == v7 && v11->_miPreFlag == a7 && v11->_miDrawFlag) { - v12 = (char *)v11->_miAnimData; - if (!v12) + m = &missile[missileactive[i]]; + if(m->_mix == x && m->_miy == y && m->_miPreFlag == pre && m->_miDrawFlag) { + pCelBuff = m->_miAnimData; + if(!pCelBuff) { + // TermMsg("Draw Missile type %d Clipped: NULL Cel Buffer", m->_mitype); return; - v13 = v11->_miAnimFrame; - if (v13 < 1 || (unsigned int)*v12 > 0x32 || v13 > *v12) + } + nCel = m->_miAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Clipped Missile: frame %d of %d, missile type==%d", nCel, pFrameTable[0], m->_mitype); return; - v14 = sy + v11->_miyoff; - v15 = sx + v11->_mixoff - v11->_miAnimWidth2; - if (v11->_miUniqTrans) { - Cl2DecodeFrm5(v15, v14, v12, v13, v11->_miAnimWidth, a5, a6, _LOBYTE(v11->_miUniqTrans) + 3); - v7 = v25; - } else { - v23 = v11->_miAnimWidth; - v21 = v11->_miAnimFrame; - if (v11->_miLightFlag) - Cl2DecodeFrm6(v15, v14, v12, v21, v23, a5, a6); - else - Cl2DecodeFrm4(v15, v14, v12, v21, v23, a5, a6); } + mx = sx + m->_mixoff - m->_miAnimWidth2; + my = sy + m->_miyoff; + if(m->_miUniqTrans) + Cl2DecodeFrm5(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + else if(m->_miLightFlag) + Cl2DecodeFrm6(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + else + Cl2DecodeFrm4(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } else { - v16 = &missile[v8 - 1]; - if (v16->_miPreFlag == a7) { - if (v16->_miDrawFlag) { - v17 = (char *)v16->_miAnimData; - if (v17) { - v18 = v16->_miAnimFrame; - if (v18 >= 1 && (unsigned int)*v17 <= 0x32 && v18 <= *v17) { - v19 = sy + v16->_miyoff; - v20 = sx + v16->_mixoff - v16->_miAnimWidth2; - if (v16->_miUniqTrans) { - Cl2DecodeFrm5(v20, v19, v17, v18, v16->_miAnimWidth, a5, a6, LOBYTE(v16->_miUniqTrans) + 3); - } else { - v24 = v16->_miAnimWidth; - v22 = v16->_miAnimFrame; - if (v16->_miLightFlag) - Cl2DecodeFrm6(v20, v19, v17, v22, v24, a5, a6); - else - Cl2DecodeFrm4(v20, v19, v17, v22, v24, a5, a6); - } - } - } + m = &missile[dMissile[x][y] - 1]; + if(m->_miPreFlag == pre && m->_miDrawFlag) { + pCelBuff = m->_miAnimData; + if(!pCelBuff) { + // TermMsg("Draw Missile 2 type %d Clipped: NULL Cel Buffer", m->_mitype); + return; + } + nCel = m->_miAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Clipped Missile 2: frame %d of %d, missile type==%d", nCel, pFrameTable[0], m->_mitype); + return; } + mx = sx + m->_mixoff - m->_miAnimWidth2; + my = sy + m->_miyoff; + if(m->_miUniqTrans) + Cl2DecodeFrm5(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + else if(m->_miLightFlag) + Cl2DecodeFrm6(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + else + Cl2DecodeFrm4(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } -void __fastcall DrawDeadPlayer(int x, int y, int sx, int sy, int a5, int a6, BOOLEAN clipped) +void __fastcall DrawDeadPlayer(int x, int y, int sx, int sy, int a5, int a6, BOOL clipped) { - int v7; // ebx - int *v8; // esi - char *v9; // edi - int *v10; // eax - int v11; // ecx - int xa; // [esp+Ch] [ebp-4h] - int player_num; // [esp+28h] [ebp+18h] + int i, px, py, nCel; + PlayerStruct *p; + BYTE *pCelBuff; + DWORD *pFrameTable; - v7 = y; - xa = x; - DrawPlrProc = (int(__fastcall *)(int, int, int, int, int, void *, int, int, int, int))DrawClippedPlayer; - if (!clipped) - DrawPlrProc = (int(__fastcall *)(int, int, int, int, int, void *, int, int, int, int))DrawPlayer; - v8 = &plr[0]._pHitPoints; - v9 = &dFlags[x][y]; - *v9 &= ~DFLAG_DEAD_PLAYER; - player_num = 0; - do { - if (!*((_BYTE *)v8 - 379) || *v8 || *(v8 - 89) != currlevel || *(v8 - 88) != xa || *(v8 - 87) != v7) - goto LABEL_14; - v10 = (int *)*(v8 - 71); - if (!v10) - break; - v11 = *(v8 - 67); - if (v11 < 1 || (unsigned int)*v10 > 0x32 || v11 > *v10) - break; - *v9 |= DFLAG_DEAD_PLAYER; - DrawPlrProc(player_num, xa, v7, sx + *(v8 - 78) - *(v8 - 65), sy + *(v8 - 77), v10, v11, *(v8 - 66), a5, a6); - LABEL_14: - ++player_num; - v8 += 5430; - } while ((signed int)v8 < (signed int)&plr[4]._pHitPoints); + if(clipped) + DrawPlrProc = DrawClippedPlayer; + else + DrawPlrProc = DrawPlayer; + + dFlags[x][y] &= ~DFLAG_DEAD_PLAYER; + + for(i = 0; i < MAX_PLRS; i++) { + p = &plr[i]; + if(p->plractive && !p->_pHitPoints && p->plrlevel == (unsigned char)currlevel && p->WorldX == x && p->WorldY == y) { + pCelBuff = p->_pAnimData; + if(!pCelBuff) { + // TermMsg("Drawing dead player %d \"%s\": NULL Cel Buffer", i, p->_pName); + break; + } + nCel = p->_pAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Drawing dead player %d \"%s\": facing %d, frame %d of %d", i, p->_pName, p->_pdir, nCel, pFrameTable[0]); + break; + } + dFlags[x][y] |= DFLAG_DEAD_PLAYER; + px = sx + p->_pxoff - p->_pAnimWidth2; + py = sy + p->_pyoff; + DrawPlrProc(i, x, y, px, py, p->_pAnimData, p->_pAnimFrame, p->_pAnimWidth, a5, a6); + } + } } -void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, unsigned char *animdata, int animframe, int animwidth, int a9, int a10) +void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int a9, int a10) { - char *v10; // edx - int v11; // eax - char *v12; // ecx - int v13; // [esp+Ch] [ebp-4h] - int ya; // [esp+18h] [ebp+8h] - int animdataa; // [esp+24h] [ebp+14h] - - v10 = &dFlags[x][y]; - v11 = myplr; - v13 = pnum; - ya = (int)v10; - if (*v10 & DFLAG_LIT || plr[myplr]._pInfraFlag || !setlevel && !currlevel) { - v12 = (char *)animdata; - if (animdata) { - if (animframe >= 1 && *(_DWORD *)animdata <= 0x32u && animframe <= *(_DWORD *)animdata) { - if (v13 == pcursplr) { - Cl2DecodeFrm2(165, px, py, (char *)animdata, animframe, animwidth, a9, a10); - v11 = myplr; - v12 = (char *)animdata; - v10 = (char *)ya; - } - if (v13 == v11) { - Cl2DecodeFrm1(px, py, v12, animframe, animwidth, a9, a10); - if (plr[v13].pManaShield) - Cl2DecodeFrm1( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10); - } else if (!(*v10 & DFLAG_LIT) || plr[v11]._pInfraFlag && light_table_index > 8) { - Cl2DecodeFrm3(px, py, v12, animframe, animwidth, a9, a10, 1); - if (plr[v13].pManaShield) - Cl2DecodeFrm3( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10, - 1); - } else { - animdataa = light_table_index; - if (light_table_index >= 5) - light_table_index -= 5; - else - light_table_index = 0; - Cl2DecodeLightTbl(px, py, v12, animframe, animwidth, a9, a10); - if (plr[v13].pManaShield) - Cl2DecodeLightTbl( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10); - light_table_index = animdataa; - } - } + int l; + DWORD *pFrameTable; + + if(dFlags[x][y] & DFLAG_LIT || plr[myplr]._pInfraFlag || !setlevel && !currlevel) { + if(!pCelBuff) { + // TermMsg("Drawing player %d \"%s\": NULL Cel Buffer", pnum, plr[pnum]._pName); + return; + } + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(plr[pnum]._pmode <= 11) + szMode = szPlrModeAssert[plr[pnum]._pmode]; + TermMsg( + "Drawing player %d \"%s\" %s: facing %d, frame %d of %d", + pnum, + plr[pnum]._pName, + szMode, + plr[pnum]._pdir, + nCel, + pFrameTable[0]); + */ + return; + } + if(pnum == pcursplr) + Cl2DecodeFrm2(165, px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(pnum == myplr) { + Cl2DecodeFrm1(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(plr[pnum].pManaShield) + Cl2DecodeFrm1( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10); + } else if(!(dFlags[x][y] & DFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) { + Cl2DecodeFrm3(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10, 1); + if(plr[pnum].pManaShield) + Cl2DecodeFrm3( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10, + 1); + } else { + l = light_table_index; + if(light_table_index < 5) + light_table_index = 0; + else + light_table_index -= 5; + Cl2DecodeLightTbl(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(plr[pnum].pManaShield) + Cl2DecodeLightTbl( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10); + light_table_index = l; } } } @@ -343,71 +301,75 @@ void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, unsigned char // 5CF31D: using guessed type char setlevel; // 69BEF8: using guessed type int light_table_index; -void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, unsigned char *animdata, int animframe, int animwidth, int a9, int a10) +void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int a9, int a10) { - char *v10; // edx - int v11; // eax - char *v12; // ecx - int v13; // [esp+Ch] [ebp-4h] - int ya; // [esp+18h] [ebp+8h] - int animdataa; // [esp+24h] [ebp+14h] - - v10 = &dFlags[x][y]; - v11 = myplr; - v13 = pnum; - ya = (int)v10; - if (*v10 & DFLAG_LIT || plr[myplr]._pInfraFlag) { - v12 = (char *)animdata; - if (animdata) { - if (animframe >= 1 && *(_DWORD *)animdata <= 0x32u && animframe <= *(_DWORD *)animdata) { - if (v13 == pcursplr) { - Cl2DecodeClrHL(165, px, py, (char *)animdata, animframe, animwidth, a9, a10); - v11 = myplr; - v12 = (char *)animdata; - v10 = (char *)ya; - } - if (v13 == v11) { - Cl2DecodeFrm4(px, py, v12, animframe, animwidth, a9, a10); - if (plr[v13].pManaShield) - Cl2DecodeFrm4( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10); - } else if (!(*v10 & DFLAG_LIT) || plr[v11]._pInfraFlag && light_table_index > 8) { - Cl2DecodeFrm5(px, py, v12, animframe, animwidth, a9, a10, 1); - if (plr[v13].pManaShield) - Cl2DecodeFrm5( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10, - 1); - } else { - animdataa = light_table_index; - if (light_table_index >= 5) - light_table_index -= 5; - else - light_table_index = 0; - Cl2DecodeFrm6(px, py, v12, animframe, animwidth, a9, a10); - if (plr[v13].pManaShield) - Cl2DecodeFrm6( - px + plr[v13]._pAnimWidth2 - misfiledata[9].mAnimWidth2[0], - py, - (char *)misfiledata[9].mAnimData[0], - 1, - misfiledata[9].mAnimWidth[0], - a9, - a10); - light_table_index = animdataa; - } - } + int l; + DWORD *pFrameTable; + + if(dFlags[x][y] & DFLAG_LIT || plr[myplr]._pInfraFlag) { + if(!pCelBuff) { + // TermMsg("Drawing player %d \"%s\" clipped: NULL Cel Buffer", pnum, plr[pnum]._pName); + return; + } + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(plr[pnum]._pmode <= 11) + szMode = szPlrModeAssert[plr[pnum]._pmode]; + TermMsg( + "Drawing player %d \"%s\" %s clipped: facing %d, frame %d of %d", + pnum, + plr[pnum]._pName, + szMode, + plr[pnum]._pdir, + nCel, + pFrameTable[0]); + */ + return; + } + if(pnum == pcursplr) + Cl2DecodeClrHL(165, px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(pnum == myplr) { + Cl2DecodeFrm4(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(plr[pnum].pManaShield) + Cl2DecodeFrm4( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10); + } else if(!(dFlags[x][y] & DFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) { + Cl2DecodeFrm5(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10, 1); + if(plr[pnum].pManaShield) + Cl2DecodeFrm5( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10, + 1); + } else { + l = light_table_index; + if(light_table_index < 5) + light_table_index = 0; + else + light_table_index -= 5; + Cl2DecodeFrm6(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + if(plr[pnum].pManaShield) + Cl2DecodeFrm6( + px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], + py, + (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + 1, + misfiledata[MFILE_MANASHLD].mAnimWidth[0], + a9, + a10); + light_table_index = l; } } } @@ -1050,107 +1012,108 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, // 69CF94: using guessed type int cel_transparency_active; // 69EFA4: using guessed type int draw_monster_num; -void __fastcall DrawClippedMonster(int x, int y, int a3, int a4, int mon_id, int a6, int a7) +void __fastcall DrawClippedMonster(int x, int y, int mx, int my, int m, int a6, int a7) { - int v7; // eax - char *v8; // esi - signed int v9; // ebx - char v10; // cl - CMonster *v11; // eax - char mon_ida; // [esp+1Ch] [ebp+10h] - - if ((unsigned int)mon_id < MAXMONSTERS) { - v7 = mon_id; - v8 = (char *)monster[mon_id]._mAnimData; - if (v8) { - v9 = monster[v7]._mAnimFrame; - if (v9 >= 1 && (unsigned int)*v8 <= 0x32 && v9 <= *v8) { - if (dFlags[x][y] & DFLAG_LIT) { - v10 = 0; - mon_ida = 0; - if (monster[v7]._uniqtype) { - v10 = monster[v7]._uniqtrans + 4; - mon_ida = monster[v7]._uniqtrans + 4; - } - if (monster[v7]._mmode == MM_STONE) { - v10 = 2; - mon_ida = 2; - } - if (plr[myplr]._pInfraFlag && light_table_index > 8) { - v10 = 1; - mon_ida = 1; - } - v11 = monster[v7].MType; - if (v10) - Cl2DecodeFrm5(a3, a4, v8, v9, v11->width, a6, a7, mon_ida); - else - Cl2DecodeFrm6(a3, a4, v8, v9, v11->width, a6, a7); - } else { - Cl2DecodeFrm5(a3, a4, v8, v9, monster[v7].MType->width, a6, a7, 1); - } - } - } + int nCel; + char trans; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if((DWORD)m >= MAXMONSTERS) { + // TermMsg("Draw Monster Clipped: tried to draw illegal monster %d", m); + return; + } + + pCelBuff = monster[m]._mAnimData; + if(!pCelBuff) { + // TermMsg("Draw Monster \"%s\" Clipped: NULL Cel Buffer", monster[m].mName); + return; + } + + nCel = monster[m]._mAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(monster[m]._mmode <= 17) + szMode = szMonModeAssert[monster[m]._mmode]; + TermMsg( + "Draw Monster \"%s\" %s Clipped: facing %d, frame %d of %d", + monster[m].mName, + szMode, + monster[m]._mdir, + nCel, + pFrameTable[0]); + */ + return; + } + + if(!(dFlags[x][y] & DFLAG_LIT)) { + Cl2DecodeFrm5(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); + } else { + trans = 0; + if(monster[m]._uniqtype) + trans = monster[m]._uniqtrans + 4; + if(monster[m]._mmode == MM_STONE) + trans = 2; + if(plr[myplr]._pInfraFlag && light_table_index > 8) + trans = 1; + if(trans) + Cl2DecodeFrm5(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); + else + Cl2DecodeFrm6(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); } } // 69BEF8: using guessed type int light_table_index; -void __fastcall DrawClippedObject(int x, int y, int a3, int a4, int pre_flag, int a6, int dir) +void __fastcall DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int a6, int dir) { - int v7; // edi - char v8; // al - unsigned char v9; // dl - int v10; // esi - int v11; // ebx - int v12; // edi - int v13; // eax - int v14; // ecx - char *v15; // eax - signed int v16; // ecx - char *v17; // [esp-14h] [ebp-24h] - int v18; // [esp-10h] [ebp-20h] - int v19; // [esp-Ch] [ebp-1Ch] - char v20; // [esp+Fh] [ebp-1h] - - v7 = y; - v8 = dObject[x][y]; - if (v8 <= 0) { - v9 = -1 - v8; - v10 = (char)(-1 - v8); - v20 = -1 - v8; - if (object[v10]._oPreFlag != pre_flag) + int sx, sy, xx, yy, nCel; + char bv; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if(dObject[x][y] > 0) { + bv = dObject[x][y] - 1; + if(object[bv]._oPreFlag != pre) return; - dir = 8; - v13 = object[v10]._ox - x; - v14 = object[v10]._oy - v7; - v12 = a3 + 32 * v13 - object[v10]._oAnimWidth2 - 32 * v14; - v11 = a4 + 16 * (v14 + v13); - a6 = 0; + sx = ox - object[bv]._oAnimWidth2; + sy = oy; } else { - v9 = v8 - 1; - v10 = (char)(v8 - 1); - v20 = v8 - 1; - if (object[v10]._oPreFlag != pre_flag) + bv = -(dObject[x][y] + 1); + if(object[bv]._oPreFlag != pre) return; - v11 = a4; - v12 = a3 - object[v10]._oAnimWidth2; - } - if (v9 < MAXOBJECTS) { - v15 = (char *)object[v10]._oAnimData; - if (v15) { - v16 = object[v10]._oAnimFrame; - if (v16 >= 1 && *(_DWORD *)v15 <= 0x32u && v16 <= *(_DWORD *)v15) { - if (v20 == pcursobj) - CelDrawHdrClrHL(194, v12, v11, v15, v16, object[v10]._oAnimWidth, a6, dir); - v19 = object[v10]._oAnimWidth; - v18 = object[v10]._oAnimFrame; - v17 = (char *)object[v10]._oAnimData; - if (object[v10]._oLight) - Cel2DecodeHdrLight(v12, v11, v17, v18, v19, a6, dir); - else - Cel2DrawHdrOnly(v12, v11, v17, v18, v19, a6, dir); - } - } + xx = object[bv]._ox - x; + yy = object[bv]._oy - y; + sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); + sy = oy + (yy << 4) + (xx << 4); + a6 = 0; + dir = 8; + } + + /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); + if((unsigned char)bv >= MAXOBJECTS) + return; + + pCelBuff = object[bv]._oAnimData; + if(!pCelBuff) { + // TermMsg("Draw Object type %d Clipped: NULL Cel Buffer", object[bv]._otype); + return; + } + + nCel = object[bv]._oAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Clipped Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); + return; } + + if(bv == pcursobj) + CelDrawHdrClrHL(194, sx, sy, (char *)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); + else + Cel2DrawHdrOnly(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } // 4B8CC1: using guessed type char pcursobj; @@ -2189,111 +2152,110 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 // 69CF94: using guessed type int cel_transparency_active; // 69EFA4: using guessed type int draw_monster_num; -void __fastcall DrawMonster(int x, int y, int a3, int a4, int mon_id, int a6, int a7) +void __fastcall DrawMonster(int x, int y, int mx, int my, int m, int a6, int a7) { - int v7; // eax - char *v8; // esi - signed int v9; // ebx - char v10; // cl - CMonster *v11; // eax - char mon_ida; // [esp+1Ch] [ebp+10h] - - if ((unsigned int)mon_id < MAXMONSTERS) { - v7 = mon_id; - v8 = (char *)monster[mon_id]._mAnimData; - if (v8) { - v9 = monster[v7]._mAnimFrame; - if (v9 >= 1 && (unsigned int)*v8 <= 0x32 && v9 <= *v8) { - if (dFlags[x][y] & DFLAG_LIT) { - v10 = 0; - mon_ida = 0; - if (monster[v7]._uniqtype) { - v10 = monster[v7]._uniqtrans + 4; - mon_ida = monster[v7]._uniqtrans + 4; - } - if (monster[v7]._mmode == MM_STONE) { - v10 = 2; - mon_ida = 2; - } - if (plr[myplr]._pInfraFlag && light_table_index > 8) { - v10 = 1; - mon_ida = 1; - } - v11 = monster[v7].MType; - if (v10) - Cl2DecodeFrm3(a3, a4, v8, v9, v11->width, a6, a7, mon_ida); - else - Cl2DecodeLightTbl(a3, a4, v8, v9, v11->width, a6, a7); - } else { - Cl2DecodeFrm3(a3, a4, v8, v9, monster[v7].MType->width, a6, a7, 1); - } - } - } + int nCel; + char trans; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if((DWORD)m >= MAXMONSTERS) { + // TermMsg("Draw Monster: tried to draw illegal monster %d", m); + return; + } + + pCelBuff = monster[m]._mAnimData; + if(!pCelBuff) { + // TermMsg("Draw Monster \"%s\": NULL Cel Buffer", monster[m].mName); + return; + } + + nCel = monster[m]._mAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(monster[m]._mmode <= 17) + szMode = szMonModeAssert[monster[m]._mmode]; + TermMsg( + "Draw Monster \"%s\" %s: facing %d, frame %d of %d", + monster[m].mName, + szMode, + monster[m]._mdir, + nCel, + pFrameTable[0]); + */ + return; + } + + if(!(dFlags[x][y] & DFLAG_LIT)) { + Cl2DecodeFrm3(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); + } else { + trans = 0; + if(monster[m]._uniqtype) + trans = monster[m]._uniqtrans + 4; + if(monster[m]._mmode == MM_STONE) + trans = 2; + if(plr[myplr]._pInfraFlag && light_table_index > 8) + trans = 1; + if(trans) + Cl2DecodeFrm3(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); + else + Cl2DecodeLightTbl(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); } } // 69BEF8: using guessed type int light_table_index; -void __fastcall DrawObject(int x, int y, int a3, int a4, int pre_flag, int a6, int dir) +void __fastcall DrawObject(int x, int y, int ox, int oy, BOOL pre, int a6, int dir) { - int v7; // edi - char v8; // al - unsigned char v9; // dl - int v10; // esi - int v11; // ebx - int v12; // edi - int v13; // eax - int v14; // ecx - char *v15; // eax - signed int v16; // ecx - char *v17; // eax - char v18; // [esp+Fh] [ebp-1h] - - v7 = y; - v8 = dObject[x][y]; - if (v8 <= 0) { - v9 = -1 - v8; - v10 = (char)(-1 - v8); - v18 = -1 - v8; - if (object[v10]._oPreFlag != pre_flag) + int sx, sy, xx, yy, nCel; + char bv; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if(dObject[x][y] > 0) { + bv = dObject[x][y] - 1; + if(object[bv]._oPreFlag != pre) return; - dir = 8; - v13 = object[v10]._ox - x; - v14 = object[v10]._oy - v7; - v12 = a3 + 32 * v13 - object[v10]._oAnimWidth2 - 32 * v14; - v11 = a4 + 16 * (v14 + v13); - a6 = 0; + sx = ox - object[bv]._oAnimWidth2; + sy = oy; } else { - v9 = v8 - 1; - v10 = (char)(v8 - 1); - v18 = v8 - 1; - if (object[v10]._oPreFlag != pre_flag) + bv = -(dObject[x][y] + 1); + if(object[bv]._oPreFlag != pre) return; - v11 = a4; - v12 = a3 - object[v10]._oAnimWidth2; - } - if (v9 < MAXOBJECTS) { - v15 = (char *)object[v10]._oAnimData; - if (v15) { - v16 = object[v10]._oAnimFrame; - if (v16 >= 1 && *(_DWORD *)v15 <= 0x32u && v16 <= *(_DWORD *)v15) { - if (v18 == pcursobj) - CelDecodeClr(194, v12, v11, v15, v16, object[v10]._oAnimWidth, a6, dir); - if (object[v10]._oLight) { - CelDecodeHdrLightOnly( - v12, - v11, - (char *)object[v10]._oAnimData, - object[v10]._oAnimFrame, - object[v10]._oAnimWidth, - a6, - dir); - } else { - v17 = (char *)object[v10]._oAnimData; - if (v17) - CelDrawHdrOnly(v12, v11, v17, object[v10]._oAnimFrame, object[v10]._oAnimWidth, a6, dir); - } - } - } + xx = object[bv]._ox - x; + yy = object[bv]._oy - y; + sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); + sy = oy + (yy << 4) + (xx << 4); + a6 = 0; + dir = 8; + } + + /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); + if((unsigned char)bv >= MAXOBJECTS) + return; + + pCelBuff = object[bv]._oAnimData; + if(!pCelBuff) { + // TermMsg("Draw Object type %d: NULL Cel Buffer", object[bv]._otype); + return; + } + + nCel = object[bv]._oAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if(nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // TermMsg("Draw Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); + return; + } + + if(bv == pcursobj) + CelDecodeClr(194, sx, sy, (char *)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); + } else { + /// ASSERT: assert(object[bv]._oAnimData); + if(object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant + CelDrawHdrOnly(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } } // 4B8CC1: using guessed type char pcursobj; diff --git a/Source/scrollrt.h b/Source/scrollrt.h index 0e78f0003..fcf3ea217 100644 --- a/Source/scrollrt.h +++ b/Source/scrollrt.h @@ -10,29 +10,29 @@ extern char arch_draw_type; // weak extern DDSURFACEDESC DDS_desc; extern int cel_transparency_active; // weak extern int level_piece_id; // weak -extern int(__fastcall *DrawPlrProc)(int player_num, int x, int y, int screen_x, int screen_y, void *cl2_buf, int frame, int frame_width, int a9, int a10); +extern void (__fastcall *DrawPlrProc)(int, int, int, int, int, BYTE *, int, int, int, int); extern int draw_monster_num; // weak void __cdecl ClearCursor(); -void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL del_flag); -void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL a7); -void __fastcall DrawDeadPlayer(int x, int y, int sx, int sy, int a5, int a6, BOOLEAN clipped); -void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, unsigned char *animdata, int animframe, int animwidth, int a9, int a10); -void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, unsigned char *animdata, int animframe, int animwidth, int a9, int a10); +void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL pre); +void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL pre); +void __fastcall DrawDeadPlayer(int x, int y, int sx, int sy, int a5, int a6, BOOL clipped); +void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int a9, int a10); +void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int a9, int a10); void __fastcall DrawView(int StartX, int StartY); void __fastcall DrawGame(int x, int y); void __fastcall scrollrt_draw_lower(int x, int y, int sx, int sy, int a5, int some_flag); void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, int a5, int a6); -void __fastcall DrawClippedMonster(int x, int y, int a3, int a4, int mon_id, int a6, int a7); -void __fastcall DrawClippedObject(int x, int y, int a3, int a4, int pre_flag, int a6, int dir); +void __fastcall DrawClippedMonster(int x, int y, int mx, int my, int m, int a6, int a7); +void __fastcall DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int a6, int dir); void __fastcall scrollrt_draw_clipped_e_flag(char *buffer, int x, int y, int a4, int a5); void __fastcall scrollrt_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, int some_flag); void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int a4, int a5, int sx, int sy, int me_flag); void __fastcall scrollrt_draw_clipped_e_flag_2(char *buffer, int x, int y, int a4, signed int a5, int sx, int sy); void __fastcall scrollrt_draw_upper(int x, int y, int sx, int sy, int a5, int a6, int some_flag); void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5, int sx, int sy, int me_flag); -void __fastcall DrawMonster(int x, int y, int a3, int a4, int mon_id, int a6, int a7); -void __fastcall DrawObject(int x, int y, int a3, int a4, int pre_flag, int a6, int dir); +void __fastcall DrawMonster(int x, int y, int mx, int my, int m, int a6, int a7); +void __fastcall DrawObject(int x, int y, int ox, int oy, BOOL pre, int a6, int dir); void __fastcall scrollrt_draw_e_flag(char *buffer, int x, int y, int a4, int a5, int sx, int sy); void __fastcall DrawZoom(int x, int y); void __cdecl ClearScreenBuffer(); From 3a943c332c654fc915afbc20805e37471ad2a3a5 Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 12 Mar 2019 03:16:09 +0100 Subject: [PATCH 03/31] miss_null_32 bin exact (#628) --- Source/missiles.cpp | 48 +++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 4c4be65ab..65e233beb 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2670,38 +2670,26 @@ void __fastcall AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, int void __fastcall miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - int v10; // ebx - AnimStruct *v11; // edi - int v12; // eax - CMonster *v13; // ecx - BOOLEAN v14; // zf - int v15; // ecx + AnimStruct *anim; - v9 = id; - v10 = mi; - v11 = &monster[id].MType->Anims[MA_WALK]; + anim = &monster[id].MType->Anims[MA_WALK]; GetMissileVel(mi, sx, sy, dx, dy, 16); - v12 = v10; - missile[v12]._mimfnum = midir; - missile[v12]._miAnimFlags = 0; - missile[v12]._miAnimData = v11->Data[midir]; - missile[v12]._miAnimDelay = v11->Rate; - missile[v12]._miAnimLen = v11->Frames; - v13 = monster[id].MType; - missile[v12]._miAnimWidth = v13->width; - missile[v12]._miAnimWidth2 = v13->width2; - v14 = monster[id]._uniqtype == 0; - missile[v12]._miAnimAdd = 1; - missile[v12]._miVar1 = 0; - missile[v12]._miVar2 = 0; - missile[v12]._miLightFlag = 1; - if (!v14) - missile[v12]._miUniqTrans = (unsigned char)monster[v9]._uniqtrans + 1; - v15 = monster[v9]._mx; - missile[v12]._mirange = 256; - dMonster[v15][monster[v9]._my] = 0; - PutMissile(v10); + missile[mi]._mimfnum = midir; + missile[mi]._miAnimFlags = 0; + 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; + missile[mi]._miVar1 = 0; + missile[mi]._miVar2 = 0; + missile[mi]._miLightFlag = 1; + if (monster[id]._uniqtype != 0) + missile[mi]._miUniqTrans = monster[id]._uniqtrans + 1; + dMonster[monster[id]._mx][monster[id]._my] = 0; + missile[mi]._mirange = 256; + PutMissile(mi); } void __fastcall AddFlare(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From f42336a9b2f536e10061f049edc9c6205c39807b Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 12 Mar 2019 03:17:48 +0100 Subject: [PATCH 04/31] miss_null_33 bin exact (#627) --- Source/missiles.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 65e233beb..92a27031b 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1934,18 +1934,11 @@ void __fastcall AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, void __fastcall miss_null_33(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - int v10; // edi - int v11; // eax - - v9 = sx; - v10 = mi; GetMissileVel(mi, sx, sy, dx, dy, 16); - v11 = v10; - missile[v11]._mirange = 256; - missile[v11]._miVar1 = v9; - missile[v11]._miVar2 = sy; - PutMissile(v10); + missile[mi]._mirange = 256; + missile[mi]._miVar1 = sx; + missile[mi]._miVar2 = sy; + PutMissile(mi); } void __fastcall AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From 7157f5bba4b461e1aacd3fd6c0922344d7c8d3fa Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 12 Mar 2019 03:18:33 +0100 Subject: [PATCH 05/31] AddMagmaball bin exact (#626) --- Source/missiles.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 92a27031b..d2b9bd8bd 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1914,22 +1914,14 @@ void __fastcall AddFirebolt(int mi, int sx, int sy, int dx, int dy, int midir, i void __fastcall AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - int v10; // edi - int i; // ST1C_4 - - v9 = mi; - v10 = sx; - i = mi; GetMissileVel(mi, sx, sy, dx, dy, 16); - v9 *= 176; - *(int *)((char *)&missile[0]._mitxoff + v9) += 3 * *(int *)((char *)&missile[0]._mixvel + v9); - *(int *)((char *)&missile[0]._mityoff + v9) += 3 * *(int *)((char *)&missile[0]._miyvel + v9); - GetMissilePos(i); - *(int *)((char *)&missile[0]._mirange + v9) = 256; - *(int *)((char *)&missile[0]._miVar1 + v9) = v10; - *(int *)((char *)&missile[0]._miVar2 + v9) = sy; - *(int *)((char *)&missile[0]._mlid + v9) = AddLight(v10, sy, 8); + missile[mi]._mitxoff += 3 * missile[mi]._mixvel; + missile[mi]._mityoff += 3 * missile[mi]._miyvel; + GetMissilePos(mi); + missile[mi]._mirange = 256; + missile[mi]._miVar1 = sx; + missile[mi]._miVar2 = sy; + missile[mi]._mlid = AddLight(sx, sy, 8); } void __fastcall miss_null_33(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From 82c3d295eea6a600aa382d776c48a4cdeff3e219 Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 12 Mar 2019 15:00:24 +0100 Subject: [PATCH 06/31] AddFlash bin exact (#633) --- Source/missiles.cpp | 56 +++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index d2b9bd8bd..372f16091 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2314,46 +2314,26 @@ void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int m void __fastcall AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - signed int v10; // ebx - char *v11; // edi - int v12; // ecx - int v13; // eax - int v14; // eax + int i; - v9 = mi; - if ((_BYTE)mienemy) { - v14 = 2 * SLOBYTE(monster[id].mLevel); - goto LABEL_12; - } - if (id == -1) { - v14 = (unsigned int)currlevel >> 1; - LABEL_12: - missile[v9]._midam = v14; - goto LABEL_13; - } - v10 = 0; - v11 = &plr[id]._pLevel; - missile[v9]._midam = 0; - if (*v11 >= 0) { - do { - missile[v9]._midam += random(55, 20) + 1; - ++v10; - } while (v10 <= *v11); - } - v12 = missile[v9]._mispllvl; - if (v12 > 0) { - v13 = missile[v9]._midam; - do { - v13 += v13 >> 3; - --v12; - } while (v12); - missile[v9]._midam = v13; + if (!(_BYTE)mienemy && id != -1) { + missile[mi]._midam = 0; + for (i = 0; i <= plr[id]._pLevel; i++) { + missile[mi]._midam += random(55, 20) + 1; + } + for (i = 0; i < missile[mi]._mispllvl; i++) { + missile[mi]._midam += missile[mi]._midam >> 3; + } + missile[mi]._midam += missile[mi]._midam >> 1; + UseMana(id, 4); + } else { + if (!(_BYTE)mienemy) { + missile[mi]._midam = currlevel >> 1; + } else { + missile[mi]._midam = monster[id].mLevel << 1; + } } - missile[v9]._midam += missile[v9]._midam >> 1; - UseMana(id, 4); -LABEL_13: - missile[v9]._mirange = 19; + missile[mi]._mirange = 19; } void __fastcall AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From e8f45a3875d484c8df8327e76a65872235fd97f6 Mon Sep 17 00:00:00 2001 From: qndel Date: Tue, 12 Mar 2019 15:02:05 +0100 Subject: [PATCH 07/31] AddFlash2 bin exact (#634) --- Source/missiles.cpp | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 372f16091..df4b4bb1a 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2338,40 +2338,24 @@ void __fastcall AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, int void __fastcall AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // esi - char *v10; // edi - signed int v11; // ebx - int v12; // ecx - int v13; // eax - int v14; // eax - int v15; // [esp+4h] [ebp-4h] + int i; - v15 = mi; if (!(_BYTE)mienemy) { - if (id == -1) { - missile[mi]._midam = (unsigned int)currlevel >> 1; - } else { - v9 = mi; - v10 = &plr[id]._pLevel; - v11 = 0; - for (missile[mi]._midam = 0; v11 <= *v10; ++v11) { - missile[v9]._midam += random(56, 2) + 1; + if (id != -1) { + missile[mi]._midam = 0; + for (i = 0; i <= plr[id]._pLevel; i++) { + missile[mi]._midam += random(56, 2) + 1; } - v12 = missile[v9]._mispllvl; - if (v12 > 0) { - v13 = missile[v9]._midam; - do { - v13 += v13 >> 3; - --v12; - } while (v12); - missile[v9]._midam = v13; + for (i = 0; i < missile[mi]._mispllvl; i++) { + missile[mi]._midam += missile[mi]._midam >> 3; } - missile[v9]._midam += missile[v9]._midam >> 1; + missile[mi]._midam += missile[mi]._midam >> 1; + } else { + missile[mi]._midam = currlevel >> 1; } } - v14 = v15; - missile[v14]._miPreFlag = TRUE; - missile[v14]._mirange = 19; + missile[mi]._miPreFlag = TRUE; + missile[mi]._mirange = 19; } void __fastcall AddManashield(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) @@ -2635,7 +2619,7 @@ void __fastcall AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, int void __fastcall miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - AnimStruct *anim; + AnimStruct *anim; anim = &monster[id].MType->Anims[MA_WALK]; GetMissileVel(mi, sx, sy, dx, dy, 16); From 6df2738d015b2bf73c3de46e46ead71750051ef6 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:51:29 +0100 Subject: [PATCH 08/31] MI_Boom bin exact (#650) --- Source/missiles.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index df4b4bb1a..ccc81628c 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4952,19 +4952,14 @@ void __fastcall MI_Stone(int i) void __fastcall MI_Boom(int i) { - int v1; // edi - int v2; // esi - - v1 = i; - v2 = i; - --missile[v2]._mirange; + missile[i]._mirange--; if (!missile[i]._miVar1) - CheckMissileCol(i, missile[v2]._midam, missile[v2]._midam, 0, missile[v2]._mix, missile[v2]._miy, 1); - if (missile[v2]._miHitFlag) - missile[v2]._miVar1 = 1; - if (!missile[v2]._mirange) - missile[v2]._miDelFlag = TRUE; - PutMissile(v1); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 0, missile[i]._mix, missile[i]._miy, 1); + if (missile[i]._miHitFlag == TRUE) + missile[i]._miVar1 = 1; + if (!missile[i]._mirange) + missile[i]._miDelFlag = TRUE; + PutMissile(i); } void __fastcall MI_Rhino(int i) From d1f5ae5535e70b8abb4641875bc7c0ad71d7faaf Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:52:28 +0100 Subject: [PATCH 09/31] MI_Stone bin exact (#649) --- Source/missiles.cpp | 44 +++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index ccc81628c..4fff6cd85 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4915,38 +4915,28 @@ void __fastcall MI_Teleport(int i) void __fastcall MI_Stone(int i) { - int v1; // esi - int v2; // edi - int v3; // edi - BOOLEAN v4; // zf - BOOLEAN v5; // sf - int ia; // [esp+Ch] [ebp-4h] + int m; - v1 = i; - ia = i; - v2 = missile[i]._miVar2; - --missile[v1]._mirange; - v3 = v2; - if (!monster[v3]._mhitpoints && _LOBYTE(missile[v1]._miAnimType) != MFILE_MAGBALL) { - missile[v1]._mimfnum = 0; - missile[v1]._miDrawFlag = TRUE; + missile[i]._mirange--; + m = missile[i]._miVar2; + if (!monster[m]._mhitpoints && missile[i]._miAnimType != MFILE_SHATTER1) { + missile[i]._mimfnum = 0; + missile[i]._miDrawFlag = TRUE; SetMissAnim(i, MFILE_SHATTER1); - missile[v1]._mirange = 11; + missile[i]._mirange = 11; } - if (monster[v3]._mmode == MM_STONE) { - if (!missile[v1]._mirange) { - v4 = monster[v3]._mhitpoints == 0; - v5 = monster[v3]._mhitpoints < 0; - missile[v1]._miDelFlag = TRUE; - if (v5 || v4) - AddDead(monster[v3]._mx, monster[v3]._my, stonendx, (direction)monster[v3]._mdir); + if (monster[m]._mmode != MM_STONE) { + missile[i]._miDelFlag = TRUE; + } else { + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + if (monster[m]._mhitpoints > 0) + monster[m]._mmode = missile[i]._miVar1; else - monster[v3]._mmode = missile[v1]._miVar1; + AddDead(monster[m]._mx, monster[m]._my, stonendx, (direction)monster[m]._mdir); } - if (_LOBYTE(missile[v1]._miAnimType) == MFILE_MAGBALL) - PutMissile(ia); - } else { - missile[v1]._miDelFlag = TRUE; + if (missile[i]._miAnimType == MFILE_SHATTER1) + PutMissile(i); } } From 9c3e6f1ea45da62ae2cdd3c65ae06202cf4f56b0 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:53:27 +0100 Subject: [PATCH 10/31] MI_Teleport bin exact (#648) --- Source/missiles.cpp | 65 ++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 42 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 4fff6cd85..5883c51af 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4865,51 +4865,32 @@ void __fastcall MI_Acidsplat(int i) void __fastcall MI_Teleport(int i) { - int v1; // edi - int v2; // ebx - int *v3; // eax - int v4; // esi - int v5; // ecx - int v6; // edx - int v7; // ecx - int v8; // edx - int v9; // edx - int v10; // eax - BOOLEAN v11; // zf + int id; - v1 = i; - v2 = missile[i]._misource; - v3 = &missile[i]._mirange; - if (--*v3 > 0) { - v4 = v2; - v5 = plr[v2].WorldX; - v6 = plr[v2].WorldY; - dPlayer[plr[v2].WorldX][v6] = 0; - PlrClrTrans(v5, v6); - v7 = missile[v1]._mix; - v8 = missile[v1]._miy; - plr[v4].WorldX = v7; - plr[v4].WorldY = v8; - plr[v4]._px = v7; - plr[v4]._py = v8; - plr[v4]._poldx = v7; - plr[v4]._poldy = v8; - PlrDoTrans(v7, v8); - v9 = plr[v2].WorldX; - missile[v1]._miVar1 = 1; - v10 = plr[v2].WorldY; - v11 = leveltype == DTYPE_TOWN; - dPlayer[v9][v10] = v2 + 1; - if (!v11) { - ChangeLightXY(plr[v4]._plid, v9, v10); - ChangeVisionXY(plr[v4]._pvid, plr[v4].WorldX, plr[v4].WorldY); + id = missile[i]._misource; + missile[i]._mirange--; + if (missile[i]._mirange <= 0) { + missile[i]._miDelFlag = TRUE; + } else { + dPlayer[plr[id].WorldX][plr[id].WorldY] = 0; + PlrClrTrans(plr[id].WorldX, plr[id].WorldY); + plr[id].WorldX = missile[i]._mix; + plr[id].WorldY = missile[i]._miy; + plr[id]._px = missile[i]._mix; + plr[id]._py = missile[i]._miy; + plr[id]._poldx = missile[i]._mix; + plr[id]._poldy = missile[i]._miy; + PlrDoTrans(missile[i]._mix, missile[i]._miy); + missile[i]._miVar1 = 1; + dPlayer[plr[id].WorldX][plr[id].WorldY] = id + 1; + if (leveltype != DTYPE_TOWN) { + ChangeLightXY(plr[id]._plid, plr[id].WorldX, plr[id].WorldY); + ChangeVisionXY(plr[id]._pvid, plr[id].WorldX, plr[id].WorldY); } - if (v2 == myplr) { - ViewX = plr[v4].WorldX - ScrollInfo._sdx; - ViewY = plr[v4].WorldY - ScrollInfo._sdy; + if (id == myplr) { + ViewX = plr[id].WorldX - ScrollInfo._sdx; + ViewY = plr[id].WorldY - ScrollInfo._sdy; } - } else { - missile[v1]._miDelFlag = TRUE; } } From 5a1acc1ad3a54846cd6d2e24ad52379273d7287b Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:54:18 +0100 Subject: [PATCH 11/31] MI_Acidsplat bin exact (#647) --- Source/missiles.cpp | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 5883c51af..85440aa20 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4828,38 +4828,21 @@ void __fastcall MI_Misexp(int i) void __fastcall MI_Acidsplat(int i) { - int v1; // eax - int v2; // edx - int v3; // edx - int v4; // edx - int v5; // ST1C_4 + int monst, dam; - v1 = i; - v2 = missile[i]._mirange; - if (v2 == missile[i]._miAnimLen) { - ++missile[v1]._mix; - ++missile[v1]._miy; - missile[v1]._miyoff -= 32; + if (missile[i]._mirange == missile[i]._miAnimLen) { + missile[i]._mix++; + missile[i]._miy++; + missile[i]._miyoff -= 32; } - v3 = v2 - 1; - missile[v1]._mirange = v3; - if (v3) { - PutMissile(i); + missile[i]._mirange--; + if (!missile[i]._mirange) { + monst = missile[i]._misource; + dam = missile[i]._mispllvl; + missile[i]._miDelFlag = TRUE; + AddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_ACIDPUD, 1, monst, (monster[monst].MData->mLevel >= 2) + 1, dam); } else { - v4 = missile[v1]._misource; - v5 = missile[v1]._mispllvl; - missile[v1]._miDelFlag = TRUE; - AddMissile( - missile[v1]._mix, - missile[v1]._miy, - i, - 0, - missile[v1]._mimfnum, - MIS_ACIDPUD, - 1, - v4, - (monster[v4].MData->mLevel >= 2) + 1, - v5); + PutMissile(i); } } From 08b0725c334243854391687ef24d2c5b482bf3be Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:57:29 +0100 Subject: [PATCH 12/31] MI_Weapexp bin exact (#645) --- Source/missiles.cpp | 67 ++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 85440aa20..f886db03d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4732,59 +4732,32 @@ void __fastcall mi_null_11(int i) void __fastcall MI_Weapexp(int i) { - int v1; // esi - int v2; // ecx - int v3; // eax - int v4; // ecx - BOOLEAN v5; // zf - int v6; // edx - int v7; // eax - int v8; // eax - int v9; // ecx - int ExpLight[10]; // [esp+4h] [ebp-2Ch] - int ia; // [esp+2Ch] [ebp-4h] + int id, mind, maxd; + int ExpLight[10] = { 9, 10, 11, 12, 11, 10, 8, 6, 4, 2 }; - ia = i; - v1 = i; - --missile[v1]._mirange; - ExpLight[0] = 9; - ExpLight[1] = 10; - ExpLight[5] = 10; - v2 = missile[i]._mitype; - ExpLight[2] = 11; - ExpLight[4] = 11; - v3 = missile[v1]._misource; - v4 = v2; - v5 = missile[v1]._miVar2 == 1; - ExpLight[3] = 12; - ExpLight[6] = 8; - ExpLight[7] = 6; - ExpLight[8] = 4; - ExpLight[9] = 2; - if (v5) { - v6 = plr[v3]._pIFMinDam; - v7 = plr[v3]._pIFMaxDam; - missiledata[v4].mResist = MISR_FIRE; + missile[i]._mirange--; + if (missile[i]._miVar2 == 1) { + mind = plr[id]._pIFMinDam; + maxd = plr[id]._pIFMaxDam; + missiledata[missile[i]._mitype].mResist = MISR_FIRE; } else { - v6 = plr[v3]._pILMinDam; - v7 = plr[v3]._pILMaxDam; - missiledata[v4].mResist = MISR_LIGHTNING; + mind = plr[id]._pILMinDam; + maxd = plr[id]._pILMaxDam; + missiledata[missile[i]._mitype].mResist = MISR_LIGHTNING; } - CheckMissileCol(ia, v6, v7, 0, missile[v1]._mix, missile[v1]._miy, 0); - v8 = missile[v1]._miVar1; - if (v8) { - if (missile[v1]._mirange) - ChangeLight(missile[v1]._mlid, missile[v1]._mix, missile[v1]._miy, ExpLight[v8]); + CheckMissileCol(i, mind, maxd, 0, missile[i]._mix, missile[i]._miy, 0); + if (!missile[i]._miVar1) { + missile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 9); } else { - missile[v1]._mlid = AddLight(missile[v1]._mix, missile[v1]._miy, 9); + if (missile[i]._mirange) + ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar1]); } - ++missile[v1]._miVar1; - if (missile[v1]._mirange) { - PutMissile(ia); + missile[i]._miVar1++; + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + AddUnLight(missile[i]._mlid); } else { - v9 = missile[v1]._mlid; - missile[v1]._miDelFlag = TRUE; - AddUnLight(v9); + PutMissile(i); } } From dfd7b9a1ad3c3f9f4581283860b69bec3ba2df1d Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:58:00 +0100 Subject: [PATCH 13/31] mi_null_11 bin exact (#644) --- Source/missiles.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index f886db03d..9f19f50ab 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4717,16 +4717,11 @@ void __fastcall MI_Chain(int i) void __fastcall mi_null_11(int i) { - int v1; // eax - BOOLEAN v2; // zf - - v1 = i; - v2 = missile[i]._mirange == 1; - --missile[v1]._mirange; - if (v2) - missile[v1]._miDelFlag = TRUE; - if (missile[v1]._miAnimFrame == missile[v1]._miAnimLen) - missile[v1]._miPreFlag = TRUE; + missile[i]._mirange--; + if (!missile[i]._mirange) + missile[i]._miDelFlag = TRUE; + if (missile[i]._miAnimFrame == missile[i]._miAnimLen) + missile[i]._miPreFlag = TRUE; PutMissile(i); } From 2af2fd144fd97919e1b929191a839ec0f6c03e28 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:58:27 +0100 Subject: [PATCH 14/31] mi_null_33 bin exact (#643) --- Source/missiles.cpp | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 9f19f50ab..60b796cd8 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3889,21 +3889,14 @@ void __fastcall MI_Lightball(int i) void __fastcall mi_null_33(int i) { - int v1; // edi - int v2; // esi - int v3; // eax - - v1 = i; - v2 = i; - v3 = missile[i]._mixvel; - --missile[v2]._mirange; - missile[v2]._mitxoff += v3; - missile[v2]._mityoff += missile[i]._miyvel; + missile[i]._mirange--; + missile[i]._mitxoff += missile[i]._mixvel; + missile[i]._mityoff += missile[i]._miyvel; GetMissilePos(i); - CheckMissileCol(v1, missile[v2]._midam, missile[v2]._midam, 0, missile[v2]._mix, missile[v2]._miy, 0); - if (!missile[v2]._mirange) - missile[v2]._miDelFlag = TRUE; - PutMissile(v1); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 0, missile[i]._mix, missile[i]._miy, 0); + if (!missile[i]._mirange) + missile[i]._miDelFlag = TRUE; + PutMissile(i); } void __fastcall MI_Acidpud(int i) From ede04debd07dbdde7b91057407fa1d20f4a96f69 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 00:59:14 +0100 Subject: [PATCH 15/31] MI_Lightball bin exact (#642) --- Source/missiles.cpp | 53 ++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 60b796cd8..94ca565dc 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3852,39 +3852,32 @@ LABEL_39: void __fastcall MI_Lightball(int i) { - int v1; // esi - int v2; // ebx - int v3; // eax - int v4; // edi - char v5; // al - int v6; // eax - int v7; // eax - int ia; // [esp+Ch] [ebp-8h] - int v10; // [esp+10h] [ebp-4h] + int tx, ty, j, oi; + char obj; - v1 = i; - ia = i; - v2 = missile[i]._miVar1; - missile[v1]._mitxoff += missile[i]._mixvel; - v3 = missile[i]._miyvel; - v4 = missile[i]._miVar2; - --missile[v1]._mirange; - missile[v1]._mityoff += v3; + tx = missile[i]._miVar1; + missile[i]._mitxoff += missile[i]._mixvel; + ty = missile[i]._miVar2; + missile[i]._mirange--; + missile[i]._mityoff += missile[i]._miyvel; GetMissilePos(i); - v10 = 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 = v10; - v5 = dObject[v2][v4]; - if (v5 && v2 == missile[v1]._mix && v4 == missile[v1]._miy) { - v6 = v5 <= 0 ? -1 - v5 : v5 - 1; - v7 = object[v6]._otype; - if (v7 == OBJ_SHRINEL || v7 == OBJ_SHRINER) - missile[v1]._mirange = v10; + 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; + obj = dObject[tx][ty]; + if (obj && tx == missile[i]._mix && ty == missile[i]._miy) { + if (obj > 0) { + oi = obj - 1; + } else { + oi = -1 - obj; + } + if (object[oi]._otype == OBJ_SHRINEL || object[oi]._otype == OBJ_SHRINER) + missile[i]._mirange = j; } - if (!missile[v1]._mirange) - missile[v1]._miDelFlag = TRUE; - PutMissile(ia); + if (!missile[i]._mirange) + missile[i]._miDelFlag = TRUE; + PutMissile(i); } void __fastcall mi_null_33(int i) From 02db9332fc906f48b66f97bb9646147453c9f404 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:04:45 +0100 Subject: [PATCH 16/31] MI_Firewall bin exact (#639) * MI_Firewall bin exact * MI_Firewall bin exact --- Source/missiles.cpp | 62 +++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 45 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 94ca565dc..5af222c88 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3921,58 +3921,30 @@ void __fastcall MI_Acidpud(int i) void __fastcall MI_Firewall(int i) { - int v1; // esi - int v3; // ecx - int v4; // eax - int ExpLight[14]; // [esp+8h] [ebp-3Ch] - int ia; // [esp+40h] [ebp-4h] + int ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12}; - v1 = i; - ExpLight[3] = 5; - ExpLight[4] = 5; - ExpLight[11] = 12; - ExpLight[12] = 12; - --missile[v1]._mirange; - 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; + missile[i]._mirange--; if (missile[i]._mirange == missile[i]._miVar1) { SetMissDir(i, 1); - missile[v1]._miAnimFrame = random(83, 11) + 1; + missile[i]._miAnimFrame = random(83, 11) + 1; } - if (missile[v1]._mirange == missile[v1]._miAnimLen - 1) { - SetMissDir(ia, 0); - missile[v1]._miAnimAdd = -1; - missile[v1]._miAnimFrame = 13; + if (missile[i]._mirange == missile[i]._miAnimLen - 1) { + SetMissDir(i, 0); + missile[i]._miAnimAdd = -1; + missile[i]._miAnimFrame = 13; } - CheckMissileCol(ia, missile[v1]._midam, missile[v1]._midam, 1, missile[v1]._mix, missile[v1]._miy, 1); - if (!missile[v1]._mirange) { - v3 = missile[v1]._mlid; - missile[v1]._miDelFlag = TRUE; - AddUnLight(v3); + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 1, missile[i]._mix, missile[i]._miy, 1); + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + AddUnLight(missile[i]._mlid); } - if (missile[v1]._mimfnum) { - if (missile[v1]._mirange) { - if (missile[v1]._miAnimAdd != -1) { - v4 = missile[v1]._miVar2; - if (v4 < 12) { - if (!v4) - 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]._mimfnum && missile[i]._mirange && missile[i]._miAnimAdd != -1 && missile[i]._miVar2 < 12) { + 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++; } - PutMissile(ia); + PutMissile(i); } void __fastcall MI_Fireball(int i) From 820e70cd945bc555734c77b99f32bdf06259edde Mon Sep 17 00:00:00 2001 From: JustAnotherGuid <46401660+JustAnotherGuid@users.noreply.github.com> Date: Thu, 14 Mar 2019 01:08:48 +0100 Subject: [PATCH 17/31] Clean-up mpqapi_reg_store_modification_time (#623) * Clean-up AddChest. * (Work in progress) Clean-up InitL1Triggers * Clean-up InitL1Triggers (Binary-exact version) * Add /FAs flag. * Rebase * Accidental add. * Minor modifications. * Clean-Up mpqapi_reg_store_modification_time. * Change to DWORD. --- Source/mpqapi.cpp | 31 ++++++++++++++----------------- Source/mpqapi.h | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/Source/mpqapi.cpp b/Source/mpqapi.cpp index a79be494a..9beddeb7f 100644 --- a/Source/mpqapi.cpp +++ b/Source/mpqapi.cpp @@ -101,27 +101,24 @@ void __fastcall mpqapi_update_multi_creation_time(DWORD dwChar) { } -BOOLEAN __fastcall mpqapi_reg_store_modification_time(char *pbData, int dwLen) +BOOLEAN __fastcall mpqapi_reg_store_modification_time(char *pbData, DWORD dwLen) { - int v2; // ebx - char *v3; // ebp - char *v4; // edi - unsigned int v5; // esi - char *v6; // ecx + char *pbCurrentData; + DWORD i; + char *pbDataToXor; - v2 = dwLen; - v3 = pbData; - v4 = pbData; - if ((unsigned int)dwLen >= 8) { - v5 = (unsigned int)dwLen >> 3; + pbCurrentData = pbData; + if (dwLen >= 8) { + i = dwLen >> 3; do { - v6 = v4; - v4 += 8; - mpqapi_xor_buf(v6); - --v5; - } while (v5); + pbDataToXor = pbCurrentData; + pbCurrentData += 8; + mpqapi_xor_buf(pbDataToXor); + --i; + } while (i); } - return SRegSaveData("Diablo", "Video Player ", 0, (unsigned char *)v3, v2); + + return SRegSaveData("Diablo", "Video Player ", 0, (unsigned char *)pbData, dwLen); } void __fastcall mpqapi_remove_hash_entry(const char *pszName) diff --git a/Source/mpqapi.h b/Source/mpqapi.h index 5d6046ea8..71d2c05bc 100644 --- a/Source/mpqapi.h +++ b/Source/mpqapi.h @@ -11,7 +11,7 @@ void __fastcall mpqapi_store_creation_time(const char *pszArchive, int dwChar); BOOLEAN __fastcall mpqapi_reg_load_modification_time(char *dst, int size); void __fastcall mpqapi_xor_buf(char *pbData); void __fastcall mpqapi_update_multi_creation_time(DWORD dwChar); -BOOLEAN __fastcall mpqapi_reg_store_modification_time(char *pbData, int dwLen); +BOOLEAN __fastcall mpqapi_reg_store_modification_time(char *pbData, DWORD dwLen); _BLOCKENTRY *__fastcall j_mpqapi_remove_hash_entry(char *pszName); void __fastcall mpqapi_remove_hash_entry(const char *pszName); void __fastcall mpqapi_free_block(int block_offset, int block_size); From 5dfad500add3957e12e8145e820b11fa614a3509 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:19:09 +0100 Subject: [PATCH 18/31] AddTown bin exact (#635) * AddTown bin exact * Update Source/missiles.cpp AddTown bin exact suggestion commit Co-Authored-By: qndel * Update Source/missiles.cpp AddTown bin exact suggestion commit2 Co-Authored-By: qndel --- Source/missiles.cpp | 133 ++++++++++++++------------------------------ Source/missiles.h | 2 +- 2 files changed, 43 insertions(+), 92 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 5af222c88..4e6df525a 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2178,7 +2178,7 @@ void __fastcall AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, in missile[v9]._mirange = missile[v9]._miAnimLen - 1; } -BOOLEAN __fastcall CheckIfTrig(int x, int y) +BOOL __fastcall CheckIfTrig(int x, int y) { int v2; // edi int v3; // ebx @@ -2208,105 +2208,56 @@ BOOLEAN __fastcall CheckIfTrig(int x, int y) void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) { - int v9; // ebx - int v10; // esi - int v11; // edi - int v12; // eax - int v13; // ecx - char *v14; // eax - int v15; // eax - //int v16; // eax - int v17; // ecx - int v18; // eax - int v19; // eax - int v20; // ecx - int v21; // eax - int v22; // ST0C_4 - int CrawlNum[6]; // [esp+Ch] [ebp-28h] - int i; // [esp+24h] [ebp-10h] - char *v25; // [esp+28h] [ebp-Ch] - int v26; // [esp+2Ch] [ebp-8h] - int v27; // [esp+30h] [ebp-4h] - int x; // [esp+40h] [ebp+Ch] + int i, j, k, mx, tx, ty; + int CrawlNum[6] = { 0, 3, 12, 45, 94, 159 }; - _LOBYTE(v9) = dx; - i = mi; - v10 = mi; - CrawlNum[0] = 0; - CrawlNum[1] = 3; - CrawlNum[2] = 12; - CrawlNum[3] = 45; - CrawlNum[4] = 94; - CrawlNum[5] = 159; + + tx = dx; if (currlevel) { - _LOBYTE(v11) = dx; - missile[v10]._miDelFlag = TRUE; - v26 = 0; - do { - v12 = CrawlNum[v26]; - v13 = (unsigned char)CrawlTable[v12]; - v27 = (unsigned char)CrawlTable[v12]; - if (v13 > 0) { - v14 = &CrawlTable[v12 + 2]; - v25 = v14; - while (1) { - v9 = dx + (char)*(v14 - 1); - v11 = dy + (char)*v14; - if (v9 > 0 && v9 < MAXDUNX && v11 > 0 && v11 < MAXDUNY) { - v15 = v11 + 112 * v9; - if (!(dObject[0][v15] | dPlayer[0][v15] | dMissile[0][v15] | nSolidTable[dPiece[0][v15]] | (unsigned char)nMissileTable[dPiece[0][v15]])) { - //_LOBYTE(v16) = CheckIfTrig(v9, v11); - if (!CheckIfTrig(v9, v11)) - break; + missile[mi]._miDelFlag = TRUE; + for (j = 0; j < 6; j++) { + k = CrawlNum[j] + 2; + for (i = 0; i < (unsigned char)CrawlTable[CrawlNum[j]]; i++) { + tx = dx + CrawlTable[k - 1]; + ty = dy + CrawlTable[k]; + if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { + if (!(dObject[tx][ty] | dPlayer[tx][ty] | dMissile[tx][ty] | nSolidTable[dPiece[tx][ty]] | (unsigned char)nMissileTable[dPiece[tx][ty]])) { + if (!CheckIfTrig(tx, ty)) { + missile[mi]._miDelFlag = FALSE; + missile[mi]._mix = tx; + missile[mi]._miy = ty; + missile[mi]._misx = tx; + missile[mi]._misy = ty; + j = 6; + break; } } - v14 = v25 + 2; - --v27; - v25 += 2; - if (v27 <= 0) - goto LABEL_14; } - missile[v10]._miDelFlag = FALSE; - missile[v10]._mix = v9; - missile[v10]._miy = v11; - missile[v10]._misx = v9; - missile[v10]._misy = v11; - v26 = 6; + k += 2; } - LABEL_14: - ++v26; - } while (v26 < 6); + } } else { - _LOBYTE(v11) = dy; - missile[v10]._mix = dx; - missile[v10]._miy = dy; - missile[v10]._misx = dx; - missile[v10]._misy = dy; - missile[v10]._miDelFlag = FALSE; - } - v17 = nummissiles; - missile[v10]._miVar2 = 0; - v27 = 0; - missile[v10]._mirange = 100; - for (missile[v10]._miVar1 = 100 - missile[v10]._miAnimLen; v27 < v17; ++v27) { - v18 = missileactive[v27]; - x = v18; - v19 = v18; - if (missile[v19]._mitype == MIS_TOWN && x != i && missile[v19]._misource == id) - missile[v19]._mirange = 0; + ty = dy; + missile[mi]._mix = tx; + missile[mi]._miy = ty; + missile[mi]._misx = tx; + missile[mi]._misy = ty; + missile[mi]._miDelFlag = FALSE; + } + missile[mi]._mirange = 100; + missile[mi]._miVar1 = 100 - missile[mi]._miAnimLen; + missile[mi]._miVar2 = 0; + for (i = 0; i < nummissiles; i++) { + mx = missileactive[i]; + if (missile[mx]._mitype == MIS_TOWN && mx != mi && missile[mx]._misource == id) + missile[mx]._mirange = 0; } - PutMissile(i); - _HIWORD(v21) = _HIWORD(id); - if (id == myplr && !missile[v10]._miDelFlag && currlevel) { - if (setlevel) { - _LOWORD(v21) = leveltype; - v22 = v21; - _LOWORD(v21) = setlvlnum; - NetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, v9, v11, v21, v22, 1); + PutMissile(mi); + if (id == myplr && !missile[mi]._miDelFlag && currlevel) { + if (!setlevel) { + NetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, tx, ty, currlevel, leveltype, 0); } else { - _LOWORD(v20) = leveltype; - _LOWORD(v21) = currlevel; - NetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, v9, v11, v21, v20, 0); + NetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, tx, ty, setlvlnum, leveltype, 1); } } } diff --git a/Source/missiles.h b/Source/missiles.h index e649b3395..96aec1f30 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -50,7 +50,7 @@ void __fastcall AddLightctrl(int mi, int sx, int sy, int dx, int dy, int midir, void __fastcall AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); void __fastcall AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); void __fastcall AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); -BOOLEAN __fastcall CheckIfTrig(int x, int y); +BOOL __fastcall CheckIfTrig(int x, int y); void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); void __fastcall AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); void __fastcall AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam); From d1288a0f80e0bffc43301c24a59062480f37b438 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:40:05 +0100 Subject: [PATCH 19/31] MI_Golem bin exact (#641) * MI_Golem bin exact * Update Source/missiles.cpp - MI_Golem suggestion1 Co-Authored-By: qndel --- Source/missiles.cpp | 95 ++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 71 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 4e6df525a..aa23b9709 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3395,79 +3395,32 @@ void __fastcall MI_Dummy(int i) void __fastcall MI_Golem(int i) { - int v1; // esi - int v2; // eax - int v3; // eax - BOOLEAN v4; // zf - int v5; // eax - int v6; // ecx - char *v7; // eax - int v8; // ebx - int v9; // edi - int v10; // edx - int v11; // ecx - int CrawlNum[6]; // [esp+4h] [ebp-38h] - int arglist; // [esp+1Ch] [ebp-20h] - int mi; // [esp+20h] [ebp-1Ch] - unsigned int v16; // [esp+24h] [ebp-18h] - int v17; // [esp+28h] [ebp-14h] - int v18; // [esp+2Ch] [ebp-10h] - char *v19; // [esp+30h] [ebp-Ch] - int v20; // [esp+34h] [ebp-8h] - int v21; // [esp+38h] [ebp-4h] - - mi = i; - v1 = i; - v2 = missile[i]._misource; - arglist = v2; - v3 = v2; - v4 = monster[v3]._mx == 1; - CrawlNum[0] = 0; - CrawlNum[1] = 3; - CrawlNum[2] = 12; - CrawlNum[3] = 45; - CrawlNum[4] = 94; - CrawlNum[5] = 159; - if (!v4 || monster[v3]._my) - goto LABEL_17; - v21 = 0; - do { - v5 = CrawlNum[v21]; - v6 = (unsigned char)CrawlTable[v5]; - v20 = (unsigned char)CrawlTable[v5]; - if (v6 <= 0) - goto LABEL_16; - v7 = &CrawlTable[v5 + 2]; - v19 = v7; - while (1) { - v8 = missile[v1]._miVar4 + (char)*(v7 - 1); - v9 = missile[v1]._miVar5 + (char)*v7; - if (v8 <= 0 || v8 >= MAXDUNX || v9 <= 0 || v9 >= MAXDUNY) - goto LABEL_13; - v10 = missile[v1]._miVar2; - v11 = missile[v1]._miVar1; - v18 = v9 + 112 * v8; - v16 = 4 * v18; - v17 = dPiece[0][v18]; - if (LineClear(v11, v10, v8, v9)) { - if (!(dMonster[0][v16 / 4] | nSolidTable[v17] | dObject[0][v18])) - break; + int CrawlNum[6] = { 0, 3, 12, 45, 94, 159 }; + int tx, ty, dp, l,m, src, k, tid; + + src = missile[i]._misource; + if (monster[src]._mx == 1 && !monster[src]._my) { + for (l = 0; l < 6; l++) { + k = CrawlNum[l]; + tid = k + 2; + for (m = (unsigned char)CrawlTable[k];m > 0; m--){ + tx = missile[i]._miVar4 + CrawlTable[tid - 1]; + ty = missile[i]._miVar5 + CrawlTable[tid]; + if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) { + dp = dPiece[tx][ty]; + if (LineClear(missile[i]._miVar1, missile[i]._miVar2, tx, ty)) { + if (!(dMonster[tx][ty] | nSolidTable[dp] | dObject[tx][ty])) { + l = 6; + SpawnGolum(src, tx, ty, i); + break; + } + } + } + tid += 2; } - v7 = v19; - LABEL_13: - v7 += 2; - --v20; - v19 = v7; - if (v20 <= 0) - goto LABEL_16; } - v21 = 6; - SpawnGolum(arglist, v8, v9, mi); - LABEL_16: - ++v21; - } while (v21 < 6); -LABEL_17: - missile[v1]._miDelFlag = TRUE; + } + missile[i]._miDelFlag = TRUE; } void __fastcall MI_SetManashield(int i) From 631cc3099560c879e53e6650689eb74a878a8426 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:40:56 +0100 Subject: [PATCH 20/31] MI_Infra bin exact (#651) * MI_Infra bin exact * MI_Infra bin exact --- Source/missiles.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index aa23b9709..5ff87fd1d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4970,19 +4970,11 @@ void __fastcall MI_FirewallC(int i) void __fastcall MI_Infra(int i) { - int v1; // eax - int *v2; // ecx - int v3; // esi - int v4; // ecx - - v1 = i; - v2 = &missile[i]._mirange; - v3 = --*v2; - v4 = missile[v1]._misource; - plr[missile[v1]._misource]._pInfraFlag = 1; - if (!v3) { - missile[v1]._miDelFlag = TRUE; - CalcPlrItemVals(v4, 1); + missile[i]._mirange--; + plr[missile[i]._misource]._pInfraFlag = TRUE; + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + CalcPlrItemVals(missile[i]._misource, TRUE); } } From 0f95e48867a19ab754c585c59c5bfca92eadd254 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:43:13 +0100 Subject: [PATCH 21/31] AddTown bin exact fix (#653) --- Source/missiles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 5ff87fd1d..e9c8beea9 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2217,7 +2217,7 @@ void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int m missile[mi]._miDelFlag = TRUE; for (j = 0; j < 6; j++) { k = CrawlNum[j] + 2; - for (i = 0; i < (unsigned char)CrawlTable[CrawlNum[j]]; i++) { + for (i = (unsigned char)CrawlTable[CrawlNum[j]]; i > 0; i--) { tx = dx + CrawlTable[k - 1]; ty = dy + CrawlTable[k]; if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { From 2525f5bd150b658c42eee45e6ba0989d60c4b3da Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:44:13 +0100 Subject: [PATCH 22/31] CheckIfTrig bin exact (#636) * CheckIfTrig bin exact * CheckIfTrig bin exact suggestion #1 Co-Authored-By: qndel * CheckIfTrig bin exact suggestion #2 Co-Authored-By: qndel --- Source/missiles.cpp | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index e9c8beea9..ee50e93cf 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2180,30 +2180,13 @@ void __fastcall AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, in BOOL __fastcall CheckIfTrig(int x, int y) { - int v2; // edi - int v3; // ebx - int *v4; // esi - int v5; // eax - int v7; // [esp+Ch] [ebp-4h] + int i; - v7 = 0; - v2 = y; - v3 = x; - if (trigflag[4] <= 0) - return 0; - v4 = &trigs[0]._ty; - while (1) { - v5 = *(v4 - 1); - if (v3 == v5 && v2 == *v4) - break; - if (abs(v5 - v3) < 2 && abs(*v4 - v2) < 2) - break; - ++v7; - v4 += 4; - if (v7 >= trigflag[4]) - return 0; + for (i = 0; i < trigflag[4]; i++){ + if ((x == trigs[i]._tx && y == trigs[i]._ty) || (abs(trigs[i]._tx - x) < 2 && abs(trigs[i]._ty - y) < 2)) + return TRUE; } - return 1; + return FALSE; } void __fastcall AddTown(int mi, int sx, int sy, int dx, int dy, int midir, int mienemy, int id, int dam) From a2d823bb1aba3da8037a7f1a793692e1f132b291 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:52:01 +0100 Subject: [PATCH 23/31] MI_Acidpud bin exact (#638) * MI_Acidpud bin exact * Update Source/missiles.cpp Co-Authored-By: mewmew --- Source/missiles.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index ee50e93cf..aa199ddac 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3781,29 +3781,21 @@ void __fastcall mi_null_33(int i) void __fastcall MI_Acidpud(int i) { - int v1; // ebx - int v2; // esi - int v3; // ST0C_4 - int v4; // edx - int v5; // edi + int range; - v1 = i; - v2 = i; - v3 = missile[i]._miy; - v4 = missile[i]._midam; - --missile[v2]._mirange; - v5 = missile[i]._mirange; - CheckMissileCol(i, v4, v4, 1, missile[i]._mix, v3, 0); - missile[v2]._mirange = v5; - if (!v5) { - if (missile[v2]._mimfnum) { - missile[v2]._miDelFlag = TRUE; + missile[i]._mirange--; + range = missile[i]._mirange; + CheckMissileCol(i, missile[i]._midam, missile[i]._midam, 1, missile[i]._mix, missile[i]._miy, 0); + missile[i]._mirange = range; + if (!range) { + if (missile[i]._mimfnum) { + missile[i]._miDelFlag = TRUE; } else { - SetMissDir(v1, 1); - missile[v2]._mirange = missile[v2]._miAnimLen; + SetMissDir(i, 1); + missile[i]._mirange = missile[i]._miAnimLen; } } - PutMissile(v1); + PutMissile(i); } void __fastcall MI_Firewall(int i) From 3ffe00bca7c248a84bcee9b181f312c8622c5fcf Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 01:58:29 +0100 Subject: [PATCH 24/31] GetDirection8 almost bin exact - halp plox (#622) --- Source/missiles.cpp | 64 ++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index aa199ddac..30e6d2d27 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -512,18 +512,6 @@ int __fastcall GetSpellLevel(int id, int sn) int __fastcall GetDirection8(int x1, int y1, int x2, int y2) { - int v5; // esi - int v6; // eax - int v7; // eax - int result; // eax - char lrtoul[3]; // [esp+10Ch] [ebp-Ch] - char urtoll[3]; // [esp+10Fh] [ebp-9h] - char lltour[3]; // [esp+112h] [ebp-6h] - char ultolr[3]; // [esp+115h] [ebp-3h] - - int v9 = y1; - int v4 = x1; - unsigned char Dirs[16][16] = { { 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -542,37 +530,29 @@ int __fastcall GetDirection8(int x1, int y1, int x2, int y2) { 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; - - lrtoul[0] = 3; - lrtoul[1] = 4; - lrtoul[2] = 5; - urtoll[0] = 3; - urtoll[1] = 2; - urtoll[2] = 1; - ultolr[0] = 7; - ultolr[1] = 6; - ultolr[2] = 5; - lltour[0] = 7; - lltour[1] = 0; - lltour[2] = 1; - v5 = abs(x2 - x1); - if (v5 > 15) - v5 = 15; - v6 = abs(y2 - v9); - if (v6 > 15) - v6 = 15; - v7 = Dirs[v6][v5]; - if (v4 <= x2) { - if (v9 <= y2) - result = (unsigned char)lltour[v7]; + unsigned char trans[4][3] = { { 3, 4, 5 }, + { 3, 2, 1 }, + { 7, 0, 1 }, + { 7, 6, 5 } }; + int mx, my, md; + + mx = abs(x2 - x1); + if (mx > 15) + mx = 15; + my = abs(y2 - y1); + if (my > 15) + my = 15; + md = Dirs[my][mx]; + if (x1 > x2) { + if (y1 > y2) + md = trans[0][md]; else - result = (unsigned char)ultolr[v7]; - } else if (v9 <= y2) { - result = (unsigned char)urtoll[v7]; - } else { - result = (unsigned char)lrtoul[v7]; - } - return result; + md = trans[1][md]; + } else if (y1 > y2) + md = trans[3][md]; + else + md = trans[2][md]; + return md; } int __fastcall GetDirection16(int x1, int y1, int x2, int y2) From c0c5cc3610d4a836075d11c1b7e9e0a4c9c71ba9 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Wed, 13 Mar 2019 20:40:30 -0500 Subject: [PATCH 25/31] Fix DrawSpellCel (#630) --- Source/control.cpp | 273 +++++++++++++++++++++++++++------------------ Source/control.h | 4 +- 2 files changed, 164 insertions(+), 113 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index 4bed7f96d..a19ec5f59 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -51,7 +51,7 @@ int numpanbtns; // weak void *pStatusPanel; char panelstr[256]; int panelflag; // weak -unsigned char splTrans[256]; +unsigned char SplTransTbl[256]; int initialDropGoldValue; // idb void *pSpellCels; int panbtndown; // weak @@ -183,79 +183,129 @@ int SpellPages[6][7] = { { -1, -1, -1, -1, -1, -1, -1 } }; -void __fastcall DrawSpellCel(int xp, int yp, char *Trans, int nCel, int w) -{ - char *v5; // ebx - char *v6; // esi - char *v7; // edi - int v9; // edx - unsigned int v10; // eax - unsigned int v11; // ecx - char v14; // cf - unsigned int v15; // ecx - int v18; // [esp+Ch] [ebp-Ch] - int _EAX; - unsigned char *_EBX; - - v5 = &Trans[4 * nCel]; - v6 = &Trans[*(_DWORD *)v5]; - v7 = (char *)gpBuffer + screen_y_times_768[yp] + xp; - v18 = (int)&v6[*((_DWORD *)v5 + 1) - *(_DWORD *)v5]; - _EBX = splTrans; - do { - v9 = w; - do { - while (1) { - v10 = (unsigned char)*v6++; - if ((v10 & 0x80u) == 0) - break; - _LOBYTE(v10) = -(char)v10; - v7 += v10; - v9 -= v10; - if (!v9) - goto LABEL_12; - } - v9 -= v10; - v11 = v10 >> 1; - if (v10 & 1) { - _EAX = *v6++; - ASM_XLAT(_EAX, _EBX); - *v7++ = _EAX; - if (!v11) - continue; - } - v14 = v11 & 1; - v15 = v11 >> 1; - if (!v14) - goto LABEL_15; - _EAX = *(_WORD *)v6; - v6 += 2; - ASM_XLAT(_EAX, _EBX); - _EAX = __ROR2__(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - *(_WORD *)v7 = __ROR2__(_EAX, 8); - v7 += 2; - if (v15) { - LABEL_15: - do { - _EAX = *(_DWORD *)v6; - v6 += 4; - ASM_XLAT(_EAX, _EBX); - _EAX = _rotr(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - _EAX = _rotr(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - _EAX = _rotr(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - *(_DWORD *)v7 = _rotr(_EAX, 8); - v7 += 4; - --v15; - } while (v15); +void __fastcall DrawSpellCel(int xp, int yp, BYTE *Trans, int nCel, int w) +{ + BYTE *tmp, *dst, *tbl, *end; + + /// ASSERT: assert(gpBuffer); + + tmp = (BYTE *)gpBuffer; /* remove when fixed */ + dst = &tmp[screen_y_times_768[yp] + xp]; + tbl = SplTransTbl; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov ebx, Trans + mov eax, nCel + shl eax, 2 + add ebx, eax + mov eax, [ebx+4] + sub eax, [ebx] + mov end, eax + mov esi, Trans + add esi, [ebx] + mov edi, dst + mov eax, end + add eax, esi + mov end, eax + mov ebx, tbl + label1: + mov edx, w + label2: + xor eax, eax + lodsb + or al, al + js label6 + sub edx, eax + mov ecx, eax + shr ecx, 1 + jnb label3 + lodsb + xlat + stosb + jecxz label5 + label3: + shr ecx, 1 + jnb label4 + lodsw + xlat + ror ax, 8 + xlat + ror ax, 8 + stosw + jecxz label5 + label4: + lodsd + xlat + ror eax, 8 + xlat + ror eax, 8 + xlat + ror eax, 8 + xlat + ror eax, 8 + stosd + loop label4 + label5: + or edx, edx + jz label7 + jmp label2 + label6: + neg al + add edi, eax + sub edx, eax + jnz label2 + label7: + sub edi, 768 + sub edi, w + cmp esi, end + jnz label1 + } +#else + int i; + BYTE width; + BYTE *src; + DWORD *pFrameTable; + + pFrameTable = (DWORD *)&Trans[4 * nCel]; + src = &Trans[pFrameTable[0]]; + end = &src[pFrameTable[1] - pFrameTable[0]]; + + for(; src != end; dst -= 768 + w) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + // asm_cel_light_edge(width, tbl, dst, src); + if(width & 1) { + dst[0] = tbl[src[0]]; + src++; + dst++; + } + width >>= 1; + if(width & 1) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + dst[2] = tbl[src[2]]; + dst[3] = tbl[src[3]]; + src += 4; + dst += 4; + } + } else { + width = -(char)width; + dst += width; + i -= width; } - } while (v9); - LABEL_12: - v7 = &v7[-w - 768]; - } while (v6 != (char *)v18); + } + } +#endif } void __fastcall SetSpellTrans(char t) @@ -264,53 +314,54 @@ void __fastcall SetSpellTrans(char t) if (t == RSPLTYPE_SKILL) { for (i = 0; i < 128; i++) - splTrans[i] = i; + SplTransTbl[i] = i; } for (i = 128; i < 256; i++) - splTrans[i] = i; - splTrans[255] = 0; + SplTransTbl[i] = i; + SplTransTbl[255] = 0; switch (t) { case RSPLTYPE_SPELL: - splTrans[PAL8_YELLOW] = PAL16_BLUE + 1; - splTrans[PAL8_YELLOW + 1] = PAL16_BLUE + 3; - splTrans[PAL8_YELLOW + 2] = PAL16_BLUE + 5; + SplTransTbl[PAL8_YELLOW] = PAL16_BLUE + 1; + SplTransTbl[PAL8_YELLOW + 1] = PAL16_BLUE + 3; + SplTransTbl[PAL8_YELLOW + 2] = PAL16_BLUE + 5; for (i = PAL16_BLUE; i < PAL16_BLUE + 16; i++) { - splTrans[PAL16_BEIGE - PAL16_BLUE + i] = i; - splTrans[PAL16_YELLOW - PAL16_BLUE + i] = i; - splTrans[PAL16_ORANGE - PAL16_BLUE + i] = i; + SplTransTbl[PAL16_BEIGE - PAL16_BLUE + i] = i; + SplTransTbl[PAL16_YELLOW - PAL16_BLUE + i] = i; + SplTransTbl[PAL16_ORANGE - PAL16_BLUE + i] = i; } - return; + break; case RSPLTYPE_SCROLL: - splTrans[PAL8_YELLOW] = PAL16_BEIGE + 1; - splTrans[PAL8_YELLOW + 1] = PAL16_BEIGE + 3; - splTrans[PAL8_YELLOW + 2] = PAL16_BEIGE + 5; + SplTransTbl[PAL8_YELLOW] = PAL16_BEIGE + 1; + SplTransTbl[PAL8_YELLOW + 1] = PAL16_BEIGE + 3; + SplTransTbl[PAL8_YELLOW + 2] = PAL16_BEIGE + 5; for (i = PAL16_BEIGE; i < PAL16_BEIGE + 16; i++) { - splTrans[PAL16_YELLOW - PAL16_BEIGE + i] = i; - splTrans[PAL16_ORANGE - PAL16_BEIGE + i] = i; + SplTransTbl[PAL16_YELLOW - PAL16_BEIGE + i] = i; + SplTransTbl[PAL16_ORANGE - PAL16_BEIGE + i] = i; } - return; + break; case RSPLTYPE_CHARGES: - splTrans[PAL8_YELLOW] = PAL16_ORANGE + 1; - splTrans[PAL8_YELLOW + 1] = PAL16_ORANGE + 3; - splTrans[PAL8_YELLOW + 2] = PAL16_ORANGE + 5; + SplTransTbl[PAL8_YELLOW] = PAL16_ORANGE + 1; + SplTransTbl[PAL8_YELLOW + 1] = PAL16_ORANGE + 3; + SplTransTbl[PAL8_YELLOW + 2] = PAL16_ORANGE + 5; for (i = PAL16_ORANGE; i < PAL16_ORANGE + 16; i++) { - splTrans[PAL16_BEIGE - PAL16_ORANGE + i] = i; - splTrans[PAL16_YELLOW - PAL16_ORANGE + i] = i; + SplTransTbl[PAL16_BEIGE - PAL16_ORANGE + i] = i; + SplTransTbl[PAL16_YELLOW - PAL16_ORANGE + i] = i; } - return; + break; case RSPLTYPE_INVALID: - splTrans[PAL8_YELLOW] = PAL16_GRAY + 1; - splTrans[PAL8_YELLOW + 1] = PAL16_GRAY + 3; - splTrans[PAL8_YELLOW + 2] = PAL16_GRAY + 5; + SplTransTbl[PAL8_YELLOW] = PAL16_GRAY + 1; + SplTransTbl[PAL8_YELLOW + 1] = PAL16_GRAY + 3; + SplTransTbl[PAL8_YELLOW + 2] = PAL16_GRAY + 5; for (i = PAL16_GRAY; i < PAL16_GRAY + 15; i++) { - splTrans[PAL16_BEIGE - PAL16_GRAY + i] = i; - splTrans[PAL16_YELLOW - PAL16_GRAY + i] = i; - splTrans[PAL16_ORANGE - PAL16_GRAY + i] = i; + SplTransTbl[PAL16_BEIGE - PAL16_GRAY + i] = i; + SplTransTbl[PAL16_YELLOW - PAL16_GRAY + i] = i; + SplTransTbl[PAL16_ORANGE - PAL16_GRAY + i] = i; } - splTrans[PAL16_BEIGE + 15] = 0; - splTrans[PAL16_YELLOW + 15] = 0; - splTrans[PAL16_ORANGE + 15] = 0; + SplTransTbl[PAL16_BEIGE + 15] = 0; + SplTransTbl[PAL16_YELLOW + 15] = 0; + SplTransTbl[PAL16_ORANGE + 15] = 0; + break; } } @@ -342,9 +393,9 @@ void __cdecl DrawSpell() v2 = RSPLTYPE_INVALID; SetSpellTrans(v2); if (v6 == -1) - DrawSpellCel(629, 631, (char *)pSpellCels, 27, 56); + DrawSpellCel(629, 631, (BYTE *)pSpellCels, 27, 56); else - DrawSpellCel(629, 631, (char *)pSpellCels, (char)SpellITbl[v3], 56); + DrawSpellCel(629, 631, (BYTE *)pSpellCels, (char)SpellITbl[v3], 56); } void __cdecl DrawSpellList() @@ -430,11 +481,11 @@ void __cdecl DrawSpellList() } if (!currlevel && !*v20) SetSpellTrans(RSPLTYPE_INVALID); - DrawSpellCel(v17, xp, (char *)pSpellCels, (char)SpellITbl[v4], 56); + DrawSpellCel(v17, xp, (BYTE *)pSpellCels, (char)SpellITbl[v4], 56); if (MouseX >= v17 - 64 && MouseX < v17 - 64 + 56 && MouseY >= v22 && MouseY < v22 + 56) { pSpell = v4; pSplType = v1; - DrawSpellCel(v17, xp, (char *)pSpellCels, yp, 56); + DrawSpellCel(v17, xp, (BYTE *)pSpellCels, yp, 56); if (v1) { switch (v1) { case RSPLTYPE_SPELL: @@ -500,7 +551,7 @@ void __cdecl DrawSpellList() v16 = 0; do { if (plr[v0]._pSplHotKey[v16] == pSpell && plr[v0]._pSplTHotKey[v16] == pSplType) { - DrawSpellCel(v17, xp, (char *)pSpellCels, v16 + 48, 56); + DrawSpellCel(v17, xp, (BYTE *)pSpellCels, v16 + 48, 56); sprintf(tempstr, "Spell Hot Key #F%i", v16 + 5); AddPanelString(tempstr, 1); v0 = myplr; @@ -2299,10 +2350,10 @@ void __cdecl DrawSpellBook() if (v2 != -1 && (v1 & v0)) { v7 = GetSBookTrans(v2, TRUE); SetSpellTrans(v7); - DrawSpellCel(395, v8 + 1, (char *)pSBkIconCels, (char)SpellITbl[v2], MAX_SPELLS); + DrawSpellCel(395, v8 + 1, (BYTE *)pSBkIconCels, (char)SpellITbl[v2], MAX_SPELLS); if (v2 == plr[myplr]._pRSpell && v7 == _LOBYTE(plr[myplr]._pRSplType)) { SetSpellTrans(RSPLTYPE_SKILL); - DrawSpellCel(395, v8 + 1, (char *)pSBkIconCels, 43, MAX_SPELLS); + DrawSpellCel(395, v8 + 1, (BYTE *)pSBkIconCels, 43, MAX_SPELLS); } PrintSBookStr(10, v8 - 22, 0, spelldata[v2].sNameText, 0); v3 = GetSBookTrans(v2, FALSE); diff --git a/Source/control.h b/Source/control.h index 6beb3d172..23299e68c 100644 --- a/Source/control.h +++ b/Source/control.h @@ -46,14 +46,14 @@ extern int numpanbtns; // weak extern void *pStatusPanel; extern char panelstr[256]; extern int panelflag; // weak -extern unsigned char spell_trans[256]; +extern unsigned char SplTransTbl[256]; extern int initialDropGoldValue; // idb extern void *pSpellCels; extern int panbtndown; // weak extern void *pTalkPanel; // idb extern int spselflag; // weak -void __fastcall DrawSpellCel(int xp, int yp, char *Trans, int nCel, int w); +void __fastcall DrawSpellCel(int xp, int yp, BYTE *Trans, int nCel, int w); void __fastcall SetSpellTrans(char t); void __cdecl DrawSpell(); void __cdecl DrawSpellList(); From 764ed1d5f15028cccd74f391ae189e57bb42a7ed Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 02:41:13 +0100 Subject: [PATCH 26/31] GetMissileVel bin exact (#624) * GetMissileVel bin exact * GetMissileVel bin exact suggestion #1 Co-Authored-By: qndel * GetMissileVel bin exact suggestion #1 Co-Authored-By: qndel --- Source/missiles.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 30e6d2d27..d0213e3e1 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -646,23 +646,17 @@ void __fastcall DeleteMissile(int mi, int i) void __fastcall GetMissileVel(int i, int sx, int sy, int dx, int dy, int v) { - int v6; // eax - double v7; // ST18_8 - double v8; // ST10_8 - int v9; // esi - double v10; // st7 + double dxp,dyp,dr; if (dx != sx || dy != sy) { - v7 = (double)((dx + sy - sx - dy) << 21); - v8 = (double)((dy + dx - sx - sy) << 21); - v9 = i; - v10 = 1.0 / sqrt(v8 * v8 + v7 * v7); - missile[v9]._mixvel = (signed __int64)((double)(v << 16) * v7 * v10); - missile[v9]._miyvel = (signed __int64)((double)(v << 15) * v8 * v10); + dxp = (dx + sy - sx - dy) << 21; + dyp = (dy + dx - sx - sy) << 21; + dr = sqrt(dxp * dxp + dyp * dyp); + missile[i]._mixvel = (dxp * (v << 16)) / dr; + missile[i]._miyvel = (dyp * (v << 15)) / dr; } else { - v6 = i; - missile[v6]._mixvel = 0; - missile[v6]._miyvel = 0; + missile[i]._mixvel = 0; + missile[i]._miyvel = 0; } } From 81f3f5daa27d2a4edff16225bfcb4c0520826998 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Wed, 13 Mar 2019 20:47:39 -0500 Subject: [PATCH 27/31] Cleaning Engine CEL functions (#652) * Cleaning Engine CEL functions * Fix C functions --- Source/control.cpp | 32 +- Source/doom.cpp | 2 +- Source/engine.cpp | 1633 ++++++++++++++++++++++++++++--------------- Source/engine.h | 28 +- Source/error.cpp | 16 +- Source/gmenu.cpp | 12 +- Source/interfac.cpp | 2 +- Source/inv.cpp | 20 +- Source/items.cpp | 2 +- Source/minitext.cpp | 2 +- Source/quests.cpp | 6 +- Source/scrollrt.cpp | 14 +- Source/stores.cpp | 18 +- Source/town.cpp | 18 +- 14 files changed, 1152 insertions(+), 653 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index a19ec5f59..ae45644eb 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -1118,19 +1118,19 @@ void __cdecl DrawCtrlPan() do { v2 = *v1; if (panbtn[v0]) - CelDecodeOnly(v2 + 64, v1[1] + 178, pPanelButtons, v0 + 1, 71); + CelDecodeOnly(v2 + 64, v1[1] + 178, (BYTE *)pPanelButtons, v0 + 1, 71); else DrawPanelBox(v2, v1[1] - 336, 71, 20, v2 + 64, v1[1] + 160); ++v0; v1 += 5; } while (v0 < 6); if (numpanbtns == 8) { - CelDecodeOnly(151, 634, pMultiBtns, panbtn[6] + 1, 33); + CelDecodeOnly(151, 634, (BYTE *)pMultiBtns, panbtn[6] + 1, 33); if (FriendlyMode) v3 = panbtn[7] + 3; else v3 = panbtn[7] + 5; - CelDecodeOnly(591, 634, pMultiBtns, v3, 33); + CelDecodeOnly(591, 634, (BYTE *)pMultiBtns, v3, 33); } } // 484368: using guessed type int FriendlyMode; @@ -1774,7 +1774,7 @@ void __cdecl DrawChr() int v30; // [esp+54h] [ebp-8h] char a5[4]; // [esp+58h] [ebp-4h] - CelDecodeOnly(64, 511, pChrPanel, 1, 320); + CelDecodeOnly(64, 511, (BYTE *)pChrPanel, 1, 320); ADD_PlrStringXY(20, 32, 151, plr[myplr]._pName, 0); if (plr[myplr]._pClass == PC_WARRIOR) { ADD_PlrStringXY(168, 32, 299, "Warrior", 0); @@ -1937,13 +1937,13 @@ void __cdecl DrawChr() ADD_PlrStringXY(95, 266, 126, a4, 2); v22 = plr[myplr]._pClass; if (plr[myplr]._pBaseStr < MaxStats[v22][ATTRIB_STR]) - CelDecodeOnly(201, 319, pChrButtons, chrbtn[0] + 2, 41); + CelDecodeOnly(201, 319, (BYTE *)pChrButtons, chrbtn[0] + 2, 41); if (plr[myplr]._pBaseMag < MaxStats[v22][ATTRIB_MAG]) - CelDecodeOnly(201, 347, pChrButtons, chrbtn[1] + 4, 41); + CelDecodeOnly(201, 347, (BYTE *)pChrButtons, chrbtn[1] + 4, 41); if (plr[myplr]._pBaseDex < MaxStats[v22][ATTRIB_DEX]) - CelDecodeOnly(201, 376, pChrButtons, chrbtn[2] + 6, 41); + CelDecodeOnly(201, 376, (BYTE *)pChrButtons, chrbtn[2] + 6, 41); if (plr[myplr]._pBaseVit < MaxStats[v22][ATTRIB_VIT]) - CelDecodeOnly(201, 404, pChrButtons, chrbtn[3] + 8, 41); + CelDecodeOnly(201, 404, (BYTE *)pChrButtons, chrbtn[3] + 8, 41); } v23 = plr[myplr]._pMaxHP; a5[0] = v23 > plr[myplr]._pMaxHPBase; @@ -2079,7 +2079,7 @@ void __cdecl DrawLevelUpIcon() if (!stextflag) { v0 = (lvlbtndown != 0) + 2; ADD_PlrStringXY(0, 303, 120, "Level Up", 0); - CelDecodeOnly(104, 495, pChrButtons, v0, 41); + CelDecodeOnly(104, 495, (BYTE *)pChrButtons, v0, 41); } } // 4B851C: using guessed type int lvlbtndown; @@ -2247,7 +2247,7 @@ int __fastcall DrawDurIcon4Item(ItemStruct *pItem, int x, int c) LABEL_18: if (v5 > 2) v7 += 8; - CelDecodeOnly(v4, 495, pDurIcons, v7, 32); + CelDecodeOnly(v4, 495, (BYTE *)pDurIcons, v7, 32); return v4 - 40; } @@ -2339,8 +2339,8 @@ void __cdecl DrawSpellBook() int v11; // [esp+18h] [ebp-10h] int v12; // [esp+1Ch] [ebp-Ch] - CelDecodeOnly(384, 511, pSpellBkCel, 1, 320); - CelDecodeOnly(76 * sbooktab + 391, 508, pSBkBtnCel, sbooktab + 1, 76); + CelDecodeOnly(384, 511, (BYTE *)pSpellBkCel, 1, 320); + CelDecodeOnly(76 * sbooktab + 391, 508, (BYTE *)pSBkBtnCel, sbooktab + 1, 76); v9 = 1; v8 = 214; v0 = plr[myplr]._pISpells | plr[myplr]._pMemSpells | plr[myplr]._pAblSpells; @@ -2482,7 +2482,7 @@ void __fastcall DrawGoldSplit(int amount) screen_x = 0; v1 = amount; - CelDecodeOnly(415, 338, pGBoxBuff, 1, 261); + CelDecodeOnly(415, 338, (BYTE *)pGBoxBuff, 1, 261); sprintf(tempstr, "You have %u gold", initialDropGoldValue); ADD_PlrStringXY(366, 87, 600, tempstr, 3); v2 = get_pieces_str(initialDropGoldValue); @@ -2501,7 +2501,7 @@ void __fastcall DrawGoldSplit(int amount) } screen_xa = screen_x + 452; } - CelDecodeOnly(screen_xa, 300, pCelBuff, frame_4B8800, 12); + CelDecodeOnly(screen_xa, 300, (BYTE *)pCelBuff, frame_4B8800, 12); frame_4B8800 = (frame_4B8800 & 7) + 1; } @@ -2649,7 +2649,7 @@ void __cdecl DrawTalkPan() } while (v4 < 39); *v3 = 0; LABEL_10: - CelDecDatOnly((char *)gpBuffer + a4, (char *)pCelBuff, frame, 12); + CelDecDatOnly((BYTE *)gpBuffer + a4, (BYTE *)pCelBuff, frame, 12); v5 = 0; a1 = plr[0]._pName; v10 = 0; @@ -2677,7 +2677,7 @@ void __cdecl DrawTalkPan() if (talkbtndown[v5]) v7 = (v5 != 0) + 5; } - CelDecodeOnly(236, 18 * v5 + 596, pTalkBtns, v7, 61); + CelDecodeOnly(236, 18 * v5 + 596, (BYTE *)pTalkBtns, v7, 61); goto LABEL_18; } } diff --git a/Source/doom.cpp b/Source/doom.cpp index 7fb51ffbe..eacaf41f5 100644 --- a/Source/doom.cpp +++ b/Source/doom.cpp @@ -95,5 +95,5 @@ void __cdecl doom_draw() } } - CelDecodeOnly(64, 511, pDoomCel, 1, 640); + CelDecodeOnly(64, 511, (BYTE *)pDoomCel, 1, 640); } diff --git a/Source/engine.cpp b/Source/engine.cpp index d436ff85f..dbe361ebf 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -14,337 +14,584 @@ int dword_52B99C; // BOOLEAN valid - if x/y are in bounds const int rand_increment = 1; // unused const int rand_multiplier = 0x015A4E35; // unused -void __fastcall CelDrawDatOnly(char *pDecodeTo, char *pRLEBytes, int dwRLESize, int dwRLEWdt) +void __fastcall CelDrawDatOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - char *v4; // esi - char *v5; // edi - int v6; // edx - unsigned int v7; // eax - unsigned int v8; // ecx - char v9; // cf - unsigned int v10; // ecx - char *v11; // [esp+4h] [ebp-8h] - - v11 = pRLEBytes; - if (pDecodeTo && pRLEBytes) { - v4 = pRLEBytes; - v5 = pDecodeTo; - do { - v6 = dwRLEWdt; - do { - while (1) { - v7 = (unsigned char)*v4++; - if ((v7 & 0x80u) == 0) - break; - _LOBYTE(v7) = -(char)v7; - v5 += v7; - v6 -= v7; - if (!v6) - goto LABEL_14; + int w; + + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pRLEBytes + mov edi, pDecodeTo + 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 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, w + cmp ebx, esi + jnz label1 + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(width & 1) { + dst[0] = src[0]; + src++; + dst++; } - v6 -= v7; - v8 = v7 >> 1; - if (v7 & 1) { - *v5++ = *v4++; - if (!v8) - continue; + width >>= 1; + if(width & 1) { + dst[0] = src[0]; + dst[1] = src[1]; + src += 2; + dst += 2; } - v9 = v8 & 1; - v10 = v7 >> 2; - if (v9) { - *(_WORD *)v5 = *(_WORD *)v4; - v4 += 2; - v5 += 2; - if (!v10) - continue; + width >>= 1; + for(; width; width--) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + src += 4; + dst += 4; } - qmemcpy(v5, v4, 4 * v10); - v4 += 4 * v10; - v5 += 4 * v10; - } while (v6); - LABEL_14: - v5 += -dwRLEWdt - 768; - } while (&v11[dwRLESize] != v4); + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } -void __fastcall CelDecodeOnly(int screen_x, int screen_y, void *pCelBuff, int frame, int frame_width) +void __fastcall CelDecodeOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) { - if (gpBuffer) { - if (pCelBuff) - CelDrawDatOnly( - (char *)gpBuffer + screen_y_times_768[screen_y] + screen_x, - (char *)pCelBuff + *((_DWORD *)pCelBuff + frame), - *((_DWORD *)pCelBuff + frame + 1) - *((_DWORD *)pCelBuff + frame), - frame_width); - } + BYTE *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + tmp = (BYTE *)gpBuffer; + pFrameTable = (DWORD *)pCelBuff; + + CelDrawDatOnly( + &tmp[sx + screen_y_times_768[sy]], + &pCelBuff[pFrameTable[nCel]], + pFrameTable[nCel + 1] - pFrameTable[nCel], + nWidth); } -void __fastcall CelDecDatOnly(char *pBuff, char *pCelBuff, int frame, int frame_width) +void __fastcall CelDecDatOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth) { - if (pCelBuff) { - if (pBuff) - CelDrawDatOnly( - pBuff, - &pCelBuff[*(_DWORD *)&pCelBuff[4 * frame]], - *(_DWORD *)&pCelBuff[4 * frame + 4] - *(_DWORD *)&pCelBuff[4 * frame], - frame_width); - } + DWORD *pFrameTable; + + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(pBuff != NULL); + if(!pBuff) + return; + + pFrameTable = (DWORD *)pCelBuff; + + CelDrawDatOnly( + pBuff, + &pCelBuff[pFrameTable[nCel]], + pFrameTable[nCel + 1] - pFrameTable[nCel], + nWidth); } -void __fastcall CelDrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction) +void __fastcall CelDrawHdrOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v7; // edx - char *v8; // eax - int v9; // edi - int v10; // ecx - int v11; // [esp+Ch] [ebp-8h] - int v12; // [esp+10h] [ebp-4h] + int v1, v2, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; - v12 = screen_y; - v11 = screen_x; - if (gpBuffer) { - if (pCelBuff) { - v7 = *(_DWORD *)&pCelBuff[4 * frame]; - v8 = &pCelBuff[v7]; - v9 = *(unsigned short *)&pCelBuff[v7 + always_0]; - if (*(_WORD *)&pCelBuff[v7 + always_0]) { - if (direction != 8 && *(_WORD *)&v8[direction]) - v10 = *(unsigned short *)&v8[direction] - v9; - else - v10 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v7 - v9; - CelDrawDatOnly( - (char *)gpBuffer + screen_y_times_768[v12 - 16 * always_0] + v11, - &v8[v9], - v10, - frame_width); - } - } - } + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)pCelBuff; + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + v1 = *(WORD *)&pRLEBytes[always_0]; + + if(!v1) + return; + + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + if(dir == 8) + v2 = 0; + else + v2 = *(WORD *)&pRLEBytes[dir]; + if(v2) + nDataSize = v2 - v1; + else + nDataSize -= v1; + + tmp = (BYTE *)gpBuffer; + CelDrawDatOnly( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[v1], + nDataSize, + nWidth); } -void __fastcall CelDecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction) +void __fastcall CelDecodeHdrOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v6; // esi - char *v7; // eax - int v8; // ebx - int v9; // edx - int v10; // edx + int v1, v2, nDataSize; + BYTE *pRLEBytes; + DWORD *pFrameTable; - if (pCelBuff) { - if (pBuff) { - v6 = *(_DWORD *)&pCelBuff[4 * frame]; - v7 = &pCelBuff[v6]; - v8 = *(unsigned short *)&pCelBuff[v6 + always_0]; - if (*(_WORD *)&pCelBuff[v6 + always_0]) { - v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6; - if (direction != 8 && *(_WORD *)&v7[direction]) - v10 = *(unsigned short *)&v7[direction] - v8; - else - v10 = v9 - v8; - CelDrawDatOnly(pBuff, &v7[v8], v10, frame_width); - } - } - } + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(pBuff != NULL); + if(!pBuff) + return; + + pFrameTable = (DWORD *)pCelBuff; + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + v1 = *(WORD *)&pRLEBytes[always_0]; + + if(!v1) + return; + + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + if(dir == 8) + v2 = 0; + else + v2 = *(WORD *)&pRLEBytes[dir]; + if(v2) + nDataSize = v2 - v1; + else + nDataSize -= v1; + + CelDrawDatOnly(pBuff, &pRLEBytes[v1], nDataSize, nWidth); } -void __fastcall CelDecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width) +void __fastcall CelDecDatLightOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - char *v4; // esi - char *v5; // edi - char *v6; // ebx - int v7; // edx - int v8; // eax - int v9; // ST00_4 - char *a3; // [esp+Ch] [ebp-10h] - - if (pDecodeTo && pRLEBytes) { - a3 = &pLightTbl[256 * light_table_index]; - v4 = pRLEBytes; - v5 = pDecodeTo; - v6 = &pRLEBytes[frame_content_size]; - do { - v7 = frame_width; - do { - while (1) { - v8 = (unsigned char)*v4++; - if ((v8 & 0x80u) != 0) /* check sign */ - break; - v9 = v7 - v8; - CelDecDatLightEntry(v8, a3, &v5, &v4); - v7 = v9; - if (!v9) - goto LABEL_9; + int w; + BYTE *tbl; + + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov eax, light_table_index + shl eax, 8 + add eax, pLightTbl + mov tbl, eax + mov esi, pRLEBytes + mov edi, pDecodeTo + 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 label3 + push ebx + mov ebx, tbl + sub edx, eax + mov ecx, eax + push edx + call CelDecDatLightEntry + pop edx + pop ebx + or edx, edx + jnz label2 + jmp label4 + label3: + neg al + add edi, eax + sub edx, eax + jnz label2 + label4: + sub edi, w + cmp ebx, esi + jnz label1 + jmp labexit + } + + /* Assembly Macro */ + __asm { + CelDecDatLightEntry: + shr cl, 1 + jnb label5 + mov dl, [esi] + mov dl, [ebx+edx] + mov [edi], dl + add esi, 1 + add edi, 1 + label5: + shr cl, 1 + jnb label6 + mov dl, [esi] + mov ch, [ebx+edx] + mov [edi], ch + mov dl, [esi+1] + mov ch, [ebx+edx] + mov [edi+1], ch + add esi, 2 + add edi, 2 + label6: + test cl, cl + jz labret + label7: + mov eax, [esi] + add esi, 4 + mov dl, al + mov ch, [ebx+edx] + mov dl, ah + ror eax, 10h + mov [edi], ch + mov ch, [ebx+edx] + mov dl, al + mov [edi+1], ch + mov ch, [ebx+edx] + mov dl, ah + mov [edi+2], ch + mov ch, [ebx+edx] + mov [edi+3], ch + add edi, 4 + dec cl + jnz label7 + labret: + retn + } + + __asm { + labexit: + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + tbl = (BYTE *)&pLightTbl[light_table_index * 256]; + w = nWidth; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(width & 1) { + dst[0] = tbl[src[0]]; + src++; + dst++; } - _LOBYTE(v8) = -(char)v8; - v5 += v8; - v7 -= v8; - } while (v7); - LABEL_9: - v5 += -frame_width - 768; - } while (v6 != v4); + width >>= 1; + if(width & 1) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + dst[2] = tbl[src[2]]; + dst[3] = tbl[src[3]]; + src += 4; + dst += 4; + } + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } // 69BEF8: using guessed type int light_table_index; -void __fastcall CelDecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes) +void __fastcall CelDecDatLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - int i; + int w; + BOOL shift; + BYTE *tbl; - for (i = 0; i < n; i++) { - **pDecodeTo = LightIndex[**pRLEBytes]; - (*pRLEBytes)++; - (*pDecodeTo)++; - } -} + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; -void __fastcall CelDecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width) -{ - char *v4; // esi - int v5; // edi - char *v6; // ebx - int v7; // edx - unsigned int v8; // eax - unsigned int v10; // ecx - char v11; // cf - unsigned int v12; // ecx - char *v13; // esi - _BYTE *v14; // edi - _BYTE *v18; // edi - unsigned int v21; // ecx - _BYTE *v25; // edi - char *v26; // [esp-4h] [ebp-24h] - char *v27; // [esp+Ch] [ebp-14h] - int v28; // [esp+14h] [ebp-Ch] - int _EAX; - char *_EBX; - - if (pDecodeTo && pRLEBytes) { - v27 = &pLightTbl[256 * light_table_index]; - v4 = pRLEBytes; - v5 = (int)pDecodeTo; - v6 = &pRLEBytes[frame_content_size]; - v28 = (unsigned char)pDecodeTo & 1; - do { - v7 = frame_width; - do { - while (1) { - v8 = (unsigned char)*v4++; - if ((v8 & 0x80u) != 0) - break; - v26 = v6; - _EBX = v27; - v7 -= v8; - if ((v5 & 1) == v28) { - v10 = v8 >> 1; - if (!(v8 & 1)) - goto LABEL_10; - ++v4; - ++v5; - if (v10) { - LABEL_17: - v11 = v10 & 1; - v21 = v10 >> 1; - if (!v11) - goto LABEL_26; - _EAX = *v4; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5 = _EAX; - v4 += 2; - v5 += 2; - if (v21) { - LABEL_26: - do { - _EAX = *(_DWORD *)v4; - v4 += 4; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5 = _EAX; - v25 = (_BYTE *)(v5 + 2); - _EAX = _rotr(_EAX, 16); - ASM_XLAT(_EAX, _EBX); - *v25 = _EAX; - v5 = (int)(v25 + 2); - --v21; - } while (v21); - } - goto LABEL_20; +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov eax, light_table_index + shl eax, 8 + add eax, pLightTbl + mov tbl, eax + mov esi, pRLEBytes + mov edi, pDecodeTo + mov eax, 768 + add eax, nWidth + mov w, eax + mov ebx, nDataSize + add ebx, esi + mov eax, edi + and eax, 1 + mov shift, eax + label1: + mov edx, nWidth + label2: + xor eax, eax + lodsb + or al, al + js label9 + push ebx + mov ebx, tbl + sub edx, eax + mov ecx, eax + mov eax, edi + and eax, 1 + cmp eax, shift + jnz label5 + shr ecx, 1 + jnb label3 + inc esi + inc edi + jecxz label8 + jmp label6 + label3: + shr ecx, 1 + jnb label4 + inc esi + inc edi + lodsb + xlat + stosb + jecxz label8 + label4: + lodsd + inc edi + ror eax, 8 + xlat + stosb + ror eax, 10h + inc edi + xlat + stosb + loop label4 + jmp label8 + label5: + shr ecx, 1 + jnb label6 + lodsb + xlat + stosb + jecxz label8 + jmp label3 + label6: + shr ecx, 1 + jnb label7 + lodsb + xlat + stosb + inc esi + inc edi + jecxz label8 + label7: + lodsd + xlat + stosb + inc edi + ror eax, 10h + xlat + stosb + inc edi + loop label7 + label8: + pop ebx + or edx, edx + jz label10 + jmp label2 + label9: + neg al + add edi, eax + sub edx, eax + jnz label2 + label10: + sub edi, w + mov eax, shift + inc eax + and eax, 1 + mov shift, eax + cmp ebx, esi + jnz label1 + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + tbl = (BYTE *)&pLightTbl[light_table_index * 256]; + w = nWidth; + shift = (BYTE)dst & 1; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w, shift = (shift + 1) & 1) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(((BYTE)dst & 1) == shift) { + if(!(width & 1)) { + goto L_ODD; + } else { + src++; + dst++; +L_EVEN: + width >>= 1; + if(width & 1) { + dst[0] = tbl[src[0]]; + src += 2; + dst += 2; } + width >>= 1; + for(; width; width--) { + dst[0] = tbl[src[0]]; + dst[2] = tbl[src[2]]; + src += 4; + dst += 4; + } + } + } else { + if(!(width & 1)) { + goto L_EVEN; } else { - v10 = v8 >> 1; - if (!(v8 & 1)) - goto LABEL_17; - _EAX = *v4++; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5++ = _EAX; - if (v10) { - LABEL_10: - v11 = v10 & 1; - v12 = v10 >> 1; - if (!v11) - goto LABEL_27; - v13 = v4 + 1; - v14 = (_BYTE *)(v5 + 1); - _EAX = *v13; - v4 = v13 + 1; - ASM_XLAT(_EAX, _EBX); - *v14 = _EAX; - v5 = (int)(v14 + 1); - if (v12) { - LABEL_27: - do { - _EAX = *(_DWORD *)v4; - v4 += 4; - v18 = (_BYTE *)(v5 + 1); - _EAX = _rotr(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - *v18 = _EAX; - _EAX = _rotr(_EAX, 16); - v18 += 2; - ASM_XLAT(_EAX, _EBX); - *v18 = _EAX; - v5 = (int)(v18 + 1); - --v12; - } while (v12); - } - goto LABEL_20; + dst[0] = tbl[src[0]]; + src++; + dst++; +L_ODD: + width >>= 1; + if(width & 1) { + dst[1] = tbl[src[1]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[1] = tbl[src[1]]; + dst[3] = tbl[src[3]]; + src += 4; + dst += 4; } } - LABEL_20: - v6 = v26; - if (!v7) - goto LABEL_23; } - _LOBYTE(v8) = -(char)v8; - v5 += v8; - v7 -= v8; - } while (v7); - LABEL_23: - v5 -= frame_width + 768; - v28 = ((_BYTE)v28 + 1) & 1; - } while (v6 != v4); + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } // 69BEF8: using guessed type int light_table_index; -void __fastcall CelDecodeLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width) +void __fastcall CelDecodeLightOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth) { - int v5; // ebx - int v6; // esi - char *v7; // edx - char *v8; // ecx - int v9; // [esp-8h] [ebp-14h] - - v5 = screen_y; - if (gpBuffer && pCelBuff) { - v6 = *(_DWORD *)&pCelBuff[4 * frame]; - v7 = &pCelBuff[v6]; - v8 = (char *)gpBuffer + screen_y_times_768[v5] + screen_x; - v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6; - if (light_table_index) - CelDecDatLightOnly(v8, v7, v9, frame_width); - else - CelDrawDatOnly(v8, v7, v9, frame_width); - } + int nDataSize; + BYTE *pDecodeTo, *pRLEBytes, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + tmp = (BYTE *)gpBuffer; + pFrameTable = (DWORD *)pCelBuff; + + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + pDecodeTo = &tmp[sx + screen_y_times_768[sy]]; + + if(light_table_index) + CelDecDatLightOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); + else + CelDrawDatOnly(pDecodeTo, pRLEBytes, nDataSize, nWidth); } // 69BEF8: using guessed type int light_table_index; @@ -378,9 +625,9 @@ void __fastcall CelDecodeHdrLightOnly(int screen_x, int screen_y, char *pCelBuff v13 = &v10[(_DWORD)cel_buf]; v14 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * always_0] + v15; if (light_table_index) - CelDecDatLightOnly(v14, v13, v12, frame_width); + CelDecDatLightOnly((BYTE *)v14, (BYTE *)v13, v12, frame_width); else - CelDrawDatOnly(v14, v13, v12, frame_width); + CelDrawDatOnly((BYTE *)v14, (BYTE *)v13, v12, frame_width); } } } @@ -411,11 +658,11 @@ void __fastcall CelDecodeHdrLightTrans(char *pBuff, char *pCelBuff, int frame, i v11 = v10 - v9; v12 = &v8[v9]; if (cel_transparency_active) { - CelDecDatLightTrans(pBuff, v12, v11, frame_width); + CelDecDatLightTrans((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); } else if (light_table_index) { - CelDecDatLightOnly(pBuff, v12, v11, frame_width); + CelDecDatLightOnly((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); } else { - CelDrawDatOnly(pBuff, v12, v11, frame_width); + CelDrawDatOnly((BYTE *)pBuff, (BYTE *)v12, v11, frame_width); } } } @@ -508,305 +755,559 @@ void __fastcall CelDrawHdrLightRed(int screen_x, int screen_y, char *pCelBuff, i } // 525728: using guessed type int light4flag; -void __fastcall Cel2DecDatOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width) +void __fastcall Cel2DecDatOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - char *v4; // esi - char *v5; // edi - int v6; // edx - unsigned int v7; // eax - unsigned int v8; // ecx - char v9; // cf - unsigned int v10; // ecx - char *v11; // [esp+4h] [ebp-8h] - - v11 = pRLEBytes; - if (pDecodeTo && pRLEBytes && gpBuffer) { - v4 = pRLEBytes; - v5 = pDecodeTo; - do { - v6 = frame_width; - do { - while (1) { - v7 = (unsigned char)*v4++; - if ((v7 & 0x80u) == 0) - break; - _LOBYTE(v7) = -(char)v7; - v5 += v7; - v6 -= v7; - if (!v6) - goto LABEL_17; - } - v6 -= v7; - if (v5 < (char *)gpBufEnd) { - v8 = v7 >> 1; - if (!(v7 & 1) || (*v5 = *v4, ++v4, ++v5, v8)) { - v9 = v8 & 1; - v10 = v7 >> 2; - if (!v9 || (*(_WORD *)v5 = *(_WORD *)v4, v4 += 2, v5 += 2, v10)) { - qmemcpy(v5, v4, 4 * v10); - v4 += 4 * v10; - v5 += 4 * v10; - } + int w; + + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pRLEBytes + mov edi, pDecodeTo + 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 label7 + sub edx, eax + cmp edi, gpBufEnd + jb label3 + add esi, eax + add edi, eax + jmp label6 + label3: + mov ecx, eax + shr ecx, 1 + jnb label4 + movsb + jecxz label6 + label4: + shr ecx, 1 + jnb label5 + movsw + jecxz label6 + label5: + rep movsd + label6: + or edx, edx + jz label8 + jmp label2 + label7: + neg al + add edi, eax + sub edx, eax + jnz label2 + label8: + sub edi, w + cmp ebx, esi + jnz label1 + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(dst < gpBufEnd) { + 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; + for(; width; width--) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + src += 4; + dst += 4; } } else { - v4 += v7; - v5 += v7; + src += width; + dst += width; } - } while (v6); - LABEL_17: - v5 += -frame_width - 768; - } while (&v11[frame_content_size] != v4); + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } // 69CF0C: using guessed type int gpBufEnd; -void __fastcall Cel2DrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction) +void __fastcall Cel2DrawHdrOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v7; // edx - char *v8; // eax - int v9; // edi - int v10; // ecx - int v11; // [esp+Ch] [ebp-8h] - int v12; // [esp+10h] [ebp-4h] + int v1, v2, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; - v12 = screen_y; - v11 = screen_x; - if (gpBuffer) { - if (pCelBuff) { - v7 = *(_DWORD *)&pCelBuff[4 * frame]; - v8 = &pCelBuff[v7]; - v9 = *(unsigned short *)&pCelBuff[v7 + a6]; - if (*(_WORD *)&pCelBuff[v7 + a6]) { - if (direction != 8 && *(_WORD *)&v8[direction]) - v10 = *(unsigned short *)&v8[direction] - v9; - else - v10 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v7 - v9; - Cel2DecDatOnly( - (char *)gpBuffer + screen_y_times_768[v12 - 16 * a6] + v11, - &v8[v9], - v10, - frame_width); - } - } - } + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + + pFrameTable = (DWORD *)pCelBuff; + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + v1 = *(WORD *)&pRLEBytes[always_0]; + + if(!v1) + return; + + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + if(dir == 8) + v2 = 0; + else + v2 = *(WORD *)&pRLEBytes[dir]; + if(v2) + nDataSize = v2 - v1; + else + nDataSize -= v1; + + tmp = (BYTE *)gpBuffer; + Cel2DecDatOnly( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[v1], + nDataSize, + nWidth); } -void __fastcall Cel2DecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int a5, int direction) +void __fastcall Cel2DecodeHdrOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v6; // edi - char *v7; // esi - int v8; // ebx - int v9; // eax - int v10; // edx - int v11; // eax + int v1, v2, nDataSize; + BYTE *pRLEBytes; + DWORD *pFrameTable; - if (pCelBuff) { - if (pBuff) { - v6 = *(_DWORD *)&pCelBuff[4 * frame]; - v7 = &pCelBuff[v6]; - v8 = *(unsigned short *)&pCelBuff[v6 + a5]; - if (*(_WORD *)&pCelBuff[v6 + a5]) { - v9 = *(_DWORD *)&pCelBuff[4 * frame + 4] - v6; - v10 = *(unsigned short *)&v7[direction]; - if (direction == 8) - v10 = 0; - if (v10) - v11 = v10 - v8; - else - v11 = v9 - v8; - Cel2DecDatOnly(pBuff, &v7[v8], v11, frame_width); - } - } - } + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(pBuff != NULL); + if(!pBuff) + return; + + pFrameTable = (DWORD *)pCelBuff; + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + v1 = *(WORD *)&pRLEBytes[always_0]; + + if(!v1) + return; + + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + v2 = *(WORD *)&pRLEBytes[dir]; + if(dir == 8) + v2 = 0; + if(v2) + nDataSize = v2 - v1; + else + nDataSize -= v1; + + Cel2DecDatOnly(pBuff, &pRLEBytes[v1], nDataSize, nWidth); } -void __fastcall Cel2DecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width) +void __fastcall Cel2DecDatLightOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - char *v4; // esi - char *v5; // edi - char *v6; // ebx - int v7; // edx - int v8; // eax - int v9; // ST00_4 - char *a3; // [esp+Ch] [ebp-10h] - - if (pDecodeTo && pRLEBytes && gpBuffer) { - a3 = &pLightTbl[256 * light_table_index]; - v4 = pRLEBytes; - v5 = pDecodeTo; - v6 = &pRLEBytes[frame_content_size]; - do { - v7 = frame_width; - do { - while (1) { - v8 = (unsigned __int8)*v4++; - if ((v8 & 0x80u) == 0) /* check sign */ - break; - _LOBYTE(v8) = -(char)v8; - v5 += v8; - v7 -= v8; - if (!v7) - goto LABEL_13; - } - v7 -= v8; - if (v5 < (char *)gpBufEnd) { - v9 = v7; - Cel2DecDatLightEntry(v8, a3, &v5, &v4); - v7 = v9; + int w; + BYTE *tbl; + + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov eax, light_table_index + shl eax, 8 + add eax, pLightTbl + mov tbl, eax + mov esi, pRLEBytes + mov edi, pDecodeTo + 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 + push ebx + mov ebx, tbl + sub edx, eax + cmp edi, gpBufEnd + jb label3 + add esi, eax + add edi, eax + jmp label4 + label3: + mov ecx, eax + push edx + call Cel2DecDatLightEntry + pop edx + label4: + pop ebx + 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 + jmp labexit + } + + /* Assembly Macro */ + __asm { + Cel2DecDatLightEntry: + shr cl, 1 + jnb label7 + mov dl, [esi] + mov dl, [ebx+edx] + mov [edi], dl + add esi, 1 + add edi, 1 + label7: + shr cl, 1 + jnb label8 + mov dl, [esi] + mov ch, [ebx+edx] + mov [edi], ch + mov dl, [esi+1] + mov ch, [ebx+edx] + mov [edi+1], ch + add esi, 2 + add edi, 2 + label8: + test cl, cl + jz labret + label9: + mov eax, [esi] + add esi, 4 + mov dl, al + mov ch, [ebx+edx] + mov dl, ah + ror eax, 10h + mov [edi], ch + mov ch, [ebx+edx] + mov dl, al + mov [edi+1], ch + mov ch, [ebx+edx] + mov dl, ah + mov [edi+2], ch + mov ch, [ebx+edx] + mov [edi+3], ch + add edi, 4 + dec cl + jnz label9 + labret: + retn + } + + __asm { + labexit: + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + tbl = (BYTE *)&pLightTbl[light_table_index * 256]; + w = nWidth; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(dst < gpBufEnd) { + if(width & 1) { + dst[0] = tbl[src[0]]; + src++; + dst++; + } + width >>= 1; + if(width & 1) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[0] = tbl[src[0]]; + dst[1] = tbl[src[1]]; + dst[2] = tbl[src[2]]; + dst[3] = tbl[src[3]]; + src += 4; + dst += 4; + } } else { - v4 += v8; - v5 += v8; + src += width; + dst += width; } - } while (v7); - LABEL_13: - v5 += -frame_width - 768; - } while (v6 != v4); + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int gpBufEnd; -void __fastcall Cel2DecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes) +void __fastcall Cel2DecDatLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - int i; + int w; + BOOL shift; + BYTE *tbl; - for (i = 0; i < n; i++) { - **pDecodeTo = LightIndex[**pRLEBytes]; - (*pRLEBytes)++; - (*pDecodeTo)++; - } -} + /// ASSERT: assert(pDecodeTo != NULL); + if(!pDecodeTo) + return; + /// ASSERT: assert(pRLEBytes != NULL); + if(!pRLEBytes) + return; + /// ASSERT: assert(gpBuffer); + if(!gpBuffer) + return; -void __fastcall Cel2DecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width) -{ - char *v4; // esi - unsigned int v5; // edi - char *v6; // ebx - int v7; // edx - unsigned int v8; // eax - unsigned int v10; // ecx - char v11; // cf - unsigned int v12; // ecx - char *v13; // esi - _BYTE *v14; // edi - _BYTE *v18; // edi - unsigned int v21; // ecx - _BYTE *v25; // edi - char *v26; // [esp-4h] [ebp-24h] - char *v27; // [esp+Ch] [ebp-14h] - int v28; // [esp+14h] [ebp-Ch] - int _EAX; - char *_EBX; - - if (pDecodeTo && pRLEBytes && gpBuffer) { - v27 = &pLightTbl[256 * light_table_index]; - v4 = pRLEBytes; - v5 = (unsigned int)pDecodeTo; - v6 = &pRLEBytes[frame_content_size]; - v28 = (unsigned char)pDecodeTo & 1; - do { - v7 = frame_width; - do { - while (1) { - v8 = (unsigned char)*v4++; - if ((v8 & 0x80u) != 0) - break; - v26 = v6; - _EBX = v27; - v7 -= v8; - if (v5 < (unsigned int)gpBufEnd) { - if ((v5 & 1) == v28) { - v10 = v8 >> 1; - if (!(v8 & 1)) - goto LABEL_13; - ++v4; - ++v5; - if (v10) { - LABEL_20: - v11 = v10 & 1; - v21 = v10 >> 1; - if (!v11) - goto LABEL_29; - _EAX = *v4; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5 = _EAX; - v4 += 2; - v5 += 2; - if (v21) { - LABEL_29: - do { - _EAX = *(_DWORD *)v4; - v4 += 4; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5 = _EAX; - v25 = (_BYTE *)(v5 + 2); - _EAX = _rotr(_EAX, 16); - ASM_XLAT(_EAX, _EBX); - *v25 = _EAX; - v5 = (unsigned int)(v25 + 2); - --v21; - } while (v21); - } - goto LABEL_23; - } +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov eax, light_table_index + shl eax, 8 + add eax, pLightTbl + mov tbl, eax + mov esi, pRLEBytes + mov edi, pDecodeTo + mov eax, 768 + add eax, nWidth + mov w, eax + mov ebx, nDataSize + add ebx, esi + mov eax, edi + and eax, 1 + mov shift, eax + label1: + mov edx, nWidth + label2: + xor eax, eax + lodsb + or al, al + js label10 + push ebx + mov ebx, tbl + sub edx, eax + cmp edi, gpBufEnd + jb label3 + add esi, eax + add edi, eax + jmp label9 + label3: + mov ecx, eax + mov eax, edi + and eax, 1 + cmp eax, shift + jnz label6 + shr ecx, 1 + jnb label4 + inc esi + inc edi + jecxz label9 + jmp label7 + label4: + shr ecx, 1 + jnb label5 + inc esi + inc edi + lodsb + xlat + stosb + jecxz label9 + label5: + lodsd + inc edi + ror eax, 8 + xlat + stosb + ror eax, 10h + inc edi + xlat + stosb + loop label5 + jmp label9 + label6: + shr ecx, 1 + jnb label7 + lodsb + xlat + stosb + jecxz label9 + jmp label4 + label7: + shr ecx, 1 + jnb label8 + lodsb + xlat + stosb + inc esi + inc edi + jecxz label9 + label8: + lodsd + xlat + stosb + inc edi + ror eax, 10h + xlat + stosb + inc edi + loop label8 + label9: + pop ebx + or edx, edx + jz label11 + jmp label2 + label10: + neg al + add edi, eax + sub edx, eax + jnz label2 + label11: + sub edi, w + mov eax, shift + inc eax + and eax, 1 + mov shift, eax + cmp ebx, esi + jnz label1 + } +#else + int i; + BYTE width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + tbl = (BYTE *)&pLightTbl[light_table_index * 256]; + w = nWidth; + shift = (BYTE)dst & 1; + + for(; src != &pRLEBytes[nDataSize]; dst -= 768 + w, shift = (shift + 1) & 1) { + for(i = w; i;) { + width = *src++; + if(!(width & 0x80)) { + i -= width; + if(dst < gpBufEnd) { + if(((BYTE)dst & 1) == shift) { + if(!(width & 1)) { + goto L_ODD; } else { - v10 = v8 >> 1; - if (!(v8 & 1)) - goto LABEL_20; - _EAX = *v4++; - ASM_XLAT(_EAX, _EBX); - *(_BYTE *)v5++ = _EAX; - if (v10) { - LABEL_13: - v11 = v10 & 1; - v12 = v10 >> 1; - if (!v11) - goto LABEL_30; - v13 = v4 + 1; - v14 = (_BYTE *)(v5 + 1); - _EAX = *v13; - v4 = v13 + 1; - ASM_XLAT(_EAX, _EBX); - *v14 = _EAX; - v5 = (unsigned int)(v14 + 1); - if (v12) { - LABEL_30: - do { - _EAX = *(_DWORD *)v4; - v4 += 4; - v18 = (_BYTE *)(v5 + 1); - _EAX = _rotr(_EAX, 8); - ASM_XLAT(_EAX, _EBX); - *v18 = _EAX; - _EAX = _rotr(_EAX, 16); - v18 += 2; - ASM_XLAT(_EAX, _EBX); - *v18 = _EAX; - v5 = (unsigned int)(v18 + 1); - --v12; - } while (v12); - } - goto LABEL_23; + src++; + dst++; +L_EVEN: + width >>= 1; + if(width & 1) { + dst[0] = tbl[src[0]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[0] = tbl[src[0]]; + dst[2] = tbl[src[2]]; + src += 4; + dst += 4; } } } else { - v4 += v8; - v5 += v8; + if(!(width & 1)) { + goto L_EVEN; + } else { + dst[0] = tbl[src[0]]; + src++; + dst++; +L_ODD: + width >>= 1; + if(width & 1) { + dst[1] = tbl[src[1]]; + src += 2; + dst += 2; + } + width >>= 1; + for(; width; width--) { + dst[1] = tbl[src[1]]; + dst[3] = tbl[src[3]]; + src += 4; + dst += 4; + } + } } - LABEL_23: - v6 = v26; - if (!v7) - goto LABEL_26; + } else { + src += width; + dst += width; } - _LOBYTE(v8) = -(char)v8; - v5 += v8; - v7 -= v8; - } while (v7); - LABEL_26: - v5 -= frame_width + 768; - v28 = ((_BYTE)v28 + 1) & 1; - } while (v6 != v4); + } else { + width = -(char)width; + dst += width; + i -= width; + } + } } +#endif } // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int gpBufEnd; @@ -845,9 +1346,9 @@ void __fastcall Cel2DecodeHdrLight(int screen_x, int screen_y, char *pCelBuff, i v15 = &v10[(_DWORD)cel_buf]; v16 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x; if (light_table_index) - Cel2DecDatLightOnly(v16, v15, v14, frame_width); + Cel2DecDatLightOnly((BYTE *)v16, (BYTE *)v15, v14, frame_width); else - Cel2DecDatOnly(v16, v15, v14, frame_width); + Cel2DecDatOnly((BYTE *)v16, (BYTE *)v15, v14, frame_width); } } } @@ -881,11 +1382,11 @@ void __fastcall Cel2DecodeLightTrans(char *dst_buf, char *pCelBuff, int frame, i v12 = v10 - v9; v13 = &v8[v9]; if (cel_transparency_active) { - Cel2DecDatLightTrans(dst_buf, v13, v12, frame_width); + Cel2DecDatLightTrans((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); } else if (light_table_index) { - Cel2DecDatLightOnly(dst_buf, v13, v12, frame_width); + Cel2DecDatLightOnly((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); } else { - Cel2DecDatOnly(dst_buf, v13, v12, frame_width); + Cel2DecDatOnly((BYTE *)dst_buf, (BYTE *)v13, v12, frame_width); } } } diff --git a/Source/engine.h b/Source/engine.h index 6ad87180f..ad55b49be 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -11,24 +11,22 @@ extern int orgseed; // weak extern int SeedCount; // weak extern int dword_52B99C; // bool valid - if x/y are in bounds -void __fastcall CelDrawDatOnly(char *pDecodeTo, char *pRLEBytes, int dwRLESize, int dwRLEWdt); -void __fastcall CelDecodeOnly(int screen_x, int screen_y, void *pCelBuff, int frame, int frame_width); -void __fastcall CelDecDatOnly(char *pBuff, char *pCelBuff, int frame, int frame_width); -void __fastcall CelDrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int always_0, int direction); -void __fastcall CelDecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int always_0, int direction); -void __fastcall CelDecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width); -void __fastcall CelDecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes); /* __usercall a1@ a2@ a3@ a4@ */ -void __fastcall CelDecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width); -void __fastcall CelDecodeLightOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width); +void __fastcall CelDrawDatOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); +void __fastcall CelDecodeOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth); +void __fastcall CelDecDatOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth); +void __fastcall CelDrawHdrOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall CelDecodeHdrOnly(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +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 Cel2DecDatOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width); -void __fastcall Cel2DrawHdrOnly(int screen_x, int screen_y, char *pCelBuff, int frame, int frame_width, int a6, int direction); -void __fastcall Cel2DecodeHdrOnly(char *pBuff, char *pCelBuff, int frame, int frame_width, int a5, int direction); -void __fastcall Cel2DecDatLightOnly(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width); -void __fastcall Cel2DecDatLightEntry(unsigned char n, char *LightIndex, char **pDecodeTo, char **pRLEBytes); /* __usercall a1@ a2@ a3@ a4@ */ -void __fastcall Cel2DecDatLightTrans(char *pDecodeTo, char *pRLEBytes, int frame_content_size, int frame_width); +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); diff --git a/Source/error.cpp b/Source/error.cpp index 81998bd59..6c0952131 100644 --- a/Source/error.cpp +++ b/Source/error.cpp @@ -98,23 +98,23 @@ void __cdecl DrawDiabloMsg() signed int v17; // [esp+Ch] [ebp-8h] signed int screen_x; // [esp+10h] [ebp-4h] - CelDecodeOnly(165, 318, pSTextSlidCels, 1, 12); - CelDecodeOnly(591, 318, pSTextSlidCels, 4, 12); - CelDecodeOnly(165, 366, pSTextSlidCels, 2, 12); - CelDecodeOnly(591, 366, pSTextSlidCels, 3, 12); + CelDecodeOnly(165, 318, (BYTE *)pSTextSlidCels, 1, 12); + CelDecodeOnly(591, 318, (BYTE *)pSTextSlidCels, 4, 12); + CelDecodeOnly(165, 366, (BYTE *)pSTextSlidCels, 2, 12); + CelDecodeOnly(591, 366, (BYTE *)pSTextSlidCels, 3, 12); screen_x = 173; v16 = 35; do { - CelDecodeOnly(screen_x, 318, pSTextSlidCels, 5, 12); - CelDecodeOnly(screen_x, 366, pSTextSlidCels, 7, 12); + CelDecodeOnly(screen_x, 318, (BYTE *)pSTextSlidCels, 5, 12); + CelDecodeOnly(screen_x, 366, (BYTE *)pSTextSlidCels, 7, 12); screen_x += 12; --v16; } while (v16); v0 = 330; v1 = 3; do { - CelDecodeOnly(165, v0, pSTextSlidCels, 6, 12); - CelDecodeOnly(591, v0, pSTextSlidCels, 8, 12); + CelDecodeOnly(165, v0, (BYTE *)pSTextSlidCels, 6, 12); + CelDecodeOnly(591, v0, (BYTE *)pSTextSlidCels, 8, 12); v0 += 12; --v1; } while (v1); diff --git a/Source/gmenu.cpp b/Source/gmenu.cpp index 0bd757ac9..f41ff3e7a 100644 --- a/Source/gmenu.cpp +++ b/Source/gmenu.cpp @@ -65,7 +65,7 @@ void __fastcall gmenu_print_text(int x, int y, char *pszStr) ++v3; v7 = lfontframe[fontidx[i]]; if (v7) - CelDecodeLightOnly(v5, v4, (char *)BigTGold_cel, v7, 46); + CelDecodeLightOnly(v5, v4, (BYTE *)BigTGold_cel, v7, 46); v5 += lfontkern[v7] + 2; } } @@ -194,7 +194,7 @@ void __cdecl gmenu_draw() if (dword_634480) { if (dword_63447C) dword_63447C(); - CelDecodeOnly(236, 262, sgpLogo, 1, 296); + CelDecodeOnly(236, 262, (BYTE *)sgpLogo, 1, 296); v0 = 320; for (i = dword_634480; i->fnMenu; v0 += 45) { gmenu_draw_menu_item(i, v0); @@ -234,7 +234,7 @@ void __fastcall gmenu_draw_menu_item(TMenuItem *pItem, int a2) v14 = v4; if (v3->dwFlags & 0x40000000) { v6 = (v4 >> 1) + 80; - CelDecodeOnly(v6, v2 - 10, optbar_cel, 1, 287); + CelDecodeOnly(v6, v2 - 10, (BYTE *)optbar_cel, 1, 287); v7 = (v3->dwFlags >> 12) & 0xFFF; if (v7 < 2) v7 = 2; @@ -242,7 +242,7 @@ void __fastcall gmenu_draw_menu_item(TMenuItem *pItem, int a2) v9 = (v5 >> 1) + 82; v10 = v8; gmenu_clear_buffer(v9, v2 - 12, v8 + 13, 28); - CelDecodeOnly(v6 + v10 + 2, v2 - 12, option_cel, 1, 27); + CelDecodeOnly(v6 + v10 + 2, v2 - 12, (BYTE *)option_cel, 1, 27); v5 = v14; } v11 = 384 - (v5 >> 1); @@ -252,8 +252,8 @@ void __fastcall gmenu_draw_menu_item(TMenuItem *pItem, int a2) gmenu_print_text(384 - (v5 >> 1), v2, v3->pszStr); if (v3 == sgpCurrItem) { v13 = v2 + 1; - CelDecodeOnly(v11 - 54, v13, PentSpin_cel, (unsigned char)byte_634478, 48); - CelDecodeOnly(v11 + v5 + 4, v13, PentSpin_cel, (unsigned char)byte_634478, 48); + CelDecodeOnly(v11 - 54, v13, (BYTE *)PentSpin_cel, (unsigned char)byte_634478, 48); + CelDecodeOnly(v11 + v5 + 4, v13, (BYTE *)PentSpin_cel, (unsigned char)byte_634478, 48); } } // 634478: using guessed type char byte_634478; diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 31cc65344..5403879bb 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -37,7 +37,7 @@ void __cdecl DrawCutscene() unsigned int v0; // esi j_lock_buf_priv(1); - CelDecodeOnly(64, 639, sgpBackCel, 1, 640); + CelDecodeOnly(64, 639, (BYTE *)sgpBackCel, 1, 640); v0 = 0; if (sgdwProgress) { do diff --git a/Source/inv.cpp b/Source/inv.cpp index 7eca72dc9..8d761f336 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -150,7 +150,7 @@ void __cdecl DrawInv() BOOL invtest[40]; int frame, frame_width, colour, screen_x, screen_y, i, j, ii; - CelDecodeOnly(384, 511, pInvCels, 1, 320); + CelDecodeOnly(384, 511, (BYTE *)pInvCels, 1, 320); if (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) { InvDrawSlotBack(517, 219, 2 * INV_SLOT_SIZE_PX, 2 * INV_SLOT_SIZE_PX); @@ -170,7 +170,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) { - CelDrawHdrOnly(517, 219, (char *)pCursCels, frame, frame_width, 0, 8); + CelDrawHdrOnly(517, 219, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { CelDrawHdrLightRed(517, 219, (char *)pCursCels, frame, frame_width, 0, 8, 1); } @@ -194,7 +194,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) { - CelDrawHdrOnly(432, 365, (char *)pCursCels, frame, frame_width, 0, 8); + CelDrawHdrOnly(432, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { CelDrawHdrLightRed(432, 365, (char *)pCursCels, frame, frame_width, 0, 8, 1); } @@ -218,7 +218,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) { - CelDrawHdrOnly(633, 365, (char *)pCursCels, frame, frame_width, 0, 8); + CelDrawHdrOnly(633, 365, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { CelDrawHdrLightRed(633, 365, (char *)pCursCels, frame, frame_width, 0, 8, 1); } @@ -242,7 +242,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) { - CelDrawHdrOnly(589, 220, (char *)pCursCels, frame, frame_width, 0, 8); + CelDrawHdrOnly(589, 220, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { CelDrawHdrLightRed(589, 220, (char *)pCursCels, frame, frame_width, 0, 8, 1); } @@ -269,7 +269,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) { - CelDrawHdrOnly(screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8); + 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); } @@ -309,7 +309,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) { - CelDrawHdrOnly(screen_x, screen_y, (char *)pCursCels, frame, frame_width, 0, 8); + 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); } @@ -333,7 +333,7 @@ void __cdecl DrawInv() } if (plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) { - CelDrawHdrOnly(517, 320, (char *)pCursCels, frame, frame_width, 0, 8); + CelDrawHdrOnly(517, 320, (BYTE *)pCursCels, frame, frame_width, 0, 8); } else { CelDrawHdrLightRed(517, 320, (char *)pCursCels, frame, frame_width, 0, 8, 1); } @@ -377,7 +377,7 @@ void __cdecl DrawInv() CelDrawHdrOnly( 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); } else { CelDrawHdrLightRed( InvRect[j + SLOTXY_INV_FIRST].X + 64, @@ -422,7 +422,7 @@ void __cdecl DrawInvBelt() } if (plr[myplr].SpdList[i]._iStatFlag) - CelDrawHdrOnly(InvRect[i + 65].X + 64, InvRect[i + 65].Y + 159, (char *)pCursCels, frame, frame_width, 0, 8); + 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); diff --git a/Source/items.cpp b/Source/items.cpp index 4cd9250be..707fecdb6 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -3696,7 +3696,7 @@ void __fastcall PrintItemPower(char plidx, ItemStruct *x) void __cdecl DrawUBack() { - CelDecodeOnly(88, 487, pSTextBoxCels, 1, 271); + CelDecodeOnly(88, 487, (BYTE *)pSTextBoxCels, 1, 271); #define TRANS_RECT_X 27 #define TRANS_RECT_Y 28 diff --git a/Source/minitext.cpp b/Source/minitext.cpp index 83a5654a6..a7c7395f1 100644 --- a/Source/minitext.cpp +++ b/Source/minitext.cpp @@ -85,7 +85,7 @@ void __fastcall InitQTextMsg(int m) void __cdecl DrawQTextBack() { - CelDecodeOnly(88, 487, pTextBoxCels, 1, 591); + CelDecodeOnly(88, 487, (BYTE *)pTextBoxCels, 1, 591); #define TRANS_RECT_X 27 #define TRANS_RECT_Y 28 diff --git a/Source/quests.cpp b/Source/quests.cpp index a24464eea..45dedf12a 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -940,7 +940,7 @@ void __fastcall PrintQLString(int x, int y, unsigned char cjustflag, char *str, v12 = v8 + v6 + 76; if (!cjustflag) v12 = v6 + 76; - CelDecodeOnly(v12, v5 + 205, pCelBuff, ALLQUESTS, 12); + CelDecodeOnly(v12, v5 + 205, (BYTE *)pCelBuff, ALLQUESTS, 12); } v13 = 0; v19 = 0; @@ -963,7 +963,7 @@ void __fastcall PrintQLString(int x, int y, unsigned char cjustflag, char *str, v16 = v8 + v6 + 100; else v16 = 340 - v6; - CelDecodeOnly(v16, v5 + 205, pCelBuff, ALLQUESTS, 12); + CelDecodeOnly(v16, v5 + 205, (BYTE *)pCelBuff, ALLQUESTS, 12); } } // 69BE90: using guessed type int qline; @@ -974,7 +974,7 @@ void __cdecl DrawQuestLog() int i; // esi PrintQLString(0, 2, 1u, "Quest Log", 3); - CelDecodeOnly(64, 511, pQLogCel, 1, 320); + CelDecodeOnly(64, 511, (BYTE *)pQLogCel, 1, 320); v0 = qtopline; for (i = 0; i < numqlines; ++i) { PrintQLString(0, v0, 1u, questlist[qlist[i]]._qlstr, 0); diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 6ee6eb7da..016793258 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -840,7 +840,7 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, v40 = *v10; v41 = *(v10 - 1); if (visiondebug && v50 & DFLAG_LIT) - Cel2DecodeHdrOnly(dst_buf, (char *)pSquareCel, 1, 64, 0, 8); + Cel2DecodeHdrOnly((BYTE *)dst_buf, (BYTE *)pSquareCel, 1, 64, 0, 8); if (MissilePreFlag && v50 & DFLAG_MISSILE) DrawClippedMissile(a1a, sy, a4, a5, 0, 8, TRUE); if (light_table_index < lightmax) { @@ -1113,7 +1113,7 @@ void __fastcall DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int a6 if(object[bv]._oLight) Cel2DecodeHdrLight(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); else - Cel2DrawHdrOnly(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + Cel2DrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } // 4B8CC1: using guessed type char pcursobj; @@ -1436,7 +1436,7 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int v43 = *v12; v44 = *(v12 - 1); if (visiondebug && v53 & DFLAG_LIT) - Cel2DecodeHdrOnly(dst_buf, (char *)pSquareCel, 1, 64, a5, 8); + Cel2DecodeHdrOnly((BYTE *)dst_buf, (BYTE *)pSquareCel, 1, 64, a5, 8); if (MissilePreFlag && v53 & DFLAG_MISSILE) { v13 = sx; DrawClippedMissile(a1, y, sx, sy, a5, 8, TRUE); @@ -1980,7 +1980,7 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 v42 = *v12; v43 = *(v12 - 1); if (visiondebug && v52 & DFLAG_LIT) - CelDecodeHdrOnly(dst_buf, (char *)pSquareCel, 1, 64, 0, a5); + CelDecodeHdrOnly((BYTE *)dst_buf, (BYTE *)pSquareCel, 1, 64, 0, a5); if (MissilePreFlag && v52 & DFLAG_MISSILE) DrawMissile(xa, y, sx, sy, 0, a5, TRUE); if (light_table_index < lightmax) { @@ -2255,7 +2255,7 @@ void __fastcall DrawObject(int x, int y, int ox, int oy, BOOL pre, int a6, int d } else { /// ASSERT: assert(object[bv]._oAnimData); if(object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant - CelDrawHdrOnly(sx, sy, (char *)object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); + CelDrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, a6, dir); } } // 4B8CC1: using guessed type char pcursobj; @@ -2715,7 +2715,7 @@ void __cdecl scrollrt_draw_cursor_item() v10 = v3 + 1; gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[640] - v0 - 2; if (pcurs < 12) { - Cel2DrawHdrOnly(v9 + 64, v1 + v10 + 159, (char *)pCursCels, pcurs, v0, 0, 8); + Cel2DrawHdrOnly(v9 + 64, v1 + v10 + 159, (BYTE *)pCursCels, pcurs, v0, 0, 8); } else { colour = ICOL_WHITE; if (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL) @@ -2728,7 +2728,7 @@ void __cdecl scrollrt_draw_cursor_item() if (colour == ICOL_RED) Cel2DrawHdrLightRed(v12, v13, (char *)pCursCels, pcurs, cursW, 0, 8, 1); else - Cel2DrawHdrOnly(v12, v13, (char *)pCursCels, pcurs, cursW, 0, 8); + Cel2DrawHdrOnly(v12, v13, (BYTE *)pCursCels, pcurs, cursW, 0, 8); } } } diff --git a/Source/stores.cpp b/Source/stores.cpp index 8fd67c3f7..a00933485 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -147,7 +147,7 @@ void __cdecl FreeStoreMem() void __cdecl DrawSTextBack() { - CelDecodeOnly(408, 487, pSTextBoxCels, 1, 271); + CelDecodeOnly(408, 487, (BYTE *)pSTextBoxCels, 1, 271); #define TRANS_RECT_X 347 #define TRANS_RECT_Y 28 @@ -214,7 +214,7 @@ void __fastcall PrintSString(int x, int y, unsigned char cjustflag, char *str, i v14 = v27 + v30 + v8 - 20; else v14 = v27 + v8 - 20; - CelDecodeOnly(v14, v6 + 205, pCelBuff, InStoreFlag, 12); + CelDecodeOnly(v14, v6 + 205, (BYTE *)pCelBuff, InStoreFlag, 12); } v29 = 0; if (v28 > 0) { @@ -248,7 +248,7 @@ void __fastcall PrintSString(int x, int y, unsigned char cjustflag, char *str, i v22 = v27 + v30 + v8 + 4; else v22 = 660 - v8; - CelDecodeOnly(v22, v6 + 205, pCelBuff, InStoreFlag, 12); + CelDecodeOnly(v22, v6 + 205, (BYTE *)pCelBuff, InStoreFlag, 12); } } // 6A09E0: using guessed type char stextsize; @@ -309,18 +309,18 @@ void __fastcall DrawSArrows(int y1, int y2) v4 = SStringY[y1] + 204; v5 = *v2 + 204; if (stextscrlubtn == -1) - CelDecodeOnly(665, v4, pSTextSlidCels, 10, 12); + CelDecodeOnly(665, v4, (BYTE *)pSTextSlidCels, 10, 12); else - CelDecodeOnly(665, v4, pSTextSlidCels, 12, 12); + CelDecodeOnly(665, v4, (BYTE *)pSTextSlidCels, 12, 12); if (stextscrldbtn == -1) - CelDecodeOnly(665, v5, pSTextSlidCels, 9, 12); + CelDecodeOnly(665, v5, (BYTE *)pSTextSlidCels, 9, 12); else - CelDecodeOnly(665, v5, pSTextSlidCels, 11, 12); + CelDecodeOnly(665, v5, (BYTE *)pSTextSlidCels, 11, 12); while (1) { v4 += 12; if (v4 >= v5) break; - CelDecodeOnly(665, v4, pSTextSlidCels, 14, 12); + CelDecodeOnly(665, v4, (BYTE *)pSTextSlidCels, 14, 12); } v6 = stextsel; if (stextsel == 22) @@ -329,7 +329,7 @@ void __fastcall DrawSArrows(int y1, int y2) v7 = 0; else v7 = (*v2 - SStringY[v3] - 24) * (1000 * (stextsval + ((v6 - stextup) >> 2)) / (storenumh - 1)) / 1000; - CelDecodeOnly(665, SStringY[v3 + 1] + v7 + 204, pSTextSlidCels, 13, 12); + CelDecodeOnly(665, SStringY[v3 + 1] + v7 + 204, (BYTE *)pSTextSlidCels, 13, 12); } // 69F108: using guessed type int stextup; // 69F10C: using guessed type int storenumh; diff --git a/Source/town.cpp b/Source/town.cpp index a6cecafc5..ab21cae8b 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -151,7 +151,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s item[v10]._iAnimWidth, 0, 8); - Cel2DrawHdrOnly(v11, sy, (char *)item[v10]._iAnimData, item[v10]._iAnimFrame, item[v10]._iAnimWidth, 0, 8); + Cel2DrawHdrOnly(v11, sy, item[v10]._iAnimData, item[v10]._iAnimFrame, item[v10]._iAnimWidth, 0, 8); } if (dFlags[0][v7] & DFLAG_MONSTER) { v12 = -1 - dMonster[x][y - 1]; // -1 - *(&dword_52D204 + v7); /* check */ @@ -166,7 +166,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s towner[v12]._tAnimWidth, 0, 8); - Cel2DrawHdrOnly(v13, sy, (char *)towner[v12]._tAnimData, towner[v12]._tAnimFrame, towner[v12]._tAnimWidth, 0, 8); + Cel2DrawHdrOnly(v13, sy, towner[v12]._tAnimData, towner[v12]._tAnimFrame, towner[v12]._tAnimWidth, 0, 8); } v14 = dMonster[0][v7]; if (v14 > 0) { @@ -183,7 +183,7 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s towner[v16]._tAnimWidth, 0, 8); - Cel2DrawHdrOnly(v17, sy, (char *)towner[v16]._tAnimData, towner[v16]._tAnimFrame, towner[v16]._tAnimWidth, 0, 8); + Cel2DrawHdrOnly(v17, sy, towner[v16]._tAnimData, towner[v16]._tAnimFrame, towner[v16]._tAnimWidth, 0, 8); } if (dFlags[0][v7] & DFLAG_PLAYER) { v18 = -1 - dPlayer[x][y - 1]; // -1 - *((_BYTE *)&themeLoc[49].height + v7 + 3); @@ -411,7 +411,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i item[v12]._iAnimWidth, a5, 8); - Cel2DrawHdrOnly(v13, sy, (char *)item[v12]._iAnimData, item[v12]._iAnimFrame, item[v12]._iAnimWidth, a5, 8); + Cel2DrawHdrOnly(v13, sy, item[v12]._iAnimData, item[v12]._iAnimFrame, item[v12]._iAnimWidth, a5, 8); } if (dFlags[0][v9] & DFLAG_MONSTER) { v14 = -1 - dMonster[x][y - 1]; // -1 - *(&dword_52D204 + v9); /* check */ @@ -426,7 +426,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i towner[v14]._tAnimWidth, a5, 8); - Cel2DrawHdrOnly(v15, sy, (char *)towner[v14]._tAnimData, towner[v14]._tAnimFrame, towner[v14]._tAnimWidth, a5, 8); + Cel2DrawHdrOnly(v15, sy, towner[v14]._tAnimData, towner[v14]._tAnimFrame, towner[v14]._tAnimWidth, a5, 8); } v16 = dMonster[0][v9]; if (v16 > 0) { @@ -443,7 +443,7 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i towner[v18]._tAnimWidth, a5, 8); - Cel2DrawHdrOnly(v19, sy, (char *)towner[v18]._tAnimData, towner[v18]._tAnimFrame, towner[v18]._tAnimWidth, a5, 8); + Cel2DrawHdrOnly(v19, sy, towner[v18]._tAnimData, towner[v18]._tAnimFrame, towner[v18]._tAnimWidth, a5, 8); } if (dFlags[0][v9] & DFLAG_PLAYER) { v20 = -1 - dPlayer[x][y - 1]; // -1 - *((_BYTE *)&themeLoc[49].height + v9 + 3); @@ -654,21 +654,21 @@ void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, 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); - CelDrawHdrOnly(xx, sy, (char *)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); - CelDrawHdrOnly(xx, sy, (char *)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); - CelDrawHdrOnly(xx, sy, (char *)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) { pnum = -1 - dPlayer[x][y - 1]; From 63f395ac155b65f06338b08db9eaf601e836df52 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 14 Mar 2019 17:16:27 +0100 Subject: [PATCH 28/31] MI_Misexp bin exact (#646) * MI_Misexp bin exact * Update Source/missiles.cpp Co-Authored-By: mewmew --- Source/missiles.cpp | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index d0213e3e1..7c0a84cbd 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -4569,39 +4569,19 @@ void __fastcall MI_Weapexp(int i) void __fastcall MI_Misexp(int i) { - int v1; // edi - int v2; // esi - BOOLEAN v3; // zf - int v4; // ecx - int v5; // eax - int ExpLight[10]; // [esp+8h] [ebp-28h] + int ExpLight[10]={9, 10, 11, 12, 11, 10, 8, 6, 4, 2}; - v1 = i; - v2 = i; - ExpLight[0] = 9; - v3 = missile[i]._mirange == 1; - --missile[v2]._mirange; - ExpLight[1] = 10; - ExpLight[3] = 12; - ExpLight[2] = 11; - ExpLight[4] = 11; - ExpLight[5] = 10; - ExpLight[6] = 8; - ExpLight[7] = 6; - ExpLight[8] = 4; - ExpLight[9] = 2; - if (v3) { - v4 = missile[v2]._mlid; - missile[v2]._miDelFlag = TRUE; - AddUnLight(v4); + missile[i]._mirange--; + if (!missile[i]._mirange) { + missile[i]._miDelFlag = TRUE; + AddUnLight(missile[i]._mlid); } else { - v5 = missile[v2]._miVar1; - if (v5) - ChangeLight(missile[v2]._mlid, missile[v2]._mix, missile[v2]._miy, ExpLight[v5]); + if (!missile[i]._miVar1) + missile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 9); else - missile[v2]._mlid = AddLight(missile[v2]._mix, missile[v2]._miy, 9); - ++missile[v2]._miVar1; - PutMissile(v1); + ChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar1]); + missile[i]._miVar1++; + PutMissile(i); } } From f062ec0c93af9c20ddce4d6c0baf09e3092c1763 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 15 Mar 2019 02:42:09 +0100 Subject: [PATCH 29/31] Clean up sound.cpp (#655) --- Source/sound.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Source/sound.cpp b/Source/sound.cpp index 043690659..a7f894c15 100644 --- a/Source/sound.cpp +++ b/Source/sound.cpp @@ -34,20 +34,20 @@ char unk_volume[4][2] = { void __fastcall snd_update(BOOL bStopAll) { - DWORD error_code, i; + DWORD dwStatus, i; for (i = 0; i < 8; i++) { if (!DSBs[i]) continue; #ifdef __cplusplus - if (!bStopAll && !DSBs[i]->GetStatus(&error_code) && error_code == DSBSTATUS_PLAYING) + if (!bStopAll && DSBs[i]->GetStatus(&dwStatus) == DS_OK && dwStatus == DSBSTATUS_PLAYING) continue; DSBs[i]->Stop(); DSBs[i]->Release(); #else - if (!bStopAll && !DSBs[i]->lpVtbl->GetStatus(DSBs[i], &error_code) && error_code == DSBSTATUS_PLAYING) + if (!bStopAll && DSBs[i]->lpVtbl->GetStatus(DSBs[i], &dwStatus) == DS_OK && dwStatus == DSBSTATUS_PLAYING) continue; DSBs[i]->lpVtbl->Stop(DSBs[i]); @@ -70,7 +70,7 @@ void __fastcall snd_stop_snd(TSnd *pSnd) BOOL __fastcall snd_playing(TSnd *pSnd) { - DWORD error_code; // TODO should probably be HRESULT + DWORD dwStatus; if (!pSnd) return FALSE; @@ -79,13 +79,13 @@ BOOL __fastcall snd_playing(TSnd *pSnd) return FALSE; #ifdef __cplusplus - if (pSnd->DSB->GetStatus(&error_code)) + if (pSnd->DSB->GetStatus(&dwStatus) != DS_OK) #else - if (pSnd->DSB->lpVtbl->GetStatus(pSnd->DSB, &error_code)) + if (pSnd->DSB->lpVtbl->GetStatus(pSnd->DSB, &dwStatus) != DS_OK) #endif return FALSE; - return error_code == DSBSTATUS_PLAYING; + return dwStatus == DSBSTATUS_PLAYING; } void __fastcall snd_play_snd(TSnd *pSnd, int lVolume, int lPan) @@ -182,9 +182,9 @@ BOOL __fastcall sound_file_reload(TSnd *sound_file, LPDIRECTSOUNDBUFFER DSB) BOOL rv; #ifdef __cplusplus - if (DSB->Restore()) + if (DSB->Restore() != DS_OK) #else - if (DSB->lpVtbl->Restore(DSB)) + if (DSB->lpVtbl->Restore(DSB) != DS_OK) #endif return FALSE; From 0bd6375969b774d267ddbaae4343075a0c1301f3 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 16 Mar 2019 03:16:08 +0100 Subject: [PATCH 30/31] Implementing dsound wrapper --- CMakeLists.txt | 5 +- Source/sound.cpp | 1 + SourceS/miniwin.h | 8 +- SourceS/miniwin_dsound.h | 56 +++++----- SourceX/dx.cpp | 26 ----- SourceX/miniwin_dsound.cpp | 121 +++++++++++++++++++++ SourceX/pch.h | 20 ++++ SourceX/sound.cpp | 217 +++++++++++++++++++++++++------------ 8 files changed, 325 insertions(+), 129 deletions(-) create mode 100644 SourceX/miniwin_dsound.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index caf541c47..5d572be04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,6 +155,7 @@ target_include_directories(devilution PRIVATE SourceS) add_executable(devilutionx SourceX/dx.cpp SourceX/miniwin.cpp + SourceX/miniwin_dsound.cpp SourceX/miniwin_io.cpp SourceX/miniwin_msg_sdl.cpp SourceX/stub_rand.cpp @@ -236,8 +237,8 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # Silence warnings about __int64 alignment hack not always being applicable target_compile_options(devilutionx PRIVATE -Wno-ignored-attributes) # Fix: error: cast from pointer to smaller type 'unsigned char' loses information - target_compile_options(devilution PRIVATE -fms-extensions -fms-compatibility -fms-compatibility-version=19.00) - + target_compile_options(devilution PRIVATE -fms-extensions -fms-compatibility -fms-compatibility-version=19.00) + set_target_properties(devilutionx PROPERTIES LINK_FLAGS "-liconv") endif() diff --git a/Source/sound.cpp b/Source/sound.cpp index ebd6d6199..043690659 100644 --- a/Source/sound.cpp +++ b/Source/sound.cpp @@ -83,6 +83,7 @@ BOOL __fastcall snd_playing(TSnd *pSnd) #else if (pSnd->DSB->lpVtbl->GetStatus(pSnd->DSB, &error_code)) #endif + return FALSE; return error_code == DSBSTATUS_PLAYING; } diff --git a/SourceS/miniwin.h b/SourceS/miniwin.h index 34295ef77..6339cfd2a 100644 --- a/SourceS/miniwin.h +++ b/SourceS/miniwin.h @@ -35,6 +35,8 @@ #define WINAPI #define WINAPIV +#define METHOD virtual __stdcall + #define ALIGNED(n) __attribute__((aligned(n))) // Basic types @@ -136,6 +138,7 @@ typedef LRESULT(CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM); #define INFINITE 0xFFFFFFFF +#pragma pack(push, 1) typedef struct waveformat_tag { WORD wFormatTag; WORD nChannels; @@ -158,6 +161,7 @@ typedef struct tWAVEFORMATEX { WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX, *LPWAVEFORMATEX, *LPCWAVEFORMATEX; +#pragma pack(pop) typedef struct _FILETIME { DWORD dwLowDateTime; @@ -269,7 +273,7 @@ typedef WORD ATOM; #define WINUSERAPI #define WNDCLASSEX WNDCLASSEXA -#define FOURCC_RIFF MAKEFOURCC('W', 'A', 'V', 'E') +#define FOURCC_RIFF MAKEFOURCC('R', 'I', 'F', 'F') // // COM @@ -307,8 +311,6 @@ typedef void *REFIID; struct IUnknown { // clang-format off - STDMETHOD(QueryInterface)(THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG, AddRef)(THIS) PURE; STDMETHOD_(ULONG, Release)(THIS) PURE; // clang-format on }; diff --git a/SourceS/miniwin_dsound.h b/SourceS/miniwin_dsound.h index 932b66f0c..03e7c669e 100644 --- a/SourceS/miniwin_dsound.h +++ b/SourceS/miniwin_dsound.h @@ -1,7 +1,5 @@ #pragma once -typedef void *LPDSBCAPS, *LPCDSBUFFERDESC; - struct IDirectSound; typedef IDirectSound *LPDIRECTSOUND; @@ -13,28 +11,21 @@ typedef struct _DSBUFFERDESC { LPWAVEFORMATEX lpwfxFormat; } DSBUFFERDESC, *LPDSBUFFERDESC; +typedef DSBUFFERDESC *LPDSBCAPS, *LPCDSBUFFERDESC; + DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) { // clang-format off - STDMETHOD(GetCaps)(THIS_ LPDSBCAPS pDSBufferCaps); - STDMETHOD(GetCurrentPosition)(THIS_ LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor); - STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, LPDWORD pdwSizeWritten); - STDMETHOD(GetVolume)(THIS_ LPLONG plVolume); - STDMETHOD(GetPan)(THIS_ LPLONG plPan); - STDMETHOD(GetFrequency)(THIS_ LPDWORD pdwFrequency); - STDMETHOD(GetStatus)(THIS_ LPDWORD pdwStatus); - STDMETHOD(Initialize)(THIS_ LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc); + STDMETHOD(GetStatus)(THIS_ LPDWORD pdwStatus) PURE; STDMETHOD(Lock)(THIS_ DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, - LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags); - STDMETHOD(Play)(THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags); - STDMETHOD(SetCurrentPosition)(THIS_ DWORD dwNewPosition); - STDMETHOD(SetFormat)(THIS_ LPCWAVEFORMATEX pcfxFormat); - STDMETHOD(SetVolume)(THIS_ LONG lVolume); - STDMETHOD(SetPan)(THIS_ LONG lPan); - STDMETHOD(SetFrequency)(THIS_ DWORD dwFrequency); - STDMETHOD(Stop)(THIS); - STDMETHOD(Unlock)(THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2); - STDMETHOD(Restore)(THIS); + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE; + STDMETHOD(Play)(THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE; + STDMETHOD(SetFormat)(THIS_ LPCWAVEFORMATEX pcfxFormat) PURE; + STDMETHOD(SetVolume)(THIS_ LONG lVolume) PURE; + STDMETHOD(SetPan)(THIS_ LONG lPan) PURE; + STDMETHOD(Stop)(THIS) PURE; + STDMETHOD(Unlock)(THIS_ LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE; + STDMETHOD(Restore)(THIS) PURE; // clang-format on }; @@ -43,6 +34,8 @@ DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) #define DSBCAPS_CTRLPAN 0x00000040 #define DSBCAPS_CTRLVOLUME 0x00000080 +#define DSSCL_EXCLUSIVE 0x00000003 + #define WAVE_FORMAT_PCM 1 #define ERROR_SUCCESS 0L @@ -80,20 +73,18 @@ typedef struct _DSCAPS { DECLARE_INTERFACE_(IDirectSound, IUnknown) { // clang-format off - STDMETHOD(CreateSoundBuffer)(THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter); - STDMETHOD(GetCaps)(THIS_ LPDSCAPS pDSCaps); - STDMETHOD(DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate); - STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwLevel); - STDMETHOD(Compact)(THIS); - STDMETHOD(GetSpeakerConfig)(THIS_ LPDWORD pdwSpeakerConfig); - STDMETHOD(SetSpeakerConfig)(THIS_ DWORD dwSpeakerConfig); - STDMETHOD(Initialize)(THIS_ LPCGUID pcGuidDevice); + STDMETHOD(CreateSoundBuffer)(THIS_ LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetCaps)(THIS_ LPDSCAPS pDSCaps) PURE; + STDMETHOD(DuplicateSoundBuffer)(THIS_ LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) PURE; + STDMETHOD(SetCooperativeLevel)(THIS_ HWND hwnd, DWORD dwLevel) PURE; // clang-format on }; #define _FACDS 0x878 #define MAKE_DSHRESULT(code) MAKE_HRESULT(1, _FACDS, code) +#define DSBSTATUS_PLAYING 0x00000001 + #define E_NOINTERFACE 0x80004002 #define DSERR_PRIOLEVELNEEDED MAKE_DSHRESULT(70) #define DSERR_BADFORMAT MAKE_DSHRESULT(100) @@ -107,3 +98,12 @@ DECLARE_INTERFACE_(IDirectSound, IUnknown) #define DSERR_INVALIDPARAM 0x80070057 #define DSERR_ALLOCATED MAKE_DSHRESULT(10) #define DSERR_CONTROLUNAVAIL MAKE_DSHRESULT(30) + +class DirectSound : public IDirectSound { +public: + METHOD ULONG Release(); + METHOD HRESULT CreateSoundBuffer(LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOute); + METHOD HRESULT GetCaps(LPDSCAPS pDSCaps); + METHOD HRESULT DuplicateSoundBuffer(LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate); + METHOD HRESULT SetCooperativeLevel(HWND hwnd, DWORD dwLevel); +}; diff --git a/SourceX/dx.cpp b/SourceX/dx.cpp index 03e86b5ab..c9ea28380 100644 --- a/SourceX/dx.cpp +++ b/SourceX/dx.cpp @@ -33,17 +33,7 @@ bool surface_dirty; // DirectDraw COM interface stub implementations // -#define METHOD virtual __stdcall - class StubSurface : public IDirectDrawSurface { - METHOD HRESULT QueryInterface(REFIID refiid, LPVOID *lpvoid) - { - UNIMPLEMENTED(); - }; - METHOD ULONG AddRef() - { - UNIMPLEMENTED(); - }; METHOD ULONG Release() { UNIMPLEMENTED(); @@ -215,14 +205,6 @@ class StubSurface : public IDirectDrawSurface { }; class StubPalette : public IDirectDrawPalette { - METHOD HRESULT QueryInterface(REFIID refiid, LPVOID *lpvoid) - { - UNIMPLEMENTED(); - }; - METHOD ULONG AddRef() - { - UNIMPLEMENTED(); - }; METHOD ULONG Release() { UNIMPLEMENTED(); @@ -247,14 +229,6 @@ class StubPalette : public IDirectDrawPalette { }; class StubDraw : public IDirectDraw { - METHOD HRESULT QueryInterface(REFIID refiid, LPVOID *lpvoid) - { - UNIMPLEMENTED(); - }; - METHOD ULONG AddRef() - { - UNIMPLEMENTED(); - }; METHOD ULONG Release() { UNIMPLEMENTED(); diff --git a/SourceX/miniwin_dsound.cpp b/SourceX/miniwin_dsound.cpp new file mode 100644 index 000000000..f4f1585de --- /dev/null +++ b/SourceX/miniwin_dsound.cpp @@ -0,0 +1,121 @@ +#include "pch.h" + +ULONG __stdcall DirectSound::Release() +{ + Mix_CloseAudio(); + return 0; +}; + +HRESULT __stdcall DirectSound::CreateSoundBuffer(LPCDSBUFFERDESC pcDSBufferDesc, LPDIRECTSOUNDBUFFER *ppDSBuffer, LPUNKNOWN pUnkOute) +{ + if (pcDSBufferDesc->dwFlags != DSBCAPS_PRIMARYBUFFER) { // Creating primery buffer isn't needed and breaks Music + *ppDSBuffer = new DirectSoundBuffer(); + } + + return DS_OK; +}; + +HRESULT __stdcall DirectSound::GetCaps(LPDSCAPS pDSCaps) +{ + return DS_OK; +}; + +/** + * @brief SDL handels this for us when using Mix_PlayChannel(-1); + */ +HRESULT __stdcall DirectSound::DuplicateSoundBuffer(LPDIRECTSOUNDBUFFER pDSBufferOriginal, LPDIRECTSOUNDBUFFER *ppDSBufferDuplicate) +{ + UNIMPLEMENTED(); + return DS_OK; +}; + +HRESULT __stdcall DirectSound::SetCooperativeLevel(HWND hwnd, DWORD dwLevel) +{ + return DS_OK; +}; + +///// DirectSoundBuffer ///// + +ULONG __stdcall DirectSoundBuffer::Release() +{ + Mix_FreeChunk(chunk); + + return 0; +}; + +/** + * @brief Only used for handeling duplicates + */ +HRESULT __stdcall DirectSoundBuffer::GetStatus(LPDWORD pdwStatus) +{ + return DSERR_INVALIDPARAM; +}; + +HRESULT __stdcall DirectSoundBuffer::Lock(DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags) +{ + *pdwAudioBytes1 = dwBytes; + *ppvAudioPtr1 = malloc(dwBytes); + + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::Play(DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) +{ + int channel = Mix_PlayChannel(-1, chunk, 0); + if (channel == -1) { + SDL_Log("To few channels, skipping sound\n"); + return DS_OK; + } + + Mix_Volume(channel, volume); + int panned = 255 - 255 * abs(pan) / 10000; + Mix_SetPanning(channel, pan <= 0 ? 255 : panned, pan >= 0 ? 255 : panned); + + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::SetFormat(LPCWAVEFORMATEX pcfxFormat) +{ + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::SetVolume(LONG lVolume) +{ + volume = MIX_MAX_VOLUME - MIX_MAX_VOLUME * lVolume / VOLUME_MIN; + + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::SetPan(LONG lPan) +{ + pan = lPan; + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::Stop() +{ + for (int i = 1; i < Mix_AllocateChannels(-1); i++) { + if (Mix_GetChunk(i) != chunk) { + continue; + } + + Mix_HaltChannel(i); + } + + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::Unlock(LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2) +{ + SDL_RWops *rw = SDL_RWFromConstMem(pvAudioPtr1, dwAudioBytes1); + chunk = Mix_LoadWAV_RW(rw, 1); + free(pvAudioPtr1); + + return DS_OK; +}; + +HRESULT __stdcall DirectSoundBuffer::Restore() +{ + return DS_OK; +}; diff --git a/SourceX/pch.h b/SourceX/pch.h index 5b686d49b..42a8784af 100644 --- a/SourceX/pch.h +++ b/SourceX/pch.h @@ -19,3 +19,23 @@ #include "devilution.h" #include "DiabloUI/diabloui.h" + + +struct DirectSoundBuffer : public IDirectSoundBuffer { +public: + METHOD ULONG Release(); + BOOL GetStatus(LPDWORD pdwStatus); + HRESULT Lock(DWORD dwOffset, DWORD dwBytes, LPVOID *ppvAudioPtr1, LPDWORD pdwAudioBytes1, + LPVOID *ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags); + HRESULT Play(DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags); + HRESULT SetFormat(LPCWAVEFORMATEX pcfxFormat); + HRESULT SetVolume(LONG lVolume); + HRESULT SetPan(LONG lPan); + HRESULT Stop(); + HRESULT Unlock(LPVOID pvAudioPtr1, DWORD dwAudioBytes1, LPVOID pvAudioPtr2, DWORD dwAudioBytes2); + HRESULT Restore(); + private: + int volume = 0; + int pan = 0; + Mix_Chunk *chunk; +}; diff --git a/SourceX/sound.cpp b/SourceX/sound.cpp index 591866f18..4458ec688 100644 --- a/SourceX/sound.cpp +++ b/SourceX/sound.cpp @@ -37,17 +37,36 @@ void __fastcall snd_update(BOOL bStopAll) { DWORD error_code, i; - if (!bStopAll) - return; + for (i = 0; i < 8; i++) { + if (!DSBs[i]) + continue; + +#ifdef __cplusplus + if (!bStopAll && !DSBs[i]->GetStatus(&error_code) && error_code == DSBSTATUS_PLAYING) + continue; + + DSBs[i]->Stop(); + DSBs[i]->Release(); +#else + if (!bStopAll && !DSBs[i]->lpVtbl->GetStatus(DSBs[i], &error_code) && error_code == DSBSTATUS_PLAYING) + continue; - Mix_HaltChannel(-1); + DSBs[i]->lpVtbl->Stop(DSBs[i]); + DSBs[i]->lpVtbl->Release(DSBs[i]); +#endif + + DSBs[i] = NULL; + } } void __fastcall snd_stop_snd(TSnd *pSnd) { - DUMMY_ONCE(); if (pSnd && pSnd->DSB) - Mix_HaltChannel(-1); +#ifdef __cplusplus + pSnd->DSB->Stop(); +#else + pSnd->DSB->lpVtbl->Stop(pSnd->DSB); +#endif } BOOL __fastcall snd_playing(TSnd *pSnd) @@ -60,9 +79,14 @@ BOOL __fastcall snd_playing(TSnd *pSnd) if (pSnd->DSB == NULL) return FALSE; - DUMMY_ONCE(); +#ifdef __cplusplus + if (pSnd->DSB->GetStatus(&error_code)) +#else + if (pSnd->DSB->lpVtbl->GetStatus(pSnd->DSB, &error_code)) +#endif + return FALSE; - return FALSE; + return error_code == DSBSTATUS_PLAYING; } void __fastcall snd_play_snd(TSnd *pSnd, int lVolume, int lPan) @@ -86,24 +110,41 @@ void __fastcall snd_play_snd(TSnd *pSnd, int lVolume, int lPan) return; } + if (snd_playing(pSnd)) { + DSB = sound_dup_channel(pSnd->DSB); + if (DSB == NULL) { + return; + } + } + lVolume += sglSoundVolume; if (lVolume < VOLUME_MIN) { lVolume = VOLUME_MIN; } else if (lVolume > VOLUME_MAX) { lVolume = VOLUME_MAX; } +#ifdef __cplusplus + DSB->SetVolume(lVolume); + DSB->SetPan(lPan); - Mix_VolumeChunk((Mix_Chunk *)(pSnd->DSB), MIX_MAX_VOLUME - MIX_MAX_VOLUME * lVolume / VOLUME_MIN); - int channel = Mix_PlayChannel(-1, (Mix_Chunk *)(pSnd->DSB), 0); - if (channel != -1) { - int panned = 255 * abs(lPan) / 10000; - Mix_SetPanning(channel, lPan <= 0 ? 255 : panned, lPan >= 0 ? 255 : panned); - } + error_code = DSB->Play(0, 0, 0); +#else + DSB->lpVtbl->SetVolume(DSB, lVolume); + DSB->lpVtbl->SetPan(DSB, lPan); + + error_code = DSB->lpVtbl->Play(DSB, 0, 0, 0); +#endif - if (channel == -1) { - SDL_Log("Mix_PlayChannel: %s\n", SDL_GetError()); + if (error_code != DSERR_BUFFERLOST) { + if (error_code != DS_OK) { + DSErrMsg(error_code, 261, "C:\\Src\\Diablo\\Source\\SOUND.CPP"); + } } else if (sound_file_reload(pSnd, DSB)) { - UNIMPLEMENTED(); +#ifdef __cplusplus + DSB->Play(0, 0, 0); +#else + DSB->lpVtbl->Play(DSB, 0, 0, 0); +#endif } pSnd->start_tc = tc; @@ -118,7 +159,17 @@ LPDIRECTSOUNDBUFFER __fastcall sound_dup_channel(LPDIRECTSOUNDBUFFER DSB) } for (i = 0; i < 8; i++) { - UNIMPLEMENTED(); + if (!DSBs[i]) { +#ifdef __cplusplus + if (sglpDS->DuplicateSoundBuffer(DSB, &DSBs[i]) != DS_OK) { +#else + if (sglpDS->lpVtbl->DuplicateSoundBuffer(sglpDS, DSB, &DSBs[i]) != DS_OK) { +#endif + return NULL; + } + + return DSBs[i]; + } } return NULL; @@ -131,13 +182,32 @@ BOOL __fastcall sound_file_reload(TSnd *sound_file, LPDIRECTSOUNDBUFFER DSB) DWORD size1, size2; BOOL rv; - DUMMY_ONCE(); +#ifdef __cplusplus + if (DSB->Restore()) +#else + if (DSB->lpVtbl->Restore(DSB)) +#endif + return FALSE; rv = FALSE; WOpenFile(sound_file->sound_path, &file, FALSE); WSetFilePointer(file, sound_file->chunk.dwOffset, NULL, 0); +#ifdef __cplusplus + if (DSB->Lock(0, sound_file->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0) == DS_OK) { + WReadFile(file, buf1, size1); + if (DSB->Unlock(buf1, size1, buf2, size2) == DS_OK) + rv = TRUE; + } +#else + if (DSB->lpVtbl->Lock(DSB, 0, sound_file->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0) == DS_OK) { + WReadFile(file, buf1, size1); + if (DSB->lpVtbl->Unlock(DSB, buf1, size1, buf2, size2) == DS_OK) + rv = TRUE; + } +#endif + WCloseFile(file); return rv; @@ -152,7 +222,7 @@ TSnd *__fastcall sound_file_load(char *path) DWORD size1, size2; HRESULT error_code; - if (!gbSndInited) + if (!sglpDS) return NULL; WOpenFile(path, &file, FALSE); @@ -161,20 +231,30 @@ TSnd *__fastcall sound_file_load(char *path) pSnd->sound_path = path; pSnd->start_tc = GetTickCount() - 81; - //This opens the file and reads it, makes Mix_chunk pointer to it. - //Once this is done the pointer is stored TSnd Struct - - size1 = (int)SFileGetFileSize((HANDLE)file, 0); - wave_file = DiabloAllocPtr(size1); - SFileReadFile(file, (void *)wave_file, size1, (LPDWORD)&size2, 0); - SDL_RWops *rw = SDL_RWFromConstMem((void *)wave_file, size1); - Mix_Chunk *SoundFX = Mix_LoadWAV_RW(rw, 1); - pSnd->DSB = (LPDIRECTSOUNDBUFFER)SoundFX; - if (!pSnd->DSB) + wave_file = LoadWaveFile(file, &pSnd->fmt, &pSnd->chunk); + if (!wave_file) TermMsg("Invalid sound format on file %s", pSnd->sound_path); sound_CreateSoundBuffer(pSnd); +#ifdef __cplusplus + error_code = pSnd->DSB->Lock(0, pSnd->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0); +#else + error_code = pSnd->DSB->lpVtbl->Lock(pSnd->DSB, 0, pSnd->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0); +#endif + if (error_code != DS_OK) + DSErrMsg(error_code, 318, "C:\\Src\\Diablo\\Source\\SOUND.CPP"); + + memcpy(buf1, wave_file + pSnd->chunk.dwOffset, size1); + +#ifdef __cplusplus + error_code = pSnd->DSB->Unlock(buf1, size1, buf2, size2); +#else + error_code = pSnd->DSB->lpVtbl->Unlock(pSnd->DSB, buf1, size1, buf2, size2); +#endif + if (error_code != DS_OK) + DSErrMsg(error_code, 325, "C:\\Src\\Diablo\\Source\\SOUND.CPP"); + mem_free_dbg((void *)wave_file); WCloseFile(file); @@ -193,14 +273,30 @@ void __fastcall sound_CreateSoundBuffer(TSnd *sound_file) DSB.lpwfxFormat = &sound_file->fmt; DSB.dwSize = sizeof(DSBUFFERDESC); DSB.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_STATIC; + + sound_file->chunk.dwSize += sound_file->chunk.dwOffset; + sound_file->chunk.dwOffset = 0; + +#ifdef __cplusplus + error_code = sglpDS->CreateSoundBuffer(&DSB, &sound_file->DSB, NULL); +#else + error_code = sglpDS->lpVtbl->CreateSoundBuffer(sglpDS, &DSB, &sound_file->DSB, NULL); +#endif + if (error_code != ERROR_SUCCESS) + DSErrMsg(error_code, 282, "C:\\Src\\Diablo\\Source\\SOUND.CPP"); } void __fastcall sound_file_cleanup(TSnd *sound_file) { if (sound_file) { if (sound_file->DSB) { - DUMMY_ONCE(); - Mix_FreeChunk((Mix_Chunk *)sound_file->DSB); +#ifdef __cplusplus + sound_file->DSB->Stop(); + sound_file->DSB->Release(); +#else + sound_file->DSB->lpVtbl->Stop(sound_file->DSB); + sound_file->DSB->lpVtbl->Release(sound_file->DSB); +#endif sound_file->DSB = NULL; } @@ -210,23 +306,26 @@ void __fastcall sound_file_cleanup(TSnd *sound_file) void __fastcall snd_init(HWND hWnd) { - DUMMY(); sound_load_volume("Sound Volume", &sglSoundVolume); gbSoundOn = sglSoundVolume > VOLUME_MIN; sound_load_volume("Music Volume", &sglMusicVolume); gbMusicOn = sglMusicVolume > VOLUME_MIN; - if (Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024) != 0) { + if (sound_DirectSoundCreate(NULL, &sglpDS, NULL) != DS_OK) sglpDS = NULL; +#ifdef __cplusplus + if (sglpDS && sglpDS->SetCooperativeLevel(hWnd, DSSCL_EXCLUSIVE) == DS_OK) +#else + if (sglpDS && sglpDS->lpVtbl->SetCooperativeLevel(sglpDS, hWnd, DSSCL_EXCLUSIVE) == DS_OK) +#endif sound_create_primary_buffer(NULL); - } SVidInitialize(sglpDS); SFileDdaInitialize(sglpDS); - gbSndInited = true; + gbSndInited = sglpDS != NULL; } void __fastcall sound_load_volume(char *value_name, int *value) @@ -247,7 +346,6 @@ void __fastcall sound_load_volume(char *value_name, int *value) void __fastcall sound_create_primary_buffer(HANDLE music_track) { - DUMMY(); HRESULT error_code; DSBUFFERDESC dsbuf; WAVEFORMATEX format; @@ -301,7 +399,7 @@ void __fastcall sound_create_primary_buffer(HANDLE music_track) HRESULT __fastcall sound_DirectSoundCreate(LPGUID lpGuid, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter) { - UNIMPLEMENTED(); + DUMMY(); HRESULT(WINAPI * DirectSoundCreate) (LPGUID lpGuid, LPDIRECTSOUND * ppDS, LPUNKNOWN pUnkOuter); @@ -310,11 +408,13 @@ HRESULT __fastcall sound_DirectSoundCreate(LPGUID lpGuid, LPDIRECTSOUND *ppDS, L } } - DirectSoundCreate = NULL; if (DirectSoundCreate == NULL) { - ErrDlg(IDD_DIALOG5, GetLastError(), "C:\\Src\\Diablo\\Source\\SOUND.CPP", 427); } - return DirectSoundCreate(lpGuid, ppDS, pUnkOuter); + *ppDS = new DirectSound(); + int result = Mix_OpenAudio(22050, AUDIO_S16LSB, 2, 1024); + Mix_AllocateChannels(25); + Mix_ReserveChannels(1); // reserve one channel for naration (SFileDda*) + return result; } void __cdecl sound_cleanup() @@ -323,8 +423,12 @@ void __cdecl sound_cleanup() SVidDestroy(); SFileDdaDestroy(); - if (gbSndInited) { - DUMMY(); + if (sglpDS) { +#ifdef __cplusplus + sglpDS->Release(); +#else + sglpDS->lpVtbl->Release(sglpDS); +#endif sglpDS = NULL; } @@ -356,7 +460,7 @@ void __fastcall music_start(int nTrack) /// ASSERT: assert((DWORD) nTrack < NUM_MUSIC); music_stop(); - if (gbSndInited && gbMusicOn) { + if (sglpDS && gbMusicOn) { #ifdef _DEBUG SFileEnableDirectAccess(FALSE); #endif @@ -413,30 +517,3 @@ int __fastcall sound_get_or_set_sound_volume(int volume) return sglSoundVolume; } - -/* -SDL_AudioSpec wanted; -static Uint32 audio_len; -static Uint8 *audio_pos; - -void fill_audio(void *udata, Uint8 *stream, int len) -{ - //DUMMY(); - //wanted.freq = 44100; //seems not to be used at this time - //wanted.format = AUDIO_S16LSB; //seems not to be used at this time - //wanted.channels = 2; // 1 = mono, 2 = stereo, seems not to be used at this time - //wanted.samples = 1024; // Good low-latency value for callback, seems not to be used at this time - //wanted.callback = fill_audio; //seems not to be used at this time - //wanted.userdata = NULL; //seems not to be used at this time - - // Only play if we have data left - if (audio_len == 0) - return; - - // Mix as much data as possible - len = (len > audio_len ? audio_len : len); - SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME); - audio_pos += len; - audio_len -= len; -} -*/ From 9e4885a955cbf9f54b9ed83aed42f73795f5d729 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Fri, 15 Mar 2019 21:56:04 -0500 Subject: [PATCH 31/31] Cleanup CL2 functions (#656) --- Source/engine.cpp | 1971 +++++++++++++++++++++++++++---------------- Source/engine.h | 30 +- Source/scrollrt.cpp | 88 +- Source/town.cpp | 24 +- 4 files changed, 1324 insertions(+), 789 deletions(-) diff --git a/Source/engine.cpp b/Source/engine.cpp index dbe361ebf..01086dbb1 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -2,6 +2,10 @@ #include "../types.h" +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) +#pragma warning (disable : 4731) // frame pointer register 'ebp' modified by inline assembly code +#endif + char gbPixelCol; // automap pixel color 8-bit (palette entry) int dword_52B970; // BOOLEAN flip - if y < x int orgseed; // weak @@ -2129,796 +2133,1327 @@ void __fastcall LoadFileWithMem(char *pszName, void *buf) WCloseFile(a1); } -void __fastcall Cl2ApplyTrans(unsigned char *p, unsigned char *ttbl, int last_frame) +void __fastcall Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel) { - int v3; // eax - int v4; // edi - int v5; // esi - unsigned char *v6; // eax - char v7; // bl - unsigned char v8; // bl - int v9; // edi - int i; // [esp+0h] [ebp-4h] - - v3 = 1; - for (i = 1; i <= last_frame; ++i) { - v4 = *(_DWORD *)&p[4 * v3]; - v5 = *(_DWORD *)&p[4 * v3 + 4] - v4 - 10; - v6 = &p[v4 + 10]; - while (v5) { - v7 = *v6++; - --v5; - if (v7 < 0) { - v8 = -v7; - if ((char)v8 <= 65) { - v5 -= (char)v8; - if (v8) { - v9 = v8; - do { - *v6 = ttbl[*v6]; - ++v6; - --v9; - } while (v9); - } + int i, nDataSize; + char width; + BYTE *dst; + DWORD *pFrameTable; + + /// ASSERT: assert(p != NULL); + /// ASSERT: assert(ttbl != NULL); + + for(i = 1; i <= nCel; i++) { + pFrameTable = (DWORD *)&p[4 * i]; + dst = &p[pFrameTable[0] + 10]; + nDataSize = pFrameTable[1] - pFrameTable[0] - 10; + while(nDataSize) { + width = *dst++; + nDataSize--; + /// ASSERT: assert(nDataSize >= 0); + if(width < 0) { + width = -width; + if(width > 65) { + nDataSize--; + /// ASSERT: assert(nDataSize >= 0); + *dst = ttbl[*dst]; + dst++; } else { - --v5; - *v6 = ttbl[*v6]; - ++v6; + nDataSize -= width; + /// ASSERT: assert(nDataSize >= 0); + while(width) { + *dst = ttbl[*dst]; + dst++; + width--; + } } } } - v3 = i + 1; } } -void __fastcall Cl2DecodeFrm1(int x, int y, char *pCelBuff, int nCel, int width, int dir1, int dir2) +void __fastcall Cl2DecodeFrm1(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - char *v8; // edx - char *v9; // ecx - int v10; // ecx - int v11; // eax - char *pCelBuffa; // [esp+18h] [ebp+8h] + int hdr, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(char **)&pCelBuff[4 * nCel]; - pCelBuffa = v9; - v10 = (int)&v9[(_DWORD)v8]; - if (*(_WORD *)(v10 + dir1)) { - if (dir2 == 8 || (v11 = *(unsigned short *)(v10 + dir2), !*(_WORD *)(v10 + dir2))) - v11 = *((_DWORD *)v8 + nCel + 1) - (_DWORD)pCelBuffa; - Cl2DecDatFrm1( - (char *)gpBuffer + screen_y_times_768[y - 16 * dir1] + x, - (char *)(*(unsigned short *)(v10 + dir1) + v10), - v11 - *(unsigned short *)(v10 + dir1), - width); - } - } - } - } + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + tmp = (BYTE *)gpBuffer; + Cl2DecDatFrm1( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth); } -void __fastcall Cl2DecDatFrm1(char *buffer, char *frame_content, int a3, int width) /* fix */ +void __fastcall Cl2DecDatFrm1(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) { - char *v4; // esi - char *v5; // edi - int v6; // eax - int v7; // ebx - int v8; // ecx - char v9; // dl - char v10; // dl - int v11; // edx - - v4 = frame_content; - v5 = buffer; - v6 = 0; - v7 = width; - v8 = a3; - do { - _LOBYTE(v6) = *v4++; - --v8; - if ((v6 & 0x80u) == 0) { - do { - if (v6 <= v7) { - v11 = v6; - v5 += v6; - v6 = 0; - } else { - v11 = v7; - v5 += v7; - v6 -= v7; +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + xor eax, eax + mov ebx, nWidth + mov ecx, nDataSize + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label6 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + mov dl, [esi] + inc esi + sub ebx, eax + label2: + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label5 + label3: + sub ecx, eax + sub ebx, eax + label4: + mov dl, [esi] + inc esi + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label4 + label5: + test ebx, ebx + jnz label10 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + jmp label10 + label6: + cmp eax, ebx + jle label7 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label8 + label7: + mov edx, eax + add edi, eax + xor eax, eax + label8: + sub ebx, edx + jnz label9 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + label9: + test eax, eax + jnz label6 + label10: + test ecx, ecx + jnz label1 + pop edi + pop esi + pop ebx + } +#else + int w; + char width; + BYTE fill; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + fill = *src++; + w -= width; + while(width) { + *dst = fill; + dst++; + width--; } - v7 -= v11; - if (!v7) { - v7 = width; - v5 = &v5[-width - 768]; + if(!w) { + w = nWidth; + dst -= 768 + w; } - } while (v6); - } else { - _LOBYTE(v6) = -(char)v6; - if ((char)v6 <= 65) { - v8 -= v6; - v7 -= v6; - do { - v10 = *v4++; - *v5 = v10; - --v6; - ++v5; - } while (v6); + continue; } else { - _LOBYTE(v6) = v6 - 65; - --v8; - v9 = *v4++; - v7 -= v6; - do { - *v5 = v9; - --v6; - ++v5; - } while (v6); - } - if (!v7) { - v7 = width; - v5 = &v5[-width - 768]; - } - } - } while (v8); -} - -void __fastcall Cl2DecodeFrm2(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8) -{ - int v8; // ebx - char *v9; // edx - int v10; // eax - int v11; // [esp+Ch] [ebp-8h] - - v11 = screen_x; - if (gpBuffer) { - if (pCelBuff) { - if (nCel > 0) { - v8 = *(_DWORD *)&pCelBuff[4 * nCel]; - v9 = &pCelBuff[v8]; - if (*(_WORD *)&pCelBuff[v8 + a7]) { - if (a8 == 8 || (v10 = *(unsigned short *)&v9[a8], !*(_WORD *)&v9[a8])) - v10 = *(_DWORD *)&pCelBuff[4 * nCel + 4] - v8; - Cl2DecDatFrm2( - (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + v11, - &v9[*(unsigned short *)&pCelBuff[v8 + a7]], - v10 - *(unsigned short *)&pCelBuff[v8 + a7], - frame_width, - colour); + nDataSize -= width; + w -= width; + while(width) { + *dst = *src; + src++; + dst++; + width--; } - } - } - } -} - -void __fastcall Cl2DecDatFrm2(char *buffer, char *frame_content, int a3, int frame_width, char colour) -{ - char *v5; // esi - char *v6; // edi - int v7; // eax - int v8; // ebx - int v9; // ecx - char v10; // dl - char v11; // dh - char v12; // dh - int v13; // edx - - v5 = frame_content; - v6 = buffer; - v7 = 0; - v8 = frame_width; - v9 = a3; - v10 = colour; - do { - _LOBYTE(v7) = *v5++; - --v9; - if ((v7 & 0x80u) != 0) { - _LOBYTE(v7) = -(char)v7; - if ((char)v7 <= 65) { - v9 -= v7; - v8 -= v7; - do { - v12 = *v5++; - if (v12) { - *(v6 - 1) = v10; - v6[1] = v10; - *(v6 - 768) = v10; - v6[768] = v10; - } - --v7; - ++v6; - } while (v7); - goto LABEL_12; - } - _LOBYTE(v7) = v7 - 65; - --v9; - v11 = *v5++; - if (v11) { - *(v6 - 1) = v10; - v8 -= v7; - v6[v7] = v10; - do { - *(v6 - 768) = v10; - v6[768] = v10; - --v7; - ++v6; - } while (v7); - LABEL_12: - if (!v8) { - v8 = frame_width; - v6 = &v6[-frame_width - 768]; + if(!w) { + w = nWidth; + dst -= 768 + w; } continue; } } - do { - if (v7 <= v8) { - v13 = v7; - v6 += v7; - v7 = 0; + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; } else { - v13 = v8; - v6 += v8; - v7 -= v8; - } - v8 -= v13; - if (!v8) { - v8 = frame_width; - v6 = &v6[-frame_width - 768]; + dst += width; + w -= width; + width = 0; } - } while (v7); - v10 = colour; - } while (v9); -} - -void __fastcall Cl2DecodeFrm3(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8) -{ - char *v8; // edi - int v9; // ebx - char *v10; // esi - int v11; // eax - int v12; // eax - char *v13; // esi - int v14; // edi - int v15; // eax - int v16; // eax - char *pCelBuffa; // [esp+18h] [ebp+8h] - - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(_DWORD *)&pCelBuff[4 * nCel]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + a6]; - pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6]; - if (v11) { - if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7])) - v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9; - v13 = &v10[(_DWORD)pCelBuffa]; - v14 = v12 - (_DWORD)pCelBuffa; - v15 = -(light4flag != 0); - _LOWORD(v15) = v15 & 0xF400; - v16 = v15 + 4096; - if (a8 == 2) - v16 += 256; - if (a8 >= 4) - v16 = v16 + (a8 << 8) - 256; - Cl2DecDatLightTbl1( - (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a6] + screen_x, - v13, - v14, - frame_width, - &pLightTbl[v16]); - } + if(!w) { + w = nWidth; + dst -= 768 + w; } } } +#endif } -// 525728: using guessed type int light4flag; -void __fastcall Cl2DecDatLightTbl1(char *a1, char *a2, int a3, int a4, char *unused_lindex) /* check 5th arg */ +void __fastcall Cl2DecodeFrm2(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - char *v5; // esi - char *v6; // edi - int v7; // ebx - int v8; // ecx - int v9; // eax - int v10; // edx - char v11; // dl - - v5 = a2; - v6 = a1; - v7 = a4; - v8 = a3; - sgnWidth = a4; - v9 = 0; - v10 = 0; - do { - _LOBYTE(v9) = *v5++; - --v8; - if ((v9 & 0x80u) == 0) { - do { - if (v9 <= v7) { - v10 = v9; - v6 += v9; - v9 = 0; - } else { - v10 = v7; - v6 += v7; - v9 -= v7; - } - v7 -= v10; - if (!v7) { - v7 = sgnWidth; - v6 = &v6[-sgnWidth - 768]; - } - } while (v9); - } else { - _LOBYTE(v9) = -(char)v9; - if ((char)v9 <= 65) { - v8 -= v9; - v7 -= v9; - do { - _LOBYTE(v10) = *v5++; - *v6 = unused_lindex[v10]; - --v9; - ++v6; - } while (v9); - } else { - _LOBYTE(v9) = v9 - 65; - --v8; - v7 -= v9; - _LOBYTE(v10) = *v5++; - v11 = unused_lindex[v10]; - do { - *v6 = v11; - --v9; - ++v6; - } while (v9); - } - if (!v7) { - v7 = sgnWidth; - v6 = &v6[-sgnWidth - 768]; - } - } - } while (v8); -} -// 52B978: using guessed type int sgnWidth; + int hdr, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; -void __fastcall Cl2DecodeLightTbl(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7) -{ - int v7; // esi - char *v8; // edi - int v9; // ebx - char *v10; // edx - int v11; // eax - int v12; // eax - int v13; // eax - char *v14; // edx - char *v15; // ecx - char *pCelBuffa; // [esp+18h] [ebp+8h] + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; - v7 = screen_y; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(_DWORD *)&pCelBuff[4 * nCel]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + a6]; - pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6]; - if (v11) { - if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7])) - v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9; - v13 = v12 - (_DWORD)pCelBuffa; - v14 = &v10[(_DWORD)pCelBuffa]; - v15 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x; - if (light_table_index) - Cl2DecDatLightTbl1( - v15, - v14, - v13, - frame_width, - &pLightTbl[256 * light_table_index]); - else - Cl2DecDatFrm1(v15, v14, v13, frame_width); - } - } - } - } -} -// 69BEF8: using guessed type int light_table_index; + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); -void __fastcall Cl2DecodeFrm4(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7) -{ - int v7; // ebx - char *v8; // edx - char *v9; // ecx - int v10; // ecx - int v11; // eax - int v12; // [esp+Ch] [ebp-4h] - char *pCelBuffa; // [esp+18h] [ebp+8h] + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; - v7 = screen_y; - v12 = screen_x; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(char **)&pCelBuff[4 * nCel]; - pCelBuffa = v9; - v10 = (int)&v9[(_DWORD)v8]; - if (*(_WORD *)(v10 + a6)) { - if (a7 == 8 || (v11 = *(unsigned short *)(v10 + a7), !*(_WORD *)(v10 + a7))) - v11 = *(_DWORD *)&v8[4 * nCel + 4] - (_DWORD)pCelBuffa; - Cl2DecDatFrm4( - (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + v12, - (char *)(*(unsigned short *)(v10 + a6) + v10), - v11 - *(unsigned short *)(v10 + a6), - frame_width); - } - } - } - } -} + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; -void __fastcall Cl2DecDatFrm4(char *buffer, char *a2, int a3, int frame_width) -{ - char *v4; // esi - char *v5; // edi - int v6; // eax - int v7; // ebx - int v8; // ecx - char v9; // dl - char v10; // dl - int v11; // edx - - v4 = a2; - v5 = buffer; - v6 = 0; - v7 = frame_width; - v8 = a3; - do { - _LOBYTE(v6) = *v4++; - --v8; - if ((v6 & 0x80u) != 0) { - _LOBYTE(v6) = -(char)v6; - if ((char)v6 <= 65) { - v8 -= v6; - if (v5 < (char *)gpBufEnd) { - v7 -= v6; - do { - v10 = *v4++; - *v5 = v10; - --v6; - ++v5; - } while (v6); - goto LABEL_12; - } - v4 += v6; - } else { - _LOBYTE(v6) = v6 - 65; - --v8; - v9 = *v4++; - if (v5 < (char *)gpBufEnd) { - v7 -= v6; - do { - *v5 = v9; - --v6; - ++v5; - } while (v6); - LABEL_12: - if (!v7) { - v7 = frame_width; - v5 = &v5[-frame_width - 768]; - } - continue; - } - } - } - do { - if (v6 <= v7) { - v11 = v6; - v5 += v6; - v6 = 0; - } else { - v11 = v7; - v5 += v7; - v6 -= v7; - } - v7 -= v11; - if (!v7) { - v7 = frame_width; - v5 = &v5[-frame_width - 768]; - } - } while (v6); - } while (v8); + tmp = (BYTE *)gpBuffer; + Cl2DecDatFrm2( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth, + col); } -// 69CF0C: using guessed type int gpBufEnd; -void __fastcall Cl2DecodeClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8) +void __fastcall Cl2DecDatFrm2(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col) { - int v8; // ebx - char *v9; // edx - int v10; // ecx - int v11; // eax - int v12; // [esp+Ch] [ebp-8h] - char a5; // [esp+10h] [ebp-4h] - - v12 = screen_x; - a5 = colour; - if (gpBuffer) { - if (pCelBuff) { - if (nCel > 0) { - v8 = *(_DWORD *)&pCelBuff[4 * nCel]; - v9 = &pCelBuff[v8]; - v10 = *(unsigned short *)&pCelBuff[v8 + a7]; - if (*(_WORD *)&pCelBuff[v8 + a7]) { - if (a8 == 8 || (v11 = *(unsigned short *)&v9[a8], !*(_WORD *)&v9[a8])) - v11 = *(_DWORD *)&pCelBuff[4 * nCel + 4] - v8; - gpBufEnd -= 768; - Cl2DecDatClrHL( - (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a7] + v12, - &v9[v10], - v11 - v10, - frame_width, - a5); - gpBufEnd += 768; - } - } - } +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + xor eax, eax + mov ebx, nWidth + xor edx, edx + mov ecx, nDataSize + mov dl, col + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label7 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + mov dh, [esi] + inc esi + test dh, dh + jz label7 + mov [edi-1], dl + sub ebx, eax + mov [edi+eax], dl + label2: + mov [edi-768], dl + mov [edi+768], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label6 + label3: + sub ecx, eax + sub ebx, eax + label4: + mov dh, [esi] + inc esi + test dh, dh + jz label5 + mov [edi-1], dl + mov [edi+1], dl + mov [edi-768], dl + mov [edi+768], dl + label5: + dec eax + lea edi, [edi+1] + jnz label4 + label6: + test ebx, ebx + jnz label11 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + jmp label11 + label7: + cmp eax, ebx + jle label8 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label9 + label8: + mov edx, eax + add edi, eax + xor eax, eax + label9: + sub ebx, edx + jnz label10 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + label10: + test eax, eax + jnz label7 + mov dl, col + label11: + test ecx, ecx + jnz label1 + pop edi + pop esi + pop ebx } -} -// 69CF0C: using guessed type int gpBufEnd; +#else + int w; + char width; + BYTE *src, *dst; -void __fastcall Cl2DecDatClrHL(char *dst_buf, char *frame_content, int a3, int frame_width, char colour) -{ - char *v5; // esi - char *v6; // edi - int v7; // eax - int v8; // ebx - int v9; // ecx - char v10; // dl - char v11; // dh - char v12; // dh - int v13; // edx - - v5 = frame_content; - v6 = dst_buf; - v7 = 0; - v8 = frame_width; - v9 = a3; - v10 = colour; - do { - _LOBYTE(v7) = *v5++; - --v9; - if ((v7 & 0x80u) != 0) { - _LOBYTE(v7) = -(char)v7; - if ((char)v7 <= 65) { - v9 -= v7; - if (v6 < (char *)gpBufEnd) { - v8 -= v7; - do { - v12 = *v5++; - if (v12) { - *(v6 - 1) = v10; - v6[1] = v10; - *(v6 - 768) = v10; - v6[768] = v10; - } - --v7; - ++v6; - } while (v7); - goto LABEL_15; + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + if(*src++) { + w -= width; + dst[-1] = col; + dst[width] = col; + while(width) { + dst[-768] = col; + dst[768] = col; + dst++; + width--; + } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + continue; } - v5 += v7; } else { - _LOBYTE(v7) = v7 - 65; - --v9; - v11 = *v5++; - if (v11 && v6 < (char *)gpBufEnd) { - *(v6 - 1) = v10; - v8 -= v7; - v6[v7] = v10; - do { - *(v6 - 768) = v10; - v6[768] = v10; - --v7; - ++v6; - } while (v7); - LABEL_15: - if (!v8) { - v8 = frame_width; - v6 = &v6[-frame_width - 768]; + nDataSize -= width; + w -= width; + while(width) { + if(*src++) { + dst[-1] = col; + dst[1] = col; + dst[-768] = col; + dst[768] = col; } - continue; + dst++; + width--; } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + continue; } } - do { - if (v7 <= v8) { - v13 = v7; - v6 += v7; - v7 = 0; + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; } else { - v13 = v8; - v6 += v8; - v7 -= v8; - } - v8 -= v13; - if (!v8) { - v8 = frame_width; - v6 = &v6[-frame_width - 768]; + dst += width; + w -= width; + width = 0; } - } while (v7); - v10 = colour; - } while (v9); -} -// 69CF0C: using guessed type int gpBufEnd; - -void __fastcall Cl2DecodeFrm5(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8) -{ - char *v8; // edi - int v9; // ebx - char *v10; // esi - int v11; // eax - int v12; // eax - char *v13; // esi - int v14; // edi - int v15; // eax - int v16; // eax - char *pCelBuffa; // [esp+18h] [ebp+8h] - - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(_DWORD *)&pCelBuff[4 * nCel]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned __int16 *)&pCelBuff[v9 + a6]; - pCelBuffa = (char *)*(unsigned __int16 *)&pCelBuff[v9 + a6]; - if (v11) { - if (a7 == 8 || (v12 = *(unsigned __int16 *)&v10[a7], !*(_WORD *)&v10[a7])) - v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9; - v13 = &v10[(_DWORD)pCelBuffa]; - v14 = v12 - (_DWORD)pCelBuffa; - v15 = -(light4flag != 0); - _LOWORD(v15) = v15 & 0xF400; - v16 = v15 + 4096; - if (a8 == 2) - v16 += 256; - if (a8 >= 4) - v16 = v16 + (a8 << 8) - 256; - Cl2DecDatLightTbl2( - (char *)gpBuffer + screen_y_times_768[screen_y - 16 * a6] + screen_x, - v13, - v14, - frame_width, - &pLightTbl[v16]); - } + if(!w) { + w = nWidth; + dst -= 768 + w; } } } +#endif } -// 525728: using guessed type int light4flag; -void __fastcall Cl2DecDatLightTbl2(char *dst_buf, char *a2, int a3, int frame_width, char *a5) /* check 5th arg */ +void __fastcall Cl2DecodeFrm3(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light) { - char *v5; // esi - char *v6; // edi - int v7; // ebx - int v8; // ecx - int v9; // eax - int v10; // edx - char v11; // dl - - v5 = a2; - v6 = dst_buf; - v7 = frame_width; - v8 = a3; - sgnWidth = frame_width; - v9 = 0; - v10 = 0; - do { - _LOBYTE(v9) = *v5++; - --v8; - if ((v9 & 0x80u) != 0) { - _LOBYTE(v9) = -(char)v9; - if ((char)v9 <= 65) { - v8 -= v9; - if (v6 < (char *)gpBufEnd) { - v7 -= v9; - do { - _LOBYTE(v10) = *v5++; - *v6 = a5[v10]; - --v9; - ++v6; - } while (v9); - goto LABEL_12; + int hdr, idx, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + idx = light4flag ? 1024 : 4096; + if(light == 2) + idx += 256; + if(light >= 4) + idx += (light - 1) << 8; + + tmp = (BYTE *)gpBuffer; + Cl2DecDatLightTbl1( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth, + (BYTE *)&pLightTbl[idx]); +} +// 525728: using guessed type int light4flag; + +void __fastcall Cl2DecDatLightTbl1(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable) +{ +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + mov ebx, nWidth + mov ecx, nDataSize + mov edx, pTable + push ebp + mov sgnWidth, ebx + mov ebp, edx + xor eax, eax + xor edx, edx + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label6 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + sub ebx, eax + mov dl, [esi] + inc esi + mov dl, [ebp+edx] + label2: + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label5 + label3: + sub ecx, eax + sub ebx, eax + label4: + mov dl, [esi] + inc esi + mov dl, [ebp+edx] + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label4 + label5: + test ebx, ebx + jnz label10 + mov ebx, sgnWidth + sub edi, 768 + sub edi, ebx + jmp label10 + label6: + cmp eax, ebx + jle label7 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label8 + label7: + mov edx, eax + add edi, eax + xor eax, eax + label8: + sub ebx, edx + jnz label9 + mov ebx, sgnWidth + sub edi, 768 + sub edi, ebx + label9: + test eax, eax + jnz label6 + label10: + test ecx, ecx + jnz label1 + pop ebp + pop edi + pop esi + pop ebx + } +#else + int w; + char width; + BYTE fill; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + sgnWidth = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + fill = pTable[*src++]; + w -= width; + while(width) { + *dst = fill; + dst++; + width--; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; } - v5 += v9; + continue; } else { - _LOBYTE(v9) = v9 - 65; - --v8; - _LOBYTE(v10) = *v5++; - v11 = a5[v10]; - if (v6 < (char *)gpBufEnd) { - v7 -= v9; - do { - *v6 = v11; - --v9; - ++v6; - } while (v9); - LABEL_12: - if (!v7) { - v7 = sgnWidth; - v6 = &v6[-sgnWidth - 768]; + nDataSize -= width; + w -= width; + while(width) { + *dst = pTable[*src]; + src++; + dst++; + width--; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; + } + continue; + } + } + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; + } else { + dst += width; + w -= width; + width = 0; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; + } + } + } +#endif +} +// 52B978: using guessed type int sgnWidth; + +void __fastcall Cl2DecodeLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) +{ + int hdr, nDataSize; + BYTE *pRLEBytes, *pDecodeTo, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + tmp = (BYTE *)gpBuffer; + pDecodeTo = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + if(light_table_index) + Cl2DecDatLightTbl1(pDecodeTo, &pRLEBytes[hdr], nDataSize - hdr, nWidth, (BYTE *)&pLightTbl[light_table_index * 256]); + else + Cl2DecDatFrm1(pDecodeTo, &pRLEBytes[hdr], nDataSize - hdr, nWidth); +} +// 69BEF8: using guessed type int light_table_index; + +void __fastcall Cl2DecodeFrm4(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) +{ + int hdr, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + tmp = (BYTE *)gpBuffer; + Cl2DecDatFrm4( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth); +} + +void __fastcall Cl2DecDatFrm4(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth) +{ +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + xor eax, eax + mov ebx, nWidth + mov ecx, nDataSize + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label7 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + mov dl, [esi] + inc esi + cmp edi, gpBufEnd + jge label7 + sub ebx, eax + label2: + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label6 + label3: + sub ecx, eax + cmp edi, gpBufEnd + jl label4 + add esi, eax + jmp label7 + label4: + sub ebx, eax + label5: + mov dl, [esi] + inc esi + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label5 + label6: + test ebx, ebx + jnz label11 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + jmp label11 + label7: + cmp eax, ebx + jle label8 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label9 + label8: + mov edx, eax + add edi, eax + xor eax, eax + label9: + sub ebx, edx + jnz label10 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + label10: + test eax, eax + jnz label7 + label11: + test ecx, ecx + jnz label1 + pop edi + pop esi + pop ebx + } +#else + int w; + char width; + BYTE fill; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + fill = *src++; + if(dst < gpBufEnd) { + w -= width; + while(width) { + *dst = fill; + dst++; + width--; + } + if(!w) { + w = nWidth; + dst -= 768 + w; } continue; } + } else { + nDataSize -= width; + if(dst < gpBufEnd) { + w -= width; + while(width) { + *dst = *src; + src++; + dst++; + width--; + } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + continue; + } else { + src += width; + } } } - do { - if (v9 <= v7) { - v10 = v9; - v6 += v9; - v9 = 0; + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; } else { - v10 = v7; - v6 += v7; - v9 -= v7; + dst += width; + w -= width; + width = 0; } - v7 -= v10; - if (!v7) { - v7 = sgnWidth; - v6 = &v6[-sgnWidth - 768]; + if(!w) { + w = nWidth; + dst -= 768 + w; } - } while (v9); - } while (v8); + } + } +#endif } -// 52B978: using guessed type int sgnWidth; // 69CF0C: using guessed type int gpBufEnd; -void __fastcall Cl2DecodeFrm6(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7) +void __fastcall Cl2DecodeClrHL(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) { - int v7; // esi - char *v8; // edi - int v9; // ebx - char *v10; // edx - int v11; // eax - int v12; // eax - int v13; // eax - char *v14; // edx - char *v15; // ecx - char *pCelBuffa; // [esp+18h] [ebp+8h] + int hdr, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; - v7 = screen_y; - if (gpBuffer) { - v8 = pCelBuff; - if (pCelBuff) { - if (nCel > 0) { - v9 = *(_DWORD *)&pCelBuff[4 * nCel]; - v10 = &pCelBuff[v9]; - v11 = *(unsigned short *)&pCelBuff[v9 + a6]; - pCelBuffa = (char *)*(unsigned short *)&pCelBuff[v9 + a6]; - if (v11) { - if (a7 == 8 || (v12 = *(unsigned short *)&v10[a7], !*(_WORD *)&v10[a7])) - v12 = *(_DWORD *)&v8[4 * nCel + 4] - v9; - v13 = v12 - (_DWORD)pCelBuffa; - v14 = &v10[(_DWORD)pCelBuffa]; - v15 = (char *)gpBuffer + screen_y_times_768[v7 - 16 * a6] + screen_x; - if (light_table_index) - Cl2DecDatLightTbl2(v15, v14, v13, frame_width, &pLightTbl[256 * light_table_index]); - else - Cl2DecDatFrm4(v15, v14, v13, frame_width); + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + tmp = (BYTE *)gpBuffer; + gpBufEnd -= 768; + Cl2DecDatClrHL( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth, + col); + gpBufEnd += 768; +} +// 69CF0C: using guessed type int gpBufEnd; + +void __fastcall Cl2DecDatClrHL(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col) +{ +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + xor eax, eax + mov ebx, nWidth + xor edx, edx + mov ecx, nDataSize + mov dl, col + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label9 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + mov dh, [esi] + inc esi + test dh, dh + jz label9 + cmp edi, gpBufEnd + jge label9 + mov [edi-1], dl + sub ebx, eax + mov [edi+eax], dl + label2: + mov [edi-768], dl + mov [edi+768], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label7 + label3: + sub ecx, eax + cmp edi, gpBufEnd + jl label4 + add esi, eax + jmp label9 + label4: + sub ebx, eax + label5: + mov dh, [esi] + inc esi + test dh, dh + jz label6 + mov [edi-1], dl + mov [edi+1], dl + mov [edi-768], dl + mov [edi+768], dl + label6: + dec eax + lea edi, [edi+1] + jnz label5 + label7: + test ebx, ebx + jnz label13 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + jmp label13 + label9: + cmp eax, ebx + jle label10 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label11 + label10: + mov edx, eax + add edi, eax + xor eax, eax + label11: + sub ebx, edx + jnz label12 + mov ebx, nWidth + sub edi, 768 + sub edi, ebx + label12: + test eax, eax + jnz label9 + mov dl, col + label13: + test ecx, ecx + jnz label1 + pop edi + pop esi + pop ebx + } +#else + int w; + char width; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + if(*src++ && dst < gpBufEnd) { + w -= width; + dst[-1] = col; + dst[width] = col; + while(width) { + dst[-768] = col; + dst[768] = col; + dst++; + width--; + } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + continue; + } + } else { + nDataSize -= width; + if(dst < gpBufEnd) { + w -= width; + while(width) { + if(*src++) { + dst[-1] = col; + dst[1] = col; + dst[-768] = col; + dst[768] = col; + } + dst++; + width--; + } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + continue; + } else { + src += width; } } } + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; + } else { + dst += width; + w -= width; + width = 0; + } + if(!w) { + w = nWidth; + dst -= 768 + w; + } + } } +#endif +} +// 69CF0C: using guessed type int gpBufEnd; + +void __fastcall Cl2DecodeFrm5(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light) +{ + int hdr, idx, nDataSize; + BYTE *pRLEBytes, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + idx = light4flag ? 1024 : 4096; + if(light == 2) + idx += 256; + if(light >= 4) + idx += (light - 1) << 8; + + tmp = (BYTE *)gpBuffer; + Cl2DecDatLightTbl2( + &tmp[sx + screen_y_times_768[sy - 16 * always_0]], + &pRLEBytes[hdr], + nDataSize - hdr, + nWidth, + (BYTE *)&pLightTbl[idx]); +} +// 525728: using guessed type int light4flag; + +void __fastcall Cl2DecDatLightTbl2(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable) +{ +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + push ebx + push esi + push edi + mov esi, edx /// UNSAFE: use 'mov esi, pRLEBytes' + mov edi, ecx /// UNSAFE: use 'mov edi, pDecodeTo' + mov ebx, nWidth + mov ecx, nDataSize + mov edx, pTable + push ebp + mov sgnWidth, ebx + mov ebp, edx + xor eax, eax + xor edx, edx + label1: + mov al, [esi] + inc esi + dec ecx + test al, al + jns label7 + neg al + cmp al, 41h + jle label3 + sub al, 41h + dec ecx + mov dl, [esi] + inc esi + mov dl, [ebp+edx] + cmp edi, gpBufEnd + jge label7 + sub ebx, eax + label2: + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label2 + jmp label6 + label3: + sub ecx, eax + cmp edi, gpBufEnd + jl label4 + add esi, eax + jmp label7 + label4: + sub ebx, eax + label5: + mov dl, [esi] + inc esi + mov dl, [ebp+edx] + mov [edi], dl + dec eax + lea edi, [edi+1] + jnz label5 + label6: + test ebx, ebx + jnz label11 + mov ebx, sgnWidth + sub edi, 768 + sub edi, ebx + jmp label11 + label7: + cmp eax, ebx + jle label8 + mov edx, ebx + add edi, ebx + sub eax, ebx + jmp label9 + label8: + mov edx, eax + add edi, eax + xor eax, eax + label9: + sub ebx, edx + jnz label10 + mov ebx, sgnWidth + sub edi, 768 + sub edi, ebx + label10: + test eax, eax + jnz label7 + label11: + test ecx, ecx + jnz label1 + pop ebp + pop edi + pop esi + pop ebx + } +#else + int w; + char width; + BYTE fill; + BYTE *src, *dst; + + src = pRLEBytes; + dst = pDecodeTo; + w = nWidth; + sgnWidth = nWidth; + + while(nDataSize) { + width = *src++; + nDataSize--; + if(width < 0) { + width = -width; + if(width > 65) { + width -= 65; + nDataSize--; + fill = pTable[*src++]; + if(dst < gpBufEnd) { + w -= width; + while(width) { + *dst = fill; + dst++; + width--; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; + } + continue; + } + } else { + nDataSize -= width; + if(dst < gpBufEnd) { + w -= width; + while(width) { + *dst = pTable[*src]; + src++; + dst++; + width--; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; + } + continue; + } else { + src += width; + } + } + } + while(width) { + if(width > w) { + dst += w; + width -= w; + w = 0; + } else { + dst += width; + w -= width; + width = 0; + } + if(!w) { + w = sgnWidth; + dst -= 768 + w; + } + } + } +#endif +} +// 52B978: using guessed type int sgnWidth; +// 69CF0C: using guessed type int gpBufEnd; + +void __fastcall Cl2DecodeFrm6(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir) +{ + int hdr, nDataSize; + BYTE *pRLEBytes, *pDecodeTo, *tmp; + DWORD *pFrameTable; + + /// ASSERT: assert(gpBuffer != NULL); + if(!gpBuffer) + return; + /// ASSERT: assert(pCelBuff != NULL); + if(!pCelBuff) + return; + /// ASSERT: assert(nCel > 0); + if(nCel <= 0) + return; + + pFrameTable = (DWORD *)pCelBuff; + /// ASSERT: assert(nCel <= (int) pFrameTable[0]); + + pRLEBytes = &pCelBuff[pFrameTable[nCel]]; + hdr = *(WORD *)&pRLEBytes[always_0]; + if(!hdr) + return; + + if(dir == 8) + nDataSize = 0; + else + nDataSize = *(WORD *)&pRLEBytes[dir]; + if(!nDataSize) + nDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel]; + + tmp = (BYTE *)gpBuffer; + pDecodeTo = &tmp[sx + screen_y_times_768[sy - 16 * always_0]]; + + if(light_table_index) + Cl2DecDatLightTbl2(pDecodeTo, &pRLEBytes[hdr], nDataSize - hdr, nWidth, (BYTE *)&pLightTbl[light_table_index * 256]); + else + Cl2DecDatFrm4(pDecodeTo, &pRLEBytes[hdr], nDataSize - hdr, nWidth); } // 69BEF8: using guessed type int light_table_index; diff --git a/Source/engine.h b/Source/engine.h index ad55b49be..f45abbbb9 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -47,21 +47,21 @@ unsigned char *__fastcall DiabloAllocPtr(int dwBytes); void __fastcall mem_free_dbg(void *p); BYTE *__fastcall LoadFileInMem(char *pszName, int *pdwFileLen); void __fastcall LoadFileWithMem(char *pszName, void *buf); -void __fastcall Cl2ApplyTrans(unsigned char *p, unsigned char *ttbl, int last_frame); -void __fastcall Cl2DecodeFrm1(int x, int y, char *pCelBuff, int nCel, int width, int dir1, int dir2); -void __fastcall Cl2DecDatFrm1(char *buffer, char *frame_content, int a3, int width); -void __fastcall Cl2DecodeFrm2(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8); -void __fastcall Cl2DecDatFrm2(char *buffer, char *a2, int a3, int a4, char a5); -void __fastcall Cl2DecodeFrm3(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8); -void __fastcall Cl2DecDatLightTbl1(char *a1, char *a2, int a3, int a4, char *unused_lindex); -void __fastcall Cl2DecodeLightTbl(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7); -void __fastcall Cl2DecodeFrm4(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7); -void __fastcall Cl2DecDatFrm4(char *buffer, char *a2, int a3, int frame_width); -void __fastcall Cl2DecodeClrHL(char colour, int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a7, int a8); -void __fastcall Cl2DecDatClrHL(char *dst_buf, char *frame_content, int a3, int frame_width, char colour); -void __fastcall Cl2DecodeFrm5(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7, char a8); -void __fastcall Cl2DecDatLightTbl2(char *dst_buf, char *a2, int a3, int frame_width, char *a5); -void __fastcall Cl2DecodeFrm6(int screen_x, int screen_y, char *pCelBuff, int nCel, int frame_width, int a6, int a7); +void __fastcall Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel); +void __fastcall Cl2DecodeFrm1(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cl2DecDatFrm1(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); +void __fastcall Cl2DecodeFrm2(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cl2DecDatFrm2(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col); +void __fastcall Cl2DecodeFrm3(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light); +void __fastcall Cl2DecDatLightTbl1(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable); +void __fastcall Cl2DecodeLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cl2DecodeFrm4(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cl2DecDatFrm4(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); +void __fastcall Cl2DecodeClrHL(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); +void __fastcall Cl2DecDatClrHL(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col); +void __fastcall Cl2DecodeFrm5(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir, char light); +void __fastcall Cl2DecDatLightTbl2(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable); +void __fastcall Cl2DecodeFrm6(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int always_0, int dir); void __fastcall PlayInGameMovie(char *pszMovie); /* rdata */ diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 016793258..2a64a7853 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -95,11 +95,11 @@ void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL p mx = sx + m->_mixoff - m->_miAnimWidth2; my = sy + m->_miyoff; if(m->_miUniqTrans) - Cl2DecodeFrm3(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + Cl2DecodeFrm3(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); else if(m->_miLightFlag) - Cl2DecodeLightTbl(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeLightTbl(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); else - Cl2DecodeFrm1(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm1(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } else { @@ -119,11 +119,11 @@ void __fastcall DrawMissile(int x, int y, int sx, int sy, int a5, int a6, BOOL p mx = sx + m->_mixoff - m->_miAnimWidth2; my = sy + m->_miyoff; if(m->_miUniqTrans) - Cl2DecodeFrm3(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + Cl2DecodeFrm3(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); else if(m->_miLightFlag) - Cl2DecodeLightTbl(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeLightTbl(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); else - Cl2DecodeFrm1(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm1(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } @@ -156,11 +156,11 @@ void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, mx = sx + m->_mixoff - m->_miAnimWidth2; my = sy + m->_miyoff; if(m->_miUniqTrans) - Cl2DecodeFrm5(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + Cl2DecodeFrm5(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); else if(m->_miLightFlag) - Cl2DecodeFrm6(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm6(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); else - Cl2DecodeFrm4(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm4(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } else { @@ -180,11 +180,11 @@ void __fastcall DrawClippedMissile(int x, int y, int sx, int sy, int a5, int a6, mx = sx + m->_mixoff - m->_miAnimWidth2; my = sy + m->_miyoff; if(m->_miUniqTrans) - Cl2DecodeFrm5(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); + Cl2DecodeFrm5(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6, m->_miUniqTrans + 3); else if(m->_miLightFlag) - Cl2DecodeFrm6(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm6(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); else - Cl2DecodeFrm4(mx, my, (char *)m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); + Cl2DecodeFrm4(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, a5, a6); } } } @@ -253,25 +253,25 @@ void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuf return; } if(pnum == pcursplr) - Cl2DecodeFrm2(165, px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeFrm2(165, px, py, pCelBuff, nCel, nWidth, a9, a10); if(pnum == myplr) { - Cl2DecodeFrm1(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeFrm1(px, py, pCelBuff, nCel, nWidth, a9, a10); if(plr[pnum].pManaShield) Cl2DecodeFrm1( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, a10); } else if(!(dFlags[x][y] & DFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) { - Cl2DecodeFrm3(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10, 1); + Cl2DecodeFrm3(px, py, pCelBuff, nCel, nWidth, a9, a10, 1); if(plr[pnum].pManaShield) Cl2DecodeFrm3( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, @@ -283,12 +283,12 @@ void __fastcall DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuf light_table_index = 0; else light_table_index -= 5; - Cl2DecodeLightTbl(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeLightTbl(px, py, pCelBuff, nCel, nWidth, a9, a10); if(plr[pnum].pManaShield) Cl2DecodeLightTbl( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, @@ -329,25 +329,25 @@ void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE * return; } if(pnum == pcursplr) - Cl2DecodeClrHL(165, px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeClrHL(165, px, py, pCelBuff, nCel, nWidth, a9, a10); if(pnum == myplr) { - Cl2DecodeFrm4(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeFrm4(px, py, pCelBuff, nCel, nWidth, a9, a10); if(plr[pnum].pManaShield) Cl2DecodeFrm4( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, a10); } else if(!(dFlags[x][y] & DFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) { - Cl2DecodeFrm5(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10, 1); + Cl2DecodeFrm5(px, py, pCelBuff, nCel, nWidth, a9, a10, 1); if(plr[pnum].pManaShield) Cl2DecodeFrm5( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, @@ -359,12 +359,12 @@ void __fastcall DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE * light_table_index = 0; else light_table_index -= 5; - Cl2DecodeFrm6(px, py, (char *)pCelBuff, nCel, nWidth, a9, a10); + Cl2DecodeFrm6(px, py, pCelBuff, nCel, nWidth, a9, a10); if(plr[pnum].pManaShield) Cl2DecodeFrm6( px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0], py, - (char *)misfiledata[MFILE_MANASHLD].mAnimData[0], + misfiledata[MFILE_MANASHLD].mAnimData[0], 1, misfiledata[MFILE_MANASHLD].mAnimWidth[0], a9, @@ -853,9 +853,9 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, if (v14 >= 1 && (unsigned int)*v12 <= 0x32 && v14 <= *v12) { v15 = v11->_deadtrans; if (v15) - Cl2DecodeFrm5(v13, a5, (char *)v12, v14, v11->_deadWidth, 0, 8, v15); + Cl2DecodeFrm5(v13, a5, (BYTE *)v12, v14, v11->_deadWidth, 0, 8, v15); else - Cl2DecodeFrm6(v13, a5, (char *)v12, v14, v11->_deadWidth, 0, 8); + Cl2DecodeFrm6(v13, a5, (BYTE *)v12, v14, v11->_deadWidth, 0, 8); } } } @@ -913,7 +913,7 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, v26 = a5 + v24->_myoff; v27 = a4 + v24->_mxoff - v25->width2; if (v23 == pcursmonst) { - Cl2DecodeClrHL(233, v27, v26, (char *)v24->_mAnimData, v24->_mAnimFrame, v25->width, 0, 8); + Cl2DecodeClrHL(233, v27, v26, v24->_mAnimData, v24->_mAnimFrame, v25->width, 0, 8); v23 = draw_monster_num; } DrawClippedMonster(a1a, sy, v27, v26, v23, 0, 8); @@ -961,7 +961,7 @@ void __fastcall scrollrt_draw_clipped_dungeon(char *a1, int sx, int sy, int a4, v34 = a5 + v32->_myoff; v35 = a4 + v32->_mxoff - v33->width2; if (v31 == pcursmonst) { - Cl2DecodeClrHL(233, v35, v34, (char *)v32->_mAnimData, v32->_mAnimFrame, v33->width, 0, 8); + Cl2DecodeClrHL(233, v35, v34, v32->_mAnimData, v32->_mAnimFrame, v33->width, 0, 8); v31 = draw_monster_num; } DrawClippedMonster(a1a, sy, v35, v34, v31, 0, 8); @@ -1049,7 +1049,7 @@ void __fastcall DrawClippedMonster(int x, int y, int mx, int my, int m, int a6, } if(!(dFlags[x][y] & DFLAG_LIT)) { - Cl2DecodeFrm5(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); + Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); } else { trans = 0; if(monster[m]._uniqtype) @@ -1059,9 +1059,9 @@ void __fastcall DrawClippedMonster(int x, int y, int mx, int my, int m, int a6, if(plr[myplr]._pInfraFlag && light_table_index > 8) trans = 1; if(trans) - Cl2DecodeFrm5(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); + Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); else - Cl2DecodeFrm6(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); + Cl2DecodeFrm6(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); } } // 69BEF8: using guessed type int light_table_index; @@ -1453,9 +1453,9 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int if (v17 >= 1 && (unsigned int)*v15 <= 0x32 && v17 <= *v15) { v18 = v14->_deadtrans; if (v18) - Cl2DecodeFrm5(v16, sy, (char *)v15, v17, v14->_deadWidth, a5, 8, v18); + Cl2DecodeFrm5(v16, sy, (BYTE *)v15, v17, v14->_deadWidth, a5, 8, v18); else - Cl2DecodeFrm6(v16, sy, (char *)v15, v17, v14->_deadWidth, a5, 8); + Cl2DecodeFrm6(v16, sy, (BYTE *)v15, v17, v14->_deadWidth, a5, 8); } } } @@ -1513,7 +1513,7 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int v29 = sy + v27->_myoff; v30 = sx + v27->_mxoff - v28->width2; if (v26 == pcursmonst) { - Cl2DecodeClrHL(233, v30, v29, (char *)v27->_mAnimData, v27->_mAnimFrame, v28->width, a5, 8); + Cl2DecodeClrHL(233, v30, v29, v27->_mAnimData, v27->_mAnimFrame, v28->width, a5, 8); v26 = draw_monster_num; } DrawClippedMonster(a1, y, v30, v29, v26, a5, 8); @@ -1562,7 +1562,7 @@ void __fastcall scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int v37 = sy + v35->_myoff; v38 = sx + v35->_mxoff - v36->width2; if (v34 == pcursmonst) { - Cl2DecodeClrHL(233, v38, v37, (char *)v35->_mAnimData, v35->_mAnimFrame, v36->width, a5, 8); + Cl2DecodeClrHL(233, v38, v37, v35->_mAnimData, v35->_mAnimFrame, v36->width, a5, 8); v34 = draw_monster_num; } DrawClippedMonster(a1, y, v38, v37, v34, a5, 8); @@ -1993,9 +1993,9 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 if (v16 >= 1 && (unsigned int)*v14 <= 0x32 && v16 <= *v14) { v17 = v13->_deadtrans; if (v17) - Cl2DecodeFrm3(v15, sy, (char *)v14, v16, v13->_deadWidth, 0, a5, v17); + Cl2DecodeFrm3(v15, sy, (BYTE *)v14, v16, v13->_deadWidth, 0, a5, v17); else - Cl2DecodeLightTbl(v15, sy, (char *)v14, v16, v13->_deadWidth, 0, a5); + Cl2DecodeLightTbl(v15, sy, (BYTE *)v14, v16, v13->_deadWidth, 0, a5); } } } @@ -2053,7 +2053,7 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 v28 = sy + v26->_myoff; v29 = sx + v26->_mxoff - v27->width2; if (v25 == pcursmonst) { - Cl2DecodeFrm2(233, v29, v28, (char *)v26->_mAnimData, v26->_mAnimFrame, v27->width, 0, a5); + Cl2DecodeFrm2(233, v29, v28, v26->_mAnimData, v26->_mAnimFrame, v27->width, 0, a5); v25 = draw_monster_num; } DrawMonster(xa, y, v29, v28, v25, 0, a5); @@ -2101,7 +2101,7 @@ void __fastcall scrollrt_draw_dungeon(char *buffer, int x, int y, int a4, int a5 v36 = sy + v34->_myoff; v37 = sx + v34->_mxoff - v35->width2; if (v33 == pcursmonst) { - Cl2DecodeFrm2(233, v37, v36, (char *)v34->_mAnimData, v34->_mAnimFrame, v35->width, 0, a5); + Cl2DecodeFrm2(233, v37, v36, v34->_mAnimData, v34->_mAnimFrame, v35->width, 0, a5); v33 = draw_monster_num; } DrawMonster(xa, y, v37, v36, v33, 0, a5); @@ -2189,7 +2189,7 @@ void __fastcall DrawMonster(int x, int y, int mx, int my, int m, int a6, int a7) } if(!(dFlags[x][y] & DFLAG_LIT)) { - Cl2DecodeFrm3(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); + Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, 1); } else { trans = 0; if(monster[m]._uniqtype) @@ -2199,9 +2199,9 @@ void __fastcall DrawMonster(int x, int y, int mx, int my, int m, int a6, int a7) if(plr[myplr]._pInfraFlag && light_table_index > 8) trans = 1; if(trans) - Cl2DecodeFrm3(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); + Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7, trans); else - Cl2DecodeLightTbl(mx, my, (char *)monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); + Cl2DecodeLightTbl(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, a6, a7); } } // 69BEF8: using guessed type int light_table_index; diff --git a/Source/town.cpp b/Source/town.cpp index ab21cae8b..1c288311f 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -191,8 +191,8 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s v20 = sy + plr[v19]._pyoff; v21 = sx + plr[v19]._pxoff - plr[v19]._pAnimWidth2; if (v18 == pcursplr) - Cl2DecodeClrHL(165, v21, v20, (char *)plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8); - Cl2DecodeFrm4(v21, v20, (char *)plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8); + Cl2DecodeClrHL(165, v21, v20, plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8); + Cl2DecodeFrm4(v21, v20, plr[v19]._pAnimData, plr[v19]._pAnimFrame, plr[v19]._pAnimWidth, 0, 8); if (some_flag && plr[v19]._peflag) town_draw_clipped_e_flag((BYTE *)v27 - 64, xa - 1, y + 1, sx - 64, sy); v7 = v29; @@ -206,8 +206,8 @@ void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int s v25 = sy + plr[v24]._pyoff; v26 = sx + plr[v24]._pxoff - plr[v24]._pAnimWidth2; if (v23 == pcursplr) - Cl2DecodeClrHL(165, v26, v25, (char *)plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8); - Cl2DecodeFrm4(v26, v25, (char *)plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8); + Cl2DecodeClrHL(165, v26, v25, plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8); + Cl2DecodeFrm4(v26, v25, plr[v24]._pAnimData, plr[v24]._pAnimFrame, plr[v24]._pAnimWidth, 0, 8); if (some_flag && plr[v24]._peflag) town_draw_clipped_e_flag((BYTE *)v27 - 64, xa - 1, y + 1, sx - 64, sy); v7 = v29; @@ -451,8 +451,8 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i v22 = sy + plr[v21]._pyoff; v23 = sx + plr[v21]._pxoff - plr[v21]._pAnimWidth2; if (v20 == pcursplr) - Cl2DecodeClrHL(165, v23, v22, (char *)plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8); - Cl2DecodeFrm4(v23, v22, (char *)plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8); + Cl2DecodeClrHL(165, v23, v22, plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8); + Cl2DecodeFrm4(v23, v22, plr[v21]._pAnimData, plr[v21]._pAnimFrame, plr[v21]._pAnimWidth, a5, 8); if (some_flag && plr[v21]._peflag) town_draw_clipped_e_flag_2((BYTE *)(v29 - 64), xa - 1, a3 + 1, a4, a5, sx - 64, sy); v9 = v31; @@ -466,8 +466,8 @@ void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, i v27 = sy + plr[v26]._pyoff; v28 = sx + plr[v26]._pxoff - plr[v26]._pAnimWidth2; if (v25 == pcursplr) - Cl2DecodeClrHL(165, v28, v27, (char *)plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8); - Cl2DecodeFrm4(v28, v27, (char *)plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8); + Cl2DecodeClrHL(165, v28, v27, plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8); + Cl2DecodeFrm4(v28, v27, plr[v26]._pAnimData, plr[v26]._pAnimFrame, plr[v26]._pAnimWidth, a5, 8); if (some_flag && plr[v26]._peflag) town_draw_clipped_e_flag_2((BYTE *)(v29 - 64), xa - 1, a3 + 1, a4, a5, sx - 64, sy); v9 = v31; @@ -675,8 +675,8 @@ void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, yy = sy + plr[pnum]._pyoff; xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2; if (pnum == pcursplr) - Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, (char *)plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); - Cl2DecodeFrm1(xx, yy, (char *)plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); + Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); + Cl2DecodeFrm1(xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); if (some_flag && plr[pnum]._peflag) town_draw_e_flag(buffer - 64, x - 1, y + 1, a4, dir, sx - 64, sy); } @@ -687,8 +687,8 @@ void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, yy = sy + plr[pnum]._pyoff; xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2; if (pnum == pcursplr) - Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, (char *)plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); - Cl2DecodeFrm1(xx, yy, (char *)plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); + Cl2DecodeFrm2(PAL16_BEIGE + 5, xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); + Cl2DecodeFrm1(xx, yy, plr[pnum]._pAnimData, plr[pnum]._pAnimFrame, plr[pnum]._pAnimWidth, 0, dir); if (some_flag && plr[pnum]._peflag) town_draw_e_flag(buffer - 64, x - 1, y + 1, a4, dir, sx - 64, sy); }