#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
