# HG changeset patch # User Ritor1 # Date 1360837043 -21600 # Node ID 90521fb9766c181584877b3a1138bf07c41b3f6b # Parent 71b13d70f5a63fdb9b2b2bfc5e8984a39f8a7df8 NPCDialogue fix diff -r 71b13d70f5a6 -r 90521fb9766c GUIWindow.h --- a/GUIWindow.h Thu Feb 14 14:48:54 2013 +0600 +++ b/GUIWindow.h Thu Feb 14 16:17:23 2013 +0600 @@ -23,8 +23,13 @@ }; - - +enum DIALOGUE_TYPE +{ + DIALOGUE_ARENA_WELCOME = 0x89, + DIALOGUE_ARENA_FIGHT_NOT_OVER_YET = 0x90, + DIALOGUE_ARENA_REWARD = 0x91, + DIALOGUE_ARENA_ALREADY_WON = 0x92, +}; diff -r 71b13d70f5a6 -r 90521fb9766c mm7_3.cpp --- a/mm7_3.cpp Thu Feb 14 14:48:54 2013 +0600 +++ b/mm7_3.cpp Thu Feb 14 16:17:23 2013 +0600 @@ -15920,10 +15920,10 @@ //----- (00445350) -------------------------------------------------------- void __cdecl DrawDialogueUI() { - NPCData *v0; // ebx@2 + NPCData *pNPC; // ebx@2 int v1; // eax@2 unsigned __int16 v2; // di@2 - unsigned int v3; // eax@2 + //unsigned int v3; // eax@2 char *v4; // esi@3 int v5; // eax@11 char *v6; // ecx@13 @@ -15968,7 +15968,7 @@ unsigned int v45; // ecx@104 unsigned __int16 *v46; // edx@104 unsigned __int16 v47; // ax@104 - char pFont; // [sp+4h] [bp-110h]@39 + GUIWindow pWindow; // [sp+4h] [bp-110h]@39 int v49; // [sp+Ch] [bp-108h]@39 int v50; // [sp+14h] [bp-100h]@39 GUIWindow v51; // [sp+58h] [bp-BCh]@2 @@ -15982,7 +15982,7 @@ if ( !pDialogueWindow ) return; memcpy(&v51, pDialogueWindow, sizeof(v51)); - v0 = GetNPCData(uDialogue_SpeakingActorNPC_ID); + pNPC = GetNPCData(uDialogue_SpeakingActorNPC_ID); v1 = sub_445C8B(uDialogue_SpeakingActorNPC_ID); v51.uFrameWidth -= 10; v51.uFrameZ -= 10; @@ -15990,41 +15990,81 @@ GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); - pRenderer->DrawTextureIndexed(0x1DDu, 0, pTexture_Dialogue_Background); - pRenderer->DrawTextureTransparent(0x1D4u, 0, (Texture *)(uTextureID_507B04 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507B04] : 0)); + pRenderer->DrawTextureIndexed(477, 0, pTexture_Dialogue_Background); + pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_507B04 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507B04] : 0)); pRenderer->DrawTextureIndexed(pNPCPortraits_x - 4, pNPCPortraits_y - 4, (Texture *)(uTextureID_50795C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50795C] : 0)); pRenderer->DrawTextureIndexed(pNPCPortraits_x, pNPCPortraits_y, pDialogueNPCPortraits[0]); - v3 = v0->uProfession; - if ( v3 ) - { - v4 = pTmpBuf; - sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[429], v0->pName, aNPCProfessionNames[v3]); - } - else - { - strcpy(pTmpBuf, v0->pName); - v4 = pTmpBuf; - } - v51.DrawTitleText(pFontArrus, 0x1E3u, 0x70u, v2, v4, 3u); + if ( pNPC->uProfession ) + { + sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[429], pNPC->pName, aNPCProfessionNames[pNPC->uProfession]);//^Pi[%s] %s + } + else + { + strcpy(pTmpBuf, pNPC->pName); + } + v51.DrawTitleText(pFontArrus, 483, 112, v2, pTmpBuf, 3); pParty->GetPartyFame(); if ( (signed int)uDialogueType > 89 ) { if ( uDialogueType == 90 ) { - v7 = pGlobalTXT_LocalizationStrings[577]; // "Get back in there you wimps:" - goto LABEL_37; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pGlobalTXT_LocalizationStrings[577], &pWindow, 13, 0) + 7;//"Get back in there you wimps:" + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pGlobalTXT_LocalizationStrings[577], &pWindow, 13, 0) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pGlobalTXT_LocalizationStrings[577], pFontArrus, &pWindow, 0xDu, 0); + pDialogueWindow->DrawText(pFontArrus, 13, 354 - v12, 0, v13, 0, 0, 0); + goto LABEL_42; } if ( uDialogueType == 91 ) { sprintf(v4, pGlobalTXT_LocalizationStrings[576], dword_F8B1B4);// "Congratulations on your win: here's your stuff: %u gold." pInString = v4; v8 = 0; - goto LABEL_39; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } if ( uDialogueType == 92 ) { v7 = pGlobalTXT_LocalizationStrings[582]; // "You already won this trip to the Arena:" - goto LABEL_37; + v8 = 0; + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } } else @@ -16032,12 +16072,46 @@ if ( uDialogueType == 89 ) { v7 = pGlobalTXT_LocalizationStrings[574]; // "Welcome to the Arena of Life and Death. Remember, you are only allowed one arena combat per visit. To fight an arena battle, select the option that best describes your abilities and return to me- if you survive:" - goto LABEL_37; + v8 = 0; + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } if ( uDialogueType == 13 ) { - v5 = 5 * v0->uProfession; - goto LABEL_18; + v5 = 5 * pNPC->uProfession; + v6 = (char *)*(&pNPCStats->field_13A64 + v5); + v8 = 0; + v7 = sub_495461(v6, uActiveCharacter - 1, 0, 0, 0, 0); + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } if ( (signed int)uDialogueType > 18 ) { @@ -16045,44 +16119,103 @@ { if ( uDialogueType == 77 ) { - v5 = 5 * v0->uProfession; + v5 = 5 * pNPC->uProfession; if ( byte_F8B1EC ) { - v6 = (char *)*(&pNPCStats->field_13A5C + 5 * v0->uProfession); - goto LABEL_19; - } - if ( v0->uFlags & 0x80 ) - { - v6 = (char *)*(&pNPCStats->field_13A68 + 5 * v0->uProfession); -LABEL_19: + v6 = (char *)*(&pNPCStats->field_13A5C + 5 * pNPC->uProfession); + v8 = 0; + v7 = sub_495461(v6, uActiveCharacter - 1, 0, 0, 0, 0); + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; + } + if ( pNPC->uFlags & 0x80 ) + { + v6 = (char *)*(&pNPCStats->field_13A68 + 5 * pNPC->uProfession); v8 = 0; v7 = sub_495461(v6, uActiveCharacter - 1, 0, 0, 0, 0); -LABEL_38: pInString = v7; - goto LABEL_39; - } -LABEL_18: + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; + } v6 = (char *)*(&pNPCStats->field_13A64 + v5); - goto LABEL_19; + v8 = 0; + v7 = sub_495461(v6, uActiveCharacter - 1, 0, 0, 0, 0); + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } goto LABEL_24; } if ( byte_5B0938[0] ) goto LABEL_24; v7 = (char *)ptr_F8B1E8; -LABEL_37: v8 = 0; - goto LABEL_38; + pInString = v7; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; + pOutString = pFontArrus; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + if ( 352 - v12 < 8 ) + { + pOutString = pFontCreate; + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); + pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); + pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); + goto LABEL_42; } } LABEL_24: if ( *(int *)v54 == 1 ) { - v11 = v0->greet; + v11 = pNPC->greet; v8 = 0; if ( v11 ) { - v10 = (char *)*(&pNPCStats->field_17884 + ((v0->uFlags & 3) == 2) + 2 * v11); + v10 = (char *)*(&pNPCStats->field_17884 + ((pNPC->uFlags & 3) == 2) + 2 * v11); goto LABEL_32; } } @@ -16091,32 +16224,28 @@ if ( *(int *)v54 == 2 ) { v8 = 0; - if ( v0->uFlags & 0x80 ) - v9 = (char *)*(&pNPCStats->field_13A68 + 5 * v0->uProfession); - else - v9 = (char *)*(&pNPCStats->field_13A64 + 5 * v0->uProfession); + if ( pNPC->uFlags & 0x80 ) + v9 = (char *)*(&pNPCStats->field_13A68 + 5 * pNPC->uProfession); + else + v9 = (char *)*(&pNPCStats->field_13A64 + 5 * pNPC->uProfession); //"Invalid String Passed" v10 = sub_495461(v9, uActiveCharacter - 1, 0, 0, 0, 0); LABEL_32: pInString = v10; if ( v10 == (char *)v8 ) goto LABEL_42; -LABEL_39: - v49 = 460; - v50 = 452; + pWindow.uFrameWidth = 460; + pWindow.uFrameZ = 452; pOutString = pFontArrus; - v12 = pFontArrus->CalcTextHeight(pInString, (GUIWindow *)&pFont, 13, v8) + 7; + v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; if ( 352 - v12 < 8 ) { pOutString = pFontCreate; - v12 = pFontCreate->CalcTextHeight(pInString, (GUIWindow *)&pFont, 13, v8) + 7; - } - pRenderer->_4A6A68( - 8u, - 352 - v12, - (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), + v12 = pFontCreate->CalcTextHeight(pInString, &pWindow, 13, v8) + 7; + } + pRenderer->_4A6A68(8, 352 - v12, (Texture *)(uTextureID_Leather != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_Leather] : 0), (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - v12); pRenderer->DrawTextureIndexed(8u, 347 - v12, pTexture_591428); - v13 = FitTextInAWindow(pInString, pOutString, (GUIWindow *)&pFont, 0xDu, v8); + v13 = FitTextInAWindow(pInString, pOutString, &pWindow, 0xDu, v8); pDialogueWindow->DrawText(pOutString, 13, 354 - v12, v8, v13, v8, v8, v8); goto LABEL_42; } @@ -16153,7 +16282,10 @@ if ( v29 ) { if ( v29 != 1 ) - goto LABEL_71; + { + v24 = ""; + goto LABEL_79; + } v24 = pGlobalTXT_LocalizationStrings[581]; } else @@ -16178,10 +16310,9 @@ } else { - if ( v0->uFlags & 0x80 ) - { -LABEL_59: - sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[408], v0->pName); + if ( pNPC->uFlags & 0x80 ) + { + sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[408], pNPC->pName); v24 = pTmpBuf; goto LABEL_79; } @@ -16192,9 +16323,9 @@ { if ( v16 == 24 ) { - v23 = v0->evtf; + v23 = pNPC->evtf; LABEL_63: - v24 = pNPCTopics[v23-1].pTopic;//(&dword_721660)[8 * v23]; + v24 = pNPCTopics[v23-1].pTopic;//(&dword_721660)[8 * v23]; if ( !v24 ) { v24 = ""; @@ -16205,7 +16336,7 @@ v17 = v16 - 9; if ( !v17 ) { - v24 = (const char *)sub_445308(v0->uProfession); + v24 = (const char *)sub_445308(pNPC->uProfession); goto LABEL_79; } v18 = v17 - 4; @@ -16214,38 +16345,41 @@ v19 = v18 - 6; if ( !v19 ) { - v23 = v0->bDrawSomeAnim; + v23 = pNPC->bDrawSomeAnim; goto LABEL_63; } v20 = v19 - 1; if ( !v20 ) { - v23 = v0->_anim_current_time; + v23 = pNPC->_anim_current_time; goto LABEL_63; } v21 = v20 - 1; if ( !v21 ) { - v23 = v0->_anim_end_time; + v23 = pNPC->_anim_end_time; goto LABEL_63; } v22 = v21 - 1; if ( !v22 ) { - v23 = v0->evtd; + v23 = pNPC->evtd; goto LABEL_63; } if ( v22 == 1 ) { - v23 = v0->evte; + v23 = pNPC->evte; goto LABEL_63; } -LABEL_71: v24 = ""; goto LABEL_79; } - if ( v0->uFlags & 0x80 ) - goto LABEL_59; + if ( pNPC->uFlags & 0x80 ) + { + sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[408], pNPC->pName); + v24 = pTmpBuf; + goto LABEL_79; + } v24 = pGlobalTXT_LocalizationStrings[122]; } LABEL_79: @@ -16326,10 +16460,7 @@ while ( (signed int)v41 < pDialogueWindow->pNumPresenceButton + pDialogueWindow->pStartingPosActiveItem ); } } - pRenderer->DrawTextureIndexed( - 0x1D7u, - 0x1BDu, - (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0)); + pRenderer->DrawTextureIndexed(471, 445, (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0)); } //----- (004459F9) -------------------------------------------------------- @@ -19826,95 +19957,147 @@ //----- (0044C768) -------------------------------------------------------- char *__fastcall FitTextInAWindow(const char *pInString, GUIFont *pFont, GUIWindow *pWindow, unsigned int uX, int a5) { + const char *v5; // edi@1 + GUIFont *v6; // esi@1 unsigned int v8; // eax@3 + int v9; // edi@3 unsigned __int8 v10; // cl@4 + int v11; // edx@10 GUICharMetric *v12; // ecx@10 + int v13; // edx@11 + int v14; // edx@12 + int v15; // edx@13 unsigned int v16; // esi@15 unsigned int v17; // edx@15 unsigned int v18; // ecx@15 + int v19; // ebx@16 + unsigned __int8 v20; // zf@16 + char v21; // sf@16 + unsigned __int8 v22; // of@16 + int v23; // edi@16 unsigned __int8 v24; // dl@17 int v25; // edi@39 int v26; // eax@42 std::string v27; // [sp-18h] [bp-40h]@2 const char *v28; // [sp-8h] [bp-30h]@2 int v29; // [sp-4h] [bp-2Ch]@2 + const char *v30; // [sp+Ch] [bp-1Ch]@1 char Str[3]; // [sp+10h] [bp-18h]@42 char v32; // [sp+13h] [bp-15h]@42 - int v33; // [sp+14h] [bp-14h]@3 + size_t v33; // [sp+14h] [bp-14h]@3 + unsigned int v34; // [sp+18h] [bp-10h]@3 + GUIFont *v35; // [sp+1Ch] [bp-Ch]@1 int v36; // [sp+20h] [bp-8h]@3 - + int v37; // [sp+24h] [bp-4h]@3 + + v5 = pInString; + v6 = pFont; + v30 = pInString; + v35 = pFont; if ( !pInString ) { MessageBoxW(nullptr, L"Invalid string passed !", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Font.cpp:445", 0); return 0; } v33 = strlen(pInString); - strcpy(pTmpBuf3, pInString); + strcpy(pTmpBuf3, v5); v8 = uX; + v9 = 0; v36 = 0; - for(int i=0;icFirstChar || v10 > pFont->cLastChar) || v10 == '\f' || v10 == '\r' || v10 == '\t' || v10 == '\n' ) - { - v12 = &pFont->pMetrics[v10]; - if ( v10 == '\t' ) - { - strncpy(Str, &pTmpBuf3[i + 1], 3u); - v32 = 0; - v26 = atoi(Str); - v8 = uX + v26; - i+=3; - } - else if ( v10 == '\n' ) - { - v36 = i; - } - else if ( v10 == '\f' ) - { - i+=5; - } - else if ( v10 == '\r' && !a5) - return (char *)pInString; - else if ( v10 == ' ' ) - { - v8 += v12->uWidth; - v36 = i; - } - else - { - v16 = v12->uRightSpacing; - v17 = v12->uWidth; - v18 = v12->uLeftSpacing; - if ( v8 + v16 + v18 + v17 < pWindow->uFrameWidth ) - { - if ( i > v36 ) - v8 += v18; - v8 += v17; - if ( i < v33 ) - v8 += v16; - } - else - { - pTmpBuf3[v36] = 10; - if ( v36 == i )//(unsigned __int8)(v21 ^ v22) | v20 ) - { - for(int j=v36;j<=i;j++) - { - v24 = pTmpBuf3[j]; - if ( v24 >= pFont->cFirstChar && v24 <= pFont->cLastChar || v24 == '\f' || v24 == '\r' || v24 == '\t' || v24 == '\n' ) - { - if ( j > v36 ) - v8 += pFont->pMetrics[v24].uLeftSpacing; - v8 += pFont->pMetrics[v24].uWidth;//*((int *)&pFont->cFirstChar + 3 * v24 + 9); - if ( j < i ) - v8 += pFont->pMetrics[v24].uRightSpacing; - } - } - } - } - } - } + v34 = uX; + v37 = 0; + if ( (signed int)v33 > 0 ) + { + while ( 1 ) + { + v10 = pTmpBuf3[v9]; + if ((v10 < v6->cFirstChar || v10 > v6->cLastChar) + && v10 != '\f' && v10 != '\r' && v10 != '\t' && v10 != '\n' ) + goto LABEL_34; + v11 = v10 - 9; + v12 = &v6->pMetrics[v10]; + if ( !v11 ) + { + strncpy(Str, &pTmpBuf3[v9 + 1], 3u); + v32 = 0; + v26 = atoi(Str); + v8 = uX + v26; + v25 = v9 + 3; + v34 = v8; + goto LABEL_43; + } + v13 = v11 - 1; + if ( !v13 ) + break; + v14 = v13 - 2; + if ( !v14 ) + { + v25 = v9 + 5; +LABEL_43: + v37 = v25; + goto LABEL_34; + } + v15 = v14 - 1; + if ( v15 ) + { + if ( v15 != 19 ) + { + v16 = v12->uRightSpacing; + v17 = v12->uWidth; + v18 = v12->uLeftSpacing; + if ( v8 + v16 + v18 + v17 < pWindow->uFrameWidth ) + { + if ( v37 > v36 ) + v8 += v18; + v8 += v17; + if ( v37 < (signed int)v33 ) + v8 += v16; + v6 = v35; + } + else + { + v19 = v36; + v8 = v34; + v22 = v36 > v37; + v20 = v36 == v37; + v21 = v36 - v37 < 0; + v6 = v35; + pTmpBuf3[v36] = 10; + v23 = v19; + if ( (unsigned __int8)(v21 ^ v22) | v20 ) + { + do + { + v24 = pTmpBuf3[v23]; + if ( v24 >= v6->cFirstChar && v24 <= v6->cLastChar || v24 == 12 || v24 == 13 || v24 == 9 || v24 == 10 ) + { + if ( v23 > v19 ) + v8 += v6->pMetrics[v24].uLeftSpacing; + v8 += *((int *)&v6->cFirstChar + 3 * v24 + 9); + if ( v23 < v37 ) + v8 += v6->pMetrics[v24].uRightSpacing; + } + ++v23; + } + while ( v23 <= v37 ); + } + } + goto LABEL_34; + } + v8 += v12->uWidth; + goto LABEL_41; + } + if ( !a5 ) + return (char *)v30; +LABEL_34: + v9 = v37++ + 1; + if ( v37 >= (signed int)v33 ) + return pTmpBuf3; + } + v8 = v34; +LABEL_41: + v36 = v9; + goto LABEL_34; } return pTmpBuf3; } diff -r 71b13d70f5a6 -r 90521fb9766c mm7_4.cpp --- a/mm7_4.cpp Thu Feb 14 14:48:54 2013 +0600 +++ b/mm7_4.cpp Thu Feb 14 16:17:23 2013 +0600 @@ -11084,6 +11084,7 @@ signed int v1; // edi@1 //GUIWindow *v2; // ecx@1 + __debugbreak(); v0 = GetNPCData(uDialogue_SpeakingActorNPC_ID); v1 = 0; pDialogueWindow->eWindowType = WINDOW_MainMenu;