You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5249 lines
120 KiB

#include "diablo.h"
#include "_asm.cpp"
int WorldBoolFlag = 0;
unsigned int gdwCurrentMask = 0;
// char world_4B3264 = 0;
unsigned char *gpCelFrame = NULL;
unsigned int *gpDrawMask = NULL;
// char world_4B326D[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned int RightMask[32] = {
7 years ago
0xEAAAAAAA, 0xF5555555,
0xFEAAAAAA, 0xFF555555,
0xFFEAAAAA, 0xFFF55555,
0xFFFEAAAA, 0xFFFF5555,
0xFFFFEAAA, 0xFFFFF555,
0xFFFFFEAA, 0xFFFFFF55,
0xFFFFFFEA, 0xFFFFFFF5,
0xFFFFFFFE, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF
};
unsigned int LeftMask[32] = {
7 years ago
0xAAAAAAAB, 0x5555555F,
0xAAAAAABF, 0x555555FF,
0xAAAAABFF, 0x55555FFF,
0xAAAABFFF, 0x5555FFFF,
0xAAABFFFF, 0x555FFFFF,
0xAABFFFFF, 0x55FFFFFF,
0xABFFFFFF, 0x5FFFFFFF,
0xBFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF
};
unsigned int WallMask[32] = {
7 years ago
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555,
0xAAAAAAAA, 0x55555555
};
int WorldTbl3x16[48] = {
0, 0, 0,
4, 4, 4,
8, 8, 8,
12, 12, 12,
16, 16, 16,
20, 20, 20,
24, 24, 24,
28, 28, 28,
32, 32, 32,
36, 36, 36,
40, 40, 40,
44, 44, 44,
48, 48, 48,
52, 52, 52,
56, 56, 56,
60, 60, 60
};
8 years ago
// slope/angle tables, left and right
int WorldTbl17_1[17] = { 0, 4, 8, 16, 24, 36, 48, 64, 80, 100, 120, 144, 168, 196, 224, 256, 288 };
int WorldTbl17_2[17] = { 0, 32, 60, 88, 112, 136, 156, 176, 192, 208, 220, 232, 240, 248, 252, 256, 288 };
/*
32x32 arch types
add 8 if light index is 0
|-| 0x8 (0)
|-|
/\ 0x9 (1)
\/
/| 0xA (2)
\|
|\ 0xB (3)
|/
|-| 0xC (4)
\|
|-| 0xD (5)
|/
*/
#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)
#include "_render.cpp"
#else
void drawTopArchesUpperScreen(BYTE *pBuff)
{
unsigned char *dst; // edi MAPDST
unsigned char *tbl; // ebx
unsigned char *src; // esi MAPDST
short cel_type_16; // ax MAPDST
signed int xx_32; // ebp MAPDST
signed int yy_32; // edx MAPDST
unsigned int width; // eax MAPDST
unsigned int chk_sh_and; // ecx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
unsigned int x_minus; // ecx MAPDST
unsigned int y_minus; // ecx MAPDST
signed int i; // edx MAPDST
signed int j; // ecx MAPDST
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
if (!(_BYTE)light_table_index) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((level_cel_block >> 12) & 7) + 8;
goto LABEL_11;
}
if ((_BYTE)light_table_index != lightmax) {
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
switch (cel_type_16) {
case 0: // upper (top transparent), with lighting
i = 16;
do {
if (dst < gpBufEnd)
break;
asm_trans_light_square_1_3(8, tbl, &dst, &src);
dst -= 800;
if (dst < gpBufEnd)
break;
asm_trans_light_square_0_2(8, tbl, &dst, &src);
dst -= 800;
--i;
} while (i);
break;
case 1: // upper (top transparent), with lighting
WorldBoolFlag = (unsigned char)pBuff & 1;
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_67;
}
if (dst < gpBufEnd)
return;
if (((unsigned char)dst & 1) == WorldBoolFlag) {
asm_trans_light_cel_0_2(width, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(width, tbl, &dst, &src);
}
yy_32 -= width;
} while (yy_32);
LABEL_67:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // upper (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 3: // upper (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 4: // upper (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
i = 8;
do {
if (dst < gpBufEnd)
break;
asm_trans_light_square_1_3(8, tbl, &dst, &src);
dst -= 800;
if (dst < gpBufEnd)
break;
asm_trans_light_square_0_2(8, tbl, &dst, &src);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
default: // upper (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
i = 8;
do {
if (dst < gpBufEnd)
break;
asm_trans_light_square_1_3(8, tbl, &dst, &src);
dst -= 800;
if (dst < gpBufEnd)
break;
asm_trans_light_square_0_2(8, tbl, &dst, &src);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
}
return;
}
src = (unsigned char *)pSpeedCels
+ *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
LABEL_11:
switch (cel_type_16) {
case 8: // upper (top transparent), without lighting
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
case 9: // upper (top transparent), without lighting
WorldBoolFlag = (unsigned char)pBuff & 1;
yy_32 = 32;
LABEL_251:
xx_32 = 32;
while (1) {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
xx_32 -= width;
if (!xx_32) {
LABEL_271:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
if (!--yy_32)
return;
goto LABEL_251;
}
}
xx_32 -= width;
if (dst < gpBufEnd)
return;
if (((unsigned char)dst & 1) == WorldBoolFlag) {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_258;
++src;
++dst;
if (chk_sh_and) {
LABEL_265:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[0] = src[0];
src += 2;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_268;
}
} else {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_265;
*dst++ = *src++;
if (chk_sh_and) {
LABEL_258:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[1] = src[1];
src += 2;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_268;
}
}
LABEL_268:
if (!xx_32)
goto LABEL_271;
}
break;
case 10: // upper (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 11: // upper (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if (x_minus & 2) {
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if (x_minus & 2) {
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if (x_minus & 2) /// BUGFIX: change to `y_minus & 2`
{
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if (x_minus & 2) /// BUGFIX: change to `y_minus & 2`
{
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 12: // upper (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
i = 8;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
default: // upper (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
while (dst >= gpBufEnd) {
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
i = 8;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
}
return;
}
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // upper (top transparent), black
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
case 1: // upper (top transparent), black
WorldBoolFlag = (unsigned char)pBuff & 1;
xx_32 = 32;
while (1) {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) != 0)
break;
yy_32 -= width;
if (dst < gpBufEnd)
return;
src += width;
if (((unsigned char)dst & 1) == WorldBoolFlag) {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_378;
++dst;
if (chk_sh_and) {
LABEL_385:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_388;
}
} else {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_385;
*dst++ = 0;
if (chk_sh_and) {
LABEL_378:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_388;
}
}
LABEL_388:
if (!yy_32)
goto LABEL_391;
}
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
} while (yy_32);
LABEL_391:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
if (!--xx_32)
return;
}
case 2: // upper (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd)
return;
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
if (!xx_32)
break;
}
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
break;
case 3: // upper (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd)
return;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
if (!xx_32)
break;
dst += xx_32;
}
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
break;
case 4: // upper (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd)
return;
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
if (!xx_32)
break;
}
i = 8;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
default: // upper (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd)
return;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
if (!xx_32)
break;
dst += xx_32;
}
i = 8;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
if (dst < gpBufEnd)
break;
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
}
}
void drawBottomArchesUpperScreen(BYTE *pBuff, unsigned int *pMask)
{
unsigned char *dst; // edi MAPDST
unsigned char *src; // esi MAPDST
short cel_type_16; // ax MAPDST
int xx_32; // edx MAPDST
unsigned int left_shift; // edx MAPDST
int yy_32; // edx MAPDST
int width; // eax MAPDST
int and80_i; // ecx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
signed int i; // ecx MAPDST
unsigned char *tbl;
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
gpDrawMask = pMask;
if (!(_BYTE)light_table_index) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((level_cel_block >> 12) & 7) + 8;
LABEL_12:
switch (cel_type_16) {
case 8: // upper (bottom transparent), without lighting
xx_32 = 32;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 9: // upper (bottom transparent), without lighting
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
if (!yy_32)
goto LABEL_129;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
left_shift = gdwCurrentMask;
and80_i = width;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--and80_i;
} while (and80_i);
gdwCurrentMask = left_shift;
} while (yy_32);
LABEL_129:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 10: // upper (bottom transparent), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 11: // upper (bottom transparent), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
for (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 12: // upper (bottom transparent), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
}
break;
default: // upper (bottom transparent), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
src += (unsigned char)src & 2;
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
}
break;
}
return;
}
if ((_BYTE)light_table_index != lightmax) {
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
switch (cel_type_16) {
case 0: // upper (bottom transparent), with lighting
xx_32 = 32;
do {
if (dst < gpBufEnd)
break;
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 1: // upper (bottom transparent), with lighting
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
if (!yy_32)
goto LABEL_50;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
gdwCurrentMask = asm_trans_light_mask(width, tbl, &dst, &src, gdwCurrentMask);
} while (yy_32);
LABEL_50:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 2: // upper (bottom transparent), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 3: // upper (bottom transparent), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 4: // upper (bottom transparent), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
src += (unsigned char)src & 2;
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
}
break;
default: // upper (bottom transparent), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
src += (unsigned char)src & 2;
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
}
break;
}
return;
}
src = (unsigned char *)pSpeedCels
+ *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
goto LABEL_12;
}
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // upper (bottom transparent), black
xx_32 = 32;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 1: // upper (bottom transparent), black
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
if (!yy_32)
goto LABEL_208;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
left_shift = gdwCurrentMask;
and80_i = width;
src += width;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--and80_i;
} while (and80_i);
gdwCurrentMask = left_shift;
} while (yy_32);
LABEL_208:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 2: // upper (bottom transparent), black
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
xx_32 -= 2;
}
break;
case 3: // upper (bottom transparent), black
xx_32 = 30;
while (dst >= gpBufEnd) {
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
dst += xx_32;
xx_32 -= 2;
}
break;
case 4: // upper (bottom transparent), black
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
xx_32 -= 2;
}
break;
default: // upper (bottom transparent), black
xx_32 = 30;
while (dst >= gpBufEnd) {
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
dst += xx_32;
xx_32 -= 2;
}
break;
}
}
void drawUpperScreen(BYTE *pBuff)
{
unsigned char *dst; // edi MAPDST
unsigned char *tbl; // ebx
unsigned char *src; // esi MAPDST
short cel_type_16; // ax MAPDST
signed int xx_32; // ebp MAPDST
signed int yy_32; // edx MAPDST
unsigned int width; // eax MAPDST
unsigned int chk_sh_and; // ecx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
signed int i; // edx MAPDST
signed int j; // ecx MAPDST
if (cel_transparency_active) {
if (!arch_draw_type) {
drawTopArchesUpperScreen(pBuff);
return;
}
if (arch_draw_type == 1) {
if (block_lvid[level_piece_id] == 1 || block_lvid[level_piece_id] == 3) {
drawBottomArchesUpperScreen(pBuff, &LeftMask[31]);
return;
}
}
if (arch_draw_type == 2) {
if (block_lvid[level_piece_id] == 2 || block_lvid[level_piece_id] == 3) {
drawBottomArchesUpperScreen(pBuff, &RightMask[31]);
return;
}
}
}
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
if (!(_BYTE)light_table_index) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((level_cel_block >> 12) & 7) + 8;
LABEL_22:
switch (cel_type_16) {
case 8: // upper (solid), without lighting
i = 32;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
case 9: // upper (solid), without lighting
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = *src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_133;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
chk_sh_and = width >> 1;
if (width & 1) {
*dst++ = *src++;
if (!chk_sh_and)
continue;
}
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
*(_WORD *)dst = *(_WORD *)src;
src += 2;
dst += 2;
if (!n_draw_shift)
continue;
}
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
} while (yy_32);
LABEL_133:
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 10: // upper (solid), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 11: // upper (solid), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
for (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 12: // upper (solid), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
default: // upper (solid), without lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
}
break;
}
return;
}
if ((_BYTE)light_table_index != lightmax) {
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned short)level_cel_block >> 12;
switch (cel_type_16) {
case 0: // upper (solid), with lighting
xx_32 = 32;
do {
if (dst < gpBufEnd)
break;
asm_cel_light_square(8, tbl, &dst, &src);
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 1: // upper (solid), with lighting
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = *src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_58;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
asm_cel_light_edge(width, tbl, &dst, &src);
} while (yy_32);
LABEL_58:
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // upper (solid), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 3: // upper (solid), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
}
break;
case 4: // upper (solid), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
asm_cel_light_square(8, tbl, &dst, &src);
dst -= 800;
--yy_32;
} while (yy_32);
return;
}
}
break;
default: // upper (solid), with lighting
xx_32 = 30;
while (dst >= gpBufEnd) {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
if (xx_32 < 0) {
yy_32 = 16;
do {
if (dst < gpBufEnd)
break;
asm_cel_light_square(8, tbl, &dst, &src);
dst -= 800;
--yy_32;
} while (yy_32);
return;
}
}
break;
}
return;
}
src = (unsigned char *)pSpeedCels
+ *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned short)level_cel_block >> 12;
goto LABEL_22;
}
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((unsigned int)level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // upper (solid), black
i = 32;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
break;
case 1: // upper (solid), black
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = *src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_205;
}
yy_32 -= width;
if (dst < gpBufEnd)
return;
src += width;
chk_sh_and = width >> 1;
if (width & 1) {
*dst++ = 0;
if (!chk_sh_and)
continue;
}
n_draw_shift = width >> 2;
if (chk_sh_and & 1) {
*(_WORD *)dst = 0;
dst += 2;
if (!n_draw_shift)
continue;
}
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
} while (yy_32);
LABEL_205:
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // upper (solid), black
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
xx_32 -= 2;
}
break;
case 3: // upper (solid), black
xx_32 = 30;
while (dst >= gpBufEnd) {
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
yy_32 = 2;
do {
if (dst < gpBufEnd)
break;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
dst += xx_32;
xx_32 -= 2;
}
break;
case 4: // upper (solid), black
xx_32 = 30;
while (dst >= gpBufEnd) {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
xx_32 -= 2;
}
break;
default: // upper (solid), black
xx_32 = 30;
while (dst >= gpBufEnd) {
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
if (!xx_32) {
i = 16;
do {
if (dst < gpBufEnd)
break;
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
dst -= 800;
--i;
} while (i);
return;
}
dst += xx_32;
xx_32 -= 2;
}
break;
}
}
void drawTopArchesLowerScreen(BYTE *pBuff)
{
unsigned char *dst; // edi MAPDST
unsigned char *tbl; // ebx
unsigned char *src; // esi MAPDST
short cel_type_16; // ax MAPDST
signed int tile_42_45; // eax MAPDST
unsigned int world_tbl; // ecx MAPDST
unsigned int width; // eax MAPDST
unsigned int chk_sh_and; // ecx MAPDST
int xx_32; // edx MAPDST
unsigned int x_minus; // ecx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
int yy_32; // edx MAPDST
unsigned int y_minus; // ecx MAPDST
signed int i; // edx MAPDST
signed int j; // ecx MAPDST
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
if (!(_BYTE)light_table_index) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((level_cel_block >> 12) & 7) + 8;
goto LABEL_11;
}
if ((_BYTE)light_table_index == lightmax) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // lower (top transparent), black
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
case 1: // lower (top transparent), black
WorldBoolFlag = (unsigned char)pBuff & 1;
xx_32 = 32;
LABEL_412:
yy_32 = 32;
while (1) {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32) {
LABEL_433:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
if (!--xx_32)
return;
goto LABEL_412;
}
}
yy_32 -= width;
if (dst < gpBufEnd) {
src += width;
if (((unsigned char)dst & 1) == WorldBoolFlag) {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_420;
++dst;
if (chk_sh_and) {
LABEL_427:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_430;
}
} else {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_427;
*dst++ = 0;
if (chk_sh_and) {
LABEL_420:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_430;
}
}
} else {
src += width;
dst += width;
}
LABEL_430:
if (!yy_32)
goto LABEL_433;
}
break;
case 2: // lower (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd) {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-xx_32 + 32];
dst += 32;
}
dst -= 800;
if (!xx_32)
break;
}
yy_32 = 2;
do {
if (dst < gpBufEnd) {
dst += yy_32;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-yy_32 + 32];
dst += 32;
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
break;
case 3: // lower (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd) {
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-xx_32 + 32];
dst = &dst[-xx_32 + 32];
}
dst -= 800;
if (!xx_32)
break;
dst += xx_32;
}
yy_32 = 2;
do {
if (dst < gpBufEnd) {
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-yy_32 + 32];
dst = &dst[-yy_32 + 32];
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
break;
case 4: // lower (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd) {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-xx_32 + 32];
dst += 32;
}
dst -= 800;
if (!xx_32)
break;
}
i = 8;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
default: // lower (top transparent), black
WorldBoolFlag = 0;
for (xx_32 = 30;; xx_32 -= 2) {
if (dst < gpBufEnd) {
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = 0;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src = &src[-xx_32 + 32];
dst = &dst[-xx_32 + 32];
}
dst -= 800;
if (!xx_32)
break;
dst += xx_32;
}
i = 8;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = 0;
dst[3] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = 0;
dst[2] = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
}
return;
}
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
switch (cel_type_16) {
case 0: // lower (top transparent), with lighting
i = 16;
do {
if (dst < gpBufEnd) {
asm_trans_light_square_1_3(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
asm_trans_light_square_0_2(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
case 1: // lower (top transparent), with lighting
WorldBoolFlag = (unsigned char)pBuff & 1;
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_69;
}
yy_32 -= width;
if (dst < gpBufEnd) {
if (((unsigned char)dst & 1) == WorldBoolFlag) {
asm_trans_light_cel_0_2(width, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(width, tbl, &dst, &src);
}
} else {
src += width;
dst += width;
}
} while (yy_32);
LABEL_69:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // lower (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_98:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
yy_32 = world_tbl + 2;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_98;
case 3: // lower (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_154:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
yy_32 = world_tbl + 2;
WorldBoolFlag += world_tbl >> 1;
}
do {
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_154;
case 4: // lower (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_210:
i = 8;
do {
if (dst < gpBufEnd) {
asm_trans_light_square_1_3(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
asm_trans_light_square_0_2(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_210;
default: // lower (top transparent), with lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_249:
i = 8;
do {
if (dst < gpBufEnd) {
asm_trans_light_square_1_3(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
asm_trans_light_square_0_2(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
asm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);
} else {
asm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);
}
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_249;
}
return;
}
src = (unsigned char *)pSpeedCels + *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
LABEL_11:
switch (cel_type_16) {
case 8: // lower (top transparent), without lighting
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
case 9: // lower (top transparent), without lighting
WorldBoolFlag = (unsigned char)pBuff & 1;
xx_32 = 32;
while (1) {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) != 0)
break;
yy_32 -= width;
if (dst < gpBufEnd) {
if (((unsigned char)dst & 1) == WorldBoolFlag) {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_280;
++src;
++dst;
if (chk_sh_and) {
LABEL_287:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[0] = src[0];
src += 2;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_290;
}
} else {
chk_sh_and = width >> 1;
if (!(width & 1))
goto LABEL_287;
*dst++ = *src++;
if (chk_sh_and) {
LABEL_280:
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
dst[1] = src[1];
src += 2;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
goto LABEL_290;
}
}
} else {
src += width;
dst += width;
}
LABEL_290:
if (!yy_32)
goto LABEL_293;
}
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
} while (yy_32);
LABEL_293:
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
dst -= 800;
if (!--xx_32)
return;
}
case 10: // lower (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_308:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
yy_32 = world_tbl + 2;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += yy_32;
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = y_minus >> 2;
if (y_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
--n_draw_shift; /// BUGFIX: delete this line
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_308;
case 11: // lower (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff < gpBufEnd)
goto LABEL_326;
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 <= 45) {
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
do {
LABEL_326:
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_336;
}
dst = pBuff - 12288;
src += 288;
LABEL_336:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
yy_32 = world_tbl + 2;
WorldBoolFlag += world_tbl >> 1;
}
do {
y_minus = 32 - yy_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
break;
case 12: // lower (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_364:
i = 8;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
dst += xx_32;
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[1] = src[3];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
n_draw_shift = x_minus >> 2;
if (x_minus & 2) {
dst[0] = src[2];
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_364;
default: // lower (top transparent), without lighting
WorldBoolFlag = 0;
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_389:
i = 8;
do {
if (dst < gpBufEnd) {
j = 8;
do {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
if (dst < gpBufEnd) {
j = 8;
do {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
world_tbl >>= 1;
xx_32 = 30 - world_tbl;
WorldBoolFlag += world_tbl >> 1;
}
do {
x_minus = 32 - xx_32;
WorldBoolFlag = ((_BYTE)WorldBoolFlag + 1) & 1;
if (WorldBoolFlag) {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[1] = src[1];
dst[3] = src[3];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[1] = src[1];
src += 4;
dst += 2;
}
} else {
for (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {
dst[0] = src[0];
dst[2] = src[2];
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
dst[0] = src[0];
src += 4;
dst += 2;
}
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_389;
}
}
void drawBottomArchesLowerScreen(BYTE *pBuff, unsigned int *pMask)
{
unsigned char *dst; // edi MAPDST
short cel_type_16; // ax MAPDST
unsigned char *src; // esi MAPDST
int and80_i; // ecx MAPDST
signed int tile_42_45; // eax MAPDST
unsigned int world_tbl; // ecx MAPDST
int xx_32; // ecx MAPDST
int yy_32; // edx MAPDST
int width; // eax MAPDST
unsigned int left_shift; // edx MAPDST
signed int i; // edx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
unsigned char *tbl;
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
gpDrawMask = pMask;
if ((_BYTE)light_table_index) {
if ((_BYTE)light_table_index == lightmax) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // lower (bottom transparent), black
yy_32 = 32;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
break;
case 1: // lower (bottom transparent), black
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) != 0)
break;
yy_32 -= width;
if (dst < gpBufEnd) {
and80_i = width;
src += width;
left_shift = gdwCurrentMask;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--and80_i;
} while (and80_i);
gdwCurrentMask = left_shift;
} else {
src += width;
dst += width;
}
if (!yy_32)
goto LABEL_252;
}
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
} while (yy_32);
LABEL_252:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 2: // lower (bottom transparent), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
if (!i)
break;
}
i = 2;
do {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
i += 2;
} while (i != 32);
break;
case 3: // lower (bottom transparent), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst -= 800;
if (!i)
break;
dst += i;
}
i = 2;
do {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst = &dst[i - 800];
i += 2;
} while (i != 32);
break;
case 4: // lower (bottom transparent), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
if (!i)
break;
}
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
break;
default: // lower (bottom transparent), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst -= 800;
if (!i)
break;
dst += i;
}
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = 0;
left_shift *= 2;
++dst;
--i;
} while (i);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
break;
}
return;
}
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
switch (cel_type_16) {
case 0: // lower (bottom transparent), with lighting
yy_32 = 32;
do {
if (dst < gpBufEnd) {
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
break;
case 1: // lower (bottom transparent), with lighting
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) != 0)
break;
yy_32 -= width;
if (dst < gpBufEnd) {
gdwCurrentMask = asm_trans_light_mask(width, tbl, &dst, &src, gdwCurrentMask);
} else {
src += width;
dst += width;
}
if (!yy_32)
goto LABEL_52;
}
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
} while (yy_32);
LABEL_52:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 2: // lower (bottom transparent), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_62:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
yy_32 += 2;
dst -= 800;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_62;
case 3: // lower (bottom transparent), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_80:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
/// BUGFIX: uncomment this line
// src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_80;
case 4: // lower (bottom transparent), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_98:
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_98;
default: // lower (bottom transparent), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_117:
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
asm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);
src += (unsigned char)src & 2;
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_117;
}
return;
}
src = (unsigned char *)pSpeedCels
+ *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned char)(level_cel_block >> 12);
} else {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = ((level_cel_block >> 12) & 7) + 8;
}
switch (cel_type_16) {
case 8: // lower (bottom transparent), without lighting
yy_32 = 32;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
break;
case 9: // lower (bottom transparent), without lighting
xx_32 = 32;
do {
gdwCurrentMask = *gpDrawMask;
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) != 0)
break;
yy_32 -= width;
if (dst < gpBufEnd) {
and80_i = width;
left_shift = gdwCurrentMask;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--and80_i;
} while (and80_i);
gdwCurrentMask = left_shift;
} else {
src += width;
dst += width;
}
if (!yy_32)
goto LABEL_152;
}
_LOBYTE(width) = -(char)width;
dst += width;
if (width & 0x1F)
gdwCurrentMask <<= width & 0x1F;
yy_32 -= width;
} while (yy_32);
LABEL_152:
dst -= 800;
--gpDrawMask;
--xx_32;
} while (xx_32);
break;
case 10: // lower (bottom transparent), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_162:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_162;
case 11: // lower (bottom transparent), without lighting
xx_32 = 30;
if (pBuff < gpBufEnd)
goto LABEL_175;
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 <= 45) {
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
do {
LABEL_175:
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_180;
}
dst = pBuff - 12288;
src += 288;
LABEL_180:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
for (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
break;
case 12: // lower (bottom transparent), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_198:
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_198;
default: // lower (bottom transparent), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_217:
gpDrawMask -= 16;
yy_32 = 16;
do {
if (dst < gpBufEnd) {
left_shift = *gpDrawMask;
i = 32;
do {
if (left_shift & 0x80000000)
dst[0] = src[0];
left_shift *= 2;
++src;
++dst;
--i;
} while (i);
src += (unsigned char)src & 2;
} else {
src += 32;
dst += 32;
}
dst -= 800;
--gpDrawMask;
--yy_32;
} while (yy_32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_217;
}
}
void drawLowerScreen(BYTE *pBuff)
{
unsigned char *dst; // edi MAPDST
unsigned char *src; // esi MAPDST
unsigned char *tbl; // ebx
short cel_type_16; // ax MAPDST
int xx_32; // edx MAPDST
int yy_32; // ebp MAPDST
unsigned int chk_sh_and; // ecx MAPDST
signed int tile_42_45; // eax MAPDST
unsigned int world_tbl; // ecx MAPDST
unsigned int n_draw_shift; // ecx MAPDST
unsigned int width; // eax MAPDST
signed int i; // edx MAPDST
signed int j; // ecx MAPDST
if (cel_transparency_active) {
if (!arch_draw_type) {
drawTopArchesLowerScreen(pBuff);
return;
}
if (arch_draw_type == 1) {
if (block_lvid[level_piece_id] == 1 || block_lvid[level_piece_id] == 3) {
drawBottomArchesLowerScreen(pBuff, &LeftMask[31]);
return;
}
}
if (arch_draw_type == 2) {
if (block_lvid[level_piece_id] == 2 || block_lvid[level_piece_id] == 3) {
drawBottomArchesLowerScreen(pBuff, &RightMask[31]);
return;
}
}
}
gpCelFrame = (unsigned char *)SpeedFrameTbl;
dst = pBuff;
if ((_BYTE)light_table_index) {
if ((_BYTE)light_table_index == lightmax) {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (level_cel_block >> 12) & 7;
switch (cel_type_16) {
case 0: // lower (solid), black
i = 32;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
case 1: // lower (solid), black
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_232;
}
yy_32 -= width;
if (dst < gpBufEnd) {
src += width;
chk_sh_and = width >> 1;
if (width & 1) {
dst[0] = 0;
++dst;
}
if (chk_sh_and) {
n_draw_shift = width >> 2;
if (chk_sh_and & 1) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src += width;
dst += width;
}
} while (yy_32);
LABEL_232:
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // lower (solid), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
if (!i)
break;
}
i = 2;
do {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
i += 2;
} while (i != 32);
break;
case 3: // lower (solid), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst -= 800;
if (!i)
break;
dst += i;
}
i = 2;
do {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst = &dst[i - 800];
i += 2;
} while (i != 32);
break;
case 4: // lower (solid), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
dst += i;
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst += 32;
}
dst -= 800;
if (!i)
break;
}
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
default: // lower (solid), black
for (i = 30;; i -= 2) {
if (dst < gpBufEnd) {
n_draw_shift = (unsigned int)(32 - i) >> 2;
if ((32 - i) & 2) {
*(_WORD *)dst = 0;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = 0;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
} else {
src = &src[32 - i];
dst = &dst[32 - i];
}
dst -= 800;
if (!i)
break;
dst += i;
}
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
}
return;
}
if (!(level_cel_block & 0x8000)) {
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
tbl = &pLightTbl[256 * light_table_index];
cel_type_16 = (unsigned short)level_cel_block >> 12;
switch (cel_type_16) {
case 0: // lower (solid), with lighting
xx_32 = 32;
do {
if (dst < gpBufEnd) {
asm_cel_light_square(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 1: // lower (solid), with lighting
xx_32 = 32;
do {
yy_32 = 32;
do {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0) {
yy_32 -= width;
if (dst < gpBufEnd) {
asm_cel_light_edge(width, tbl, &dst, &src);
} else {
src += width;
dst += width;
}
} else {
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
}
} while (yy_32);
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 2: // lower (solid), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_68:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
dst += yy_32;
src += (32 - (_BYTE)yy_32) & 2;
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
yy_32 += 2;
dst -= 800;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_68;
case 3: // lower (solid), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_83:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
asm_cel_light_edge(32 - yy_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[yy_32 - 800];
yy_32 += 2;
} while (yy_32 != 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_83;
case 4: // lower (solid), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_100:
i = 16;
do {
if (dst < gpBufEnd) {
asm_cel_light_square(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
src += (32 - (_BYTE)xx_32) & 2;
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_100;
default: // lower (solid), with lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_116:
j = 16;
do {
if (dst < gpBufEnd) {
asm_cel_light_square(8, tbl, &dst, &src);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--j;
} while (j);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
asm_cel_light_edge(32 - xx_32, tbl, &dst, &src);
src += (unsigned char)src & 2;
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_116;
}
return;
}
src = (unsigned char *)pSpeedCels
+ *(_DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];
cel_type_16 = (unsigned short)level_cel_block >> 12;
} else {
if (level_cel_block & 0x8000)
level_cel_block = *(_DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]
+ (unsigned short)(level_cel_block & 0xF000);
src = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF));
cel_type_16 = (((unsigned int)level_cel_block >> 12) & 7) + 8;
}
switch (cel_type_16) {
case 8: // lower (solid), without lighting
i = 32;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
break;
case 9: // lower (solid), without lighting
xx_32 = 32;
do {
yy_32 = 32;
do {
while (1) {
width = (unsigned char)*src++;
if ((width & 0x80u) == 0)
break;
_LOBYTE(width) = -(char)width;
dst += width;
yy_32 -= width;
if (!yy_32)
goto LABEL_143;
}
yy_32 -= width;
if (dst < gpBufEnd) {
chk_sh_and = width >> 1;
if (width & 1) {
dst[0] = src[0];
++src;
++dst;
}
if (chk_sh_and) {
n_draw_shift = chk_sh_and >> 1;
if (chk_sh_and & 1) {
*(_WORD *)dst = *(_WORD *)src;
src += 2;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
}
} else {
src += width;
dst += width;
}
} while (yy_32);
LABEL_143:
dst -= 800;
--xx_32;
} while (xx_32);
break;
case 10: // lower (solid), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_153:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
dst += yy_32;
n_draw_shift = (unsigned int)(32 - yy_32) >> 2;
if ((32 - yy_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
yy_32 += 2;
dst -= 800;
} while (yy_32 < 32);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_153;
case 11: // lower (solid), without lighting
xx_32 = 30;
if (pBuff < gpBufEnd)
goto LABEL_166;
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 <= 45) {
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
do {
LABEL_166:
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_171;
}
dst = pBuff - 12288;
src += 288;
LABEL_171:
yy_32 = 2;
if (dst >= gpBufEnd) {
tile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 42)
return;
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_2[world_tbl >> 2];
dst -= 192 * world_tbl;
yy_32 = (world_tbl >> 1) + 2;
}
do {
for (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)yy_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst += yy_32;
yy_32 += 2;
dst -= 800;
} while (yy_32 < 32);
break;
case 12: // lower (solid), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_189:
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
dst += xx_32;
n_draw_shift = (unsigned int)(32 - xx_32) >> 2;
if ((32 - xx_32) & 2) {
*(_WORD *)dst = *((_WORD *)src + 1);
src += 4;
dst += 2;
}
if (n_draw_shift) {
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--n_draw_shift;
} while (n_draw_shift);
}
dst -= 800;
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_189;
default: // lower (solid), without lighting
xx_32 = 30;
if (pBuff >= gpBufEnd) {
tile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;
if (tile_42_45 > 45) {
dst = pBuff - 12288;
src += 288;
LABEL_205:
i = 16;
do {
if (dst < gpBufEnd) {
j = 8;
do {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
--j;
} while (j);
} else {
src += 32;
dst += 32;
}
dst -= 800;
--i;
} while (i);
return;
}
world_tbl = WorldTbl3x16[tile_42_45];
src += WorldTbl17_1[world_tbl >> 2];
dst -= 192 * world_tbl;
xx_32 = 30 - (world_tbl >> 1);
}
do {
for (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {
*(_DWORD *)dst = *(_DWORD *)src;
src += 4;
dst += 4;
}
if ((32 - (_BYTE)xx_32) & 2) {
*(_WORD *)dst = *(_WORD *)src;
src += 4;
dst += 2;
}
dst = &dst[xx_32 - 800];
xx_32 -= 2;
} while (xx_32 >= 0);
goto LABEL_205;
}
}
void world_draw_black_tile(BYTE *pBuff)
{
unsigned char *dst; // edi MAPDST
signed int xx_32; // edx
signed int i; // ebx MAPDST
signed int j; // ecx MAPDST
signed int yy_32; // edx
dst = pBuff;
xx_32 = 30;
for (i = 1;; ++i) {
dst += xx_32;
j = i;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
dst = &dst[xx_32 - 832];
if (!xx_32)
break;
xx_32 -= 2;
}
yy_32 = 2;
i = 15;
do {
dst += yy_32;
j = i;
do {
*(_DWORD *)dst = 0;
dst += 4;
--j;
} while (j);
dst = &dst[yy_32 - 832];
--i;
yy_32 += 2;
} while (yy_32 != 32);
}
#endif