diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index dc19e8cb6..57595e029 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -436,116 +436,104 @@ void __fastcall DrawView(int StartX, int StartY) void __fastcall DrawGame(int x, int y) { - int v2; // esi - int v3; // ebx - int v4; // edi - int v5; // edi - int v6; // esi - int v7; // edi - int v8; // esi - int v9; // edi - int v10; // esi - signed int v11; // [esp+Ch] [ebp-10h] - signed int a6; // [esp+10h] [ebp-Ch] - signed int a6a; // [esp+10h] [ebp-Ch] - signed int a5; // [esp+14h] [ebp-8h] - int ya; // [esp+18h] [ebp-4h] + int i, sx, sy, chunks, blocks; - dword_5C2FF8 = 10; - v2 = ScrollInfo._sxoff + 64; - v3 = x - 10; - ya = y - 1; - a5 = 10; - v4 = ScrollInfo._syoff + 175; scr_pix_width = 640; scr_pix_height = 352; + dword_5C2FF8 = 10; dword_5C2FFC = 11; - v11 = 8; - if (chrflag || questlog) { - ya = y - 3; - v3 += 2; - v2 = ScrollInfo._sxoff + 352; - a5 = 6; - } - if (invflag || sbookflag) { - ya -= 2; - v3 += 2; - v2 -= 32; - a5 = 6; - } - switch (ScrollInfo._sdir) { - case DIR_SW: - goto LABEL_9; - case DIR_W: - ++a5; - LABEL_9: - v4 = ScrollInfo._syoff + 143; - --v3; - --ya; - goto LABEL_15; - case DIR_NW: - goto LABEL_13; - case DIR_N: - v11 = 9; - goto LABEL_13; - case DIR_NE: - goto LABEL_15; - case DIR_E: - v11 = 9; - goto LABEL_12; - case DIR_SE: - LABEL_12: - v2 -= 64; - --v3; - ++ya; - LABEL_13: - ++a5; + + sx = ScrollInfo._sxoff + 64; + sy = ScrollInfo._syoff + 175; + x -= 10; + y--; + chunks = 10; + blocks = 8; + + if(chrflag || questlog) { + x += 2; + y -= 2; + sx += 288; + chunks = 6; + } + if(invflag || sbookflag) { + x += 2; + y -= 2; + sx -= 32; + chunks = 6; + } + + switch(ScrollInfo._sdir) { + case 0: + break; + case 2: + chunks++; + case 1: + sy -= 32; + x--; + y--; + blocks++; + break; + case 4: + blocks++; + case 3: + chunks++; + break; + case 5: + blocks++; break; - case DIR_OMNI: - v2 -= 64; - v4 = ScrollInfo._syoff + 143; - v3 -= 2; - ++a5; - LABEL_15: - v11 = 9; + case 6: + blocks++; + case 7: + sx -= 64; + x--; + y++; + chunks++; break; - default: + case 8: + sx -= 64; + sy -= 32; + x -= 2; + chunks++; + blocks++; break; } - a6 = 0; - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[160]; - do { - scrollrt_draw_upper(v3, ya++, v2, v4, a5, a6, 0); - v5 = v4 + 16; - v6 = v2 - 32; - scrollrt_draw_upper(v3++, ya, v6, v5, a5, a6, 1); - v2 = v6 + 32; - v4 = v5 + 16; - ++a6; - } while (a6 < 4); - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[512]; - if (v11 > 0) { - do { - scrollrt_draw_lower(v3, ya++, v2, v4, a5, 0); - v7 = v4 + 16; - v8 = v2 - 32; - scrollrt_draw_lower(v3++, ya, v8, v7, a5, 1); - v2 = v8 + 32; - v4 = v7 + 16; - --v11; - } while (v11); + + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[160]]; + for(i = 0; i < 4; i++) { + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[512]]; + for(i = 0; i < blocks; i++) { + scrollrt_draw_lower(x, y, sx, sy, chunks, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower(x, y, sx, sy, chunks, 1); + x++; + sx += 32; + sy += 16; } arch_draw_type = 0; - a6a = 0; - do { - scrollrt_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0); - v9 = v4 + 16; - v10 = v2 - 32; - scrollrt_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1); - v2 = v10 + 32; - v4 = v9 + 16; - ++a6a; - } while (a6a < 4); + for(i = 0; i < 4; i++) { + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } } // 4B8968: using guessed type int sbookflag; // 5C2FF8: using guessed type int dword_5C2FF8; @@ -2076,150 +2064,159 @@ void __fastcall scrollrt_draw_e_flag(BYTE *pBuff, int x, int y, int a4, int a5, void __fastcall DrawZoom(int x, int y) { - int v2; // edi - int v3; // ebx - int v4; // esi - int v5; // esi - int v6; // edi - int v7; // esi - int v8; // edi - int v9; // esi - int v10; // edi - _WORD *v11; // edi - char *v12; // esi - char *v13; // ebx - signed int v14; // edx - signed int v15; // ecx - short v16; // ax - int v17; // eax - signed int v18; // [esp+Ch] [ebp-10h] - signed int v19; // [esp+Ch] [ebp-10h] - signed int a5; // [esp+10h] [ebp-Ch] - int a5a; // [esp+10h] [ebp-Ch] - signed int a6; // [esp+14h] [ebp-8h] - signed int a6a; // [esp+14h] [ebp-8h] - int a6b; // [esp+14h] [ebp-8h] - int ya; // [esp+18h] [ebp-4h] - - v2 = ScrollInfo._sxoff + 64; - dword_5C2FF8 = 6; - dword_5C2FFC = 6; - v3 = x - 6; - ya = y - 1; - a5 = 6; - v4 = ScrollInfo._syoff + 143; + int i, sx, sy, chunks, blocks; + int wdt, nSrcOff, nDstOff; + scr_pix_width = 384; scr_pix_height = 192; - v18 = 3; - switch (ScrollInfo._sdir) { - case DIR_SW: - goto LABEL_3; - case DIR_W: - a5 = 7; - LABEL_3: - v4 = ScrollInfo._syoff + 111; - v3 = x - 7; - ya = y - 2; - goto LABEL_9; - case DIR_NW: - goto LABEL_7; - case DIR_N: - v18 = 4; - goto LABEL_7; - case DIR_NE: - goto LABEL_9; - case DIR_E: - v18 = 4; - goto LABEL_6; - case DIR_SE: - LABEL_6: - v2 = ScrollInfo._sxoff; - v3 = x - 7; - ya = y; - LABEL_7: - a5 = 7; + dword_5C2FF8 = 6; + dword_5C2FFC = 6; + + sx = ScrollInfo._sxoff + 64; + sy = ScrollInfo._syoff + 143; + x -= 6; + y--; + chunks = 6; + blocks = 3; + + switch(ScrollInfo._sdir) { + case 0: + break; + case 2: + chunks++; + case 1: + sy -= 32; + x--; + y--; + blocks++; + break; + case 4: + blocks++; + case 3: + chunks++; break; - case DIR_OMNI: - v2 = ScrollInfo._sxoff; - v4 = ScrollInfo._syoff + 111; - a5 = 7; - v3 = x - 8; - LABEL_9: - v18 = 4; + case 5: + blocks++; break; - default: + case 6: + blocks++; + case 7: + sx -= 64; + x--; + y++; + chunks++; + break; + case 8: + sx -= 64; + sy -= 32; + x -= 2; + chunks++; + blocks++; break; } - a6 = 0; - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[143]; - do { - scrollrt_draw_upper(v3, ya++, v2, v4, a5, a6, 0); - v5 = v4 + 16; - v6 = v2 - 32; - scrollrt_draw_upper(v3++, ya, v6, v5, a5, a6, 1); - v2 = v6 + 32; - v4 = v5 + 16; - ++a6; - } while (a6 < 4); - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[320]; - if (v18 > 0) { - do { - scrollrt_draw_lower(v3, ya++, v2, v4, a5, 0); - v7 = v4 + 16; - v8 = v2 - 32; - scrollrt_draw_lower(v3++, ya, v8, v7, a5, 1); - v2 = v8 + 32; - v4 = v7 + 16; - --v18; - } while (v18); + + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[143]]; + for(i = 0; i < 4; i++) { + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[320]]; + for(i = 0; i < blocks; i++) { + scrollrt_draw_lower(x, y, sx, sy, chunks, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower(x, y, sx, sy, chunks, 1); + x++; + sx += 32; + sy += 16; } arch_draw_type = 0; - a6a = 0; - do { - scrollrt_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0); - v9 = v4 + 16; - v10 = v2 - 32; - scrollrt_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1); - v2 = v10 + 32; - v4 = v9 + 16; - ++a6a; - } while (a6a < 4); - if (chrflag || questlog) { - a6b = 392064; - goto LABEL_23; - } - if (invflag || sbookflag) { - a6b = 391744; - LABEL_23: - a5a = 245168; - v19 = 160; - goto LABEL_24; - } - a5a = 245088; - a6b = 391744; - v19 = 320; -LABEL_24: - v11 = (_WORD *)((char *)gpBuffer + a6b); - v12 = (char *)gpBuffer + a5a; - v13 = (char *)&gpBuffer[a6b + 768]; - v14 = 176; - do { - v15 = v19; - do { - _LOBYTE(v16) = *v12++; - _HIBYTE(v16) = v16; - *v11 = v16; - *(_WORD *)v13 = v16; - ++v11; - v13 += 2; - --v15; - } while (v15); - v12 += -v19 - 768; - v17 = 2 * (v19 + 768); - v13 -= v17; - v11 = (_WORD *)((char *)v11 - v17); - --v14; - } while (v14); + for(i = 0; i < 4; i++) { + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } + + if(chrflag || questlog) { + nSrcOff = SCREENXY(112, 159); + nDstOff = SCREENXY(320, 350); + wdt = 160; + } else if(invflag || sbookflag) { + nSrcOff = SCREENXY(112, 159); + nDstOff = SCREENXY(0, 350); + wdt = 160; + } else { + nSrcOff = SCREENXY(32, 159); + nDstOff = SCREENXY(0, 350); + wdt = 320; + } + + /// ASSERT: assert(gpBuffer); + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, gpBuffer + mov edx, nDstOff + mov edi, esi + mov ecx, nSrcOff + add edi, edx + add esi, ecx + mov ebx, edi + add ebx, 768 + mov edx, 176 + label1: + mov ecx, wdt + label2: + mov al, [esi] + inc esi + mov ah, al + mov [edi], ax + mov [ebx], ax + add edi, 2 + add ebx, 2 + dec ecx + jnz label2 + mov eax, 768 + add eax, wdt + sub esi, eax + add eax, eax + sub ebx, eax + sub edi, eax + dec edx + jnz label1 + } +#else + int hgt; + BYTE *src, *dst1, *dst2; + + src = &gpBuffer[nSrcOff]; + dst1 = &gpBuffer[nDstOff]; + dst2 = &gpBuffer[nDstOff + 768]; + + for(hgt = 176; hgt != 0; hgt--, src -= 768 + wdt, dst1 -= 2 * (768 + wdt), dst2 -= 2 * (768 + wdt)) { + for(i = wdt; i != 0; i--) { + *dst1++ = *src; + *dst1++ = *src; + *dst2++ = *src; + *dst2++ = *src; + src++; + } + } +#endif } // 4B8968: using guessed type int sbookflag; // 5C2FF8: using guessed type int dword_5C2FF8; diff --git a/Source/town.cpp b/Source/town.cpp index 4182e734f..a14d611df 100644 --- a/Source/town.cpp +++ b/Source/town.cpp @@ -167,116 +167,69 @@ void __fastcall town_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int } // 69CF14: using guessed type int level_cel_block; -void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int sy, int some_flag) +void __fastcall town_draw_clipped_town(BYTE *pBuff, int x, int y, int sx, int sy, int some_flag) { - unsigned int v6; // edx - int v7; // edi - char v8; // al - char v9; // al - int v10; // esi - int v11; // ebx - int v12; // esi - int v13; // ebx - int v14; // eax - int v15; // eax - int v16; // esi - int v17; // ebx - char v18; // al - int v19; // esi - int v20; // ebx - int v21; // edi - char v22; // al - char v23; // al - int v24; // esi - int v25; // ebx - int v26; // edi - char *v27; // [esp+Ch] [ebp-Ch] - int xa; // [esp+10h] [ebp-8h] - int v29; // [esp+14h] [ebp-4h] - - xa = x; - v6 = 112 * x; - v27 = (char *)gpBuffer + screen_y_times_768[sy] + sx; - v7 = v6 + y; - v29 = v6 + y; - v8 = dItem[v6 / 0x70][y]; - if (v8) { - v9 = v8 - 1; - v10 = v9; - v11 = sx - item[v10]._iAnimWidth2; - if (v9 == pcursitem) - CelDrawHdrClrHL( - ICOL_BLUE, - v11, - sy, - 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 */ - v13 = sx - towner[v12]._tAnimWidth2; - if (v12 == pcursmonst) - CelDrawHdrClrHL( - 166, - v13, - sy, - 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) { - v15 = v14 - 1; - v16 = v15; - v17 = sx - towner[v15]._tAnimWidth2; - if (v15 == pcursmonst) - CelDrawHdrClrHL( - 166, - v17, - sy, - 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); - v19 = v18; - v20 = sy + plr[v19]._pyoff; - v21 = sx + plr[v19]._pxoff - plr[v19]._pAnimWidth2; - if (v18 == pcursplr) - 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; - } - if (dFlags[0][v7] & DFLAG_DEAD_PLAYER) - DrawDeadPlayer(xa, y, sx, sy, 0, 8, 1); - v22 = dPlayer[0][v7]; - if (v22 > 0) { - v23 = v22 - 1; - v24 = v23; - v25 = sy + plr[v24]._pyoff; - v26 = sx + plr[v24]._pxoff - plr[v24]._pAnimWidth2; - if (v23 == pcursplr) - 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; - } - if (dFlags[0][v7] & DFLAG_MISSILE) - DrawClippedMissile(xa, y, sx, sy, 0, 8, FALSE); + int mi, px, py; + char bv; + + /// ASSERT: assert(gpBuffer); + + pBuff = &gpBuffer[sx + screen_y_times_768[sy]]; + + if(dItem[x][y] != 0) { + bv = dItem[x][y] - 1; + px = sx - item[bv]._iAnimWidth2; + if(bv == pcursitem) { + CelDrawHdrClrHL(181, px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8); + } + Cel2DrawHdrOnly(px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8); + } + if(dFlags[x][y] & 0x10) { + mi = -(dMonster[x][y - 1] + 1); + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDrawHdrClrHL(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8); + } + Cel2DrawHdrOnly(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8); + } + if(dMonster[x][y] > 0) { + mi = dMonster[x][y] - 1; + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDrawHdrClrHL(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8); + } + Cel2DrawHdrOnly(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8); + } + if(dFlags[x][y] & 0x20) { + bv = -(dPlayer[x][y - 1] + 1); + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeClrHL(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8); + } + Cl2DecodeFrm4(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8); + if(some_flag && plr[bv]._peflag) { + town_draw_clipped_e_flag(pBuff - 64, x - 1, y + 1, sx - 64, sy); + } + } + if(dFlags[x][y] & 4) { + DrawDeadPlayer(x, y, sx, sy, 0, 8, 1); + } + if(dPlayer[x][y] > 0) { + bv = dPlayer[x][y] - 1; + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeClrHL(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8); + } + Cl2DecodeFrm4(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8); + if(some_flag && plr[bv]._peflag) { + town_draw_clipped_e_flag(pBuff - 64, x - 1, y + 1, sx - 64, sy); + } + } + if(dFlags[x][y] & 1) { + DrawClippedMissile(x, y, sx, sy, 0, 8, 0); + } } // 4B8CC0: using guessed type char pcursitem; // 4B8CC2: using guessed type char pcursplr; @@ -396,121 +349,70 @@ void __fastcall town_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int a4, in } if(a5 < 8) { - town_draw_clipped_town_2((int)pBuff, x, y, a4, a5, sx, sy, 0); + town_draw_clipped_town_2(pBuff, x, y, a4, a5, sx, sy, 0); } } // 69CF14: using guessed type int level_cel_block; -void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, int sx, int sy, int some_flag) +void __fastcall town_draw_clipped_town_2(BYTE *pBuff, int x, int y, int a4, int a5, int sx, int sy, int some_flag) { - unsigned int v8; // edx - int v9; // ebx - char v10; // al - char v11; // al - int v12; // esi - int v13; // edi - int v14; // esi - int v15; // edi - int v16; // eax - int v17; // eax - int v18; // esi - int v19; // edi - char v20; // al - int v21; // esi - int v22; // ebx - int v23; // edi - char v24; // al - char v25; // al - int v26; // esi - int v27; // ebx - int v28; // edi - int v29; // [esp+Ch] [ebp-Ch] - int xa; // [esp+10h] [ebp-8h] - int v31; // [esp+14h] [ebp-4h] - - xa = y; - v8 = 112 * y; - v9 = v8 + a3; - v29 = x; - v31 = v8 + a3; - v10 = dItem[v8 / 0x70][a3]; - if (v10) { - v11 = v10 - 1; - v12 = v11; - v13 = sx - item[v12]._iAnimWidth2; - if (v11 == pcursitem) - CelDrawHdrClrHL( - ICOL_BLUE, - v13, - sy, - 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[y][a3 - 1]; // -1 - *(&dword_52D204 + v9); /* check */ - v15 = sx - towner[v14]._tAnimWidth2; - if (v14 == pcursmonst) - CelDrawHdrClrHL( - 166, - v15, - sy, - 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) { - v17 = v16 - 1; - v18 = v17; - v19 = sx - towner[v17]._tAnimWidth2; - if (v17 == pcursmonst) - CelDrawHdrClrHL( - 166, - v19, - sy, - 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[y][a3 - 1]; // -1 - *((_BYTE *)&themeLoc[49].height + v9 + 3); - v21 = v20; - v22 = sy + plr[v21]._pyoff; - v23 = sx + plr[v21]._pxoff - plr[v21]._pAnimWidth2; - if (v20 == pcursplr) - 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; - } - if (dFlags[0][v9] & DFLAG_DEAD_PLAYER) - DrawDeadPlayer(xa, a3, sx, sy, a5, 8, 1); - v24 = dPlayer[0][v9]; - if (v24 > 0) { - v25 = v24 - 1; - v26 = v25; - v27 = sy + plr[v26]._pyoff; - v28 = sx + plr[v26]._pxoff - plr[v26]._pAnimWidth2; - if (v25 == pcursplr) - 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; - } - if (dFlags[0][v9] & DFLAG_MISSILE) - DrawClippedMissile(xa, a3, sx, sy, a5, 8, FALSE); + int mi, px, py; + char bv; + + if(dItem[x][y] != 0) { + bv = dItem[x][y] - 1; + px = sx - item[bv]._iAnimWidth2; + if(bv == pcursitem) { + CelDrawHdrClrHL(181, px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, a5, 8); + } + Cel2DrawHdrOnly(px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, a5, 8); + } + if(dFlags[x][y] & 0x10) { + mi = -(dMonster[x][y - 1] + 1); + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDrawHdrClrHL(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, a5, 8); + } + Cel2DrawHdrOnly(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, a5, 8); + } + if(dMonster[x][y] > 0) { + mi = dMonster[x][y] - 1; + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDrawHdrClrHL(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, a5, 8); + } + Cel2DrawHdrOnly(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, a5, 8); + } + if(dFlags[x][y] & 0x20) { + bv = -(dPlayer[x][y - 1] + 1); + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeClrHL(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, a5, 8); + } + Cl2DecodeFrm4(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, a5, 8); + if(some_flag && plr[bv]._peflag) { + town_draw_clipped_e_flag_2(pBuff - 64, x - 1, y + 1, a4, a5, sx - 64, sy); + } + } + if(dFlags[x][y] & 4) { + DrawDeadPlayer(x, y, sx, sy, a5, 8, 1); + } + if(dPlayer[x][y] > 0) { + bv = dPlayer[x][y] - 1; + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeClrHL(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, a5, 8); + } + Cl2DecodeFrm4(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, a5, 8); + if(some_flag && plr[bv]._peflag) { + town_draw_clipped_e_flag_2(pBuff - 64, x - 1, y + 1, a4, a5, sx - 64, sy); + } + } + if(dFlags[x][y] & 1) { + DrawClippedMissile(x, y, sx, sy, a5, 8, 0); + } } // 4B8CC0: using guessed type char pcursitem; // 4B8CC2: using guessed type char pcursplr; @@ -541,7 +443,7 @@ void __fastcall town_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, dst -= 768 * 32; } if(dir < 8) { - town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0); + town_draw_clipped_town_2(&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0); } } else { town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]); @@ -574,7 +476,7 @@ void __fastcall town_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, dst -= 768 * 32; } if(dir < 8) { - town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy] - 768 * 16 * dir], x, y, a6, dir, sx, sy, 1); + town_draw_clipped_town_2(&gpBuffer[sx + screen_y_times_768[sy] - 768 * 16 * dir], x, y, a6, dir, sx, sy, 1); } } else { town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]); @@ -603,7 +505,7 @@ void __fastcall town_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, dst -= 768 * 32; } if(dir < 8) { - town_draw_clipped_town_2((int)&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0); + town_draw_clipped_town_2(&gpBuffer[sx + screen_y_times_768[sy]], x, y, a6, dir, sx, sy, 0); } } else { town_clear_low_buf(&gpBuffer[sx + screen_y_times_768[sy]]); @@ -642,57 +544,70 @@ void __fastcall town_draw_e_flag(BYTE *pBuff, int x, int y, int a4, int dir, int } // 69CF14: using guessed type int level_cel_block; -void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, int sx, int sy, int some_flag) +void __fastcall town_draw_town_all(BYTE *pBuff, int x, int y, int a4, int dir, int sx, int sy, int some_flag) { - char ii, pnum; - int mi; - int xx, yy; - - if (dItem[x][y]) { - ii = dItem[x][y] - 1; - xx = sx - item[ii]._iAnimWidth2; - if (ii == pcursitem) - CelDecodeClr(ICOL_BLUE, xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir); - CelDrawHdrOnly(xx, sy, item[ii]._iAnimData, item[ii]._iAnimFrame, item[ii]._iAnimWidth, 0, dir); - } - if (dFlags[x][y] & DFLAG_MONSTER) { - mi = -1 - dMonster[x][y - 1]; - xx = sx - towner[mi]._tAnimWidth2; - if (mi == pcursmonst) - CelDecodeClr(PAL16_BEIGE + 6, xx, sy, 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) { + int mi, px, py; + char bv; + + if(dItem[x][y] != 0) { + bv = dItem[x][y] - 1; + px = sx - item[bv]._iAnimWidth2; + if(bv == pcursitem) { + CelDecodeClr(181, px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, dir); + } + /// ASSERT: assert(item[bv]._iAnimData); + CelDrawHdrOnly(px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, dir); + } + if(dFlags[x][y] & 0x10) { + mi = -(dMonster[x][y - 1] + 1); + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDecodeClr(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); + } + /// ASSERT: assert(towner[mi]._tAnimData); + CelDrawHdrOnly(px, 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, 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]; - yy = sy + plr[pnum]._pyoff; - xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2; - if (pnum == pcursplr) - 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); - } - if (dFlags[x][y] & DFLAG_DEAD_PLAYER) + px = sx - towner[mi]._tAnimWidth2; + if(mi == pcursmonst) { + CelDecodeClr(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); + } + /// ASSERT: assert(towner[mi]._tAnimData); + CelDrawHdrOnly(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, dir); + } + if(dFlags[x][y] & 0x20) { + bv = -(dPlayer[x][y - 1] + 1); + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeFrm2(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, dir); + } + /// ASSERT: assert(plr[bv]._pAnimData); + Cl2DecodeFrm1(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, dir); + if(some_flag && plr[bv]._peflag) { + town_draw_e_flag(pBuff - 64, x - 1, y + 1, a4, dir, sx - 64, sy); + } + } + if(dFlags[x][y] & 4) { DrawDeadPlayer(x, y, sx, sy, 0, dir, 0); - if (dPlayer[x][y] > 0) { - pnum = dPlayer[x][y] - 1; - yy = sy + plr[pnum]._pyoff; - xx = sx + plr[pnum]._pxoff - plr[pnum]._pAnimWidth2; - if (pnum == pcursplr) - 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); - } - if (dFlags[x][y] & DFLAG_MISSILE) - DrawMissile(x, y, sx, sy, 0, dir, FALSE); + } + if(dPlayer[x][y] > 0) { + bv = dPlayer[x][y] - 1; + px = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2; + py = sy + plr[bv]._pyoff; + if(bv == pcursplr) { + Cl2DecodeFrm2(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, dir); + } + /// ASSERT: assert(plr[bv]._pAnimData); + Cl2DecodeFrm1(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, dir); + if(some_flag && plr[bv]._peflag) { + town_draw_e_flag(pBuff - 64, x - 1, y + 1, a4, dir, sx - 64, sy); + } + } + if(dFlags[x][y] & 1) { + DrawMissile(x, y, sx, sy, 0, dir, 0); + } } // 4B8CC0: using guessed type char pcursitem; // 4B8CC2: using guessed type char pcursplr; @@ -796,117 +711,115 @@ void __fastcall town_draw_upper(int x, int y, int sx, int sy, int a5, int a6, in void __fastcall T_DrawGame(int x, int y) { - int v2; // esi - int v3; // edi - int v4; // ebx - int v5; // ebx - int v6; // esi - int v7; // ebx - int v8; // esi - int v9; // ebx - int v10; // esi - signed int v11; // [esp+Ch] [ebp-10h] - signed int a6; // [esp+10h] [ebp-Ch] - signed int a6a; // [esp+10h] [ebp-Ch] - signed int a5; // [esp+14h] [ebp-8h] - int ya; // [esp+18h] [ebp-4h] - - v2 = ScrollInfo._sxoff + 64; - v3 = x - 10; - ya = y - 1; - v4 = ScrollInfo._syoff + 175; - dword_5C2FF8 = 10; - a5 = 10; + int i, sx, sy, chunks, blocks; + scr_pix_width = 640; scr_pix_height = 352; + dword_5C2FF8 = 10; dword_5C2FFC = 11; - v11 = 5; - if (chrflag || questlog) { - ya = y - 3; - v3 += 2; - v2 = ScrollInfo._sxoff + 352; - a5 = 6; - } - if (invflag || sbookflag) { - ya -= 2; - v3 += 2; - v2 -= 32; - a5 = 6; - } - switch (ScrollInfo._sdir) { - case DIR_SW: - v4 = ScrollInfo._syoff + 143; - --v3; - --ya; - goto LABEL_15; - case DIR_W: - v4 = ScrollInfo._syoff + 143; - --v3; - --ya; - goto LABEL_14; - case DIR_NW: - goto LABEL_12; - case DIR_N: - goto LABEL_14; - case DIR_NE: - goto LABEL_15; - case DIR_E: - v2 -= 64; - --v3; - ++ya; - goto LABEL_14; - case DIR_SE: - v2 -= 64; - --v3; - ++ya; - LABEL_12: - ++a5; + + sx = ScrollInfo._sxoff + 64; + sy = ScrollInfo._syoff + 175; + x -= 10; + y--; + chunks = 10; + blocks = 5; + + if(chrflag || questlog) { + x += 2; + y -= 2; + sx += 288; + chunks = 6; + } + if(invflag || sbookflag) { + x += 2; + y -= 2; + sx -= 32; + chunks = 6; + } + + switch(ScrollInfo._sdir) { + case 0: + break; + case 1: + sy -= 32; + x--; + y--; + blocks++; + break; + case 2: + sy -= 32; + x--; + y--; + chunks++; + blocks++; + break; + case 3: + chunks++; + break; + case 4: + chunks++; + blocks++; + break; + case 5: + blocks++; break; - case DIR_OMNI: - v2 -= 64; - v4 = ScrollInfo._syoff + 143; - v3 -= 2; - LABEL_14: - ++a5; - LABEL_15: - v11 = 6; + case 6: + sx -= 64; + x--; + y++; + chunks++; + blocks++; break; - default: + case 7: + sx -= 64; + x--; + y++; + chunks++; + break; + case 8: + sx -= 64; + sy -= 32; + x -= 2; + chunks++; + blocks++; break; } - a6 = 0; - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[160]; - do { - town_draw_upper(v3, ya++, v2, v4, a5, a6, 0); - v5 = v4 + 16; - v6 = v2 - 32; - town_draw_upper(v3++, ya, v6, v5, a5, a6, 1); - v2 = v6 + 32; - v4 = v5 + 16; - ++a6; - } while (a6 < 7); - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[512]; - if (v11 > 0) { - do { - town_draw_lower(v3, ya++, v2, v4, a5, 0); - v7 = v4 + 16; - v8 = v2 - 32; - town_draw_lower(v3++, ya, v8, v7, a5, 1); - v2 = v8 + 32; - v4 = v7 + 16; - --v11; - } while (v11); - } - a6a = 0; - do { - town_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0); - v9 = v4 + 16; - v10 = v2 - 32; - town_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1); - v2 = v10 + 32; - v4 = v9 + 16; - ++a6a; - } while (a6a < 7); + + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[160]]; + for(i = 0; i < 7; i++) { + town_draw_upper(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + town_draw_upper(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[512]]; + for(i = 0; i < blocks; i++) { + town_draw_lower(x, y, sx, sy, chunks, 0); + y++; + sx -= 32; + sy += 16; + town_draw_lower(x, y, sx, sy, chunks, 1); + x++; + sx += 32; + sy += 16; + } + for(i = 0; i < 7; i++) { + town_draw_lower_2(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + town_draw_lower_2(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } } // 4B8968: using guessed type int sbookflag; // 5C2FF8: using guessed type int dword_5C2FF8; @@ -918,151 +831,170 @@ void __fastcall T_DrawGame(int x, int y) void __fastcall T_DrawZoom(int x, int y) { - int v2; // edi - int v3; // ebx - int v4; // esi - int v5; // esi - int v6; // edi - int v7; // esi - int v8; // edi - int v9; // esi - int v10; // edi - _WORD *v11; // edi - char *v12; // esi - char *v13; // ebx - signed int v14; // edx - signed int v15; // ecx - short v16; // ax - int v17; // eax - signed int v18; // [esp+Ch] [ebp-10h] - signed int v19; // [esp+Ch] [ebp-10h] - signed int a6; // [esp+10h] [ebp-Ch] - signed int a6a; // [esp+10h] [ebp-Ch] - int a6b; // [esp+10h] [ebp-Ch] - signed int a5; // [esp+14h] [ebp-8h] - int a5a; // [esp+14h] [ebp-8h] - int ya; // [esp+18h] [ebp-4h] - - v18 = 0; - v2 = ScrollInfo._sxoff + 64; - dword_5C2FF8 = 6; - dword_5C2FFC = 6; - v3 = x - 6; - a5 = 6; - v4 = ScrollInfo._syoff + 143; - ya = y - 1; + int i, sx, sy, chunks, blocks; + int wdt, nSrcOff, nDstOff; + scr_pix_width = 384; scr_pix_height = 192; - switch (ScrollInfo._sdir) { - case DIR_SW: - v4 = ScrollInfo._syoff + 111; - v3 = x - 7; - ya = y - 2; - goto LABEL_9; - case DIR_W: - v4 = ScrollInfo._syoff + 111; - v3 = x - 7; - ya = y - 2; - goto LABEL_8; - case DIR_NW: - goto LABEL_6; - case DIR_N: - goto LABEL_8; - case DIR_NE: - goto LABEL_9; - case DIR_E: - v2 = ScrollInfo._sxoff; - v3 = x - 7; - ya = y; - goto LABEL_8; - case DIR_SE: - v2 = ScrollInfo._sxoff; - v3 = x - 7; - ya = y; - LABEL_6: - a5 = 7; + dword_5C2FF8 = 6; + dword_5C2FFC = 6; + + sx = ScrollInfo._sxoff + 64; + sy = ScrollInfo._syoff + 143; + x -= 6; + y--; + chunks = 6; + blocks = 0; + + switch(ScrollInfo._sdir) { + case 0: + break; + case 1: + sy -= 32; + x--; + y--; + blocks++; + break; + case 2: + sy -= 32; + x--; + y--; + chunks++; + blocks++; + break; + case 3: + chunks++; + break; + case 4: + chunks++; + blocks++; break; - case DIR_OMNI: - v2 = ScrollInfo._sxoff; - v4 = ScrollInfo._syoff + 111; - v3 = x - 8; - LABEL_8: - a5 = 7; - LABEL_9: - v18 = 1; + case 5: + blocks++; break; - default: + case 6: + sx -= 64; + x--; + y++; + chunks++; + blocks++; break; + case 7: + sx -= 64; + x--; + y++; + chunks++; + break; + case 8: + sx -= 64; + sy -= 32; + x -= 2; + chunks++; + blocks++; + break; + } + + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[143]]; + for(i = 0; i < 7; i++) { + town_draw_upper(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + town_draw_upper(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; } - a6 = 0; - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[143]; - do { - town_draw_upper(v3, ya++, v2, v4, a5, a6, 0); - v5 = v4 + 16; - v6 = v2 - 32; - town_draw_upper(v3++, ya, v6, v5, a5, a6, 1); - v2 = v6 + 32; - v4 = v5 + 16; - ++a6; - } while (a6 < 7); - gpBufEnd = (unsigned char *)gpBuffer + screen_y_times_768[320]; - if (v18 > 0) { - do { - town_draw_lower(v3, ya++, v2, v4, a5, 0); - v7 = v4 + 16; - v8 = v2 - 32; - town_draw_lower(v3++, ya, v8, v7, a5, 1); - v2 = v8 + 32; - v4 = v7 + 16; - --v18; - } while (v18); - } - a6a = 0; - do { - town_draw_lower_2(v3, ya++, v2, v4, a5, a6a, 0); - v9 = v4 + 16; - v10 = v2 - 32; - town_draw_lower_2(v3++, ya, v10, v9, a5, a6a, 1); - v2 = v10 + 32; - v4 = v9 + 16; - ++a6a; - } while (a6a < 7); - if (chrflag || questlog) { - a5a = 392064; - goto LABEL_23; - } - if (invflag || sbookflag) { - a5a = 391744; - LABEL_23: - a6b = 245168; - v19 = 160; - goto LABEL_24; - } - a6b = 245088; - a5a = 391744; - v19 = 320; -LABEL_24: - v11 = (_WORD *)((char *)gpBuffer + a5a); - v12 = (char *)gpBuffer + a6b; - v13 = (char *)&gpBuffer[a5a + 768]; - v14 = 176; - do { - v15 = v19; - do { - _LOBYTE(v16) = *v12++; - _HIBYTE(v16) = v16; - *v11 = v16; - *(_WORD *)v13 = v16; - ++v11; - v13 += 2; - --v15; - } while (v15); - v12 += -v19 - 768; - v17 = 2 * (v19 + 768); - v13 -= v17; - v11 = (_WORD *)((char *)v11 - v17); - --v14; - } while (v14); + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[screen_y_times_768[320]]; + for(i = 0; i < blocks; i++) { + town_draw_lower(x, y, sx, sy, chunks, 0); + y++; + sx -= 32; + sy += 16; + town_draw_lower(x, y, sx, sy, chunks, 1); + x++; + sx += 32; + sy += 16; + } + for(i = 0; i < 7; i++) { + town_draw_lower_2(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + town_draw_lower_2(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; + } + + if(chrflag || questlog) { + nSrcOff = SCREENXY(112, 159); + nDstOff = SCREENXY(320, 350); + wdt = 160; + } else if(invflag || sbookflag) { + nSrcOff = SCREENXY(112, 159); + nDstOff = SCREENXY(0, 350); + wdt = 160; + } else { + nSrcOff = SCREENXY(32, 159); + nDstOff = SCREENXY(0, 350); + wdt = 320; + } + + /// ASSERT: assert(gpBuffer); + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, gpBuffer + mov edx, nDstOff + mov edi, esi + mov ecx, nSrcOff + add edi, edx + add esi, ecx + mov ebx, edi + add ebx, 768 + mov edx, 176 + label1: + mov ecx, wdt + label2: + mov al, [esi] + inc esi + mov ah, al + mov [edi], ax + mov [ebx], ax + add edi, 2 + add ebx, 2 + dec ecx + jnz label2 + mov eax, 768 + add eax, wdt + sub esi, eax + add eax, eax + sub ebx, eax + sub edi, eax + dec edx + jnz label1 + } +#else + int hgt; + BYTE *src, *dst1, *dst2; + + src = &gpBuffer[nSrcOff]; + dst1 = &gpBuffer[nDstOff]; + dst2 = &gpBuffer[nDstOff + 768]; + + for(hgt = 176; hgt != 0; hgt--, src -= 768 + wdt, dst1 -= 2 * (768 + wdt), dst2 -= 2 * (768 + wdt)) { + for(i = wdt; i != 0; i--) { + *dst1++ = *src; + *dst1++ = *src; + *dst2++ = *src; + *dst2++ = *src; + src++; + } + } +#endif } // 4B8968: using guessed type int sbookflag; // 5C2FF8: using guessed type int dword_5C2FF8; diff --git a/Source/town.h b/Source/town.h index 4425d5ca2..fb4f268be 100644 --- a/Source/town.h +++ b/Source/town.h @@ -5,13 +5,13 @@ void __fastcall town_clear_upper_buf(BYTE *pBuff); void __fastcall town_clear_low_buf(BYTE *pBuff); void __fastcall town_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy); -void __fastcall town_draw_clipped_town(BYTE *buffer, int x, int y, int sx, int sy, int some_flag); +void __fastcall town_draw_clipped_town(BYTE *pBuff, int x, int y, int sx, int sy, int some_flag); void __fastcall town_draw_lower(int x, int y, int sx, int sy, int a5, int some_flag); void __fastcall town_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int a4, int a5, int sx, int sy); -void __fastcall town_draw_clipped_town_2(int x, int y, int a3, int a4, int a5, int sx, int sy, int some_flag); +void __fastcall town_draw_clipped_town_2(BYTE *pBuff, int x, int y, int a4, int a5, int sx, int sy, int some_flag); void __fastcall town_draw_lower_2(int x, int y, int sx, int sy, int a5, int a6, int some_flag); void __fastcall town_draw_e_flag(BYTE *pBuff, int x, int y, int a4, int dir, int sx, int sy); -void __fastcall town_draw_town_all(BYTE *buffer, int x, int y, int a4, int dir, int sx, int sy, int some_flag); +void __fastcall town_draw_town_all(BYTE *pBuff, int x, int y, int a4, int dir, int sx, int sy, int some_flag); void __fastcall town_draw_upper(int x, int y, int sx, int sy, int a5, int a6, int some_flag); void __fastcall T_DrawGame(int x, int y); void __fastcall T_DrawZoom(int x, int y);