#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] = { 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] = { 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] = { 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 }; // 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) |/ */ #ifdef USE_ASM #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