/* * UNPUBLISHED -- Rights reserved under the copyright laws of the * United States. Use of a copyright notice is precautionary only and * does not imply publication or disclosure. * * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION * OF BLIZZARD ENTERTAINMENT. ANY DUPLICATION, MODIFICATION, * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT. */ #include "../types.h" int qtexty; // weak char *qtextptr; int qtextSpd; // weak char qtextflag; // weak int scrolltexty; // weak int sgLastScroll; // weak void *pMedTextCels; void *pTextBoxCels; unsigned char mfontframe[127] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 49, 38, 0, 39, 40, 47, 42, 43, 41, 45, 52, 44, 53, 55, 36, 27, 28, 29, 30, 31, 32, 33, 34, 35, 51, 50, 48, 46, 49, 54, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 0, 43, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 48, 0, 49, 0 }; unsigned char mfontkern[56] = { 5, 15, 10, 13, 14, 10, 9, 13, 11, 5, 5, 11, 10, 16, 13, 16, 10, 15, 12, 10, 14, 17, 17, 22, 17, 16, 11, 5, 11, 11, 11, 10, 11, 11, 11, 11, 15, 5, 10, 18, 15, 8, 6, 6, 7, 10, 9, 6, 10, 10, 5, 5, 5, 5, 11, 12 }; /* rdata */ int qscroll_spd_tbl[9] = { 2, 4, 6, 8, 0, -1, -2, -3, -4 }; //----- (00428056) -------------------------------------------------------- void __cdecl FreeQuestText() { void *v0; // ecx void *v1; // ecx v0 = pMedTextCels; pMedTextCels = 0; mem_free_dbg(v0); v1 = pTextBoxCels; pTextBoxCels = 0; mem_free_dbg(v1); } //----- (0042807A) -------------------------------------------------------- void __cdecl InitQuestText() { unsigned char *v0; // eax pMedTextCels = LoadFileInMem("Data\\MedTextS.CEL", 0); v0 = LoadFileInMem("Data\\TextBox.CEL", 0); qtextflag = 0; pTextBoxCels = v0; } // 646D00: using guessed type char qtextflag; //----- (004280A4) -------------------------------------------------------- void __fastcall InitQTextMsg(int m) { if ( alltext[m].scrlltxt ) { questlog = 0; qtextptr = alltext[m].txtstr; qtextflag = 1; qtexty = 500; sgLastScroll = qscroll_spd_tbl[alltext[m].txtspd - 1]; /* double check offset */ scrolltexty = sgLastScroll; qtextSpd = GetTickCount(); } PlaySFX(alltext[m].sfxnr); } // 646CF4: using guessed type int qtexty; // 646CFC: using guessed type int qtextSpd; // 646D00: using guessed type char qtextflag; // 646D04: using guessed type int scrolltexty; // 646D08: using guessed type int sgLastScroll; // 69BD04: using guessed type int questlog; //----- (00428104) -------------------------------------------------------- void __cdecl DrawQTextBack() { char *v0; // edi signed int v1; // edx signed int v2; // ecx int v3; // edi signed int v4; // ecx _BYTE *v5; // edi signed int v6; // ecx CelDecodeOnly(88, 487, pTextBoxCels, 1, 591); v0 = &gpBuffer->row[324].pixels[27]; v1 = 148; do { v2 = 292; do { *v0 = 0; v0 += 2; --v2; } while ( v2 ); *v0 = 0; v3 = (int)(v0 - 1352); v4 = 292; do { v5 = (_BYTE *)(v3 + 1); *v5 = 0; v3 = (int)(v5 + 1); --v4; } while ( v4 ); v0 = (char *)(v3 - 1352); --v1; } while ( v1 ); v6 = 292; do { *v0 = 0; v0 += 2; --v6; } while ( v6 ); *v0 = 0; } //----- (00428160) -------------------------------------------------------- void __fastcall PrintQTextChr(int screen_x, int screen_y, char *cel_buf, int frame) { char *v4; // ebx char *v5; // esi char *v6; // edi int v7; // ebx signed int v8; // edx unsigned int v9; // eax unsigned int v10; // ecx char v11; // cf unsigned int v12; // ecx char *v13; // [esp+14h] [ebp-8h] char *v14; // [esp+18h] [ebp-4h] v13 = (char *)gpBuffer + screen_y_times_768[209]; v14 = (char *)gpBuffer + screen_y_times_768[469]; v4 = &cel_buf[4 * frame]; v5 = &cel_buf[*(_DWORD *)v4]; v6 = (char *)gpBuffer + screen_y_times_768[screen_y] + screen_x; v7 = (int)&v5[*((_DWORD *)v4 + 1) - *(_DWORD *)v4]; do { v8 = 22; do { while ( 1 ) { v9 = (unsigned char)*v5++; if ( (v9 & 0x80u) == 0 ) break; _LOBYTE(v9) = -(char)v9; v6 += v9; v8 -= v9; if ( !v8 ) goto LABEL_15; } v8 -= v9; if ( v6 < v13 || v6 > v14 ) { v5 += v9; v6 += v9; } else { v10 = v9 >> 1; if ( !(v9 & 1) || (*v6 = *v5, ++v5, ++v6, v10) ) { v11 = v10 & 1; v12 = v9 >> 2; if ( !v11 || (*(_WORD *)v6 = *(_WORD *)v5, v5 += 2, v6 += 2, v12) ) { qmemcpy(v6, v5, 4 * v12); v5 += 4 * v12; v6 += 4 * v12; } } } } while ( v8 ); LABEL_15: v6 -= 790; } while ( (char *)v7 != v5 ); } //----- (00428202) -------------------------------------------------------- void __cdecl DrawQText() { char *v0; // edi signed int v1; // edx int v2; // ecx char *i; // esi unsigned char v4; // al unsigned char v5; // al char v6; // dl char *v7; // eax unsigned char v8; // al char *v9; // esi unsigned char v10; // bl DWORD v11; // eax char qstr[128]; // [esp+8h] [ebp-90h] char *v13; // [esp+88h] [ebp-10h] int v14; // [esp+8Ch] [ebp-Ch] int screen_y; // [esp+90h] [ebp-8h] int screen_x; // [esp+94h] [ebp-4h] DrawQTextBack(); v0 = qtextptr; screen_x = 112; v13 = 0; screen_y = qtexty; v14 = 0; do { v1 = 0; v2 = 0; for ( i = v0; *i != 10; ++v2 ) { if ( *i == 124 || v1 >= 543 ) break; v4 = *i++; v5 = fontidx[v4]; if ( v5 ) { qstr[v2] = v5; v1 += mfontkern[mfontframe[v5]] + 2; } else { --v2; } } v6 = *i; v7 = &qstr[v2]; qstr[v2] = 0; if ( v6 == 124 ) { *v7 = 0; v14 = 1; } else if ( v6 != 10 ) { while ( *v7 != 32 && v2 > 0 ) { *v7 = 0; v7 = &qstr[--v2]; } } v8 = qstr[0]; if ( qstr[0] ) { v9 = qstr; do { ++v0; v10 = mfontframe[fontidx[v8]]; if ( *v0 == 10 ) ++v0; if ( v10 ) PrintQTextChr(screen_x, screen_y, (char *)pMedTextCels, v10); ++v9; screen_x += mfontkern[v10] + 2; v8 = *v9; } while ( *v9 ); } if ( !v13 ) v13 = v0; screen_y += 38; screen_x = 112; if ( screen_y > 501 ) v14 = 1; } while ( !v14 ); v11 = GetTickCount(); while ( 1 ) { if ( sgLastScroll <= 0 ) { qtexty = qtexty + sgLastScroll - 1; goto LABEL_33; } if ( --scrolltexty ) { --qtexty; LABEL_33: if ( scrolltexty ) goto LABEL_35; } scrolltexty = sgLastScroll; LABEL_35: if ( qtexty <= 209 ) break; qtextSpd += 50; if ( v11 - qtextSpd >= 0x7FFFFFFF ) return; } qtexty += 38; qtextptr = v13; if ( *v13 == 124 ) qtextflag = 0; } // 646CF4: using guessed type int qtexty; // 646CFC: using guessed type int qtextSpd; // 646D00: using guessed type char qtextflag; // 646D04: using guessed type int scrolltexty; // 646D08: using guessed type int sgLastScroll; // 428202: using guessed type char qstr[128];