//HEADER_GOES_HERE #include "../types.h" int world_4B325C = 0; // truncated with & 1, some kind of bool?? unsigned char world_4B3260[5] = { 0u, 0u, 0u, 0u, 0u }; // single mask, int nTileMask int world_4B3265 = 0; // speed cel num int world_4B3269[5] = { 0, 0, 0, 0, 0 }; // seems to be a single pointer, void *pTileMask unsigned int tile_draw_masks[3][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 }, { 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 }, { 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 world_4B33FD[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 }; int world_4B34BD[17] = { 0, 4, 8, 16, 24, 36, 48, 64, 80, 100, 120, 144, 168, 196, 224, 256, 288 }; int world_4B3501[17] = { 0, 32, 60, 88, 112, 136, 156, 176, 192, 208, 220, 232, 240, 248, 252, 256, 288 }; /* double check x&2 outputs */ /* 32x32 arch types add 8 if light index is 0 |-| 0x8 (0) |-| /\ 0x9 (1) \/ /| 0xA (2) \| |\ 0xB (3) |/ |-| 0xC (4) \| |-| 0xD (5) |/ */ //----- (00463060) -------------------------------------------------------- void __fastcall drawTopArchesUpperScreen(void *a1) { char v1; // edx unsigned int v2; // edi _BYTE *v3; // esi char *v4; // ebx short v5; // ax char *v6; // esi short v7; // ax unsigned int v8; // eax unsigned char *v9; // esi unsigned int v10; // eax int v11; // eax signed int v12; // ebp signed int v13; // ecx unsigned int v14; // eax _BYTE *v15; // edi signed int v16; // ecx int v17; // eax signed int v18; // ebp signed int v19; // edx unsigned int v20; // eax char v21; // edx unsigned int v22; // ecx unsigned char v23; // cf unsigned int v24; // ecx unsigned int v25; // eax unsigned int v26; // ecx int v27; // eax unsigned int v28; // ecx unsigned int v29; // ecx int v30; // eax unsigned int v31; // ecx unsigned int v32; // eax signed int v33; // ebp _BYTE *v34; // edi unsigned int v35; // ecx char v36; // edx unsigned int v37; // ecx unsigned int v38; // ecx unsigned int v39; // eax unsigned int v40; // ecx int v41; // eax char v42; // edx unsigned int v43; // ecx unsigned int v44; // ecx int v45; // eax unsigned int v46; // ecx unsigned int v47; // eax unsigned char v48; // of signed int v49; // ebp _BYTE *v50; // edi unsigned int v51; // ecx char v52; // edx unsigned int v53; // ecx unsigned int v54; // ecx unsigned int v55; // eax unsigned int v56; // ecx int v57; // eax char v58; // edx unsigned int v59; // ecx unsigned int v60; // ecx int v61; // eax unsigned int v62; // ecx unsigned int v63; // eax signed int v64; // ebp unsigned int v65; // ecx unsigned int v66; // ecx unsigned int v67; // ecx unsigned int v68; // eax unsigned int v69; // ecx int v70; // eax unsigned int v71; // ecx unsigned int v72; // ecx int v73; // eax unsigned int v74; // ecx unsigned int v75; // eax signed int v76; // ebp unsigned int v77; // ecx unsigned int v78; // ecx unsigned int v79; // ecx unsigned int v80; // eax unsigned int v81; // ecx int v82; // eax unsigned int v83; // ecx unsigned int v84; // ecx int v85; // eax unsigned int v86; // ecx unsigned int v87; // eax signed int v88; // ebp _BYTE *v89; // edi unsigned int v90; // ecx char v91; // edx unsigned int v92; // ecx unsigned int v93; // ecx unsigned int v94; // eax unsigned int v95; // ecx int v96; // eax unsigned int v97; // ecx unsigned int v98; // ecx int v99; // eax unsigned int v100; // ecx unsigned int v101; // eax signed int v102; // ebp signed int v103; // ecx unsigned int v104; // eax _BYTE *v105; // edi signed int v106; // ecx int v107; // eax signed int v108; // ebp unsigned int v109; // ecx unsigned int v110; // ecx unsigned int v111; // ecx unsigned int v112; // eax unsigned int v113; // ecx int v114; // eax unsigned int v115; // ecx unsigned int v116; // ecx int v117; // eax unsigned int v118; // ecx unsigned int v119; // eax signed int v120; // ebp signed int v121; // ecx unsigned int v122; // eax _BYTE *v123; // edi signed int v124; // ecx int v125; // eax signed int v126; // edx signed int v127; // ecx int v128; // eax _BYTE *v129; // edi _BYTE *v130; // edi signed int v131; // ecx int v132; // eax _BYTE *v133; // edi signed int v134; // ebp signed int v135; // edx unsigned int v136; // eax unsigned int v137; // ecx unsigned int v138; // ecx char *v139; // esi _BYTE *v140; // edi char v141; // al int v142; // eax _BYTE *v143; // edi char v144; // al unsigned int v145; // ecx char v146; // al int v147; // eax _BYTE *v148; // edi signed int v149; // edx _BYTE *v150; // edi unsigned int v151; // ecx int v152; // eax unsigned int v153; // ecx _BYTE *v154; // edi int v155; // eax _BYTE *v156; // edi unsigned int v157; // ecx short v158; // ax int v159; // eax _BYTE *v160; // edi signed int v161; // edx _BYTE *v162; // edi unsigned int v163; // ecx int v164; // eax unsigned int v165; // ecx _BYTE *v166; // edi int v167; // eax _BYTE *v168; // edi unsigned int v169; // ecx short v170; // ax int v171; // eax _BYTE *v172; // edi signed int v173; // edx unsigned int v174; // ecx int v175; // eax char v176; // bp unsigned int i; // ecx int v178; // eax _BYTE *v179; // edi int v180; // ebp _BYTE *v181; // edi unsigned int j; // ecx int v183; // eax _BYTE *v184; // edi short v185; // ax signed int v186; // edx unsigned int v187; // ecx int v188; // eax unsigned int k; // ecx int v190; // eax _BYTE *v191; // edi _BYTE *v192; // edi unsigned int l; // ecx int v194; // eax _BYTE *v195; // edi short v196; // ax signed int v197; // edx _BYTE *v198; // edi unsigned int v199; // ecx int v200; // eax unsigned int v201; // ecx _BYTE *v202; // edi int v203; // eax _BYTE *v204; // edi unsigned int v205; // ecx short v206; // ax int v207; // eax _BYTE *v208; // edi signed int v209; // edx signed int v210; // ecx int v211; // eax _BYTE *v212; // edi _BYTE *v213; // edi signed int v214; // ecx int v215; // eax _BYTE *v216; // edi signed int v217; // edx unsigned int v218; // ecx int v219; // eax unsigned int m; // ecx int v221; // eax _BYTE *v222; // edi _BYTE *v223; // edi unsigned int n; // ecx int v225; // eax _BYTE *v226; // edi short v227; // ax signed int v228; // edx signed int v229; // ecx int v230; // eax _BYTE *v231; // edi _BYTE *v232; // edi signed int v233; // ecx int v234; // eax _BYTE *v235; // edi signed int v236; // edx signed int v237; // ecx _BYTE *v238; // edi signed int v239; // ecx signed int v240; // ebp signed int v241; // edx unsigned int v242; // eax unsigned int v243; // ecx unsigned int v244; // ecx _BYTE *v245; // edi unsigned int v246; // ecx signed int ii; // edx _BYTE *v248; // edi unsigned int v249; // ecx unsigned int v250; // ecx _BYTE *v251; // edi unsigned int v252; // ecx signed int v253; // edx _BYTE *v254; // edi unsigned int v255; // ecx unsigned int v256; // ecx _BYTE *v257; // edi unsigned int v258; // ecx signed int jj; // edx unsigned int v260; // ecx unsigned int v261; // ecx _BYTE *v262; // edi unsigned int v263; // ecx _BYTE *v264; // edi signed int v265; // edx unsigned int v266; // ecx unsigned int v267; // ecx _BYTE *v268; // edi unsigned int v269; // ecx signed int kk; // edx _BYTE *v271; // edi unsigned int v272; // ecx unsigned int v273; // ecx _BYTE *v274; // edi unsigned int v275; // ecx signed int v276; // edx signed int v277; // ecx _BYTE *v278; // edi signed int v279; // ecx signed int ll; // edx unsigned int v281; // ecx unsigned int v282; // ecx _BYTE *v283; // edi unsigned int v284; // ecx unsigned int v285; // edi signed int v286; // edx signed int v287; // ecx _BYTE *v288; // edi signed int v289; // ecx int v290; // [esp-14h] [ebp-18h] int v291; // [esp-14h] [ebp-18h] world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v2 = (unsigned int)a1; if ( !(_BYTE)light_table_index ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v6 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v8 = level_cel_block; _LOBYTE(v8) = BYTE1(v8); v7 = ((v8 >> 4) & 7) + 8; goto LABEL_11; } if ( (_BYTE)light_table_index != lightmax ) { if ( !(level_cel_block & 0x8000) ) { v3 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v4 = &pLightTbl[256 * light_table_index]; v5 = (unsigned char)(BYTE1(level_cel_block) >> 4); if ( BYTE1(level_cel_block) >> 4 ) { switch ( v5 ) { case 1: world_4B325C = (unsigned char)a1 & 1; v18 = 32; do { v19 = 32; do { while ( 1 ) { v20 = (unsigned char)*v3++; if ( (v20 & 0x80u) == 0 ) break; _LOBYTE(v20) = -(char)v20; v2 += v20; v19 -= v20; if ( !v19 ) goto LABEL_67; } v21 = v19 - v20; if ( v2 < screen_buf_end ) return; if ( (v2 & 1) == world_4B325C ) { v290 = v21; v22 = v20 >> 1; if ( v20 & 1 ) { ++v3; ++v2; v23 = v22 & 1; v26 = v20 >> 2; if ( v23 ) { _LOBYTE(v21) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v21]; v2 += 2; } if ( (_BYTE)v26 ) { do { v27 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v21) = v27; *(_BYTE *)v2 = v4[v21]; _LOBYTE(v21) = BYTE2(v27); v2 += 4; --v26; *(_BYTE *)(v2 - 2) = v4[v21]; } while ( v26 ); } } else { v23 = v22 & 1; v24 = v20 >> 2; if ( v23 ) { _LOBYTE(v21) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v21]; v2 += 2; } if ( (_BYTE)v24 ) { do { v25 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v21) = BYTE1(v25); v25 >>= 16; *(_BYTE *)(v2 + 1) = v4[v21]; _LOBYTE(v21) = BYTE1(v25); v2 += 4; --v24; *(_BYTE *)(v2 - 1) = v4[v21]; } while ( v24 ); } } v19 = v290; } else { v291 = v21; v28 = v20 >> 1; if ( v20 & 1 ) { _LOBYTE(v21) = *v3++; *(_BYTE *)v2++ = v4[v21]; v23 = v28 & 1; v31 = v20 >> 2; if ( v23 ) { _LOBYTE(v21) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v21]; v2 += 2; } if ( (_BYTE)v31 ) { do { v32 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v21) = BYTE1(v32); v32 >>= 16; *(_BYTE *)(v2 + 1) = v4[v21]; _LOBYTE(v21) = BYTE1(v32); v2 += 4; --v31; *(_BYTE *)(v2 - 1) = v4[v21]; } while ( v31 ); } } else { v23 = v28 & 1; v29 = v20 >> 2; if ( v23 ) { _LOBYTE(v21) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v21]; v2 += 2; } if ( (_BYTE)v29 ) { do { v30 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v21) = v30; *(_BYTE *)v2 = v4[v21]; _LOBYTE(v21) = BYTE2(v30); v2 += 4; --v29; *(_BYTE *)(v2 - 2) = v4[v21]; } while ( v29 ); } } v19 = v291; } } while ( v19 ); LABEL_67: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; --v18; } while ( v18 ); break; case 2: world_4B325C = 0; v33 = 30; while ( v2 >= screen_buf_end ) { v34 = (_BYTE *)(v33 + v2); v35 = 32 - v33; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v36 = v35 & 2; v3 += v36; v23 = v35 & 1; v37 = v35 >> 1; if ( v23 ) { ++v3; ++v34; v23 = v37 & 1; v40 = v37 >> 1; if ( v23 ) { _LOBYTE(v36) = *v3; v3 += 2; *v34 = v4[v36]; v34 += 2; } if ( (_BYTE)v40 ) { do { v41 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v36) = v41; *v34 = v4[v36]; _LOBYTE(v36) = BYTE2(v41); v34 += 4; --v40; *(v34 - 2) = v4[v36]; } while ( v40 ); } } else { v23 = v37 & 1; v38 = v37 >> 1; if ( v23 ) { _LOBYTE(v36) = v3[1]; v3 += 2; v34[1] = v4[v36]; v34 += 2; } if ( (_BYTE)v38 ) { do { v39 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v36) = BYTE1(v39); v39 >>= 16; v34[1] = v4[v36]; _LOBYTE(v36) = BYTE1(v39); v34 += 4; --v38; *(v34 - 1) = v4[v36]; } while ( v38 ); } } } else { v42 = v35 & 2; v3 += v42; v23 = v35 & 1; v43 = v35 >> 1; if ( v23 ) { _LOBYTE(v42) = *v3++; *v34++ = v4[v42]; v23 = v43 & 1; v46 = v43 >> 1; if ( v23 ) { _LOBYTE(v42) = v3[1]; v3 += 2; v34[1] = v4[v42]; v34 += 2; } if ( (_BYTE)v46 ) { do { v47 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v42) = BYTE1(v47); v47 >>= 16; v34[1] = v4[v42]; _LOBYTE(v42) = BYTE1(v47); v34 += 4; --v46; *(v34 - 1) = v4[v42]; } while ( v46 ); } } else { v23 = v43 & 1; v44 = v43 >> 1; if ( v23 ) { _LOBYTE(v42) = *v3; v3 += 2; *v34 = v4[v42]; v34 += 2; } if ( (_BYTE)v44 ) { do { v45 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v42) = v45; *v34 = v4[v42]; _LOBYTE(v42) = BYTE2(v45); v34 += 4; --v44; *(v34 - 2) = v4[v42]; } while ( v44 ); } } } v2 = (unsigned int)(v34 - 800); v48 = __OFSUB__(v33, 2); v33 -= 2; if ( (v33 < 0) ^ v48 ) { v49 = 2; do { if ( v2 < screen_buf_end ) break; v50 = (_BYTE *)(v49 + v2); v51 = 32 - v49; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v52 = v51 & 2; v3 += v52; v23 = v51 & 1; v53 = v51 >> 1; if ( v23 ) { ++v3; ++v50; v23 = v53 & 1; v56 = v53 >> 1; if ( v23 ) { _LOBYTE(v52) = *v3; v3 += 2; *v50 = v4[v52]; v50 += 2; } if ( (_BYTE)v56 ) { do { v57 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v52) = v57; *v50 = v4[v52]; _LOBYTE(v52) = BYTE2(v57); v50 += 4; --v56; *(v50 - 2) = v4[v52]; } while ( v56 ); } } else { v23 = v53 & 1; v54 = v53 >> 1; if ( v23 ) { _LOBYTE(v52) = v3[1]; v3 += 2; v50[1] = v4[v52]; v50 += 2; } if ( (_BYTE)v54 ) { do { v55 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v52) = BYTE1(v55); v55 >>= 16; v50[1] = v4[v52]; _LOBYTE(v52) = BYTE1(v55); v50 += 4; --v54; *(v50 - 1) = v4[v52]; } while ( v54 ); } } } else { v58 = v51 & 2; v3 += v58; v23 = v51 & 1; v59 = v51 >> 1; if ( v23 ) { _LOBYTE(v58) = *v3++; *v50++ = v4[v58]; v23 = v59 & 1; v62 = v59 >> 1; if ( v23 ) { _LOBYTE(v58) = v3[1]; v3 += 2; v50[1] = v4[v58]; v50 += 2; } if ( (_BYTE)v62 ) { do { v63 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v58) = BYTE1(v63); v63 >>= 16; v50[1] = v4[v58]; _LOBYTE(v58) = BYTE1(v63); v50 += 4; --v62; *(v50 - 1) = v4[v58]; } while ( v62 ); } } else { v23 = v59 & 1; v60 = v59 >> 1; if ( v23 ) { _LOBYTE(v58) = *v3; v3 += 2; *v50 = v4[v58]; v50 += 2; } if ( (_BYTE)v60 ) { do { v61 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v58) = v61; *v50 = v4[v58]; _LOBYTE(v58) = BYTE2(v61); v50 += 4; --v60; *(v50 - 2) = v4[v58]; } while ( v60 ); } } } v2 = (unsigned int)(v50 - 800); v49 += 2; } while ( v49 != 32 ); return; } } break; case 3: world_4B325C = 0; v64 = 30; while ( v2 >= screen_buf_end ) { v65 = 32 - v64; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v23 = v65 & 1; v66 = v65 >> 1; if ( v23 ) { ++v3; ++v2; v23 = v66 & 1; v69 = v66 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v69 ) { do { v70 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v70; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v70); v2 += 4; --v69; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v69 ); } } else { v23 = v66 & 1; v67 = v66 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v67 ) { do { v68 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v68); v68 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v68); v2 += 4; --v67; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v67 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v23 = v65 & 1; v71 = v65 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v23 = v71 & 1; v74 = v71 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v74 ) { do { v75 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v75); v75 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v75); v2 += 4; --v74; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v74 ); } } else { v23 = v71 & 1; v72 = v71 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v72 ) { do { v73 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v73; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v73); v2 += 4; --v72; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v72 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v64 + v2 - 800; v48 = __OFSUB__(v64, 2); v64 -= 2; if ( (v64 < 0) ^ v48 ) { v76 = 2; do { if ( v2 < screen_buf_end ) break; v77 = 32 - v76; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v23 = v77 & 1; v78 = v77 >> 1; if ( v23 ) { ++v3; ++v2; v23 = v78 & 1; v81 = v78 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v81 ) { do { v82 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v82; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v82); v2 += 4; --v81; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v81 ); } } else { v23 = v78 & 1; v79 = v78 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v79 ) { do { v80 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v80); v80 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v80); v2 += 4; --v79; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v79 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v23 = v77 & 1; v83 = v77 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v23 = v83 & 1; v86 = v83 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v86 ) { do { v87 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v87); v87 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v87); v2 += 4; --v86; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v86 ); } } else { v23 = v83 & 1; v84 = v83 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v84 ) { do { v85 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v85; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v85); v2 += 4; --v84; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v84 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v76 + v2 - 800; v76 += 2; } while ( v76 != 32 ); return; } } break; case 4: world_4B325C = 0; v88 = 30; while ( v2 >= screen_buf_end ) { v89 = (_BYTE *)(v88 + v2); v90 = 32 - v88; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v91 = v90 & 2; v3 += v91; v23 = v90 & 1; v92 = v90 >> 1; if ( v23 ) { ++v3; ++v89; v23 = v92 & 1; v95 = v92 >> 1; if ( v23 ) { _LOBYTE(v91) = *v3; v3 += 2; *v89 = v4[v91]; v89 += 2; } if ( (_BYTE)v95 ) { do { v96 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = v96; *v89 = v4[v91]; _LOBYTE(v91) = BYTE2(v96); v89 += 4; --v95; *(v89 - 2) = v4[v91]; } while ( v95 ); } } else { v23 = v92 & 1; v93 = v92 >> 1; if ( v23 ) { _LOBYTE(v91) = v3[1]; v3 += 2; v89[1] = v4[v91]; v89 += 2; } if ( (_BYTE)v93 ) { do { v94 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = BYTE1(v94); v94 >>= 16; v89[1] = v4[v91]; _LOBYTE(v91) = BYTE1(v94); v89 += 4; --v93; *(v89 - 1) = v4[v91]; } while ( v93 ); } } } else { v91 = v90 & 2; v3 += v91; v23 = v90 & 1; v97 = v90 >> 1; if ( v23 ) { _LOBYTE(v91) = *v3++; *v89++ = v4[v91]; v23 = v97 & 1; v100 = v97 >> 1; if ( v23 ) { _LOBYTE(v91) = v3[1]; v3 += 2; v89[1] = v4[v91]; v89 += 2; } if ( (_BYTE)v100 ) { do { v101 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = BYTE1(v101); v101 >>= 16; v89[1] = v4[v91]; _LOBYTE(v91) = BYTE1(v101); v89 += 4; --v100; *(v89 - 1) = v4[v91]; } while ( v100 ); } } else { v23 = v97 & 1; v98 = v97 >> 1; if ( v23 ) { _LOBYTE(v91) = *v3; v3 += 2; *v89 = v4[v91]; v89 += 2; } if ( (_BYTE)v98 ) { do { v99 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = v99; *v89 = v4[v91]; _LOBYTE(v91) = BYTE2(v99); v89 += 4; --v98; *(v89 - 2) = v4[v91]; } while ( v98 ); } } } v2 = (unsigned int)(v89 - 800); v48 = __OFSUB__(v88, 2); v88 -= 2; if ( (v88 < 0) ^ v48 ) { v102 = 8; do { if ( v2 < screen_buf_end ) break; v103 = 8; do { v104 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = BYTE1(v104); v104 >>= 16; *(_BYTE *)(v2 + 1) = v4[v91]; _LOBYTE(v91) = BYTE1(v104); v2 += 4; --v103; *(_BYTE *)(v2 - 1) = v4[v91]; } while ( v103 ); v105 = (_BYTE *)(v2 - 800); if ( (unsigned int)v105 < screen_buf_end ) break; v106 = 8; do { v107 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v91) = v107; *v105 = v4[v91]; _LOBYTE(v91) = BYTE2(v107); v105 += 4; --v106; *(v105 - 2) = v4[v91]; } while ( v106 ); v2 = (unsigned int)(v105 - 800); --v102; } while ( v102 ); return; } } break; default: world_4B325C = 0; v108 = 30; while ( v2 >= screen_buf_end ) { v109 = 32 - v108; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v23 = v109 & 1; v110 = v109 >> 1; if ( v23 ) { ++v3; ++v2; v23 = v110 & 1; v113 = v110 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v113 ) { do { v114 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v114; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v114); v2 += 4; --v113; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v113 ); } } else { v23 = v110 & 1; v111 = v110 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v111 ) { do { v112 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v112); v112 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v112); v2 += 4; --v111; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v111 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v23 = v109 & 1; v115 = v109 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v23 = v115 & 1; v118 = v115 >> 1; if ( v23 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v118 ) { do { v119 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v119); v119 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v119); v2 += 4; --v118; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v118 ); } } else { v23 = v115 & 1; v116 = v115 >> 1; if ( v23 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v116 ) { do { v117 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v117; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v117); v2 += 4; --v116; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v116 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v108 + v2 - 800; v48 = __OFSUB__(v108, 2); v108 -= 2; if ( (v108 < 0) ^ v48 ) { v120 = 8; do { if ( v2 < screen_buf_end ) break; v121 = 8; do { v122 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v122); v122 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v122); v2 += 4; --v121; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v121 ); v123 = (_BYTE *)(v2 - 800); if ( (unsigned int)v123 < screen_buf_end ) break; v124 = 8; do { v125 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v125; *v123 = v4[v1]; _LOBYTE(v1) = BYTE2(v125); v123 += 4; --v124; *(v123 - 2) = v4[v1]; } while ( v124 ); v2 = (unsigned int)(v123 - 800); --v120; } while ( v120 ); return; } } break; } } else { v12 = 16; do { if ( v2 < screen_buf_end ) break; v13 = 8; do { v14 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v14); v14 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v14); v2 += 4; --v13; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v13 ); v15 = (_BYTE *)(v2 - 800); if ( (unsigned int)v15 < screen_buf_end ) break; v16 = 8; do { v17 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v17; *v15 = v4[v1]; _LOBYTE(v1) = BYTE2(v17); v15 += 4; --v16; *(v15 - 2) = v4[v1]; } while ( v16 ); v2 = (unsigned int)(v15 - 800); --v12; } while ( v12 ); } return; } v6 = (char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v7 = (unsigned char)(BYTE1(level_cel_block) >> 4); LABEL_11: if ( v7 == 8 ) { v126 = 16; do { if ( v2 < screen_buf_end ) break; v127 = 8; do { v128 = *(_DWORD *)v6; v6 += 4; v129 = (_BYTE *)(v2 + 1); v128 = __ROR4__(v128, 8); *v129 = v128; v129 += 2; *v129 = __ROR4__(v128, 16); v2 = (unsigned int)(v129 + 1); --v127; } while ( v127 ); v130 = (_BYTE *)(v2 - 800); if ( (unsigned int)v130 < screen_buf_end ) break; v131 = 8; do { v132 = *(_DWORD *)v6; v6 += 4; *v130 = v132; v133 = v130 + 2; *v133 = __ROR4__(v132, 16); v130 = v133 + 2; --v131; } while ( v131 ); v2 = (unsigned int)(v130 - 800); --v126; } while ( v126 ); return; } if ( v7 != 9 ) { switch ( v7 ) { case 10: world_4B325C = 0; v149 = 30; while ( v2 >= screen_buf_end ) { v150 = (_BYTE *)(v149 + v2); v151 = 32 - v149; v152 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v153 = v151 >> 2; if ( !(v151 & 2) || (_LOWORD(v152) = *((_WORD *)v6 + 1), v6 += 4, v154 = v150 + 1, *v154 = __ROR4__(v152, 8), v150 = v154 + 1, v153) ) { do { v155 = *(_DWORD *)v6; v6 += 4; v156 = v150 + 1; v155 = __ROR4__(v155, 8); *v156 = v155; v156 += 2; *v156 = __ROR4__(v155, 16); v150 = v156 + 1; --v153; } while ( v153 ); } } else { v157 = v151 >> 2; if ( !(v151 & 2) || (v158 = *((_WORD *)v6 + 1), v6 += 4, *v150 = v158, v150 += 2, v157) ) { do { v159 = *(_DWORD *)v6; v6 += 4; *v150 = v159; v160 = v150 + 2; *v160 = __ROR4__(v159, 16); v150 = v160 + 2; --v157; } while ( v157 ); } } v2 = (unsigned int)(v150 - 800); v48 = __OFSUB__(v149, 2); v149 -= 2; if ( (v149 < 0) ^ v48 ) { v161 = 2; do { if ( v2 < screen_buf_end ) break; v162 = (_BYTE *)(v161 + v2); v163 = 32 - v161; v164 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v165 = v163 >> 2; if ( !(v163 & 2) || (_LOWORD(v164) = *((_WORD *)v6 + 1), v6 += 4, v166 = v162 + 1, *v166 = __ROR4__(v164, 8), v162 = v166 + 1, v165) ) { do { v167 = *(_DWORD *)v6; v6 += 4; v168 = v162 + 1; v167 = __ROR4__(v167, 8); *v168 = v167; v168 += 2; *v168 = __ROR4__(v167, 16); v162 = v168 + 1; --v165; } while ( v165 ); } } else { v169 = v163 >> 2; if ( !(v163 & 2) || (v170 = *((_WORD *)v6 + 1), v6 += 4, *v162 = v170, v162 += 2, v169) ) { do { v171 = *(_DWORD *)v6; v6 += 4; *v162 = v171; v172 = v162 + 2; *v172 = __ROR4__(v171, 16); v162 = v172 + 2; --v169; } while ( v169 ); } } v2 = (unsigned int)(v162 - 800); v161 += 2; } while ( v161 != 32 ); return; } } break; case 11: world_4B325C = 0; v173 = 30; while ( v2 >= screen_buf_end ) { v174 = 32 - v173; v175 = ((_BYTE)world_4B325C + 1) & 1; v176 = 32 - v173; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( v175 ) { for ( i = v174 >> 2; i; --i ) { v178 = *(_DWORD *)v6; v6 += 4; v179 = (_BYTE *)(v2 + 1); v178 = __ROR4__(v178, 8); *v179 = v178; v179 += 2; v175 = __ROR4__(v178, 16); *v179 = v175; v2 = (unsigned int)(v179 + 1); } v180 = v176 & 2; if ( v180 ) { _LOWORD(v175) = *(_WORD *)v6; v6 += 4; v181 = (_BYTE *)(v2 + 1); *v181 = __ROR4__(v175, 8); v2 = (unsigned int)(v181 + 1); } } else { for ( j = v174 >> 2; j; --j ) { v183 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v183; v184 = (_BYTE *)(v2 + 2); *v184 = __ROR4__(v183, 16); v2 = (unsigned int)(v184 + 2); } v180 = v176 & 2; if ( v180 ) { v185 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v185; v2 += 2; } } v2 = v173 + v2 - 800; v48 = __OFSUB__(v173, 2); v173 -= 2; if ( (v173 < 0) ^ v48 ) { v186 = 2; do { if ( v2 < screen_buf_end ) break; v187 = 32 - v186; v188 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { for ( k = v187 >> 2; k; --k ) { v190 = *(_DWORD *)v6; v6 += 4; v191 = (_BYTE *)(v2 + 1); v190 = __ROR4__(v190, 8); *v191 = v190; v191 += 2; v188 = __ROR4__(v190, 16); *v191 = v188; v2 = (unsigned int)(v191 + 1); } v180 &= 2u; if ( v180 ) { _LOWORD(v188) = *(_WORD *)v6; v6 += 4; v192 = (_BYTE *)(v2 + 1); *v192 = __ROR4__(v188, 8); v2 = (unsigned int)(v192 + 1); } } else { for ( l = v187 >> 2; l; --l ) { v194 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v194; v195 = (_BYTE *)(v2 + 2); *v195 = __ROR4__(v194, 16); v2 = (unsigned int)(v195 + 2); } v180 &= 2u; if ( v180 ) { v196 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v196; v2 += 2; } } v2 = v186 + v2 - 800; v186 += 2; } while ( v186 != 32 ); return; } } break; case 12: world_4B325C = 0; v197 = 30; while ( v2 >= screen_buf_end ) { v198 = (_BYTE *)(v197 + v2); v199 = 32 - v197; v200 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v201 = v199 >> 2; if ( !(v199 & 2) || (_LOWORD(v200) = *((_WORD *)v6 + 1), v6 += 4, v202 = v198 + 1, *v202 = __ROR4__(v200, 8), v198 = v202 + 1, v201) ) { do { v203 = *(_DWORD *)v6; v6 += 4; v204 = v198 + 1; v203 = __ROR4__(v203, 8); *v204 = v203; v204 += 2; *v204 = __ROR4__(v203, 16); v198 = v204 + 1; --v201; } while ( v201 ); } } else { v205 = v199 >> 2; if ( !(v199 & 2) || (v206 = *((_WORD *)v6 + 1), v6 += 4, *v198 = v206, v198 += 2, v205) ) { do { v207 = *(_DWORD *)v6; v6 += 4; *v198 = v207; v208 = v198 + 2; *v208 = __ROR4__(v207, 16); v198 = v208 + 2; --v205; } while ( v205 ); } } v2 = (unsigned int)(v198 - 800); v48 = __OFSUB__(v197, 2); v197 -= 2; if ( (v197 < 0) ^ v48 ) { v209 = 8; do { if ( v2 < screen_buf_end ) break; v210 = 8; do { v211 = *(_DWORD *)v6; v6 += 4; v212 = (_BYTE *)(v2 + 1); v211 = __ROR4__(v211, 8); *v212 = v211; v212 += 2; *v212 = __ROR4__(v211, 16); v2 = (unsigned int)(v212 + 1); --v210; } while ( v210 ); v213 = (_BYTE *)(v2 - 800); if ( (unsigned int)v213 < screen_buf_end ) break; v214 = 8; do { v215 = *(_DWORD *)v6; v6 += 4; *v213 = v215; v216 = v213 + 2; *v216 = __ROR4__(v215, 16); v213 = v216 + 2; --v214; } while ( v214 ); v2 = (unsigned int)(v213 - 800); --v209; } while ( v209 ); return; } } break; default: world_4B325C = 0; v217 = 30; while ( v2 >= screen_buf_end ) { v218 = 32 - v217; v219 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { for ( m = v218 >> 2; m; --m ) { v221 = *(_DWORD *)v6; v6 += 4; v222 = (_BYTE *)(v2 + 1); v221 = __ROR4__(v221, 8); *v222 = v221; v222 += 2; v219 = __ROR4__(v221, 16); *v222 = v219; v2 = (unsigned int)(v222 + 1); } if ( (32 - (_BYTE)v217) & 2 ) { _LOWORD(v219) = *(_WORD *)v6; v6 += 4; v223 = (_BYTE *)(v2 + 1); *v223 = __ROR4__(v219, 8); v2 = (unsigned int)(v223 + 1); } } else { for ( n = v218 >> 2; n; --n ) { v225 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v225; v226 = (_BYTE *)(v2 + 2); *v226 = __ROR4__(v225, 16); v2 = (unsigned int)(v226 + 2); } if ( (32 - (_BYTE)v217) & 2 ) { v227 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v227; v2 += 2; } } v2 = v217 + v2 - 800; v48 = __OFSUB__(v217, 2); v217 -= 2; if ( (v217 < 0) ^ v48 ) { v228 = 8; do { if ( v2 < screen_buf_end ) break; v229 = 8; do { v230 = *(_DWORD *)v6; v6 += 4; v231 = (_BYTE *)(v2 + 1); v230 = __ROR4__(v230, 8); *v231 = v230; v231 += 2; *v231 = __ROR4__(v230, 16); v2 = (unsigned int)(v231 + 1); --v229; } while ( v229 ); v232 = (_BYTE *)(v2 - 800); if ( (unsigned int)v232 < screen_buf_end ) break; v233 = 8; do { v234 = *(_DWORD *)v6; v6 += 4; *v232 = v234; v235 = v232 + 2; *v235 = __ROR4__(v234, 16); v232 = v235 + 2; --v233; } while ( v233 ); v2 = (unsigned int)(v232 - 800); --v228; } while ( v228 ); return; } } break; } return; } world_4B325C = (unsigned char)a1 & 1; v134 = 32; LABEL_251: v135 = 32; while ( 1 ) { while ( 1 ) { v136 = (unsigned char)*v6++; if ( (v136 & 0x80u) == 0 ) break; _LOBYTE(v136) = -(char)v136; v2 += v136; v135 -= v136; if ( !v135 ) { LABEL_271: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; if ( !--v134 ) return; goto LABEL_251; } } v135 -= v136; if ( v2 < screen_buf_end ) return; if ( (v2 & 1) == world_4B325C ) { v137 = v136 >> 1; if ( !(v136 & 1) ) goto LABEL_258; ++v6; ++v2; if ( v137 ) { LABEL_265: v23 = v137 & 1; v145 = v137 >> 1; if ( !v23 || (v146 = *v6, v6 += 2, *(_BYTE *)v2 = v146, v2 += 2, v145) ) { do { v147 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v147; v148 = (_BYTE *)(v2 + 2); *v148 = __ROR4__(v147, 16); v2 = (unsigned int)(v148 + 2); --v145; } while ( v145 ); } goto LABEL_268; } } else { v137 = v136 >> 1; if ( !(v136 & 1) ) goto LABEL_265; v144 = *v6++; *(_BYTE *)v2++ = v144; if ( v137 ) { LABEL_258: v23 = v137 & 1; v138 = v137 >> 1; if ( !v23 || (v139 = v6 + 1, v140 = (_BYTE *)(v2 + 1), v141 = *v139, v6 = v139 + 1, *v140 = v141, v2 = (unsigned int)(v140 + 1), v138) ) { do { v142 = *(_DWORD *)v6; v6 += 4; v143 = (_BYTE *)(v2 + 1); v142 = __ROR4__(v142, 8); *v143 = v142; v143 += 2; *v143 = __ROR4__(v142, 16); v2 = (unsigned int)(v143 + 1); --v138; } while ( v138 ); } goto LABEL_268; } } LABEL_268: if ( !v135 ) goto LABEL_271; } } if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v9 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v10 = level_cel_block; _LOBYTE(v10) = BYTE1(v10); v11 = (v10 >> 4) & 7; if ( !v11 ) { v236 = 16; do { if ( v2 < screen_buf_end ) break; v237 = 8; do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v237; } while ( v237 ); v238 = (_BYTE *)(v2 - 800); if ( (unsigned int)v238 < screen_buf_end ) break; v239 = 8; do { *v238 = 0; v238[2] = 0; v238 += 4; --v239; } while ( v239 ); v2 = (unsigned int)(v238 - 800); --v236; } while ( v236 ); return; } switch ( (_WORD)v11 ) { case 1: world_4B325C = (unsigned char)a1 & 1; v240 = 32; while ( 1 ) { v241 = 32; do { while ( 1 ) { v242 = *v9++; if ( (v242 & 0x80u) != 0 ) break; v241 -= v242; if ( v2 < screen_buf_end ) return; v9 += v242; if ( (v2 & 1) == world_4B325C ) { v243 = v242 >> 1; if ( !(v242 & 1) ) goto LABEL_378; ++v2; if ( v243 ) { LABEL_385: v23 = v243 & 1; v246 = v243 >> 1; if ( !v23 || (*(_BYTE *)v2 = 0, v2 += 2, v246) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v246; } while ( v246 ); } goto LABEL_388; } } else { v243 = v242 >> 1; if ( !(v242 & 1) ) goto LABEL_385; *(_BYTE *)v2++ = 0; if ( v243 ) { LABEL_378: v23 = v243 & 1; v244 = v243 >> 1; if ( !v23 || (v245 = (_BYTE *)(v2 + 1), *v245 = 0, v2 = (unsigned int)(v245 + 1), v244) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v244; } while ( v244 ); } goto LABEL_388; } } LABEL_388: if ( !v241 ) goto LABEL_391; } _LOBYTE(v242) = -(char)v242; v2 += v242; v241 -= v242; } while ( v241 ); LABEL_391: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; if ( !--v240 ) return; } case 2: world_4B325C = 0; for ( ii = 30; ; ii -= 2 ) { if ( v2 < screen_buf_end ) return; v248 = (_BYTE *)(ii + v2); v249 = 32 - ii; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v250 = v249 >> 2; if ( !(v249 & 2) || (v251 = v248 + 1, *v251 = 0, v248 = v251 + 1, v250) ) { do { v248[1] = 0; v248[3] = 0; v248 += 4; --v250; } while ( v250 ); } } else { v252 = v249 >> 2; if ( !(v249 & 2) || (*v248 = 0, v248 += 2, v252) ) { do { *v248 = 0; v248[2] = 0; v248 += 4; --v252; } while ( v252 ); } } v2 = (unsigned int)(v248 - 800); if ( !ii ) break; } v253 = 2; do { if ( v2 < screen_buf_end ) break; v254 = (_BYTE *)(v253 + v2); v255 = 32 - v253; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v256 = v255 >> 2; if ( !(v255 & 2) || (v257 = v254 + 1, *v257 = 0, v254 = v257 + 1, v256) ) { do { v254[1] = 0; v254[3] = 0; v254 += 4; --v256; } while ( v256 ); } } else { v258 = v255 >> 2; if ( !(v255 & 2) || (*v254 = 0, v254 += 2, v258) ) { do { *v254 = 0; v254[2] = 0; v254 += 4; --v258; } while ( v258 ); } } v2 = (unsigned int)(v254 - 800); v253 += 2; } while ( v253 != 32 ); break; case 3: world_4B325C = 0; for ( jj = 30; ; jj -= 2 ) { if ( v2 < screen_buf_end ) return; v260 = 32 - jj; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v261 = v260 >> 2; if ( !(v260 & 2) || (v262 = (_BYTE *)(v2 + 1), *v262 = 0, v2 = (unsigned int)(v262 + 1), v261) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v261; } while ( v261 ); } } else { v263 = v260 >> 2; if ( !(v260 & 2) || (*(_BYTE *)v2 = 0, v2 += 2, v263) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v263; } while ( v263 ); } } v264 = (_BYTE *)(v2 - 800); if ( !jj ) break; v2 = (unsigned int)&v264[jj]; } v265 = 2; do { if ( (unsigned int)v264 < screen_buf_end ) break; v266 = 32 - v265; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v267 = v266 >> 2; if ( !(v266 & 2) || (v268 = v264 + 1, *v268 = 0, v264 = v268 + 1, v267) ) { do { v264[1] = 0; v264[3] = 0; v264 += 4; --v267; } while ( v267 ); } } else { v269 = v266 >> 2; if ( !(v266 & 2) || (*v264 = 0, v264 += 2, v269) ) { do { *v264 = 0; v264[2] = 0; v264 += 4; --v269; } while ( v269 ); } } v264 = &v264[v265 - 800]; v265 += 2; } while ( v265 != 32 ); break; case 4: world_4B325C = 0; for ( kk = 30; ; kk -= 2 ) { if ( v2 < screen_buf_end ) return; v271 = (_BYTE *)(kk + v2); v272 = 32 - kk; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v273 = v272 >> 2; if ( !(v272 & 2) || (v274 = v271 + 1, *v274 = 0, v271 = v274 + 1, v273) ) { do { v271[1] = 0; v271[3] = 0; v271 += 4; --v273; } while ( v273 ); } } else { v275 = v272 >> 2; if ( !(v272 & 2) || (*v271 = 0, v271 += 2, v275) ) { do { *v271 = 0; v271[2] = 0; v271 += 4; --v275; } while ( v275 ); } } v2 = (unsigned int)(v271 - 800); if ( !kk ) break; } v276 = 8; do { if ( v2 < screen_buf_end ) break; v277 = 8; do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v277; } while ( v277 ); v278 = (_BYTE *)(v2 - 800); if ( (unsigned int)v278 < screen_buf_end ) break; v279 = 8; do { *v278 = 0; v278[2] = 0; v278 += 4; --v279; } while ( v279 ); v2 = (unsigned int)(v278 - 800); --v276; } while ( v276 ); break; default: world_4B325C = 0; for ( ll = 30; ; ll -= 2 ) { if ( v2 < screen_buf_end ) return; v281 = 32 - ll; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v282 = v281 >> 2; if ( !(v281 & 2) || (v283 = (_BYTE *)(v2 + 1), *v283 = 0, v2 = (unsigned int)(v283 + 1), v282) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v282; } while ( v282 ); } } else { v284 = v281 >> 2; if ( !(v281 & 2) || (*(_BYTE *)v2 = 0, v2 += 2, v284) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v284; } while ( v284 ); } } v285 = v2 - 800; if ( !ll ) break; v2 = ll + v285; } v286 = 8; do { if ( v285 < screen_buf_end ) break; v287 = 8; do { *(_BYTE *)(v285 + 1) = 0; *(_BYTE *)(v285 + 3) = 0; v285 += 4; --v287; } while ( v287 ); v288 = (_BYTE *)(v285 - 800); if ( (unsigned int)v288 < screen_buf_end ) break; v289 = 8; do { *v288 = 0; v288[2] = 0; v288 += 4; --v289; } while ( v289 ); v285 = (unsigned int)(v288 - 800); --v286; } while ( v286 ); break; } } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; //----- (0046468D) -------------------------------------------------------- void __fastcall drawBottomArchesUpperScreen(void *a1, int a2) { char *v2; // edi char *v3; // esi short v5; // ax char *v6; // esi short v7; // ax unsigned int v8; // eax unsigned char *v9; // esi unsigned int v10; // eax int v11; // eax int v12; // edx int v13; // edx signed int v14; // ecx int v18; // ecx signed int v19; // edx int v20; // eax int v21; // edx int v22; // ecx int v23; // edx signed int v26; // edx char *v27; // edi unsigned int v28; // ecx unsigned char v31; // of signed int v32; // edx char *v33; // edi unsigned int v34; // ecx signed int v37; // edx unsigned int l; // ecx signed int v41; // edx unsigned int m; // ecx signed int v45; // edx char *v46; // edi unsigned int v47; // ecx int v50; // edx int v51; // edx signed int v52; // ecx signed int v55; // edx unsigned int n; // ecx int v59; // edx int v60; // edx signed int v61; // ecx int v64; // edx int v65; // edx signed int v66; // ecx char v67; // al int v68; // ecx signed int v69; // edx int v70; // eax int v71; // edx int v72; // edx int v73; // ecx char v74; // al signed int v75; // edx char *v76; // edi unsigned int v77; // ecx short v78; // ax int v79; // eax signed int v80; // edx char *v81; // edi unsigned int v82; // ecx short v83; // ax int v84; // eax signed int v85; // edx unsigned int i; // ecx int v87; // eax short v88; // ax signed int v89; // edx unsigned int j; // ecx int v91; // eax short v92; // ax signed int v93; // edx char *v94; // edi unsigned int v95; // ecx short v96; // ax int v97; // eax int v98; // edx int v99; // edx signed int v100; // ecx char v101; // al signed int v102; // edx unsigned int k; // ecx int v104; // eax short v105; // ax int v106; // edx int v107; // edx signed int v108; // ecx char v109; // al int v110; // edx int v111; // edx signed int v112; // ecx int v113; // ecx signed int v114; // edx int v115; // eax int v116; // edx int v117; // edx int v118; // ecx signed int v119; // edx char *v120; // edi unsigned int v121; // ecx signed int v122; // edx char *v123; // edi unsigned int v124; // ecx signed int v125; // edx unsigned int v126; // ecx char *v127; // edi signed int v128; // edx unsigned int v129; // ecx signed int v130; // edx char *v131; // edi unsigned int v132; // ecx int v133; // edx int v134; // edx signed int v135; // ecx signed int v136; // edx unsigned int v137; // ecx char *v138; // edi int v139; // edx int v140; // edx signed int v141; // ecx int v142; // [esp-8h] [ebp-14h] int v143; // [esp-8h] [ebp-14h] int v144; // [esp-8h] [ebp-14h] int v145; // [esp-8h] [ebp-14h] int v146; // [esp-8h] [ebp-14h] int v147; // [esp-4h] [ebp-10h] int v148; // [esp-4h] [ebp-10h] int v149; // [esp-4h] [ebp-10h] int v150; // [esp-4h] [ebp-10h] int v151; // [esp-4h] [ebp-10h] int v152; // [esp-4h] [ebp-10h] int v153; // [esp-4h] [ebp-10h] int v154; // [esp-4h] [ebp-10h] int v155; // [esp-4h] [ebp-10h] int v156; // [esp-4h] [ebp-10h] int _EAX; char *_EBX; world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v2 = (char *)a1; world_4B3269[0] = a2; if ( !(_BYTE)light_table_index ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v6 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v8 = level_cel_block; _LOBYTE(v8) = BYTE1(v8); v7 = ((v8 >> 4) & 7) + 8; LABEL_12: switch ( v7 ) { case 8: v64 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) break; v150 = v64; v65 = *(_DWORD *)world_4B3269[0]; v66 = 32; do { v67 = *v6++; v65 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = v67; ++v2; --v66; } while ( v66 ); v2 -= 800; world_4B3269[0] -= 4; v64 = v150 - 1; } while ( v150 != 1 ); break; case 9: v68 = 32; do { v151 = v68; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v69 = 32; do { while ( 1 ) { v70 = (unsigned char)*v6++; if ( (v70 & 0x80u) == 0 ) break; _LOBYTE(v70) = -(char)v70; v2 += v70; if ( v70 & 0x1F ) *(_DWORD *)world_4B3260 <<= v70 & 0x1F; v69 -= v70; if ( !v69 ) goto LABEL_129; } v71 = v69 - v70; if ( (unsigned int)v2 < screen_buf_end ) return; v144 = v71; v72 = *(_DWORD *)world_4B3260; v73 = v70; do { v74 = *v6++; v72 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = v74; ++v2; --v73; } while ( v73 ); *(_DWORD *)world_4B3260 = v72; v69 = v144; } while ( v144 ); LABEL_129: v2 -= 800; world_4B3269[0] -= 4; v68 = v151 - 1; } while ( v151 != 1 ); break; case 10: v75 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v76 = &v2[v75]; v77 = (unsigned int)(32 - v75) >> 2; if ( !((32 - v75) & 2) || (v78 = *((_WORD *)v6 + 1), v6 += 4, *(_WORD *)v76 = v78, v76 += 2, v77) ) { do { v79 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v76 = v79; --v77; v76 += 4; } while ( v77 ); } v2 = v76 - 800; v31 = __OFSUB__(v75, 2); v75 -= 2; if ( (v75 < 0) ^ v31 ) { v80 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) break; v81 = &v2[v80]; v82 = (unsigned int)(32 - v80) >> 2; if ( ((32 - v80) & 2) ) { v83 = *((_WORD *)v6 + 1); v6 += 4; *(_WORD *)v81 = v83; v81 += 2; } if(v82) { do { v84 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v81 = v84; v81 += 4; --v82; } while ( v82 ); } v2 = v81 - 800; v80 += 2; } while ( v80 != 32 ); return; } } break; case 11: v85 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { for ( i = (unsigned int)(32 - v85) >> 2; i; --i ) { v87 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v87; v2 += 4; } if ( (32 - (_BYTE)v85) & 2 ) { v88 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v88; v2 += 2; } v2 = &v2[v85 - 800]; v31 = __OFSUB__(v85, 2); v85 -= 2; if ( (v85 < 0) ^ v31 ) { v89 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) break; for ( j = (unsigned int)(32 - v89) >> 2; j; --j ) { v91 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v91; v2 += 4; } if ( (32 - (_BYTE)v89) & 2 ) { v92 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v92; v2 += 2; } v2 = &v2[v89 - 800]; v89 += 2; } while ( v89 != 32 ); return; } } break; case 12: v93 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v94 = &v2[v93]; v95 = (unsigned int)(32 - v93) >> 2; if ( !((32 - v93) & 2) || (v96 = *((_WORD *)v6 + 1), v6 += 4, *(_WORD *)v94 = v96, v94 += 2, v95) ) { do { v97 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v94 = v97; v94 += 4; --v95; } while ( v95 ); } v2 = v94 - 800; v31 = __OFSUB__(v93, 2); v93 -= 2; if ( (v93 < 0) ^ v31 ) { world_4B3269[0] -= 64; v98 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) break; v152 = v98; v99 = *(_DWORD *)world_4B3269[0]; v100 = 32; do { v101 = *v6++; v99 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = v101; ++v2; --v100; } while ( v100 ); v2 -= 800; world_4B3269[0] -= 4; v98 = v152 - 1; } while ( v152 != 1 ); return; } } break; default: v102 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { for ( k = (unsigned int)(32 - v102) >> 2; k; --k ) { v104 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v104; v2 += 4; } if ( (32 - (_BYTE)v102) & 2 ) { v105 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v105; v2 += 2; } v2 = &v2[v102 - 800]; v31 = __OFSUB__(v102, 2); v102 -= 2; if ( (v102 < 0) ^ v31 ) { world_4B3269[0] -= 64; v106 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) break; v145 = v106; v107 = *(_DWORD *)world_4B3269[0]; v108 = 32; do { v109 = *v6++; v107 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = v109; ++v2; --v108; } while ( v108 ); v6 += (unsigned char)v6 & 2; v2 -= 800; world_4B3269[0] -= 4; v106 = v145 - 1; } while ( v145 != 1 ); return; } } break; } return; } if ( (_BYTE)light_table_index != lightmax ) { if ( !(level_cel_block & 0x8000) ) { v3 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); _EBX = &pLightTbl[256 * light_table_index]; v5 = (unsigned char)(BYTE1(level_cel_block) >> 4); if ( !(BYTE1(level_cel_block) >> 4) ) { v12 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) break; v147 = v12; v13 = *(_DWORD *)world_4B3269[0]; v14 = 32; do { _EAX = *v3++; v13 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v14; } while ( v14 ); v2 -= 800; world_4B3269[0] -= 4; v12 = v147 - 1; } while ( v147 != 1 ); return; } if ( BYTE1(level_cel_block) >> 4 ) { switch ( v5 ) { case 1: v18 = 32; do { v148 = v18; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v19 = 32; do { while ( 1 ) { v20 = (unsigned char)*v3++; if ( (v20 & 0x80u) == 0 ) break; _LOBYTE(v20) = -(char)v20; v2 += v20; if ( v20 & 0x1F ) *(_DWORD *)world_4B3260 <<= v20 & 0x1F; v19 -= v20; if ( !v19 ) goto LABEL_50; } v21 = v19 - v20; if ( (unsigned int)v2 < screen_buf_end ) return; v22 = v20; v142 = v21; v23 = *(_DWORD *)world_4B3260; do { _EAX = *v3++; v23 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v22; } while ( v22 ); *(_DWORD *)world_4B3260 = v23; v19 = v142; } while ( v142 ); LABEL_50: v2 -= 800; world_4B3269[0] -= 4; v18 = v148 - 1; } while ( v148 != 1 ); break; case 2: v26 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v27 = &v2[v26]; v28 = (unsigned int)(32 - v26) >> 2; if ( !((32 - v26) & 2) ) goto LABEL_268; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v27 = __ROR2__(_EAX, 8); v27 += 2; if ( v28 ) { LABEL_268: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v27 = __ROR4__(_EAX, 8); v27 += 4; --v28; } while ( v28 ); } v2 = v27 - 800; v31 = __OFSUB__(v26, 2); v26 -= 2; if ( (v26 < 0) ^ v31 ) { v32 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) break; v33 = &v2[v32]; v34 = (unsigned int)(32 - v32) >> 2; if ( !((32 - v32) & 2) ) goto LABEL_269; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v33 = __ROR2__(_EAX, 8); v33 += 2; if ( v34 ) { LABEL_269: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v33 = __ROR4__(_EAX, 8); v33 += 4; --v34; } while ( v34 ); } v2 = v33 - 800; v32 += 2; } while ( v32 != 32 ); return; } } break; case 3: v37 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { for ( l = (unsigned int)(32 - v37) >> 2; l; --l ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v37) & 2 ) { _EAX = *(_WORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v37 - 800]; v31 = __OFSUB__(v37, 2); v37 -= 2; if ( (v37 < 0) ^ v31 ) { v41 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) break; for ( m = (unsigned int)(32 - v41) >> 2; m; --m ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v41) & 2 ) { _EAX = *(_WORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v41 - 800]; v41 += 2; } while ( v41 != 32 ); return; } } break; case 4: v45 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v46 = &v2[v45]; v47 = (unsigned int)(32 - v45) >> 2; if ( !((32 - v45) & 2) ) goto LABEL_270; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v46 = __ROR2__(_EAX, 8); v46 += 2; if ( v47 ) { LABEL_270: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v46 = __ROR4__(_EAX, 8); v46 += 4; --v47; } while ( v47 ); } v2 = v46 - 800; v31 = __OFSUB__(v45, 2); v45 -= 2; if ( (v45 < 0) ^ v31 ) { world_4B3269[0] -= 64; v50 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) break; v149 = v50; v51 = *(_DWORD *)world_4B3269[0]; v52 = 32; v3 += (unsigned char)v3 & 2; do { _EAX = *v3++; v51 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v52; } while ( v52 ); v2 -= 800; world_4B3269[0] -= 4; v50 = v149 - 1; } while ( v149 != 1 ); return; } } break; default: v55 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { for ( n = (unsigned int)(32 - v55) >> 2; n; --n ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v55) & 2 ) { _EAX = *(_WORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v55 - 800]; v31 = __OFSUB__(v55, 2); v55 -= 2; if ( (v55 < 0) ^ v31 ) { world_4B3269[0] -= 64; v59 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) break; v143 = v59; v60 = *(_DWORD *)world_4B3269[0]; v61 = 32; do { _EAX = *v3++; v60 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v61; } while ( v61 ); v3 += (unsigned char)v3 & 2; v2 -= 800; world_4B3269[0] -= 4; v59 = v143 - 1; } while ( v143 != 1 ); return; } } break; } return; } LABEL_187: v110 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) break; v153 = v110; v111 = *(_DWORD *)world_4B3269[0]; v112 = 32; do { v111 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = 0; ++v2; --v112; } while ( v112 ); v2 -= 800; world_4B3269[0] -= 4; v110 = v153 - 1; } while ( v153 != 1 ); return; } v6 = (char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v7 = (unsigned char)(BYTE1(level_cel_block) >> 4); goto LABEL_12; } if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v9 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v10 = level_cel_block; _LOBYTE(v10) = BYTE1(v10); v11 = (v10 >> 4) & 7; if ( !v11 ) goto LABEL_187; switch ( (_WORD)v11 ) { case 1: v113 = 32; do { v154 = v113; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v114 = 32; do { while ( 1 ) { v115 = *v9++; if ( (v115 & 0x80u) == 0 ) break; _LOBYTE(v115) = -(char)v115; v2 += v115; if ( v115 & 0x1F ) *(_DWORD *)world_4B3260 <<= v115 & 0x1F; v114 -= v115; if ( !v114 ) goto LABEL_208; } v116 = v114 - v115; if ( (unsigned int)v2 < screen_buf_end ) return; v146 = v116; v117 = *(_DWORD *)world_4B3260; v118 = v115; v9 += v115; do { v117 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = 0; ++v2; --v118; } while ( v118 ); *(_DWORD *)world_4B3260 = v117; v114 = v146; } while ( v146 ); LABEL_208: v2 -= 800; world_4B3269[0] -= 4; v113 = v154 - 1; } while ( v154 != 1 ); break; case 2: v119 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v120 = &v2[v119]; v121 = (unsigned int)(32 - v119) >> 2; if ( !((32 - v119) & 2) || (*(_WORD *)v120 = 0, v120 += 2, v121) ) { do { *(_DWORD *)v120 = 0; v120 += 4; --v121; } while ( v121 ); } v2 = v120 - 800; if ( !v119 ) { v122 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) break; v123 = &v2[v122]; v124 = (unsigned int)(32 - v122) >> 2; if ( ((32 - v122) & 2) ) { *(_WORD *)v123 = 0; v123 += 2; } if(v124) { do { *(_DWORD *)v123 = 0; v123 += 4; --v124; } while ( v124 ); } v2 = v123 - 800; v122 += 2; } while ( v122 != 32 ); return; } v119 -= 2; } break; case 3: v125 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v126 = (unsigned int)(32 - v125) >> 2; if ( !((32 - v125) & 2) || (*(_WORD *)v2 = 0, v2 += 2, v126) ) { do { *(_DWORD *)v2 = 0; v2 += 4; --v126; } while ( v126 ); } v127 = v2 - 800; if ( !v125 ) { v128 = 2; do { if ( (unsigned int)v127 < screen_buf_end ) break; v129 = (unsigned int)(32 - v128) >> 2; if ( ((32 - v128) & 2) ) { *(_WORD *)v127 = 0; v127 += 2; } if(v129) { do { *(_DWORD *)v127 = 0; v127 += 4; --v129; } while ( v129 ); } v127 = &v127[v128 - 800]; v128 += 2; } while ( v128 != 32 ); return; } v2 = &v127[v125]; v125 -= 2; } break; case 4: v130 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v131 = &v2[v130]; v132 = (unsigned int)(32 - v130) >> 2; if ( !((32 - v130) & 2) || (*(_WORD *)v131 = 0, v131 += 2, v132) ) { do { *(_DWORD *)v131 = 0; v131 += 4; --v132; } while ( v132 ); } v2 = v131 - 800; if ( !v130 ) { world_4B3269[0] -= 64; v133 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) break; v155 = v133; v134 = *(_DWORD *)world_4B3269[0]; v135 = 32; do { v134 *= 2; if ( (unsigned int)v2 >= screen_buf_end ) *v2 = 0; ++v2; --v135; } while ( v135 ); v2 -= 800; world_4B3269[0] -= 4; v133 = v155 - 1; } while ( v155 != 1 ); return; } v130 -= 2; } break; default: v136 = 30; while ( (unsigned int)v2 >= screen_buf_end ) { v137 = (unsigned int)(32 - v136) >> 2; if ( !((32 - v136) & 2) || (*(_WORD *)v2 = 0, v2 += 2, v137) ) { do { *(_DWORD *)v2 = 0; v2 += 4; --v137; } while ( v137 ); } v138 = v2 - 800; if ( !v136 ) { world_4B3269[0] -= 64; v139 = 16; do { if ( (unsigned int)v138 < screen_buf_end ) break; v156 = v139; v140 = *(_DWORD *)world_4B3269[0]; v141 = 32; do { v140 *= 2; if ( (unsigned int)v138 >= screen_buf_end ) *v138 = 0; ++v138; --v141; } while ( v141 ); v138 -= 800; world_4B3269[0] -= 4; v139 = v156 - 1; } while ( v156 != 1 ); return; } v2 = &v138[v136]; v136 -= 2; } break; } } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; //----- (004652C5) -------------------------------------------------------- void __fastcall drawUpperScreen(void *a1) { char v1; // edx char v2; // al char v3; // al char *v4; // edi _BYTE *v5; // esi char *v6; // ebx short v7; // ax char *v8; // esi short v9; // ax unsigned int v10; // eax unsigned char *v11; // esi unsigned int v12; // eax char v13; // edx char v14; // cl int v15; // eax char v16; // ch char v17; // ch char v18; // ch signed int v19; // ebp signed int v20; // edx int v21; // eax char v22; // edx char v23; // cl int v24; // eax char v25; // ch char v26; // ch char v27; // ch signed int v28; // ebp char *v29; // edi char v30; // cl char v31; // edx int v32; // eax char v33; // ch char v34; // ch char v35; // ch unsigned char v36; // of signed int v37; // ebp char *v38; // edi char v39; // cl char v40; // edx int v41; // eax char v42; // ch char v43; // ch char v44; // ch signed int v45; // ebp char m; // cl int v47; // eax char v48; // ch char v49; // ch char v50; // ch signed int v51; // ebp char n; // cl int v53; // eax char v54; // ch char v55; // ch char v56; // ch signed int v57; // ebp char *v58; // edi char v59; // cl char v60; // edx int v61; // eax char v62; // ch char v63; // ch char v64; // ch signed int v65; // ebp char v66; // cl int v67; // eax char v68; // ch char v69; // ch char v70; // ch signed int v71; // ebp char ii; // cl int v73; // eax char v74; // ch char v75; // ch char v76; // ch signed int v77; // ebp char v78; // cl int v79; // eax char v80; // ch char v81; // ch char v82; // ch signed int v83; // edx signed int v84; // ecx int v85; // eax signed int v86; // ebp signed int v87; // edx unsigned int v88; // eax unsigned int v89; // ecx char v90; // al char v91; // cf unsigned int v92; // ecx short v93; // ax int v94; // eax signed int v95; // edx char *v96; // edi unsigned int v97; // ecx short v98; // ax int v99; // eax signed int v100; // edx char *v101; // edi unsigned int v102; // ecx short v103; // ax int v104; // eax signed int v105; // edx unsigned int i; // ecx int v107; // eax short v108; // ax signed int v109; // edx unsigned int j; // ecx int v111; // eax short v112; // ax signed int v113; // edx char *v114; // edi unsigned int v115; // ecx short v116; // ax int v117; // eax signed int v118; // edx signed int v119; // ecx int v120; // eax signed int v121; // edx unsigned int k; // ecx int v123; // eax short v124; // ax signed int v125; // edx signed int v126; // ecx int v127; // eax signed int v128; // edx signed int v129; // ecx signed int v130; // ebp signed int v131; // edx unsigned int v132; // eax unsigned int v133; // ecx unsigned int v134; // ecx signed int v135; // edx char *v136; // edi unsigned int v137; // ecx signed int v138; // edx char *v139; // edi unsigned int v140; // ecx signed int v141; // edx unsigned int v142; // ecx char *v143; // edi signed int v144; // edx unsigned int v145; // ecx signed int v146; // edx char *v147; // edi unsigned int v148; // ecx signed int v149; // edx signed int v150; // ecx signed int v151; // edx unsigned int v152; // ecx char *v153; // edi signed int v154; // edx signed int v155; // ecx int l; // [esp-14h] [ebp-18h] int v157; // [esp-10h] [ebp-14h] v1 = cel_transparency_active; if ( cel_transparency_active ) { if ( !arch_draw_type ) { drawTopArchesUpperScreen(a1); return; } if ( arch_draw_type == 1 ) { v2 = block_lvid[level_piece_id]; if ( v2 == 1 || v2 == 3 ) { drawBottomArchesUpperScreen(a1, (int)&tile_draw_masks[1][31]); return; } } if ( arch_draw_type == 2 ) { v3 = block_lvid[level_piece_id]; if ( v3 == 2 || v3 == 3 ) { drawBottomArchesUpperScreen(a1, (int)&tile_draw_masks[0][31]); return; } } } world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v4 = (char *)a1; if ( !(_BYTE)light_table_index ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v8 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v10 = level_cel_block; _LOBYTE(v10) = BYTE1(v10); v9 = ((v10 >> 4) & 7) + 8; LABEL_22: switch ( v9 ) { case 8: v83 = 32; do { if ( (unsigned int)v4 < screen_buf_end ) break; v84 = 8; do { v85 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v85; v4 += 4; --v84; } while ( v84 ); v4 -= 800; --v83; } while ( v83 ); break; case 9: v86 = 32; do { v87 = 32; do { while ( 1 ) { v88 = (unsigned char)*v8++; if ( (v88 & 0x80u) == 0 ) break; _LOBYTE(v88) = -(char)v88; v4 += v88; v87 -= v88; if ( !v87 ) goto LABEL_133; } v87 -= v88; if ( (unsigned int)v4 < screen_buf_end ) return; v89 = v88 >> 1; if ( v88 & 1 ) { v90 = *v8++; *v4++ = v90; if ( !v89 ) continue; } v91 = v89 & 1; v92 = v89 >> 1; if ( v91 ) { v93 = *(_WORD *)v8; v8 += 2; *(_WORD *)v4 = v93; v4 += 2; if ( !v92 ) continue; } do { v94 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v94; v4 += 4; --v92; } while ( v92 ); } while ( v87 ); LABEL_133: v4 -= 800; --v86; } while ( v86 ); break; case 10: v95 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v96 = &v4[v95]; v97 = (unsigned int)(32 - v95) >> 2; if ( !((32 - v95) & 2) || (v98 = *((_WORD *)v8 + 1), v8 += 4, *(_WORD *)v96 = v98, v96 += 2, v97) ) { do { v99 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v96 = v99; v96 += 4; --v97; } while ( v97 ); } v4 = v96 - 800; v36 = __OFSUB__(v95, 2); v95 -= 2; if ( (v95 < 0) ^ v36 ) { v100 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) break; v101 = &v4[v100]; v102 = (unsigned int)(32 - v100) >> 2; if ( ((32 - v100) & 2) ) { v103 = *((_WORD *)v8 + 1); v8 += 4; *(_WORD *)v101 = v103; v101 += 2; } if(v102) { do { v104 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v101 = v104; v101 += 4; --v102; } while ( v102 ); } v4 = v101 - 800; v100 += 2; } while ( v100 != 32 ); return; } } break; case 11: v105 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { for ( i = (unsigned int)(32 - v105) >> 2; i; --i ) { v107 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v107; v4 += 4; } if ( (32 - (_BYTE)v105) & 2 ) { v108 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v108; v4 += 2; } v4 = &v4[v105 - 800]; v36 = __OFSUB__(v105, 2); v105 -= 2; if ( (v105 < 0) ^ v36 ) { v109 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) break; for ( j = (unsigned int)(32 - v109) >> 2; j; --j ) { v111 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v111; v4 += 4; } if ( (32 - (_BYTE)v109) & 2 ) { v112 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v112; v4 += 2; } v4 = &v4[v109 - 800]; v109 += 2; } while ( v109 != 32 ); return; } } break; case 12: v113 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v114 = &v4[v113]; v115 = (unsigned int)(32 - v113) >> 2; if ( !((32 - v113) & 2) || (v116 = *((_WORD *)v8 + 1), v8 += 4, *(_WORD *)v114 = v116, v114 += 2, v115) ) { do { v117 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v114 = v117; v114 += 4; --v115; } while ( v115 ); } v4 = v114 - 800; v36 = __OFSUB__(v113, 2); v113 -= 2; if ( (v113 < 0) ^ v36 ) { v118 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) break; v119 = 8; do { v120 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v120; v4 += 4; --v119; } while ( v119 ); v4 -= 800; --v118; } while ( v118 ); return; } } break; default: v121 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { for ( k = (unsigned int)(32 - v121) >> 2; k; --k ) { v123 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v123; v4 += 4; } if ( (32 - (_BYTE)v121) & 2 ) { v124 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v124; v4 += 2; } v4 = &v4[v121 - 800]; v36 = __OFSUB__(v121, 2); v121 -= 2; if ( (v121 < 0) ^ v36 ) { v125 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) break; v126 = 8; do { v127 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v127; v4 += 4; --v126; } while ( v126 ); v4 -= 800; --v125; } while ( v125 ); return; } } break; } return; } if ( (_BYTE)light_table_index != lightmax ) { if ( !(level_cel_block & 0x8000) ) { v5 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v6 = &pLightTbl[256 * light_table_index]; v7 = (unsigned short)level_cel_block >> 12; if ( (unsigned short)level_cel_block >> 12 ) { switch ( v7 ) { case 1: v19 = 32; do { v20 = 32; do { while ( 1 ) { v21 = (unsigned char)*v5++; if ( (v21 & 0x80u) == 0 ) break; _LOBYTE(v21) = -(char)v21; v4 += v21; v20 -= v21; if ( !v20 ) goto LABEL_58; } v22 = v20 - v21; if ( (unsigned int)v4 < screen_buf_end ) return; v23 = v21; for ( l = v22; v23 >= 4; v23 -= 4 ) { v24 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v22) = v24; v25 = v6[v22]; _LOBYTE(v22) = BYTE1(v24); v24 = __ROR4__(v24, 16); *v4 = v25; v26 = v6[v22]; _LOBYTE(v22) = v24; v4[1] = v26; v27 = v6[v22]; _LOBYTE(v22) = BYTE1(v24); v4[2] = v27; v4[3] = v6[v22]; v4 += 4; } if ( v23 >= 2 ) { _LOBYTE(v22) = *v5; *v4 = v6[v22]; _LOBYTE(v22) = v5[1]; v4[1] = v6[v22]; v5 += 2; v4 += 2; } if ( v23 & 1 ) { _LOBYTE(v22) = *v5++; *v4++ = v6[v22]; } v20 = l; } while ( l ); LABEL_58: v4 -= 800; --v19; } while ( v19 ); break; case 2: v28 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v29 = &v4[v28]; v30 = 32 - v28; v31 = (32 - (_BYTE)v28) & 2; v5 += v31; if ( (char)(32 - v28) >= 4 ) { do { v32 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v31) = v32; v33 = v6[v31]; _LOBYTE(v31) = BYTE1(v32); v32 = __ROR4__(v32, 16); *v29 = v33; v34 = v6[v31]; _LOBYTE(v31) = v32; v29[1] = v34; v35 = v6[v31]; _LOBYTE(v31) = BYTE1(v32); v29[2] = v35; v29[3] = v6[v31]; v29 += 4; v30 -= 4; } while ( v30 >= 4 ); } if ( v30 >= 2 ) { _LOBYTE(v31) = *v5; *v29 = v6[v31]; _LOBYTE(v31) = v5[1]; v29[1] = v6[v31]; v5 += 2; v29 += 2; } v4 = v29 - 800; v36 = __OFSUB__(v28, 2); v28 -= 2; if ( (v28 < 0) ^ v36 ) { v37 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) break; v38 = &v4[v37]; v39 = 32 - v37; v40 = (32 - (_BYTE)v37) & 2; v5 += v40; if ( (char)(32 - v37) >= 4 ) { do { v41 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v40) = v41; v42 = v6[v40]; _LOBYTE(v40) = BYTE1(v41); v41 = __ROR4__(v41, 16); *v38 = v42; v43 = v6[v40]; _LOBYTE(v40) = v41; v38[1] = v43; v44 = v6[v40]; _LOBYTE(v40) = BYTE1(v41); v38[2] = v44; v38[3] = v6[v40]; v38 += 4; v39 -= 4; } while ( v39 >= 4 ); } if ( v39 >= 2 ) { _LOBYTE(v40) = *v5; *v38 = v6[v40]; _LOBYTE(v40) = v5[1]; v38[1] = v6[v40]; v5 += 2; v38 += 2; } v4 = v38 - 800; v37 += 2; } while ( v37 != 32 ); return; } } break; case 3: v45 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { for ( m = 32 - v45; m >= 4; m -= 4 ) { v47 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v47; v48 = v6[v1]; _LOBYTE(v1) = BYTE1(v47); v47 = __ROR4__(v47, 16); *v4 = v48; v49 = v6[v1]; _LOBYTE(v1) = v47; v4[1] = v49; v50 = v6[v1]; _LOBYTE(v1) = BYTE1(v47); v4[2] = v50; v4[3] = v6[v1]; v4 += 4; } if ( m >= 2 ) { _LOBYTE(v1) = *v5; *v4 = v6[v1]; _LOBYTE(v1) = v5[1]; v4[1] = v6[v1]; v5 += 2; v4 += 2; } v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v45 - 800]; v36 = __OFSUB__(v45, 2); v45 -= 2; if ( (v45 < 0) ^ v36 ) { v51 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) break; for ( n = 32 - v51; n >= 4; n -= 4 ) { v53 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v53; v54 = v6[v1]; _LOBYTE(v1) = BYTE1(v53); v53 = __ROR4__(v53, 16); *v4 = v54; v55 = v6[v1]; _LOBYTE(v1) = v53; v4[1] = v55; v56 = v6[v1]; _LOBYTE(v1) = BYTE1(v53); v4[2] = v56; v4[3] = v6[v1]; v4 += 4; } if ( n >= 2 ) { _LOBYTE(v1) = *v5; *v4 = v6[v1]; _LOBYTE(v1) = v5[1]; v4[1] = v6[v1]; v5 += 2; v4 += 2; } v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v51 - 800]; v51 += 2; } while ( v51 != 32 ); return; } } break; case 4: v57 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v58 = &v4[v57]; v59 = 32 - v57; v60 = (32 - (_BYTE)v57) & 2; v5 += v60; if ( (char)(32 - v57) >= 4 ) { do { v61 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v60) = v61; v62 = v6[v60]; _LOBYTE(v60) = BYTE1(v61); v61 = __ROR4__(v61, 16); *v58 = v62; v63 = v6[v60]; _LOBYTE(v60) = v61; v58[1] = v63; v64 = v6[v60]; _LOBYTE(v60) = BYTE1(v61); v58[2] = v64; v58[3] = v6[v60]; v58 += 4; v59 -= 4; } while ( v59 >= 4 ); } if ( v59 >= 2 ) { _LOBYTE(v60) = *v5; *v58 = v6[v60]; _LOBYTE(v60) = v5[1]; v58[1] = v6[v60]; v5 += 2; v58 += 2; } v4 = v58 - 800; v36 = __OFSUB__(v57, 2); v57 -= 2; if ( (v57 < 0) ^ v36 ) { v65 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) break; v66 = 32; do { v67 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v60) = v67; v68 = v6[v60]; _LOBYTE(v60) = BYTE1(v67); v67 = __ROR4__(v67, 16); *v4 = v68; v69 = v6[v60]; _LOBYTE(v60) = v67; v4[1] = v69; v70 = v6[v60]; _LOBYTE(v60) = BYTE1(v67); v4[2] = v70; v4[3] = v6[v60]; v4 += 4; v66 -= 4; } while ( v66 >= 4 ); v4 -= 800; --v65; } while ( v65 ); return; } } break; default: v71 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { for ( ii = 32 - v71; ii >= 4; ii -= 4 ) { v73 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v73; v74 = v6[v1]; _LOBYTE(v1) = BYTE1(v73); v73 = __ROR4__(v73, 16); *v4 = v74; v75 = v6[v1]; _LOBYTE(v1) = v73; v4[1] = v75; v76 = v6[v1]; _LOBYTE(v1) = BYTE1(v73); v4[2] = v76; v4[3] = v6[v1]; v4 += 4; } if ( ii >= 2 ) { _LOBYTE(v1) = *v5; *v4 = v6[v1]; _LOBYTE(v1) = v5[1]; v4[1] = v6[v1]; v5 += 2; v4 += 2; } v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v71 - 800]; v36 = __OFSUB__(v71, 2); v71 -= 2; if ( (v71 < 0) ^ v36 ) { v77 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) break; v78 = 32; do { v79 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v79; v80 = v6[v1]; _LOBYTE(v1) = BYTE1(v79); v79 = __ROR4__(v79, 16); *v4 = v80; v81 = v6[v1]; _LOBYTE(v1) = v79; v4[1] = v81; v82 = v6[v1]; _LOBYTE(v1) = BYTE1(v79); v4[2] = v82; v4[3] = v6[v1]; v4 += 4; v78 -= 4; } while ( v78 >= 4 ); v4 -= 800; --v77; } while ( v77 ); return; } } break; } } else { v13 = 32; do { if ( (unsigned int)v4 < screen_buf_end ) break; v14 = 32; v157 = v13; do { v15 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v13) = v15; v16 = v6[v13]; _LOBYTE(v13) = BYTE1(v15); v15 = __ROR4__(v15, 16); *v4 = v16; v17 = v6[v13]; _LOBYTE(v13) = v15; v4[1] = v17; v18 = v6[v13]; _LOBYTE(v13) = BYTE1(v15); v4[2] = v18; v4[3] = v6[v13]; v4 += 4; v14 -= 4; } while ( v14 >= 4 ); v4 -= 800; v13 = v157 - 1; } while ( v157 != 1 ); } return; } v8 = (char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v9 = (unsigned short)level_cel_block >> 12; goto LABEL_22; } if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v11 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v12 = ((unsigned int)level_cel_block >> 12) & 7; if ( v12 ) { switch ( (_WORD)v12 ) { case 1: v130 = 32; do { v131 = 32; do { while ( 1 ) { v132 = *v11++; if ( (v132 & 0x80u) == 0 ) break; _LOBYTE(v132) = -(char)v132; v4 += v132; v131 -= v132; if ( !v131 ) goto LABEL_205; } v131 -= v132; if ( (unsigned int)v4 < screen_buf_end ) return; v11 += v132; v133 = v132 >> 1; if ( v132 & 1 ) { *v4++ = 0; if ( !v133 ) continue; } v91 = v133 & 1; v134 = v132 >> 2; if ( v91 ) { *(_WORD *)v4 = 0; v4 += 2; if ( !v134 ) continue; } do { *(_DWORD *)v4 = 0; v4 += 4; --v134; } while ( v134 ); } while ( v131 ); LABEL_205: v4 -= 800; --v130; } while ( v130 ); break; case 2: v135 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v136 = &v4[v135]; v137 = (unsigned int)(32 - v135) >> 2; if ( !((32 - v135) & 2) || (*(_WORD *)v136 = 0, v136 += 2, v137) ) { do { *(_DWORD *)v136 = 0; v136 += 4; --v137; } while ( v137 ); } v4 = v136 - 800; if ( !v135 ) { v138 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) break; v139 = &v4[v138]; v140 = (unsigned int)(32 - v138) >> 2; if ( ((32 - v138) & 2) ) { *(_WORD *)v139 = 0; v139 += 2; } if(v140) { do { *(_DWORD *)v139 = 0; v139 += 4; --v140; } while ( v140 ); } v4 = v139 - 800; v138 += 2; } while ( v138 != 32 ); return; } v135 -= 2; } break; case 3: v141 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v142 = (unsigned int)(32 - v141) >> 2; if ( !((32 - v141) & 2) || (*(_WORD *)v4 = 0, v4 += 2, v142) ) { do { *(_DWORD *)v4 = 0; v4 += 4; --v142; } while ( v142 ); } v143 = v4 - 800; if ( !v141 ) { v144 = 2; do { if ( (unsigned int)v143 < screen_buf_end ) break; v145 = (unsigned int)(32 - v144) >> 2; if ( ((32 - v144) & 2) ) { *(_WORD *)v143 = 0; v143 += 2; } if(v145) { do { *(_DWORD *)v143 = 0; v143 += 4; --v145; } while ( v145 ); } v143 = &v143[v144 - 800]; v144 += 2; } while ( v144 != 32 ); return; } v4 = &v143[v141]; v141 -= 2; } break; case 4: v146 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v147 = &v4[v146]; v148 = (unsigned int)(32 - v146) >> 2; if ( !((32 - v146) & 2) || (*(_WORD *)v147 = 0, v147 += 2, v148) ) { do { *(_DWORD *)v147 = 0; v147 += 4; --v148; } while ( v148 ); } v4 = v147 - 800; if ( !v146 ) { v149 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) break; v150 = 8; do { *(_DWORD *)v4 = 0; v4 += 4; --v150; } while ( v150 ); v4 -= 800; --v149; } while ( v149 ); return; } v146 -= 2; } break; default: v151 = 30; while ( (unsigned int)v4 >= screen_buf_end ) { v152 = (unsigned int)(32 - v151) >> 2; if ( !((32 - v151) & 2) || (*(_WORD *)v4 = 0, v4 += 2, v152) ) { do { *(_DWORD *)v4 = 0; v4 += 4; --v152; } while ( v152 ); } v153 = v4 - 800; if ( !v151 ) { v154 = 16; do { if ( (unsigned int)v153 < screen_buf_end ) break; v155 = 8; do { *(_DWORD *)v153 = 0; v153 += 4; --v155; } while ( v155 ); v153 -= 800; --v154; } while ( v154 ); return; } v4 = &v153[v151]; v151 -= 2; } break; } } else { v128 = 32; do { if ( (unsigned int)v4 < screen_buf_end ) break; v129 = 8; do { *(_DWORD *)v4 = 0; v4 += 4; --v129; } while ( v129 ); v4 -= 800; --v128; } while ( v128 ); } } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; // 69CF20: using guessed type char arch_draw_type; // 69CF94: using guessed type int cel_transparency_active; // 69CF98: using guessed type int level_piece_id; //----- (00465F38) -------------------------------------------------------- void __fastcall drawTopArchesLowerScreen(void *a1) { char v1; // edx unsigned int v2; // edi _BYTE *v3; // esi char *v4; // ebx short v5; // ax char *v6; // esi short v7; // ax unsigned int v8; // eax char *v9; // esi unsigned int v10; // eax int v11; // eax signed int v12; // ebp signed int v13; // ecx unsigned int v14; // eax _BYTE *v15; // edi signed int v16; // ecx int v17; // eax int v18; // ecx signed int v19; // ebp unsigned int v20; // eax unsigned int v21; // ecx unsigned char v22; // cf unsigned int v23; // ecx unsigned int v24; // eax unsigned int v25; // ecx int v26; // eax unsigned int v27; // ecx unsigned int v28; // ecx int v29; // eax unsigned int v30; // ecx unsigned int v31; // eax int v32; // ebp signed int v33; // eax unsigned int v34; // ecx int v35; // eax _BYTE *v36; // edi unsigned int v37; // ecx char v38; // edx unsigned int v39; // ecx unsigned int v40; // ecx unsigned int v41; // eax unsigned int v42; // ecx int v43; // eax char v44; // edx unsigned int v45; // ecx unsigned int v46; // ecx int v47; // eax unsigned int v48; // ecx unsigned int v49; // eax unsigned char v50; // of int v51; // ebp signed int v52; // eax unsigned int v53; // ecx int v54; // eax _BYTE *v55; // edi unsigned int v56; // ecx char v57; // edx unsigned int v58; // ecx unsigned int v59; // ecx unsigned int v60; // eax unsigned int v61; // ecx int v62; // eax char v63; // edx unsigned int v64; // ecx unsigned int v65; // ecx int v66; // eax unsigned int v67; // ecx unsigned int v68; // eax int v69; // ebp signed int v70; // eax unsigned int v71; // ecx int v72; // eax unsigned int v73; // ecx unsigned int v74; // ecx unsigned int v75; // ecx unsigned int v76; // eax unsigned int v77; // ecx int v78; // eax unsigned int v79; // ecx unsigned int v80; // ecx int v81; // eax unsigned int v82; // ecx unsigned int v83; // eax int v84; // ebp signed int v85; // eax unsigned int v86; // ecx int v87; // eax unsigned int v88; // ecx unsigned int v89; // ecx unsigned int v90; // ecx unsigned int v91; // eax unsigned int v92; // ecx int v93; // eax unsigned int v94; // ecx unsigned int v95; // ecx int v96; // eax unsigned int v97; // ecx unsigned int v98; // eax int v99; // ebp signed int v100; // eax unsigned int v101; // ecx int v102; // eax _BYTE *v103; // edi unsigned int v104; // ecx unsigned int v105; // ecx unsigned int v106; // ecx unsigned int v107; // eax unsigned int v108; // ecx int v109; // eax unsigned int v110; // ecx unsigned int v111; // ecx int v112; // eax unsigned int v113; // ecx unsigned int v114; // eax signed int v115; // ebp signed int v116; // ecx unsigned int v117; // eax _BYTE *v118; // edi signed int v119; // ecx int v120; // eax int v121; // ebp signed int v122; // eax unsigned int v123; // ecx int v124; // eax unsigned int v125; // ecx unsigned int v126; // ecx unsigned int v127; // ecx unsigned int v128; // eax unsigned int v129; // ecx int v130; // eax unsigned int v131; // ecx unsigned int v132; // ecx int v133; // eax unsigned int v134; // ecx unsigned int v135; // eax signed int v136; // ebp signed int v137; // ecx unsigned int v138; // eax _BYTE *v139; // edi signed int v140; // ecx int v141; // eax signed int v142; // edx signed int v143; // ecx int v144; // eax _BYTE *v145; // edi _BYTE *v146; // edi signed int v147; // ecx int v148; // eax _BYTE *v149; // edi int v150; // ecx signed int v151; // edx unsigned int v152; // eax unsigned int v153; // ecx unsigned int v154; // ecx char *v155; // esi _BYTE *v156; // edi char v157; // al int v158; // eax _BYTE *v159; // edi char v160; // al unsigned int v161; // ecx char v162; // al int v163; // eax _BYTE *v164; // edi int v165; // edx signed int v166; // eax unsigned int v167; // ecx int v168; // eax _BYTE *v169; // edi unsigned int v170; // ecx int v171; // eax unsigned int v172; // ecx _BYTE *v173; // edi int v174; // eax _BYTE *v175; // edi unsigned int v176; // ecx short v177; // ax int v178; // eax _BYTE *v179; // edi int v180; // edx signed int v181; // eax unsigned int v182; // ecx int v183; // eax _BYTE *v184; // edi unsigned int v185; // ecx int v186; // eax unsigned int v187; // ecx _BYTE *v188; // edi int v189; // eax _BYTE *v190; // edi unsigned int v191; // ecx short v192; // ax int v193; // eax _BYTE *v194; // edi int v195; // edx signed int v196; // eax unsigned int v197; // ecx int v198; // eax unsigned int v199; // ecx int v200; // eax unsigned int ii; // ecx int v202; // eax _BYTE *v203; // edi _BYTE *v204; // edi unsigned int jj; // ecx int v206; // eax _BYTE *v207; // edi short v208; // ax int v209; // edx signed int v210; // eax unsigned int v211; // ecx int v212; // eax unsigned int v213; // ecx int v214; // eax unsigned int kk; // ecx int v216; // eax _BYTE *v217; // edi _BYTE *v218; // edi unsigned int ll; // ecx int v220; // eax _BYTE *v221; // edi short v222; // ax int v223; // edx signed int v224; // eax unsigned int v225; // ecx int v226; // eax _BYTE *v227; // edi unsigned int v228; // ecx int v229; // eax unsigned int v230; // ecx _BYTE *v231; // edi int v232; // eax _BYTE *v233; // edi unsigned int v234; // ecx short v235; // ax int v236; // eax _BYTE *v237; // edi signed int v238; // edx signed int v239; // ecx int v240; // eax _BYTE *v241; // edi _BYTE *v242; // edi signed int v243; // ecx int v244; // eax _BYTE *v245; // edi int v246; // edx signed int v247; // eax unsigned int v248; // ecx int v249; // eax unsigned int v250; // ecx int v251; // eax unsigned int m; // ecx int v253; // eax _BYTE *v254; // edi _BYTE *v255; // edi unsigned int n; // ecx int v257; // eax _BYTE *v258; // edi short v259; // ax signed int v260; // edx signed int v261; // ecx int v262; // eax _BYTE *v263; // edi _BYTE *v264; // edi signed int v265; // ecx int v266; // eax _BYTE *v267; // edi signed int v268; // edx signed int v269; // ecx _BYTE *v270; // edi signed int v271; // ecx int v272; // ecx signed int v273; // edx unsigned int v274; // eax unsigned int v275; // ecx unsigned int v276; // ecx _BYTE *v277; // edi unsigned int v278; // ecx signed int i; // edx _BYTE *v280; // edi unsigned int v281; // ecx unsigned int v282; // ecx _BYTE *v283; // edi unsigned int v284; // ecx signed int v285; // edx _BYTE *v286; // edi unsigned int v287; // ecx unsigned int v288; // ecx _BYTE *v289; // edi unsigned int v290; // ecx signed int j; // edx unsigned int v292; // ecx unsigned int v293; // ecx _BYTE *v294; // edi unsigned int v295; // ecx _BYTE *v296; // edi signed int v297; // edx unsigned int v298; // ecx unsigned int v299; // ecx _BYTE *v300; // edi unsigned int v301; // ecx signed int k; // edx _BYTE *v303; // edi unsigned int v304; // ecx unsigned int v305; // ecx _BYTE *v306; // edi unsigned int v307; // ecx signed int v308; // edx signed int v309; // ecx _BYTE *v310; // edi signed int v311; // ecx signed int l; // edx unsigned int v313; // ecx unsigned int v314; // ecx _BYTE *v315; // edi unsigned int v316; // ecx unsigned int v317; // edi signed int v318; // edx signed int v319; // ecx _BYTE *v320; // edi signed int v321; // ecx int v322; // [esp-14h] [ebp-18h] int v323; // [esp-10h] [ebp-14h] int v324; // [esp-10h] [ebp-14h] world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v2 = (unsigned int)a1; if ( !(_BYTE)light_table_index ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v6 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v8 = level_cel_block; _LOBYTE(v8) = BYTE1(v8); v7 = ((v8 >> 4) & 7) + 8; goto LABEL_11; } if ( (_BYTE)light_table_index == lightmax ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v9 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v10 = level_cel_block; _LOBYTE(v10) = BYTE1(v10); v11 = (v10 >> 4) & 7; if ( !v11 ) { v268 = 16; do { if ( v2 < screen_buf_end ) { v269 = 8; do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v269; } while ( v269 ); } else { v9 += 32; v2 += 32; } v270 = (_BYTE *)(v2 - 800); if ( (unsigned int)v270 < screen_buf_end ) { v271 = 8; do { *v270 = 0; v270[2] = 0; v270 += 4; --v271; } while ( v271 ); } else { v9 += 32; v270 += 32; } v2 = (unsigned int)(v270 - 800); --v268; } while ( v268 ); return; } if ( (_WORD)v11 != 1 ) { switch ( (_WORD)v11 ) { case 2: world_4B325C = 0; for ( i = 30; ; i -= 2 ) { if ( v2 < screen_buf_end ) { v280 = (_BYTE *)(i + v2); v281 = 32 - i; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v282 = v281 >> 2; if ( !(v281 & 2) || (v283 = v280 + 1, *v283 = 0, v280 = v283 + 1, v282) ) { do { v280[1] = 0; v280[3] = 0; v280 += 4; --v282; } while ( v282 ); } } else { v284 = v281 >> 2; if ( !(v281 & 2) || (*v280 = 0, v280 += 2, v284) ) { do { *v280 = 0; v280[2] = 0; v280 += 4; --v284; } while ( v284 ); } } } else { v9 = &v9[-i + 32]; v280 = (_BYTE *)(v2 + 32); } v2 = (unsigned int)(v280 - 800); if ( !i ) break; } v285 = 2; do { if ( v2 < screen_buf_end ) { v286 = (_BYTE *)(v285 + v2); v287 = 32 - v285; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v288 = v287 >> 2; if ( !(v287 & 2) || (v289 = v286 + 1, *v289 = 0, v286 = v289 + 1, v288) ) { do { v286[1] = 0; v286[3] = 0; v286 += 4; --v288; } while ( v288 ); } } else { v290 = v287 >> 2; if ( !(v287 & 2) || (*v286 = 0, v286 += 2, v290) ) { do { *v286 = 0; v286[2] = 0; v286 += 4; --v290; } while ( v290 ); } } } else { v9 = &v9[-v285 + 32]; v286 = (_BYTE *)(v2 + 32); } v2 = (unsigned int)(v286 - 800); v285 += 2; } while ( v285 != 32 ); break; case 3: world_4B325C = 0; for ( j = 30; ; j -= 2 ) { if ( v2 < screen_buf_end ) { v292 = 32 - j; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v293 = v292 >> 2; if ( !(v292 & 2) || (v294 = (_BYTE *)(v2 + 1), *v294 = 0, v2 = (unsigned int)(v294 + 1), v293) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v293; } while ( v293 ); } } else { v295 = v292 >> 2; if ( !(v292 & 2) || (*(_BYTE *)v2 = 0, v2 += 2, v295) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v295; } while ( v295 ); } } } else { v9 = &v9[-j + 32]; v2 = v2 + 32 - j; } v296 = (_BYTE *)(v2 - 800); if ( !j ) break; v2 = (unsigned int)&v296[j]; } v297 = 2; do { if ( (unsigned int)v296 < screen_buf_end ) { v298 = 32 - v297; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v299 = v298 >> 2; if ( !(v298 & 2) || (v300 = v296 + 1, *v300 = 0, v296 = v300 + 1, v299) ) { do { v296[1] = 0; v296[3] = 0; v296 += 4; --v299; } while ( v299 ); } } else { v301 = v298 >> 2; if ( !(v298 & 2) || (*v296 = 0, v296 += 2, v301) ) { do { *v296 = 0; v296[2] = 0; v296 += 4; --v301; } while ( v301 ); } } } else { v9 = &v9[-v297 + 32]; v296 = &v296[-v297 + 32]; } v296 = &v296[v297 - 800]; v297 += 2; } while ( v297 != 32 ); break; case 4: world_4B325C = 0; for ( k = 30; ; k -= 2 ) { if ( v2 < screen_buf_end ) { v303 = (_BYTE *)(k + v2); v304 = 32 - k; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v305 = v304 >> 2; if ( !(v304 & 2) || (v306 = v303 + 1, *v306 = 0, v303 = v306 + 1, v305) ) { do { v303[1] = 0; v303[3] = 0; v303 += 4; --v305; } while ( v305 ); } } else { v307 = v304 >> 2; if ( !(v304 & 2) || (*v303 = 0, v303 += 2, v307) ) { do { *v303 = 0; v303[2] = 0; v303 += 4; --v307; } while ( v307 ); } } } else { v9 = &v9[-k + 32]; v303 = (_BYTE *)(v2 + 32); } v2 = (unsigned int)(v303 - 800); if ( !k ) break; } v308 = 8; do { if ( v2 < screen_buf_end ) { v309 = 8; do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v309; } while ( v309 ); } else { v9 += 32; v2 += 32; } v310 = (_BYTE *)(v2 - 800); if ( (unsigned int)v310 < screen_buf_end ) { v311 = 8; do { *v310 = 0; v310[2] = 0; v310 += 4; --v311; } while ( v311 ); } else { v9 += 32; v310 += 32; } v2 = (unsigned int)(v310 - 800); --v308; } while ( v308 ); break; default: world_4B325C = 0; for ( l = 30; ; l -= 2 ) { if ( v2 < screen_buf_end ) { v313 = 32 - l; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v314 = v313 >> 2; if ( !(v313 & 2) || (v315 = (_BYTE *)(v2 + 1), *v315 = 0, v2 = (unsigned int)(v315 + 1), v314) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v314; } while ( v314 ); } } else { v316 = v313 >> 2; if ( !(v313 & 2) || (*(_BYTE *)v2 = 0, v2 += 2, v316) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v316; } while ( v316 ); } } } else { v9 = &v9[-l + 32]; v2 = v2 + 32 - l; } v317 = v2 - 800; if ( !l ) break; v2 = l + v317; } v318 = 8; do { if ( v317 < screen_buf_end ) { v319 = 8; do { *(_BYTE *)(v317 + 1) = 0; *(_BYTE *)(v317 + 3) = 0; v317 += 4; --v319; } while ( v319 ); } else { v9 += 32; v317 += 32; } v320 = (_BYTE *)(v317 - 800); if ( (unsigned int)v320 < screen_buf_end ) { v321 = 8; do { *v320 = 0; v320[2] = 0; v320 += 4; --v321; } while ( v321 ); } else { v9 += 32; v320 += 32; } v317 = (unsigned int)(v320 - 800); --v318; } while ( v318 ); break; } return; } world_4B325C = (unsigned char)a1 & 1; v272 = 32; LABEL_412: v324 = v272; v273 = 32; while ( 1 ) { while ( 1 ) { v274 = (unsigned char)*v9++; if ( (v274 & 0x80u) == 0 ) break; _LOBYTE(v274) = -(char)v274; v2 += v274; v273 -= v274; if ( !v273 ) { LABEL_433: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; v272 = v324 - 1; if ( v324 == 1 ) return; goto LABEL_412; } } v273 -= v274; if ( v2 < screen_buf_end ) { v9 += v274; if ( (v2 & 1) == world_4B325C ) { v275 = v274 >> 1; if ( !(v274 & 1) ) goto LABEL_420; ++v2; if ( v275 ) { LABEL_427: v22 = v275 & 1; v278 = v275 >> 1; if ( !v22 || (*(_BYTE *)v2 = 0, v2 += 2, v278) ) { do { *(_BYTE *)v2 = 0; *(_BYTE *)(v2 + 2) = 0; v2 += 4; --v278; } while ( v278 ); } goto LABEL_430; } } else { v275 = v274 >> 1; if ( !(v274 & 1) ) goto LABEL_427; *(_BYTE *)v2++ = 0; if ( v275 ) { LABEL_420: v22 = v275 & 1; v276 = v275 >> 1; if ( !v22 || (v277 = (_BYTE *)(v2 + 1), *v277 = 0, v2 = (unsigned int)(v277 + 1), v276) ) { do { *(_BYTE *)(v2 + 1) = 0; *(_BYTE *)(v2 + 3) = 0; v2 += 4; --v276; } while ( v276 ); } goto LABEL_430; } } } else { v9 += v274; v2 += v274; } LABEL_430: if ( !v273 ) goto LABEL_433; } } if ( !(level_cel_block & 0x8000) ) { v3 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v4 = &pLightTbl[256 * light_table_index]; v5 = (unsigned char)(BYTE1(level_cel_block) >> 4); if ( !(BYTE1(level_cel_block) >> 4) ) { v12 = 16; do { if ( v2 < screen_buf_end ) { v13 = 8; do { v14 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v14); v14 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v14); v2 += 4; --v13; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v13 ); } else { v3 += 32; v2 += 32; } v15 = (_BYTE *)(v2 - 800); if ( (unsigned int)v15 < screen_buf_end ) { v16 = 8; do { v17 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v17; *v15 = v4[v1]; _LOBYTE(v1) = BYTE2(v17); v15 += 4; --v16; *(v15 - 2) = v4[v1]; } while ( v16 ); } else { v3 += 32; v15 += 32; } v2 = (unsigned int)(v15 - 800); --v12; } while ( v12 ); return; } if ( v5 == 1 ) { world_4B325C = (unsigned char)a1 & 1; v18 = 32; do { v322 = v18; v19 = 32; do { while ( 1 ) { v20 = (unsigned char)*v3++; if ( (v20 & 0x80u) == 0 ) break; _LOBYTE(v20) = -(char)v20; v2 += v20; v19 -= v20; if ( !v19 ) goto LABEL_69; } v19 -= v20; if ( v2 < screen_buf_end ) { if ( (v2 & 1) == world_4B325C ) { v21 = v20 >> 1; if ( v20 & 1 ) { ++v3; ++v2; v22 = v21 & 1; v25 = v20 >> 2; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v25 ) { do { v26 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v26; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v26); v2 += 4; --v25; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v25 ); } } else { v22 = v21 & 1; v23 = v20 >> 2; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v23 ) { do { v24 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v24); v24 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v24); v2 += 4; --v23; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v23 ); } } } else { v27 = v20 >> 1; if ( v20 & 1 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v22 = v27 & 1; v30 = v20 >> 2; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v30 ) { do { v31 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v31); v31 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v31); v2 += 4; --v30; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v30 ); } } else { v22 = v27 & 1; v28 = v20 >> 2; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v28 ) { do { v29 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v29; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v29); v2 += 4; --v28; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v28 ); } } } } else { v3 += v20; v2 += v20; } } while ( v19 ); LABEL_69: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; v18 = v322 - 1; } while ( v322 != 1 ); return; } if ( v5 != 2 ) { if ( v5 != 3 ) { if ( v5 != 4 ) { world_4B325C = 0; v121 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v122 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v122 > 45 ) { v2 = (unsigned int)a1 - 12288; v3 += 288; LABEL_249: v136 = 8; do { if ( v2 < screen_buf_end ) { v137 = 8; do { v138 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v138); v138 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v138); v2 += 4; --v137; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v137 ); } else { v3 += 32; v2 += 32; } v139 = (_BYTE *)(v2 - 800); if ( (unsigned int)v139 < screen_buf_end ) { v140 = 8; do { v141 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v141; *v139 = v4[v1]; _LOBYTE(v1) = BYTE2(v141); v139 += 4; --v140; *(v139 - 2) = v4[v1]; } while ( v140 ); } else { v3 += 32; v139 += 32; } v2 = (unsigned int)(v139 - 800); --v136; } while ( v136 ); return; } v123 = world_4B33FD[v122]; v3 += *(int *)((char *)world_4B34BD + v123); v124 = 192 * v123; v123 >>= 1; v2 -= v124; v121 = 30 - v123; world_4B325C += v123 >> 1; } do { v125 = 32 - v121; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v22 = v125 & 1; v126 = v125 >> 1; if ( v22 ) { ++v3; ++v2; v22 = v126 & 1; v129 = v126 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v129 ) { do { v130 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v130; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v130); v2 += 4; --v129; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v129 ); } } else { v22 = v126 & 1; v127 = v126 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v127 ) { do { v128 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v128); v128 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v128); v2 += 4; --v127; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v127 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v22 = v125 & 1; v131 = v125 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v22 = v131 & 1; v134 = v131 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v134 ) { do { v135 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v135); v135 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v135); v2 += 4; --v134; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v134 ); } } else { v22 = v131 & 1; v132 = v131 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v132 ) { do { v133 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v133; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v133); v2 += 4; --v132; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v132 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v121 + v2 - 800; v50 = __OFSUB__(v121, 2); v121 -= 2; } while ( !((v121 < 0) ^ v50) ); goto LABEL_249; } world_4B325C = 0; v99 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v100 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v100 > 45 ) { v2 = (unsigned int)a1 - 12288; v3 += 288; LABEL_210: v115 = 8; do { if ( v2 < screen_buf_end ) { v116 = 8; do { v117 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v117); v117 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v117); v2 += 4; --v116; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v116 ); } else { v3 += 32; v2 += 32; } v118 = (_BYTE *)(v2 - 800); if ( (unsigned int)v118 < screen_buf_end ) { v119 = 8; do { v120 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v120; *v118 = v4[v1]; _LOBYTE(v1) = BYTE2(v120); v118 += 4; --v119; *(v118 - 2) = v4[v1]; } while ( v119 ); } else { v3 += 32; v118 += 32; } v2 = (unsigned int)(v118 - 800); --v115; } while ( v115 ); return; } v101 = world_4B33FD[v100]; v3 += *(int *)((char *)world_4B34BD + v101); v102 = 192 * v101; v101 >>= 1; v2 -= v102; v99 = 30 - v101; world_4B325C += v101 >> 1; } do { v103 = (_BYTE *)(v99 + v2); v104 = 32 - v99; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v1 = v104 & 2; v3 += v1; v22 = v104 & 1; v105 = v104 >> 1; if ( v22 ) { ++v3; ++v103; v22 = v105 & 1; v108 = v105 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *v103 = v4[v1]; v103 += 2; } if ( (_BYTE)v108 ) { do { v109 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v109; *v103 = v4[v1]; _LOBYTE(v1) = BYTE2(v109); v103 += 4; --v108; *(v103 - 2) = v4[v1]; } while ( v108 ); } } else { v22 = v105 & 1; v106 = v105 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; v103[1] = v4[v1]; v103 += 2; } if ( (_BYTE)v106 ) { do { v107 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v107); v107 >>= 16; v103[1] = v4[v1]; _LOBYTE(v1) = BYTE1(v107); v103 += 4; --v106; *(v103 - 1) = v4[v1]; } while ( v106 ); } } } else { v1 = v104 & 2; v3 += v1; v22 = v104 & 1; v110 = v104 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3++; *v103++ = v4[v1]; v22 = v110 & 1; v113 = v110 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; v103[1] = v4[v1]; v103 += 2; } if ( (_BYTE)v113 ) { do { v114 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v114); v114 >>= 16; v103[1] = v4[v1]; _LOBYTE(v1) = BYTE1(v114); v103 += 4; --v113; *(v103 - 1) = v4[v1]; } while ( v113 ); } } else { v22 = v110 & 1; v111 = v110 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *v103 = v4[v1]; v103 += 2; } if ( (_BYTE)v111 ) { do { v112 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v112; *v103 = v4[v1]; _LOBYTE(v1) = BYTE2(v112); v103 += 4; --v111; *(v103 - 2) = v4[v1]; } while ( v111 ); } } } v2 = (unsigned int)(v103 - 800); v50 = __OFSUB__(v99, 2); v99 -= 2; } while ( !((v99 < 0) ^ v50) ); goto LABEL_210; } world_4B325C = 0; v69 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v70 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v70 > 45 ) { v2 = (unsigned int)a1 - 12288; v3 += 288; LABEL_154: v84 = 2; if ( v2 >= screen_buf_end ) { v85 = (v2 - screen_buf_end + 1023) >> 8; if ( v85 > 42 ) return; v86 = world_4B33FD[v85]; v3 += *(int *)((char *)world_4B3501 + v86); v87 = 192 * v86; v86 >>= 1; v2 -= v87; v84 = v86 + 2; world_4B325C += v86 >> 1; } do { v88 = 32 - v84; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v22 = v88 & 1; v89 = v88 >> 1; if ( v22 ) { ++v3; ++v2; v22 = v89 & 1; v92 = v89 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v92 ) { do { v93 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v93; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v93); v2 += 4; --v92; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v92 ); } } else { v22 = v89 & 1; v90 = v89 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v90 ) { do { v91 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v91); v91 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v91); v2 += 4; --v90; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v90 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v22 = v88 & 1; v94 = v88 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v22 = v94 & 1; v97 = v94 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v97 ) { do { v98 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v98); v98 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v98); v2 += 4; --v97; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v97 ); } } else { v22 = v94 & 1; v95 = v94 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v95 ) { do { v96 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v96; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v96); v2 += 4; --v95; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v95 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v84 + v2 - 800; v84 += 2; } while ( v84 != 32 ); return; } v71 = world_4B33FD[v70]; v3 += *(int *)((char *)world_4B34BD + v71); v72 = 192 * v71; v71 >>= 1; v2 -= v72; v69 = 30 - v71; world_4B325C += v71 >> 1; } do { v73 = 32 - v69; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v22 = v73 & 1; v74 = v73 >> 1; if ( v22 ) { ++v3; ++v2; v22 = v74 & 1; v77 = v74 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v77 ) { do { v78 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v78; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v78); v2 += 4; --v77; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v77 ); } } else { v22 = v74 & 1; v75 = v74 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v75 ) { do { v76 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v76); v76 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v76); v2 += 4; --v75; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v75 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } else { v22 = v73 & 1; v79 = v73 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3++; *(_BYTE *)v2++ = v4[v1]; v22 = v79 & 1; v82 = v79 >> 1; if ( v22 ) { _LOBYTE(v1) = v3[1]; v3 += 2; *(_BYTE *)(v2 + 1) = v4[v1]; v2 += 2; } if ( (_BYTE)v82 ) { do { v83 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = BYTE1(v83); v83 >>= 16; *(_BYTE *)(v2 + 1) = v4[v1]; _LOBYTE(v1) = BYTE1(v83); v2 += 4; --v82; *(_BYTE *)(v2 - 1) = v4[v1]; } while ( v82 ); } } else { v22 = v79 & 1; v80 = v79 >> 1; if ( v22 ) { _LOBYTE(v1) = *v3; v3 += 2; *(_BYTE *)v2 = v4[v1]; v2 += 2; } if ( (_BYTE)v80 ) { do { v81 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v1) = v81; *(_BYTE *)v2 = v4[v1]; _LOBYTE(v1) = BYTE2(v81); v2 += 4; --v80; *(_BYTE *)(v2 - 2) = v4[v1]; } while ( v80 ); } } v1 = (unsigned char)v3 & 2; v3 += v1; } v2 = v69 + v2 - 800; v50 = __OFSUB__(v69, 2); v69 -= 2; } while ( !((v69 < 0) ^ v50) ); goto LABEL_154; } world_4B325C = 0; v32 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v33 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v33 > 45 ) { v2 = (unsigned int)a1 - 12288; v3 += 288; LABEL_98: v51 = 2; if ( v2 >= screen_buf_end ) { v52 = (v2 - screen_buf_end + 1023) >> 8; if ( v52 > 42 ) return; v53 = world_4B33FD[v52]; v3 += *(int *)((char *)world_4B3501 + v53); v54 = 192 * v53; v53 >>= 1; v2 -= v54; v51 = v53 + 2; world_4B325C += v53 >> 1; } do { v55 = (_BYTE *)(v51 + v2); v56 = 32 - v51; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v57 = v56 & 2; v3 += v57; v22 = v56 & 1; v58 = v56 >> 1; if ( v22 ) { ++v3; ++v55; v22 = v58 & 1; v61 = v58 >> 1; if ( v22 ) { _LOBYTE(v57) = *v3; v3 += 2; *v55 = v4[v57]; v55 += 2; } if ( (_BYTE)v61 ) { do { v62 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v57) = v62; *v55 = v4[v57]; _LOBYTE(v57) = BYTE2(v62); v55 += 4; --v61; *(v55 - 2) = v4[v57]; } while ( v61 ); } } else { v22 = v58 & 1; v59 = v58 >> 1; if ( v22 ) { _LOBYTE(v57) = v3[1]; v3 += 2; v55[1] = v4[v57]; v55 += 2; } if ( (_BYTE)v59 ) { do { v60 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v57) = BYTE1(v60); v60 >>= 16; v55[1] = v4[v57]; _LOBYTE(v57) = BYTE1(v60); v55 += 4; --v59; *(v55 - 1) = v4[v57]; } while ( v59 ); } } } else { v63 = v56 & 2; v3 += v63; v22 = v56 & 1; v64 = v56 >> 1; if ( v22 ) { _LOBYTE(v63) = *v3++; *v55++ = v4[v63]; v22 = v64 & 1; v67 = v64 >> 1; if ( v22 ) { _LOBYTE(v63) = v3[1]; v3 += 2; v55[1] = v4[v63]; v55 += 2; } if ( (_BYTE)v67 ) { do { v68 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v63) = BYTE1(v68); v68 >>= 16; v55[1] = v4[v63]; _LOBYTE(v63) = BYTE1(v68); v55 += 4; --v67; *(v55 - 1) = v4[v63]; } while ( v67 ); } } else { v22 = v64 & 1; v65 = v64 >> 1; if ( v22 ) { _LOBYTE(v63) = *v3; v3 += 2; *v55 = v4[v63]; v55 += 2; } if ( (_BYTE)v65 ) { do { v66 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v63) = v66; *v55 = v4[v63]; _LOBYTE(v63) = BYTE2(v66); v55 += 4; --v65; *(v55 - 2) = v4[v63]; } while ( v65 ); } } } v2 = (unsigned int)(v55 - 800); v51 += 2; } while ( v51 != 32 ); return; } v34 = world_4B33FD[v33]; v3 += *(int *)((char *)world_4B34BD + v34); v35 = 192 * v34; v34 >>= 1; v2 -= v35; v32 = 30 - v34; world_4B325C += v34 >> 1; } do { v36 = (_BYTE *)(v32 + v2); v37 = 32 - v32; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v38 = v37 & 2; v3 += v38; v22 = v37 & 1; v39 = v37 >> 1; if ( v22 ) { ++v3; ++v36; v22 = v39 & 1; v42 = v39 >> 1; if ( v22 ) { _LOBYTE(v38) = *v3; v3 += 2; *v36 = v4[v38]; v36 += 2; } if ( (_BYTE)v42 ) { do { v43 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v38) = v43; *v36 = v4[v38]; _LOBYTE(v38) = BYTE2(v43); v36 += 4; --v42; *(v36 - 2) = v4[v38]; } while ( v42 ); } } else { v22 = v39 & 1; v40 = v39 >> 1; if ( v22 ) { _LOBYTE(v38) = v3[1]; v3 += 2; v36[1] = v4[v38]; v36 += 2; } if ( (_BYTE)v40 ) { do { v41 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v38) = BYTE1(v41); v41 >>= 16; v36[1] = v4[v38]; _LOBYTE(v38) = BYTE1(v41); v36 += 4; --v40; *(v36 - 1) = v4[v38]; } while ( v40 ); } } } else { v44 = v37 & 2; v3 += v44; v22 = v37 & 1; v45 = v37 >> 1; if ( v22 ) { _LOBYTE(v44) = *v3++; *v36++ = v4[v44]; v22 = v45 & 1; v48 = v45 >> 1; if ( v22 ) { _LOBYTE(v44) = v3[1]; v3 += 2; v36[1] = v4[v44]; v36 += 2; } if ( (_BYTE)v48 ) { do { v49 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v44) = BYTE1(v49); v49 >>= 16; v36[1] = v4[v44]; _LOBYTE(v44) = BYTE1(v49); v36 += 4; --v48; *(v36 - 1) = v4[v44]; } while ( v48 ); } } else { v22 = v45 & 1; v46 = v45 >> 1; if ( v22 ) { _LOBYTE(v44) = *v3; v3 += 2; *v36 = v4[v44]; v36 += 2; } if ( (_BYTE)v46 ) { do { v47 = *(_DWORD *)v3; v3 += 4; _LOBYTE(v44) = v47; *v36 = v4[v44]; _LOBYTE(v44) = BYTE2(v47); v36 += 4; --v46; *(v36 - 2) = v4[v44]; } while ( v46 ); } } } v2 = (unsigned int)(v36 - 800); v50 = __OFSUB__(v32, 2); v32 -= 2; } while ( !((v32 < 0) ^ v50) ); goto LABEL_98; } v6 = (char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v7 = (unsigned char)(BYTE1(level_cel_block) >> 4); LABEL_11: switch ( v7 ) { case 8: v142 = 16; do { if ( v2 < screen_buf_end ) { v143 = 8; do { v144 = *(_DWORD *)v6; v6 += 4; v145 = (_BYTE *)(v2 + 1); v144 = __ROR4__(v144, 8); *v145 = v144; v145 += 2; *v145 = __ROR4__(v144, 16); v2 = (unsigned int)(v145 + 1); --v143; } while ( v143 ); } else { v6 += 32; v2 += 32; } v146 = (_BYTE *)(v2 - 800); if ( (unsigned int)v146 < screen_buf_end ) { v147 = 8; do { v148 = *(_DWORD *)v6; v6 += 4; *v146 = v148; v149 = v146 + 2; *v149 = __ROR4__(v148, 16); v146 = v149 + 2; --v147; } while ( v147 ); } else { v6 += 32; v146 += 32; } v2 = (unsigned int)(v146 - 800); --v142; } while ( v142 ); return; case 9: world_4B325C = (unsigned char)a1 & 1; v150 = 32; while ( 1 ) { v323 = v150; v151 = 32; do { while ( 1 ) { v152 = (unsigned char)*v6++; if ( (v152 & 0x80u) != 0 ) break; v151 -= v152; if ( v2 < screen_buf_end ) { if ( (v2 & 1) == world_4B325C ) { v153 = v152 >> 1; if ( !(v152 & 1) ) goto LABEL_280; ++v6; ++v2; if ( v153 ) { LABEL_287: v22 = v153 & 1; v161 = v153 >> 1; if ( !v22 || (v162 = *v6, v6 += 2, *(_BYTE *)v2 = v162, v2 += 2, v161) ) { do { v163 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v163; v164 = (_BYTE *)(v2 + 2); *v164 = __ROR4__(v163, 16); v2 = (unsigned int)(v164 + 2); --v161; } while ( v161 ); } goto LABEL_290; } } else { v153 = v152 >> 1; if ( !(v152 & 1) ) goto LABEL_287; v160 = *v6++; *(_BYTE *)v2++ = v160; if ( v153 ) { LABEL_280: v22 = v153 & 1; v154 = v153 >> 1; if ( !v22 || (v155 = v6 + 1, v156 = (_BYTE *)(v2 + 1), v157 = *v155, v6 = v155 + 1, *v156 = v157, v2 = (unsigned int)(v156 + 1), v154) ) { do { v158 = *(_DWORD *)v6; v6 += 4; v159 = (_BYTE *)(v2 + 1); v158 = __ROR4__(v158, 8); *v159 = v158; v159 += 2; *v159 = __ROR4__(v158, 16); v2 = (unsigned int)(v159 + 1); --v154; } while ( v154 ); } goto LABEL_290; } } } else { v6 += v152; v2 += v152; } LABEL_290: if ( !v151 ) goto LABEL_293; } _LOBYTE(v152) = -(char)v152; v2 += v152; v151 -= v152; } while ( v151 ); LABEL_293: world_4B325C = ((_BYTE)world_4B325C + 1) & 1; v2 -= 800; v150 = v323 - 1; if ( v323 == 1 ) return; } case 10: world_4B325C = 0; v165 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v166 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v166 > 45 ) { v2 = (unsigned int)a1 - 12288; v6 += 288; LABEL_308: v180 = 2; if ( v2 >= screen_buf_end ) { v181 = (v2 - screen_buf_end + 1023) >> 8; if ( v181 > 42 ) return; v182 = world_4B33FD[v181]; v6 += *(int *)((char *)world_4B3501 + v182); v183 = 192 * v182; v182 >>= 1; v2 -= v183; v180 = v182 + 2; world_4B325C += v182 >> 1; } do { v184 = (_BYTE *)(v180 + v2); v185 = 32 - v180; v186 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v187 = v185 >> 2; if ( !(v185 & 2) || (_LOWORD(v186) = *((_WORD *)v6 + 1), v6 += 4, v188 = v184 + 1, *v188 = __ROR4__(v186, 8), v184 = v188 + 1, v187) ) { do { v189 = *(_DWORD *)v6; v6 += 4; v190 = v184 + 1; v189 = __ROR4__(v189, 8); *v190 = v189; v190 += 2; *v190 = __ROR4__(v189, 16); v184 = v190 + 1; --v187; } while ( v187 ); } } else { v191 = v185 >> 2; if ( !(v185 & 2) || (v192 = *((_WORD *)v6 + 1), v6 += 4, *v184 = v192, v184 += 2, --v191, v191) ) { do { v193 = *(_DWORD *)v6; v6 += 4; *v184 = v193; v194 = v184 + 2; *v194 = __ROR4__(v193, 16); v184 = v194 + 2; --v191; } while ( v191 ); } } v2 = (unsigned int)(v184 - 800); v180 += 2; } while ( v180 != 32 ); return; } v167 = world_4B33FD[v166]; v6 += *(int *)((char *)world_4B34BD + v167); v168 = 192 * v167; v167 >>= 1; v2 -= v168; v165 = 30 - v167; world_4B325C += v167 >> 1; } do { v169 = (_BYTE *)(v165 + v2); v170 = 32 - v165; v171 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v172 = v170 >> 2; if ( !(v170 & 2) || (_LOWORD(v171) = *((_WORD *)v6 + 1), v6 += 4, v173 = v169 + 1, *v173 = __ROR4__(v171, 8), v169 = v173 + 1, v172) ) { do { v174 = *(_DWORD *)v6; v6 += 4; v175 = v169 + 1; v174 = __ROR4__(v174, 8); *v175 = v174; v175 += 2; *v175 = __ROR4__(v174, 16); v169 = v175 + 1; --v172; } while ( v172 ); } } else { v176 = v170 >> 2; if ( !(v170 & 2) || (v177 = *((_WORD *)v6 + 1), v6 += 4, *v169 = v177, v169 += 2, v176) ) { do { v178 = *(_DWORD *)v6; v6 += 4; *v169 = v178; v179 = v169 + 2; *v179 = __ROR4__(v178, 16); v169 = v179 + 2; --v176; } while ( v176 ); } } v2 = (unsigned int)(v169 - 800); v50 = __OFSUB__(v165, 2); v165 -= 2; } while ( !((v165 < 0) ^ v50) ); goto LABEL_308; } if ( v7 != 11 ) { if ( v7 != 12 ) { world_4B325C = 0; v246 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v247 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v247 > 45 ) { v2 = (unsigned int)a1 - 12288; v6 += 288; LABEL_389: v260 = 8; do { if ( v2 < screen_buf_end ) { v261 = 8; do { v262 = *(_DWORD *)v6; v6 += 4; v263 = (_BYTE *)(v2 + 1); v262 = __ROR4__(v262, 8); *v263 = v262; v263 += 2; *v263 = __ROR4__(v262, 16); v2 = (unsigned int)(v263 + 1); --v261; } while ( v261 ); } else { v6 += 32; v2 += 32; } v264 = (_BYTE *)(v2 - 800); if ( (unsigned int)v264 < screen_buf_end ) { v265 = 8; do { v266 = *(_DWORD *)v6; v6 += 4; *v264 = v266; v267 = v264 + 2; *v267 = __ROR4__(v266, 16); v264 = v267 + 2; --v265; } while ( v265 ); } else { v6 += 32; v264 += 32; } v2 = (unsigned int)(v264 - 800); --v260; } while ( v260 ); return; } v248 = world_4B33FD[v247]; v6 += *(int *)((char *)world_4B34BD + v248); v249 = 192 * v248; v248 >>= 1; v2 -= v249; v246 = 30 - v248; world_4B325C += v248 >> 1; } do { v250 = 32 - v246; v251 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { for ( m = v250 >> 2; m; --m ) { v253 = *(_DWORD *)v6; v6 += 4; v254 = (_BYTE *)(v2 + 1); v253 = __ROR4__(v253, 8); *v254 = v253; v254 += 2; v251 = __ROR4__(v253, 16); *v254 = v251; v2 = (unsigned int)(v254 + 1); } if ( (32 - (_BYTE)v246) & 2 ) { _LOWORD(v251) = *(_WORD *)v6; v6 += 4; v255 = (_BYTE *)(v2 + 1); *v255 = __ROR4__(v251, 8); v2 = (unsigned int)(v255 + 1); } } else { for ( n = v250 >> 2; n; --n ) { v257 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v257; v258 = (_BYTE *)(v2 + 2); *v258 = __ROR4__(v257, 16); v2 = (unsigned int)(v258 + 2); } if ( (32 - (_BYTE)v246) & 2 ) { v259 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v259; v2 += 2; } } v2 = v246 + v2 - 800; v50 = __OFSUB__(v246, 2); v246 -= 2; } while ( !((v246 < 0) ^ v50) ); goto LABEL_389; } world_4B325C = 0; v223 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v224 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v224 > 45 ) { v2 = (unsigned int)a1 - 12288; v6 += 288; LABEL_364: v238 = 8; do { if ( v2 < screen_buf_end ) { v239 = 8; do { v240 = *(_DWORD *)v6; v6 += 4; v241 = (_BYTE *)(v2 + 1); v240 = __ROR4__(v240, 8); *v241 = v240; v241 += 2; *v241 = __ROR4__(v240, 16); v2 = (unsigned int)(v241 + 1); --v239; } while ( v239 ); } else { v6 += 32; v2 += 32; } v242 = (_BYTE *)(v2 - 800); if ( (unsigned int)v242 < screen_buf_end ) { v243 = 8; do { v244 = *(_DWORD *)v6; v6 += 4; *v242 = v244; v245 = v242 + 2; *v245 = __ROR4__(v244, 16); v242 = v245 + 2; --v243; } while ( v243 ); } else { v6 += 32; v242 += 32; } v2 = (unsigned int)(v242 - 800); --v238; } while ( v238 ); return; } v225 = world_4B33FD[v224]; v6 += *(int *)((char *)world_4B34BD + v225); v226 = 192 * v225; v225 >>= 1; v2 -= v226; v223 = 30 - v225; world_4B325C += v225 >> 1; } do { v227 = (_BYTE *)(v223 + v2); v228 = 32 - v223; v229 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { v230 = v228 >> 2; if ( !(v228 & 2) || (_LOWORD(v229) = *((_WORD *)v6 + 1), v6 += 4, v231 = v227 + 1, *v231 = __ROR4__(v229, 8), v227 = v231 + 1, v230) ) { do { v232 = *(_DWORD *)v6; v6 += 4; v233 = v227 + 1; v232 = __ROR4__(v232, 8); *v233 = v232; v233 += 2; *v233 = __ROR4__(v232, 16); v227 = v233 + 1; --v230; } while ( v230 ); } } else { v234 = v228 >> 2; if ( !(v228 & 2) || (v235 = *((_WORD *)v6 + 1), v6 += 4, *v227 = v235, v227 += 2, v234) ) { do { v236 = *(_DWORD *)v6; v6 += 4; *v227 = v236; v237 = v227 + 2; *v237 = __ROR4__(v236, 16); --v234; v227 = v237 + 2; } while ( v234 ); } } v2 = (unsigned int)(v227 - 800); v50 = __OFSUB__(v223, 2); v223 -= 2; } while ( !((v223 < 0) ^ v50) ); goto LABEL_364; } world_4B325C = 0; v195 = 30; if ( (unsigned int)a1 < screen_buf_end ) goto LABEL_326; v196 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v196 <= 45 ) { v197 = world_4B33FD[v196]; v6 += *(int *)((char *)world_4B34BD + v197); v198 = 192 * v197; v197 >>= 1; v2 -= v198; v195 = 30 - v197; world_4B325C += v197 >> 1; do { LABEL_326: v199 = 32 - v195; v200 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { for ( ii = v199 >> 2; ii; --ii ) { v202 = *(_DWORD *)v6; v6 += 4; v203 = (_BYTE *)(v2 + 1); v202 = __ROR4__(v202, 8); *v203 = v202; v203 += 2; v200 = __ROR4__(v202, 16); *v203 = v200; v2 = (unsigned int)(v203 + 1); } if ( (32 - (_BYTE)v195) & 2 ) { _LOWORD(v200) = *(_WORD *)v6; v6 += 4; v204 = (_BYTE *)(v2 + 1); *v204 = __ROR4__(v200, 8); v2 = (unsigned int)(v204 + 1); } } else { for ( jj = v199 >> 2; jj; --jj ) { v206 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v206; v207 = (_BYTE *)(v2 + 2); *v207 = __ROR4__(v206, 16); v2 = (unsigned int)(v207 + 2); } if ( (32 - (_BYTE)v195) & 2 ) { v208 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v208; v2 += 2; } } v2 = v195 + v2 - 800; v50 = __OFSUB__(v195, 2); v195 -= 2; } while ( !((v195 < 0) ^ v50) ); goto LABEL_336; } v2 = (unsigned int)a1 - 12288; v6 += 288; LABEL_336: v209 = 2; if ( v2 >= screen_buf_end ) { v210 = (v2 - screen_buf_end + 1023) >> 8; if ( v210 > 42 ) return; v211 = world_4B33FD[v210]; v6 += *(int *)((char *)world_4B3501 + v211); v212 = 192 * v211; v211 >>= 1; v2 -= v212; v209 = v211 + 2; world_4B325C += v211 >> 1; } do { v213 = 32 - v209; v214 = ((_BYTE)world_4B325C + 1) & 1; world_4B325C = ((_BYTE)world_4B325C + 1) & 1; if ( world_4B325C ) { for ( kk = v213 >> 2; kk; --kk ) { v216 = *(_DWORD *)v6; v6 += 4; v217 = (_BYTE *)(v2 + 1); v216 = __ROR4__(v216, 8); *v217 = v216; v217 += 2; v214 = __ROR4__(v216, 16); *v217 = v214; v2 = (unsigned int)(v217 + 1); } if ( (32 - (_BYTE)v209) & 2 ) { _LOWORD(v214) = *(_WORD *)v6; v6 += 4; v218 = (_BYTE *)(v2 + 1); *v218 = __ROR4__(v214, 8); v2 = (unsigned int)(v218 + 1); } } else { for ( ll = v213 >> 2; ll; --ll ) { v220 = *(_DWORD *)v6; v6 += 4; *(_BYTE *)v2 = v220; v221 = (_BYTE *)(v2 + 2); *v221 = __ROR4__(v220, 16); v2 = (unsigned int)(v221 + 2); } if ( (32 - (_BYTE)v209) & 2 ) { v222 = *(_WORD *)v6; v6 += 4; *(_BYTE *)v2 = v222; v2 += 2; } } v2 = v209 + v2 - 800; v209 += 2; } while ( v209 != 32 ); } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; //----- (00467949) -------------------------------------------------------- void __fastcall drawBottomArchesLowerScreen(void *a1, int a2) { char *v2; // edi char *v3; // esi short v5; // ax char *v6; // esi short v7; // ax unsigned int v8; // eax char *v9; // esi unsigned int v10; // eax int v11; // eax signed int v12; // ebp int v13; // edx signed int v14; // ecx int v18; // ecx signed int v19; // edx int v20; // eax int v21; // ecx int v22; // edx int v25; // edx signed int v26; // eax unsigned int v27; // ecx char *v28; // edi unsigned int v29; // ecx unsigned char v32; // of int v33; // edx signed int v34; // eax unsigned int v35; // ecx char *v36; // edi unsigned int v37; // ecx int v40; // edx signed int v41; // eax unsigned int v42; // ecx unsigned int ii; // ecx int v46; // edx signed int v47; // eax unsigned int v48; // ecx unsigned int n; // ecx int v52; // edx signed int v53; // eax unsigned int v54; // ecx char *v55; // edi unsigned int v56; // ecx signed int v59; // edx int v60; // edx signed int v61; // ecx int v64; // edx signed int v65; // eax unsigned int v66; // ecx unsigned int m; // ecx signed int v70; // edx int v71; // edx signed int v72; // ecx signed int v75; // edx int v76; // edx signed int v77; // ecx char v78; // al int v79; // ecx signed int v80; // edx int v81; // eax int v82; // ecx int v83; // edx char v84; // al int v85; // edx signed int v86; // eax unsigned int v87; // ecx char *v88; // edi unsigned int v89; // ecx short v90; // ax int v91; // eax int v92; // edx signed int v93; // eax unsigned int v94; // ecx char *v95; // edi unsigned int v96; // ecx short v97; // ax int v98; // eax int v99; // edx signed int v100; // eax unsigned int v101; // ecx unsigned int kk; // ecx int v103; // eax short v104; // ax int v105; // edx signed int v106; // eax unsigned int v107; // ecx unsigned int ll; // ecx int v109; // eax short v110; // ax int v111; // edx signed int v112; // eax unsigned int v113; // ecx char *v114; // edi unsigned int v115; // ecx short v116; // ax int v117; // eax signed int v118; // edx int v119; // edx signed int v120; // ecx char v121; // al int v122; // edx signed int v123; // eax unsigned int v124; // ecx unsigned int jj; // ecx int v126; // eax short v127; // ax signed int v128; // edx int v129; // edx signed int v130; // ecx char v131; // al signed int v132; // edx int v133; // edx signed int v134; // ecx int v135; // ecx signed int v136; // edx int v137; // eax int v138; // ecx int v139; // edx signed int i; // edx char *v141; // edi unsigned int v142; // ecx signed int v143; // edx char *v144; // edi unsigned int v145; // ecx signed int j; // edx unsigned int v147; // ecx char *v148; // edi signed int v149; // edx unsigned int v150; // ecx signed int k; // edx char *v152; // edi unsigned int v153; // ecx signed int v154; // edx int v155; // edx signed int v156; // ecx signed int l; // edx unsigned int v158; // ecx char *v159; // edi signed int v160; // edx int v161; // edx signed int v162; // ecx signed int v163; // [esp-8h] [ebp-14h] signed int v164; // [esp-8h] [ebp-14h] signed int v165; // [esp-8h] [ebp-14h] signed int v166; // [esp-8h] [ebp-14h] signed int v167; // [esp-8h] [ebp-14h] int v168; // [esp-4h] [ebp-10h] signed int v169; // [esp-4h] [ebp-10h] signed int v170; // [esp-4h] [ebp-10h] int v171; // [esp-4h] [ebp-10h] signed int v172; // [esp-4h] [ebp-10h] signed int v173; // [esp-4h] [ebp-10h] int v174; // [esp-4h] [ebp-10h] signed int v175; // [esp-4h] [ebp-10h] signed int v176; // [esp-4h] [ebp-10h] int _EAX; char *_EBX; world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v2 = (char *)a1; world_4B3269[0] = a2; if ( (_BYTE)light_table_index ) { if ( (_BYTE)light_table_index == lightmax ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v9 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v10 = level_cel_block; _LOBYTE(v10) = BYTE1(v10); v11 = (v10 >> 4) & 7; if ( v11 ) { switch ( (_WORD)v11 ) { case 1: v135 = 32; do { v174 = v135; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v136 = 32; do { while ( 1 ) { v137 = (unsigned char)*v9++; if ( (v137 & 0x80u) != 0 ) break; v136 -= v137; if ( (unsigned int)v2 < screen_buf_end ) { v138 = v137; v9 += v137; v167 = v136; v139 = *(_DWORD *)world_4B3260; do { v139 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = 0; ++v2; --v138; } while ( v138 ); *(_DWORD *)world_4B3260 = v139; v136 = v167; } else { v9 += v137; v2 += v137; } if ( !v136 ) goto LABEL_252; } _LOBYTE(v137) = -(char)v137; v2 += v137; if ( v137 & 0x1F ) *(_DWORD *)world_4B3260 <<= v137 & 0x1F; v136 -= v137; } while ( v136 ); LABEL_252: v2 -= 800; world_4B3269[0] -= 4; v135 = v174 - 1; } while ( v174 != 1 ); break; case 2: for ( i = 30; ; i -= 2 ) { if ( (unsigned int)v2 < screen_buf_end ) { v141 = &v2[i]; v142 = (unsigned int)(32 - i) >> 2; if ( !((32 - i) & 2) || (*(_WORD *)v141 = 0, v141 += 2, v142) ) { do { *(_DWORD *)v141 = 0; v141 += 4; --v142; } while ( v142 ); } } else { v9 = &v9[-i + 32]; v141 = v2 + 32; } v2 = v141 - 800; if ( !i ) break; } v143 = 2; do { if ( (unsigned int)v2 < screen_buf_end ) { v144 = &v2[v143]; v145 = (unsigned int)(32 - v143) >> 2; if ( !((32 - v143) & 2) || (*(_WORD *)v144 = 0, v144 += 2, v145) ) { do { *(_DWORD *)v144 = 0; v144 += 4; --v145; } while ( v145 ); } } else { v9 = &v9[-v143 + 32]; v144 = v2 + 32; } v2 = v144 - 800; v143 += 2; } while ( v143 != 32 ); break; case 3: for ( j = 30; ; j -= 2 ) { if ( (unsigned int)v2 < screen_buf_end ) { v147 = (unsigned int)(32 - j) >> 2; if ( !((32 - j) & 2) || (*(_WORD *)v2 = 0, v2 += 2, v147) ) { do { *(_DWORD *)v2 = 0; v2 += 4; --v147; } while ( v147 ); } } else { v9 = &v9[-j + 32]; v2 = &v2[-j + 32]; } v148 = v2 - 800; if ( !j ) break; v2 = &v148[j]; } v149 = 2; do { if ( (unsigned int)v148 < screen_buf_end ) { v150 = (unsigned int)(32 - v149) >> 2; if ( !((32 - v149) & 2) || (*(_WORD *)v148 = 0, v148 += 2, v150) ) { do { *(_DWORD *)v148 = 0; v148 += 4; --v150; } while ( v150 ); } } else { v9 = &v9[-v149 + 32]; v148 = &v148[-v149 + 32]; } v148 = &v148[v149 - 800]; v149 += 2; } while ( v149 != 32 ); break; case 4: for ( k = 30; ; k -= 2 ) { if ( (unsigned int)v2 < screen_buf_end ) { v152 = &v2[k]; v153 = (unsigned int)(32 - k) >> 2; if ( !((32 - k) & 2) || (*(_WORD *)v152 = 0, v152 += 2, v153) ) { do { *(_DWORD *)v152 = 0; v152 += 4; --v153; } while ( v153 ); } } else { v9 = &v9[-k + 32]; v152 = v2 + 32; } v2 = v152 - 800; if ( !k ) break; } world_4B3269[0] -= 64; v154 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) { v175 = v154; v155 = *(_DWORD *)world_4B3269[0]; v156 = 32; do { v155 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = 0; ++v2; --v156; } while ( v156 ); v154 = v175; } else { v9 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v154; } while ( v154 ); break; default: for ( l = 30; ; l -= 2 ) { if ( (unsigned int)v2 < screen_buf_end ) { v158 = (unsigned int)(32 - l) >> 2; if ( !((32 - l) & 2) || (*(_WORD *)v2 = 0, v2 += 2, v158) ) { do { *(_DWORD *)v2 = 0; v2 += 4; --v158; } while ( v158 ); } } else { v9 = &v9[-l + 32]; v2 = &v2[-l + 32]; } v159 = v2 - 800; if ( !l ) break; v2 = &v159[l]; } world_4B3269[0] -= 64; v160 = 16; do { if ( (unsigned int)v159 < screen_buf_end ) { v176 = v160; v161 = *(_DWORD *)world_4B3269[0]; v162 = 32; do { v161 *= 2; if ( (unsigned int)v159 < screen_buf_end ) *v159 = 0; ++v159; --v162; } while ( v162 ); v160 = v176; } else { v9 += 32; v159 += 32; } v159 -= 800; world_4B3269[0] -= 4; --v160; } while ( v160 ); break; } } else { v132 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) { v173 = v132; v133 = *(_DWORD *)world_4B3269[0]; v134 = 32; do { v133 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = 0; ++v2; --v134; } while ( v134 ); v132 = v173; } else { v9 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v132; } while ( v132 ); } return; } if ( !(level_cel_block & 0x8000) ) { v3 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); _EBX = &pLightTbl[256 * light_table_index]; v5 = (unsigned char)(BYTE1(level_cel_block) >> 4); if ( !(BYTE1(level_cel_block) >> 4) ) { v12 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) { v13 = *(_DWORD *)world_4B3269[0]; v14 = 32; do { _EAX = *v3++; v13 *= 2; if ( (unsigned int)v2 < screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v14; } while ( v14 ); } else { v3 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v12; } while ( v12 ); return; } if ( v5 == 1 ) { v18 = 32; do { v168 = v18; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v19 = 32; do { while ( 1 ) { v20 = (unsigned char)*v3++; if ( (v20 & 0x80u) != 0 ) break; v19 -= v20; if ( (unsigned int)v2 < screen_buf_end ) { v21 = v20; v163 = v19; v22 = *(_DWORD *)world_4B3260; do { _EAX = *v3++; v22 *= 2; if ( (unsigned int)v2 < screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v21; } while ( v21 ); *(_DWORD *)world_4B3260 = v22; v19 = v163; } else { v3 += v20; v2 += v20; } if ( !v19 ) goto LABEL_52; } _LOBYTE(v20) = -(char)v20; v2 += v20; if ( v20 & 0x1F ) *(_DWORD *)world_4B3260 <<= v20 & 0x1F; v19 -= v20; } while ( v19 ); LABEL_52: v2 -= 800; world_4B3269[0] -= 4; v18 = v168 - 1; } while ( v168 != 1 ); return; } if ( v5 != 2 ) { if ( v5 != 3 ) { if ( v5 != 4 ) { v64 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v65 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v65 > 45 ) { v2 = (char *)a1 - 12288; v3 += 288; LABEL_117: world_4B3269[0] -= 64; v70 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) { v164 = v70; v71 = *(_DWORD *)world_4B3269[0]; v72 = 32; do { _EAX = *v3++; v71 *= 2; if ( (unsigned int)v2 < screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v72; } while ( v72 ); v3 += (unsigned char)v3 & 2; v70 = v164; } else { v3 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v70; } while ( v70 ); return; } v66 = world_4B33FD[v65]; v3 += *(int *)((char *)world_4B34BD + v66); v2 -= 192 * v66; v64 = 30 - (v66 >> 1); } do { for ( m = (unsigned int)(32 - v64) >> 2; m; --m ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v64) & 2 ) { _EAX = *(_WORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v64 - 800]; v32 = __OFSUB__(v64, 2); v64 -= 2; } while ( !((v64 < 0) ^ v32) ); goto LABEL_117; } v52 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v53 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v53 > 45 ) { v2 = (char *)a1 - 12288; v3 += 288; LABEL_98: world_4B3269[0] -= 64; v59 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) { v169 = v59; v60 = *(_DWORD *)world_4B3269[0]; v61 = 32; do { _EAX = *v3++; v60 *= 2; if ( (unsigned int)v2 < screen_buf_end ) { ASM_XLAT(_EAX,_EBX); *v2 = _EAX; } ++v2; --v61; } while ( v61 ); v59 = v169; } else { v3 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v59; } while ( v59 ); return; } v54 = world_4B33FD[v53]; v3 += *(int *)((char *)world_4B34BD + v54); v2 -= 192 * v54; v52 = 30 - (v54 >> 1); } do { v55 = &v2[v52]; v56 = (unsigned int)(32 - v52) >> 2; if ( !((32 - v52) & 2) ) goto LABEL_322; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v55 = __ROR2__(_EAX, 8); v55 += 2; if ( v56 ) { LABEL_322: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v55 = __ROR4__(_EAX, 8); v55 += 4; --v56; } while ( v56 ); } v2 = v55 - 800; v32 = __OFSUB__(v52, 2); v52 -= 2; } while ( !((v52 < 0) ^ v32) ); goto LABEL_98; } v40 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v41 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v41 > 45 ) { v2 = (char *)a1 - 12288; v3 += 288; LABEL_80: v46 = 2; if ( (unsigned int)v2 >= screen_buf_end ) { v47 = (unsigned int)&v2[-screen_buf_end + 1023] >> 8; if ( v47 > 42 ) return; v48 = world_4B33FD[v47]; v3 += *(int *)((char *)world_4B3501 + v48); v2 -= 192 * v48; v46 = (v48 >> 1) + 2; } do { for ( n = (unsigned int)(32 - v46) >> 2; n; --n ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v46) & 2 ) { _EAX = *(_WORD *)v3; v3 += 2; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v46 - 800]; v46 += 2; } while ( v46 != 32 ); return; } v42 = world_4B33FD[v41]; v3 += *(int *)((char *)world_4B34BD + v42); v2 -= 192 * v42; v40 = 30 - (v42 >> 1); } do { for ( ii = (unsigned int)(32 - v40) >> 2; ii; --ii ) { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v2 = __ROR4__(_EAX, 8); v2 += 4; } if ( (32 - (_BYTE)v40) & 2 ) { _EAX = *(_WORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v2 = __ROR2__(_EAX, 8); v2 += 2; } v2 = &v2[v40 - 800]; v32 = __OFSUB__(v40, 2); v40 -= 2; } while ( !((v40 < 0) ^ v32) ); goto LABEL_80; } v25 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v26 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v26 > 45 ) { v2 = (char *)a1 - 12288; v3 += 288; LABEL_62: v33 = 2; if ( (unsigned int)v2 >= screen_buf_end ) { v34 = (unsigned int)&v2[-screen_buf_end + 1023] >> 8; if ( v34 > 42 ) return; v35 = world_4B33FD[v34]; v3 += *(int *)((char *)world_4B3501 + v35); v2 -= 192 * v35; v33 = (v35 >> 1) + 2; } do { v36 = &v2[v33]; v37 = (unsigned int)(32 - v33) >> 2; if ( !((32 - v33) & 2) ) goto LABEL_323; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v36 = __ROR2__(_EAX, 8); v36 += 2; if ( v37 ) { LABEL_323: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v36 = __ROR4__(_EAX, 8); v36 += 4; --v37; } while ( v37 ); } v2 = v36 - 800; v33 += 2; } while ( v33 != 32 ); return; } v27 = world_4B33FD[v26]; v3 += *(int *)((char *)world_4B34BD + v27); v2 -= 192 * v27; v25 = 30 - (v27 >> 1); } do { v28 = &v2[v25]; v29 = (unsigned int)(32 - v25) >> 2; if ( !((32 - v25) & 2) ) goto LABEL_324; _EAX = *((_WORD *)v3 + 1); v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR2__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_WORD *)v28 = __ROR2__(_EAX, 8); v28 += 2; if ( v29 ) { LABEL_324: do { _EAX = *(_DWORD *)v3; v3 += 4; ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); _EAX = __ROR4__(_EAX, 8); ASM_XLAT(_EAX,_EBX); *(_DWORD *)v28 = __ROR4__(_EAX, 8); v28 += 4; --v29; } while ( v29 ); } v2 = v28 - 800; v32 = __OFSUB__(v25, 2); v25 -= 2; } while ( !((v25 < 0) ^ v32) ); goto LABEL_62; } v6 = (char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v7 = (unsigned char)(BYTE1(level_cel_block) >> 4); } else { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v6 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v8 = level_cel_block; _LOBYTE(v8) = BYTE1(v8); v7 = ((v8 >> 4) & 7) + 8; } switch ( v7 ) { case 8: v75 = 32; do { if ( (unsigned int)v2 < screen_buf_end ) { v170 = v75; v76 = *(_DWORD *)world_4B3269[0]; v77 = 32; do { v78 = *v6++; v76 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = v78; ++v2; --v77; } while ( v77 ); v75 = v170; } else { v6 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v75; } while ( v75 ); return; case 9: v79 = 32; do { v171 = v79; *(_DWORD *)world_4B3260 = *(_DWORD *)world_4B3269[0]; v80 = 32; do { while ( 1 ) { v81 = (unsigned char)*v6++; if ( (v81 & 0x80u) != 0 ) break; v80 -= v81; if ( (unsigned int)v2 < screen_buf_end ) { v82 = v81; v165 = v80; v83 = *(_DWORD *)world_4B3260; do { v84 = *v6++; v83 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = v84; ++v2; --v82; } while ( v82 ); *(_DWORD *)world_4B3260 = v83; v80 = v165; } else { v6 += v81; v2 += v81; } if ( !v80 ) goto LABEL_152; } _LOBYTE(v81) = -(char)v81; v2 += v81; if ( v81 & 0x1F ) *(_DWORD *)world_4B3260 <<= v81 & 0x1F; v80 -= v81; } while ( v80 ); LABEL_152: v2 -= 800; world_4B3269[0] -= 4; v79 = v171 - 1; } while ( v171 != 1 ); return; case 10: v85 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v86 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v86 > 45 ) { v2 = (char *)a1 - 12288; v6 += 288; LABEL_162: v92 = 2; if ( (unsigned int)v2 >= screen_buf_end ) { v93 = (unsigned int)&v2[-screen_buf_end + 1023] >> 8; if ( v93 > 42 ) return; v94 = world_4B33FD[v93]; v6 += *(int *)((char *)world_4B3501 + v94); v2 -= 192 * v94; v92 = (v94 >> 1) + 2; } do { v95 = &v2[v92]; v96 = (unsigned int)(32 - v92) >> 2; if ( !((32 - v92) & 2) || (v97 = *((_WORD *)v6 + 1), v6 += 4, *(_WORD *)v95 = v97, v95 += 2, v96) ) { do { v98 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v95 = v98; v95 += 4; --v96; } while ( v96 ); } v2 = v95 - 800; v92 += 2; } while ( v92 != 32 ); return; } v87 = world_4B33FD[v86]; v6 += *(int *)((char *)world_4B34BD + v87); v2 -= 192 * v87; v85 = 30 - (v87 >> 1); } do { v88 = &v2[v85]; v89 = (unsigned int)(32 - v85) >> 2; if ( !((32 - v85) & 2) || (v90 = *((_WORD *)v6 + 1), v6 += 4, *(_WORD *)v88 = v90, v88 += 2, v89) ) { do { v91 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v88 = v91; v88 += 4; --v89; } while ( v89 ); } v2 = v88 - 800; v32 = __OFSUB__(v85, 2); v85 -= 2; } while ( !((v85 < 0) ^ v32) ); goto LABEL_162; } if ( v7 != 11 ) { if ( v7 != 12 ) { v122 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v123 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v123 > 45 ) { v2 = (char *)a1 - 12288; v6 += 288; LABEL_217: world_4B3269[0] -= 64; v128 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) { v166 = v128; v129 = *(_DWORD *)world_4B3269[0]; v130 = 32; do { v131 = *v6++; v129 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = v131; ++v2; --v130; } while ( v130 ); v6 += (unsigned char)v6 & 2; v128 = v166; } else { v6 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v128; } while ( v128 ); return; } v124 = world_4B33FD[v123]; v6 += *(int *)((char *)world_4B34BD + v124); v2 -= 192 * v124; v122 = 30 - (v124 >> 1); } do { for ( jj = (unsigned int)(32 - v122) >> 2; jj; --jj ) { v126 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v126; v2 += 4; } if ( (32 - (_BYTE)v122) & 2 ) { v127 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v127; v2 += 2; } v2 = &v2[v122 - 800]; v32 = __OFSUB__(v122, 2); v122 -= 2; } while ( !((v122 < 0) ^ v32) ); goto LABEL_217; } v111 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v112 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v112 > 45 ) { v2 = (char *)a1 - 12288; v6 += 288; LABEL_198: world_4B3269[0] -= 64; v118 = 16; do { if ( (unsigned int)v2 < screen_buf_end ) { v172 = v118; v119 = *(_DWORD *)world_4B3269[0]; v120 = 32; do { v121 = *v6++; v119 *= 2; if ( (unsigned int)v2 < screen_buf_end ) *v2 = v121; ++v2; --v120; } while ( v120 ); v118 = v172; } else { v6 += 32; v2 += 32; } v2 -= 800; world_4B3269[0] -= 4; --v118; } while ( v118 ); return; } v113 = world_4B33FD[v112]; v6 += *(int *)((char *)world_4B34BD + v113); v2 -= 192 * v113; v111 = 30 - (v113 >> 1); } do { v114 = &v2[v111]; v115 = (unsigned int)(32 - v111) >> 2; if ( !((32 - v111) & 2) || (v116 = *((_WORD *)v6 + 1), v6 += 4, *(_WORD *)v114 = v116, v114 += 2, v115) ) { do { v117 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v114 = v117; v114 += 4; --v115; } while ( v115 ); } v2 = v114 - 800; v32 = __OFSUB__(v111, 2); v111 -= 2; } while ( !((v111 < 0) ^ v32) ); goto LABEL_198; } v99 = 30; if ( (unsigned int)a1 < screen_buf_end ) goto LABEL_175; v100 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v100 <= 45 ) { v101 = world_4B33FD[v100]; v6 += *(int *)((char *)world_4B34BD + v101); v2 -= 192 * v101; v99 = 30 - (v101 >> 1); do { LABEL_175: for ( kk = (unsigned int)(32 - v99) >> 2; kk; --kk ) { v103 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v103; v2 += 4; } if ( (32 - (_BYTE)v99) & 2 ) { v104 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v104; v2 += 2; } v2 = &v2[v99 - 800]; v32 = __OFSUB__(v99, 2); v99 -= 2; } while ( !((v99 < 0) ^ v32) ); goto LABEL_180; } v2 = (char *)a1 - 12288; v6 += 288; LABEL_180: v105 = 2; if ( (unsigned int)v2 >= screen_buf_end ) { v106 = (unsigned int)&v2[-screen_buf_end + 1023] >> 8; if ( v106 > 42 ) return; v107 = world_4B33FD[v106]; v6 += *(int *)((char *)world_4B3501 + v107); v2 -= 192 * v107; v105 = (v107 >> 1) + 2; } do { for ( ll = (unsigned int)(32 - v105) >> 2; ll; --ll ) { v109 = *(_DWORD *)v6; v6 += 4; *(_DWORD *)v2 = v109; v2 += 4; } if ( (32 - (_BYTE)v105) & 2 ) { v110 = *(_WORD *)v6; v6 += 4; *(_WORD *)v2 = v110; v2 += 2; } v2 = &v2[v105 - 800]; v105 += 2; } while ( v105 != 32 ); } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; //----- (0046886B) -------------------------------------------------------- void __fastcall drawLowerScreen(void *a1) { char v1; // edx char v2; // al char v3; // al char *v4; // edi _BYTE *v5; // esi char *v6; // ebx short v7; // ax unsigned char *v8; // esi short v9; // ax char *v10; // esi unsigned int v11; // eax int v12; // eax int v13; // edx char v14; // edx signed int v15; // ebp int v16; // eax int v17; // ecx signed int v18; // ebp int v19; // eax char m; // cl int v21; // eax char v22; // ch char v23; // ch char v24; // ch int v25; // ebp signed int v26; // eax unsigned int v27; // ecx char *v28; // edi int v29; // ecx char v30; // edx unsigned char v31; // of int v32; // ebp signed int v33; // eax unsigned int v34; // ecx char *v35; // edi int v36; // ecx char v37; // edx int v38; // ebp signed int v39; // eax unsigned int v40; // ecx int v41; // ecx int v42; // ebp signed int v43; // eax unsigned int v44; // ecx int v45; // ecx int v46; // ebp signed int v47; // eax unsigned int v48; // ecx char *v49; // edi char v50; // cl int v51; // eax char v52; // ch char v53; // ch char v54; // ch signed int v55; // ebp char v56; // cl int v57; // eax char v58; // ch char v59; // ch char v60; // ch int v61; // ebp signed int v62; // eax unsigned int v63; // ecx char n; // cl int v65; // eax char v66; // ch char v67; // ch char v68; // ch signed int v69; // ebp char v70; // cl int v71; // eax char v72; // ch char v73; // ch char v74; // ch signed int v75; // edx signed int v76; // ecx int v77; // eax int v78; // ecx signed int v79; // edx unsigned int v80; // eax unsigned int v81; // ecx unsigned char v82; // al char v83; // cf unsigned int v84; // ecx short v85; // ax int v86; // eax int v87; // edx signed int v88; // eax unsigned int v89; // ecx char *v90; // edi unsigned int v91; // ecx short v92; // ax int v93; // eax int v94; // edx signed int v95; // eax unsigned int v96; // ecx char *v97; // edi unsigned int v98; // ecx short v99; // ax int v100; // eax int v101; // edx signed int v102; // eax unsigned int v103; // ecx unsigned int jj; // ecx int v105; // eax short v106; // ax int v107; // edx signed int v108; // eax unsigned int v109; // ecx unsigned int kk; // ecx int v111; // eax short v112; // ax int v113; // edi int v114; // edx signed int v115; // eax unsigned int v116; // ecx char *v117; // edi unsigned int v118; // ecx short v119; // ax int v120; // eax signed int v121; // edx signed int v122; // ecx int v123; // eax int v124; // edx signed int v125; // eax unsigned int v126; // ecx unsigned int ii; // ecx int v128; // eax short v129; // ax signed int v130; // edx signed int v131; // ecx int v132; // eax signed int v133; // edx signed int v134; // ecx int v135; // ecx signed int v136; // edx unsigned int v137; // eax unsigned int v138; // ecx unsigned int v139; // ecx signed int i; // edx char *v141; // edi unsigned int v142; // ecx signed int v143; // edx char *v144; // edi unsigned int v145; // ecx signed int j; // edx unsigned int v147; // ecx char *v148; // edi signed int v149; // edx unsigned int v150; // ecx signed int k; // edx char *v152; // edi unsigned int v153; // ecx signed int v154; // edx signed int v155; // ecx signed int l; // edx unsigned int v157; // ecx char *v158; // edi signed int v159; // edx signed int v160; // ecx int v161; // [esp-14h] [ebp-18h] int v162; // [esp-14h] [ebp-18h] int v163; // [esp-10h] [ebp-14h] int v164; // [esp-10h] [ebp-14h] v1 = cel_transparency_active; if ( cel_transparency_active ) { if ( !arch_draw_type ) { drawTopArchesLowerScreen(a1); return; } if ( arch_draw_type == 1 ) { v2 = block_lvid[level_piece_id]; if ( v2 == 1 || v2 == 3 ) { drawBottomArchesLowerScreen(a1, (int)&tile_draw_masks[1][31]); return; } } if ( arch_draw_type == 2 ) { v3 = block_lvid[level_piece_id]; if ( v3 == 2 || v3 == 3 ) { drawBottomArchesLowerScreen(a1, (int)&tile_draw_masks[0][31]); return; } } } world_4B3265 = (int)speed_cel_frame_num_from_light_index_frame_num; v4 = (char *)a1; if ( (_BYTE)light_table_index ) { if ( (_BYTE)light_table_index == lightmax ) { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v10 = (char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v11 = level_cel_block; _LOBYTE(v11) = BYTE1(v11); v12 = (v11 >> 4) & 7; if ( v12 ) { switch ( (_WORD)v12 ) { case 1: v135 = 32; do { v164 = v135; v136 = 32; do { while ( 1 ) { v137 = (unsigned char)*v10++; if ( (v137 & 0x80u) == 0 ) break; _LOBYTE(v137) = -(char)v137; v4 += v137; v136 -= v137; if ( !v136 ) goto LABEL_232; } v136 -= v137; if ( (unsigned int)v4 < screen_buf_end ) { v10 += v137; v138 = v137 >> 1; if ( !(v137 & 1) || (*v4 = 0, ++v4, v138) ) { v83 = v138 & 1; v139 = v137 >> 2; if ( !v83 || (*(_WORD *)v4 = 0, v4 += 2, v139) ) { do { *(_DWORD *)v4 = 0; v4 += 4; --v139; } while ( v139 ); } } } else { v10 += v137; v4 += v137; } } while ( v136 ); LABEL_232: v4 -= 800; v135 = v164 - 1; } while ( v164 != 1 ); break; case 2: for ( i = 30; ; i -= 2 ) { if ( (unsigned int)v4 < screen_buf_end ) { v141 = &v4[i]; v142 = (unsigned int)(32 - i) >> 2; if ( !((32 - i) & 2) || (*(_WORD *)v141 = 0, v141 += 2, v142) ) { do { *(_DWORD *)v141 = 0; v141 += 4; --v142; } while ( v142 ); } } else { v10 = &v10[-i + 32]; v141 = v4 + 32; } v4 = v141 - 800; if ( !i ) break; } v143 = 2; do { if ( (unsigned int)v4 < screen_buf_end ) { v144 = &v4[v143]; v145 = (unsigned int)(32 - v143) >> 2; if ( !((32 - v143) & 2) || (*(_WORD *)v144 = 0, v144 += 2, v145) ) { do { *(_DWORD *)v144 = 0; v144 += 4; --v145; } while ( v145 ); } } else { v10 = &v10[-v143 + 32]; v144 = v4 + 32; } v4 = v144 - 800; v143 += 2; } while ( v143 != 32 ); break; case 3: for ( j = 30; ; j -= 2 ) { if ( (unsigned int)v4 < screen_buf_end ) { v147 = (unsigned int)(32 - j) >> 2; if ( !((32 - j) & 2) || (*(_WORD *)v4 = 0, v4 += 2, v147) ) { do { *(_DWORD *)v4 = 0; v4 += 4; --v147; } while ( v147 ); } } else { v10 = &v10[-j + 32]; v4 = &v4[-j + 32]; } v148 = v4 - 800; if ( !j ) break; v4 = &v148[j]; } v149 = 2; do { if ( (unsigned int)v148 < screen_buf_end ) { v150 = (unsigned int)(32 - v149) >> 2; if ( !((32 - v149) & 2) || (*(_WORD *)v148 = 0, v148 += 2, v150) ) { do { *(_DWORD *)v148 = 0; v148 += 4; --v150; } while ( v150 ); } } else { v10 = &v10[-v149 + 32]; v148 = &v148[-v149 + 32]; } v148 = &v148[v149 - 800]; v149 += 2; } while ( v149 != 32 ); break; case 4: for ( k = 30; ; k -= 2 ) { if ( (unsigned int)v4 < screen_buf_end ) { v152 = &v4[k]; v153 = (unsigned int)(32 - k) >> 2; if ( !((32 - k) & 2) || (*(_WORD *)v152 = 0, v152 += 2, v153) ) { do { *(_DWORD *)v152 = 0; v152 += 4; --v153; } while ( v153 ); } } else { v10 = &v10[-k + 32]; v152 = v4 + 32; } v4 = v152 - 800; if ( !k ) break; } v154 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) { v155 = 8; do { *(_DWORD *)v4 = 0; v4 += 4; --v155; } while ( v155 ); } else { v10 += 32; v4 += 32; } v4 -= 800; --v154; } while ( v154 ); break; default: for ( l = 30; ; l -= 2 ) { if ( (unsigned int)v4 < screen_buf_end ) { v157 = (unsigned int)(32 - l) >> 2; if ( !((32 - l) & 2) || (*(_WORD *)v4 = 0, v4 += 2, v157) ) { do { *(_DWORD *)v4 = 0; v4 += 4; --v157; } while ( v157 ); } } else { v10 = &v10[-l + 32]; v4 = &v4[-l + 32]; } v158 = v4 - 800; if ( !l ) break; v4 = &v158[l]; } v159 = 16; do { if ( (unsigned int)v158 < screen_buf_end ) { v160 = 8; do { *(_DWORD *)v158 = 0; v158 += 4; --v160; } while ( v160 ); } else { v10 += 32; v158 += 32; } v158 -= 800; --v159; } while ( v159 ); break; } } else { v133 = 32; do { if ( (unsigned int)v4 < screen_buf_end ) { v134 = 8; do { *(_DWORD *)v4 = 0; v4 += 4; --v134; } while ( v134 ); } else { v10 += 32; v4 += 32; } v4 -= 800; --v133; } while ( v133 ); } return; } if ( !(level_cel_block & 0x8000) ) { v5 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v6 = &pLightTbl[256 * light_table_index]; v7 = (unsigned short)level_cel_block >> 12; if ( !((unsigned short)level_cel_block >> 12) ) { v13 = 32; do { v161 = v13; if ( (unsigned int)v4 < screen_buf_end ) { v14 = 0; v15 = 8; do { v16 = *(_DWORD *)v5; v5 += 4; v16 = __ROR4__(v16, 16); _LOBYTE(v14) = v16; _LOBYTE(a1) = v6[v14]; _LOBYTE(v14) = BYTE1(v16); BYTE1(a1) = v6[v14]; v16 = __ROR4__(v16, 16); a1 = (void *)((_DWORD)a1 << 16); _LOBYTE(v14) = v16; _LOBYTE(a1) = v6[v14]; _LOBYTE(v14) = BYTE1(v16); BYTE1(a1) = v6[v14]; *(_DWORD *)v4 = (unsigned int)a1; v4 += 4; --v15; } while ( v15 ); } else { v5 += 32; v4 += 32; } v4 -= 800; v13 = v161 - 1; } while ( v161 != 1 ); return; } if ( v7 == 1 ) { v17 = 32; do { v162 = v17; v18 = 32; do { v19 = (unsigned char)*v5++; if ( (v19 & 0x80u) == 0 ) { v18 -= v19; if ( (unsigned int)v4 < screen_buf_end ) { for ( m = v19; m >= 4; m -= 4 ) { v21 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v21; v22 = v6[v1]; _LOBYTE(v1) = BYTE1(v21); v21 = __ROR4__(v21, 16); *v4 = v22; v23 = v6[v1]; _LOBYTE(v1) = v21; v4[1] = v23; v24 = v6[v1]; _LOBYTE(v1) = BYTE1(v21); v4[2] = v24; v4[3] = v6[v1]; v4 += 4; } if ( m >= 2 ) { _LOBYTE(v1) = *v5; *v4 = v6[v1]; _LOBYTE(v1) = v5[1]; v4[1] = v6[v1]; v5 += 2; v4 += 2; } if ( m & 1 ) { _LOBYTE(v1) = *v5++; *v4++ = v6[v1]; } } else { v5 += v19; v4 += v19; } } else { _LOBYTE(v19) = -(char)v19; v4 += v19; v18 -= v19; } } while ( v18 ); v4 -= 800; v17 = v162 - 1; } while ( v162 != 1 ); return; } if ( v7 != 2 ) { if ( v7 != 3 ) { if ( v7 != 4 ) { v61 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v62 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v62 > 45 ) { v4 = (char *)a1 - 12288; v5 += 288; LABEL_116: v69 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) { v70 = 32; do { v71 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v71; v72 = v6[v1]; _LOBYTE(v1) = BYTE1(v71); v71 = __ROR4__(v71, 16); *v4 = v72; v73 = v6[v1]; _LOBYTE(v1) = v71; v4[1] = v73; v74 = v6[v1]; _LOBYTE(v1) = BYTE1(v71); v4[2] = v74; v4[3] = v6[v1]; v4 += 4; v70 -= 4; } while ( v70 >= 4 ); } else { v5 += 32; v4 += 32; } v4 -= 800; --v69; } while ( v69 ); return; } v63 = world_4B33FD[v62]; v5 += *(int *)((char *)world_4B34BD + v63); v4 -= 192 * v63; v61 = 30 - (v63 >> 1); } do { for ( n = 32 - v61; n >= 4; n -= 4 ) { v65 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v65; v66 = v6[v1]; _LOBYTE(v1) = BYTE1(v65); v65 = __ROR4__(v65, 16); *v4 = v66; v67 = v6[v1]; _LOBYTE(v1) = v65; v4[1] = v67; v68 = v6[v1]; _LOBYTE(v1) = BYTE1(v65); v4[2] = v68; v4[3] = v6[v1]; v4 += 4; } if ( n >= 2 ) { _LOBYTE(v1) = *v5; *v4 = v6[v1]; _LOBYTE(v1) = v5[1]; v4[1] = v6[v1]; v5 += 2; v4 += 2; } v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v61 - 800]; v31 = __OFSUB__(v61, 2); v61 -= 2; } while ( !((v61 < 0) ^ v31) ); goto LABEL_116; } v46 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v47 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v47 > 45 ) { v4 = (char *)a1 - 12288; v5 += 288; LABEL_100: v55 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) { v56 = 32; do { v57 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v57; v58 = v6[v1]; _LOBYTE(v1) = BYTE1(v57); v57 = __ROR4__(v57, 16); *v4 = v58; v59 = v6[v1]; _LOBYTE(v1) = v57; v4[1] = v59; v60 = v6[v1]; _LOBYTE(v1) = BYTE1(v57); v4[2] = v60; v4[3] = v6[v1]; v4 += 4; v56 -= 4; } while ( v56 >= 4 ); } else { v5 += 32; v4 += 32; } v4 -= 800; --v55; } while ( v55 ); return; } v48 = world_4B33FD[v47]; v5 += *(int *)((char *)world_4B34BD + v48); v4 -= 192 * v48; v46 = 30 - (v48 >> 1); } do { v49 = &v4[v46]; v50 = 32 - v46; v1 = (32 - (_BYTE)v46) & 2; v5 += v1; if ( (char)(32 - v46) >= 4 ) { do { v51 = *(_DWORD *)v5; v5 += 4; _LOBYTE(v1) = v51; v52 = v6[v1]; _LOBYTE(v1) = BYTE1(v51); v51 = __ROR4__(v51, 16); *v49 = v52; v53 = v6[v1]; _LOBYTE(v1) = v51; v49[1] = v53; v54 = v6[v1]; _LOBYTE(v1) = BYTE1(v51); v49[2] = v54; v49[3] = v6[v1]; v49 += 4; v50 -= 4; } while ( v50 >= 4 ); } if ( v50 >= 2 ) { _LOBYTE(v1) = *v5; *v49 = v6[v1]; _LOBYTE(v1) = v5[1]; v49[1] = v6[v1]; v5 += 2; v49 += 2; } v4 = v49 - 800; v31 = __OFSUB__(v46, 2); v46 -= 2; } while ( !((v46 < 0) ^ v31) ); goto LABEL_100; } v38 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v39 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v39 > 45 ) { v4 = (char *)a1 - 12288; v5 += 288; LABEL_83: v42 = 2; if ( (unsigned int)v4 >= screen_buf_end ) { v43 = (unsigned int)&v4[-screen_buf_end + 1023] >> 8; if ( v43 > 42 ) return; v44 = world_4B33FD[v43]; v5 += *(int *)((char *)world_4B3501 + v44); v4 -= 192 * v44; v42 = (v44 >> 1) + 2; } do { v45 = 32 - v42; do { _LOBYTE(v1) = *v5++; *v4++ = v6[v1]; --v45; } while ( v45 ); v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v42 - 800]; v42 += 2; } while ( v42 != 32 ); return; } v40 = world_4B33FD[v39]; v5 += *(int *)((char *)world_4B34BD + v40); v4 -= 192 * v40; v38 = 30 - (v40 >> 1); } do { v41 = 32 - v38; do { _LOBYTE(v1) = *v5++; *v4++ = v6[v1]; --v41; } while ( v41 ); v1 = (unsigned char)v5 & 2; v5 += v1; v4 = &v4[v38 - 800]; v31 = __OFSUB__(v38, 2); v38 -= 2; } while ( !((v38 < 0) ^ v31) ); goto LABEL_83; } v25 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v26 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v26 > 45 ) { v4 = (char *)a1 - 12288; v5 += 288; LABEL_68: v32 = 2; if ( (unsigned int)v4 >= screen_buf_end ) { v33 = (unsigned int)&v4[-screen_buf_end + 1023] >> 8; if ( v33 > 42 ) return; v34 = world_4B33FD[v33]; v5 += *(int *)((char *)world_4B3501 + v34); v4 -= 192 * v34; v32 = (v34 >> 1) + 2; } do { v35 = &v4[v32]; v36 = 32 - v32; v37 = (32 - (_BYTE)v32) & 2; v5 += v37; do { _LOBYTE(v37) = *v5++; *v35++ = v6[v37]; --v36; } while ( v36 ); v32 += 2; v4 = v35 - 800; } while ( v32 != 32 ); return; } v27 = world_4B33FD[v26]; v5 += *(int *)((char *)world_4B34BD + v27); v4 -= 192 * v27; v25 = 30 - (v27 >> 1); } do { v28 = &v4[v25]; v29 = 32 - v25; v30 = (32 - (_BYTE)v25) & 2; v5 += v30; do { _LOBYTE(v30) = *v5++; *v28++ = v6[v30]; --v29; } while ( v29 ); v4 = v28 - 800; v31 = __OFSUB__(v25, 2); v25 -= 2; } while ( !((v25 < 0) ^ v31) ); goto LABEL_68; } v8 = (unsigned char *)pSpeedCels + *(_DWORD *)(4 * (light_table_index + 16 * (level_cel_block & 0xFFF)) + world_4B3265); v9 = (unsigned short)level_cel_block >> 12; } else { if ( level_cel_block & 0x8000 ) level_cel_block = *(_DWORD *)(((level_cel_block & 0xFFF) << 6) + world_4B3265) + (unsigned short)(level_cel_block & 0xF000); v8 = (unsigned char *)pDungeonCels + *((_DWORD *)pDungeonCels + (level_cel_block & 0xFFF)); v9 = (((unsigned int)level_cel_block >> 12) & 7) + 8; } switch ( v9 ) { case 8: v75 = 32; do { if ( (unsigned int)v4 < screen_buf_end ) { v76 = 8; do { v77 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v77; v4 += 4; --v76; } while ( v76 ); } else { v8 += 32; v4 += 32; } v4 -= 800; --v75; } while ( v75 ); return; case 9: v78 = 32; do { v163 = v78; v79 = 32; do { while ( 1 ) { v80 = *v8++; if ( (v80 & 0x80u) == 0 ) break; _LOBYTE(v80) = -(char)v80; v4 += v80; v79 -= v80; if ( !v79 ) goto LABEL_143; } v79 -= v80; if ( (unsigned int)v4 < screen_buf_end ) { v81 = v80 >> 1; if ( !(v80 & 1) || (v82 = *v8, ++v8, *v4 = v82, ++v4, v81) ) { v83 = v81 & 1; v84 = v81 >> 1; if ( !v83 || (v85 = *(_WORD *)v8, v8 += 2, *(_WORD *)v4 = v85, v4 += 2, v84) ) { do { v86 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v86; v4 += 4; --v84; } while ( v84 ); } } } else { v8 += v80; v4 += v80; } } while ( v79 ); LABEL_143: v4 -= 800; v78 = v163 - 1; } while ( v163 != 1 ); return; case 10: v87 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v88 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v88 > 45 ) { v4 = (char *)a1 - 12288; v8 += 288; LABEL_153: v94 = 2; if ( (unsigned int)v4 >= screen_buf_end ) { v95 = (unsigned int)&v4[-screen_buf_end + 1023] >> 8; if ( v95 > 42 ) return; v96 = world_4B33FD[v95]; v8 += *(int *)((char *)world_4B3501 + v96); v4 -= 192 * v96; v94 = (v96 >> 1) + 2; } do { v97 = &v4[v94]; v98 = (unsigned int)(32 - v94) >> 2; if ( !((32 - v94) & 2) || (v99 = *((_WORD *)v8 + 1), v8 += 4, *(_WORD *)v97 = v99, v97 += 2, v98) ) { do { v100 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v97 = v100; v97 += 4; --v98; } while ( v98 ); } v94 += 2; v4 = v97 - 800; } while ( v94 < 32 ); return; } v89 = world_4B33FD[v88]; v8 += *(int *)((char *)world_4B34BD + v89); v4 -= 192 * v89; v87 = 30 - (v89 >> 1); } do { v90 = &v4[v87]; v91 = (unsigned int)(32 - v87) >> 2; if ( !((32 - v87) & 2) || (v92 = *((_WORD *)v8 + 1), v8 += 4, *(_WORD *)v90 = v92, v90 += 2, v91) ) { do { v93 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v90 = v93; v90 += 4; --v91; } while ( v91 ); } v4 = v90 - 800; v31 = __OFSUB__(v87, 2); v87 -= 2; } while ( !((v87 < 0) ^ v31) ); goto LABEL_153; } if ( v9 != 11 ) { if ( v9 != 12 ) { v124 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v125 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v125 > 45 ) { v4 = (char *)a1 - 12288; v8 += 288; LABEL_205: v130 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) { v131 = 8; do { v132 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v132; v4 += 4; --v131; } while ( v131 ); } else { v8 += 32; v4 += 32; } v4 -= 800; --v130; } while ( v130 ); return; } v126 = world_4B33FD[v125]; v8 += *(int *)((char *)world_4B34BD + v126); v4 -= 192 * v126; v124 = 30 - (v126 >> 1); } do { for ( ii = (unsigned int)(32 - v124) >> 2; ii; --ii ) { v128 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v128; v4 += 4; } if ( (32 - (_BYTE)v124) & 2 ) { v129 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v129; v4 += 2; } v4 = &v4[v124 - 800]; v31 = __OFSUB__(v124, 2); v124 -= 2; } while ( !((v124 < 0) ^ v31) ); goto LABEL_205; } v114 = 30; if ( (unsigned int)a1 >= screen_buf_end ) { v115 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v115 > 45 ) { v4 = (char *)a1 - 12288; v8 += 288; LABEL_189: v121 = 16; do { if ( (unsigned int)v4 < screen_buf_end ) { v122 = 8; do { v123 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v123; v4 += 4; --v122; } while ( v122 ); } else { v8 += 32; v4 += 32; } v4 -= 800; --v121; } while ( v121 ); return; } v116 = world_4B33FD[v115]; v8 += *(int *)((char *)world_4B34BD + v116); v4 -= 192 * v116; v114 = 30 - (v116 >> 1); } do { v117 = &v4[v114]; v118 = (unsigned int)(32 - v114) >> 2; if ( !((32 - v114) & 2) || (v119 = *((_WORD *)v8 + 1), v8 += 4, *(_WORD *)v117 = v119, v117 += 2, v118) ) { do { v120 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v117 = v120; v117 += 4; --v118; } while ( v118 ); } v4 = v117 - 800; v31 = __OFSUB__(v114, 2); v114 -= 2; } while ( !((v114 < 0) ^ v31) ); goto LABEL_189; } v101 = 30; if ( (unsigned int)a1 < screen_buf_end ) goto LABEL_166; v102 = (unsigned int)((char *)a1 - screen_buf_end + 1023) >> 8; if ( v102 <= 45 ) { v103 = world_4B33FD[v102]; v8 += *(int *)((char *)world_4B34BD + v103); v4 -= 192 * v103; v101 = 30 - (v103 >> 1); do { LABEL_166: for ( jj = (unsigned int)(32 - v101) >> 2; jj; --jj ) { v105 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v105; v4 += 4; } if ( (32 - (_BYTE)v101) & 2 ) { v106 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v106; v4 += 2; } v4 = &v4[v101 - 800]; v31 = __OFSUB__(v101, 2); v101 -= 2; } while ( !((v101 < 0) ^ v31) ); goto LABEL_171; } v4 = (char *)a1 - 12288; v8 += 288; LABEL_171: v107 = 2; if ( (unsigned int)v4 >= screen_buf_end ) { v108 = (unsigned int)&v4[-screen_buf_end + 1023] >> 8; if ( v108 > 42 ) return; v109 = world_4B33FD[v108]; v8 += *(int *)((char *)world_4B3501 + v109); v4 -= 192 * v109; v107 = (v109 >> 1) + 2; } do { for ( kk = (unsigned int)(32 - v107) >> 2; kk; --kk ) { v111 = *(_DWORD *)v8; v8 += 4; *(_DWORD *)v4 = v111; v4 += 4; } if ( (32 - (_BYTE)v107) & 2 ) { v112 = *(_WORD *)v8; v8 += 4; *(_WORD *)v4 = v112; v4 += 2; } v113 = (int)&v4[v107]; v107 += 2; v4 = (char *)(v113 - 800); } while ( v107 < 32 ); } // 642A14: using guessed type char lightmax; // 69BEF8: using guessed type int light_table_index; // 69CF0C: using guessed type int screen_buf_end; // 69CF14: using guessed type int level_cel_block; // 69CF20: using guessed type char arch_draw_type; // 69CF94: using guessed type int cel_transparency_active; // 69CF98: using guessed type int level_piece_id; //----- (004696BE) -------------------------------------------------------- void __fastcall world_draw_black_tile(char *dst_buf) { char *v1; // edi signed int v2; // edx signed int i; // ebx char *v4; // edi signed int v5; // ecx signed int v6; // edx signed int v7; // ebx char *v8; // edi signed int v9; // ecx v1 = dst_buf; v2 = 30; for ( i = 1; ; ++i ) { v4 = &v1[v2]; v5 = i; do { *(_DWORD *)v4 = 0; v4 += 4; --v5; } while ( v5 ); v1 = &v4[v2 - 832]; if ( !v2 ) break; v2 -= 2; } v6 = 2; v7 = 15; do { v8 = &v1[v6]; v9 = v7; do { *(_DWORD *)v8 = 0; v8 += 4; --v9; } while ( v9 ); v1 = &v8[v6 - 832]; --v7; v6 += 2; } while ( v6 != 32 ); }