# HG changeset patch # User Ritor1 # Date 1361761748 -21600 # Node ID 91e1ba340f39f1267ba072cc0d59e006ea3c16a5 # Parent e65d7520626397673506d9f188dd8eabd80fcaf3# Parent 62ca9e2e1432c81be5b5d8eef5bd7180ceed42b6 Слияние diff -r e65d75206263 -r 91e1ba340f39 AIL.cpp --- a/AIL.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/AIL.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -35,7 +35,7 @@ void (__stdcall *mss32_AIL_set_sample_loop_count)(HSAMPLE, int) = 0; void (__stdcall *mss32_AIL_set_sample_playback_rate)(HSAMPLE, int) = 0; void (__stdcall *mss32_AIL_sample_ms_position)(HSAMPLE, int *, int *) = 0; -void (__stdcall *mss32_AIL_start_sample)(HSAMPLE) = 0; +int (__stdcall *mss32_AIL_start_sample)(HSAMPLE) = 0; AILFILETYPE (__stdcall *mss32_AIL_file_type)(void *, int) = 0; int (__stdcall *mss32_AIL_WAV_info)(void *, AILSOUNDINFO *) = 0; int (__stdcall *mss32_AIL_decompress_ADPCM)(AILSOUNDINFO *, void *, void *) = 0; @@ -77,7 +77,7 @@ mss32_AIL_set_sample_loop_count = (void (__stdcall *)(HSAMPLE, int))GetProcAddress(pDll, "_AIL_set_sample_loop_count@8"); mss32_AIL_set_sample_playback_rate = (void (__stdcall *)(HSAMPLE, int))GetProcAddress(pDll, "_AIL_set_sample_playback_rate@8"); mss32_AIL_sample_ms_position = (void (__stdcall *)(HSAMPLE, int *, int *))GetProcAddress(pDll, "_AIL_sample_ms_position@12"); - mss32_AIL_start_sample = (void (__stdcall *)(HSAMPLE))GetProcAddress(pDll, "_AIL_start_sample@4"); + mss32_AIL_start_sample = (int (__stdcall *)(HSAMPLE))GetProcAddress(pDll, "_AIL_start_sample@4"); mss32_AIL_file_type = (AILFILETYPE (__stdcall *)(void *, int))GetProcAddress(pDll, "_AIL_file_type@8"); mss32_AIL_WAV_info = (int (__stdcall *)(void *, AILSOUNDINFO *))GetProcAddress(pDll, "_AIL_WAV_info@8"); mss32_AIL_decompress_ADPCM = (int (__stdcall *)(AILSOUNDINFO *, void *, void *))GetProcAddress(pDll, "_AIL_decompress_ADPCM@12"); @@ -171,10 +171,7 @@ } void __stdcall AIL_3D_provider_attribute(HPROVIDER lib, char *name, void *val) -{ - //__asm int 3 - //return 0; - +{ (mss32_AIL_3D_provider_attribute)(lib,name,val); } @@ -210,9 +207,6 @@ void __stdcall AIL_waveOutClose(HDIGDRIVER drvr) { - //__asm int 3 - //return 0; - (mss32_AIL_waveOutClose)(drvr); } @@ -248,9 +242,6 @@ void __stdcall AIL_release_sample_handle(HSAMPLE s) { - //__asm int 3 - //return 0; - (mss32_AIL_release_sample_handle)(s); } @@ -262,20 +253,20 @@ int __stdcall AIL_close_3D_provider(HPROVIDER) { - //__asm int 3 + __asm int 3 return 0; } int __stdcall AIL_redbook_close(HREDBOOK a1) { - //__asm int 3 + __asm int 3 return 0; } // sub_4D8344: using guessed type int __stdcall AIL_shutdown(); int __stdcall AIL_shutdown() { - //__asm int 3 + __asm int 3 return 0; } @@ -306,9 +297,9 @@ return (mss32_AIL_set_sample_file)(s, file_image, block); } -void __stdcall AIL_start_sample(HSAMPLE s) +int __stdcall AIL_start_sample(HSAMPLE s) { - (mss32_AIL_start_sample)(s); + return (mss32_AIL_start_sample)(s); } void __stdcall AIL_set_sample_playback_rate(HSAMPLE s, int rate) diff -r e65d75206263 -r 91e1ba340f39 AIL.h --- a/AIL.h Mon Feb 25 09:08:13 2013 +0600 +++ b/AIL.h Mon Feb 25 09:09:08 2013 +0600 @@ -272,7 +272,7 @@ void __stdcall AIL_end_sequence(HSEQUENCE a1); void __stdcall AIL_pause_stream(HSTREAM a1, int onoff); int __stdcall AIL_set_sample_file(HSAMPLE, const void *file_image, int block); -void __stdcall AIL_start_sample(HSAMPLE); +int __stdcall AIL_start_sample(HSAMPLE); void __stdcall AIL_set_sample_playback_rate(HSAMPLE, int rate); void __stdcall AIL_sample_ms_position(HSAMPLE, int *pTotalMS, int *pCurrentMS); int __stdcall AIL_3D_sample_status(void *a1); diff -r e65d75206263 -r 91e1ba340f39 Actor.cpp --- a/Actor.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Actor.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -151,14 +151,14 @@ NPCData *v4; // eax@1 NPCData *v5; // ebp@1 unsigned int v6; // eax@1 - signed int v7; // eax@3 + //signed int v7; // eax@3 unsigned int v8; // eax@8 int v9; // esi@8 int v10; // eax@11 GUIWindow *v11; // ecx@19 signed int v12; // eax@21 //int v13; // [sp-8h] [bp-44h]@34 - const char *v14; // [sp-4h] [bp-40h]@4 + //const char *v14; // [sp-4h] [bp-40h]@4 //int v15; // [sp-4h] [bp-40h]@34 signed int v16; // [sp-4h] [bp-40h]@35 int v17; // [sp+10h] [bp-2Ch]@1 @@ -181,9 +181,9 @@ v6 = v4->uFlags; if ( (v6 & 3) != 2 ) v5->uFlags = v6 + 1; - v7 = const_2(); + /*v7 = const_2(); sprintf(pContainer, "evt%02d", v7); - if ( !pParty->uAlignment ) + if (pParty->alignment == PartyAlignment_Good) { v14 = "-b"; strcat(pContainer, v14); @@ -192,9 +192,17 @@ { v14 = "-c"; strcat(pContainer, v14); + }*/ + + switch (pParty->alignment) + { + case PartyAlignment_Good: sprintf(pContainer, "evt%02d-b", const_2()); break; + case PartyAlignment_Neutral: sprintf(pContainer, "evt%02d", const_2()); break; + case PartyAlignment_Evil: sprintf(pContainer, "evt%02d-c", const_2()); break; } + v8 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); - array_5913D8[6] = 0; + pDialogueNPCCount = 0; uNumDialogueNPCPortraits = 1; pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v8]; sprintf(pContainer, "npc%03u", v5->uPortraitID); @@ -335,7 +343,7 @@ if ( v2 ) { v1->array_000234[3].uItemID = 197; - v1->array_000234[3].uAdditionalValue = v2; + v1->array_000234[3].uSpecEnchantmentType = v2; } } } @@ -1983,87 +1991,42 @@ v9->UpdateAnimation(); } else - Actor::_402F87(v5, v4, a4); + Actor::AI_Bored(v5, v4, a4); } //----- (00403F58) -------------------------------------------------------- -void Actor::_403F58(unsigned int uActorID, signed int uObjID, int uActionLength, AIDirection *a4) +void Actor::AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, AIDirection *a4) { - unsigned int v4; // esi@1 - //unsigned int result; // eax@2 - AIDirection *v6; // eax@3 - unsigned int v7; // edi@3 - Actor *v8; // ebx@3 - AIDirection *v9; // esi@4 - AIDirection a3; // [sp+4h] [bp-3Ch]@4 - AIDirection v11; // [sp+20h] [bp-20h]@4 - signed int a2; // [sp+3Ch] [bp-4h]@1 - - a2 = uObjID; - v4 = uActorID; - if ( rand() % 2 ) - { - Actor::_402F87(v4, a2, a4); - return; - } - - v6 = a4; - v7 = 0; - v8 = &pActors[v4]; - if ( !a4 ) - { - v9 = Actor::GetDirectionInfo(8 * v4 | 3, a2, &a3, 0); - v6 = &v11; - memcpy(&v11, v9, sizeof(v11)); - v7 = 0; - } - v8->uYawAngle = LOWORD(v6->uYawAngle); - v8->uPitchAngle = LOWORD(v6->uPitchAngle); - if ( uActionLength == v7 ) - v8->uCurrentActionLength = rand() % 256 + 256; - else - v8->uCurrentActionLength = uActionLength; - v8->uCurrentActionTime = v7; - v8->uAIState = Standing; - v8->vVelocity.z = v7; - v8->vVelocity.y = v7; - v8->vVelocity.x = v7; - v8->UpdateAnimation(); + if (rand() % 2) + AI_Bored(uActorID, uObjID, a4); + else + AI_Stand(uActorID, uObjID, uActionLength, a4); } //----- (00403EB6) -------------------------------------------------------- -void Actor::_403EB6(unsigned int uActorID, unsigned int a2, unsigned int uActionLength, AIDirection *a4) +void Actor::AI_Stand(unsigned int uActorID, unsigned int object_to_face_pid, unsigned int uActionLength, AIDirection *a4) { - AIDirection *v4; // eax@1 - unsigned int v5; // esi@1 - Actor *v6; // ebx@1 - AIDirection *v7; // esi@2 - AIDirection a3; // [sp+Ch] [bp-38h]@2 - AIDirection v10; // [sp+28h] [bp-1Ch]@2 + assert(uActorID < uNumActors); + auto actor = pActors + uActorID; + + AIDirection a3; + if (!a4) + a4 = Actor::GetDirectionInfo(8 * uActorID | 3, object_to_face_pid, &a3, 0); - v4 = a4; - v5 = 0; - v6 = &pActors[uActorID]; - if ( !a4 ) - { - v7 = Actor::GetDirectionInfo(8 * uActorID | 3, a2, &a3, 0); - v4 = &v10; - memcpy(&v10, v7, sizeof(v10)); - v5 = 0; - } - v6->uYawAngle = LOWORD(v4->uYawAngle); - if ( uActionLength == v5 ) - v6->uCurrentActionLength = rand() % 256 + 256; + actor->uAIState = Standing; + if (!uActionLength) + actor->uCurrentActionLength = rand() % 256 + 256; else - v6->uCurrentActionLength = uActionLength; - v6->uCurrentActionTime = v5; - v6->uAIState = Standing; - v6->vVelocity.z = v5; - v6->vVelocity.y = v5; - v6->vVelocity.x = v5; - v6->UpdateAnimation(); + actor->uCurrentActionLength = uActionLength; + actor->uCurrentActionTime = 0; + actor->uYawAngle = a4->uYawAngle; + actor->uPitchAngle = a4->uPitchAngle; + actor->vVelocity.z = 0; + actor->vVelocity.y = 0; + actor->vVelocity.x = 0; + actor->UpdateAnimation(); } @@ -2115,7 +2078,7 @@ v24 = uActorID; if ( v4 && v3->pMonsterInfo.uAIType == 1 ) { - Actor::_403EB6(uActorID, edx0, 0, arg0); + Actor::AI_Stand(uActorID, edx0, 0, arg0); return; } @@ -2921,6 +2884,8 @@ unsigned int uActorID; // [sp+34h] [bp-8h]@1 int v19; // [sp+38h] [bp-4h]@1 + //v14 never filled, maybe it is passed to function but optimized away as local variable + uActorID = a1; v4 = a1; v5 = &pActors[a1]; @@ -2938,14 +2903,14 @@ { if ( !uActionLength ) uActionLength = 256; - Actor::_403F58(uActorID, 4, uActionLength, &v14); + Actor::AI_StandOrBored(uActorID, OBJECT_Player, uActionLength, &v14); return; } if ( pActors[v4].pMonsterInfo.uMovementType == 3 && v19 < 128 ) { v13 = &v14; v12 = 256; - Actor::_403EB6(uActorID, v16, v12, v13); + Actor::AI_Stand(uActorID, v16, v12, v13); return; } v15 = (rand() & 0xF) << 12; @@ -2961,7 +2926,7 @@ { v13 = &v14; v12 = 256; - Actor::_403EB6(uActorID, v16, v12, v13); + Actor::AI_Stand(uActorID, v16, v12, v13); return; } v11 = v5->uMovementSpeed; @@ -3088,54 +3053,36 @@ } //----- (00402F87) -------------------------------------------------------- -void Actor::_402F87(unsigned int uActorID, unsigned int uObjID, AIDirection *a4) +void Actor::AI_Bored(unsigned int uActorID, unsigned int uObjID, AIDirection *a4) { - int v3; // edi@1 - AIDirection *v4; // esi@1 - Actor *v5; // ebx@1 - SpriteFrame *v6; // ecx@3 unsigned int v7; // eax@3 - int v8; // edx@3 unsigned int v9; // eax@3 - //int result; // eax@4 + + assert(uActorID < uNumActors); + auto actor = pActors + uActorID; + AIDirection a3; // [sp+Ch] [bp-5Ch]@2 - AIDirection v12; // [sp+28h] [bp-40h]@2 - AIDirection v13; // [sp+44h] [bp-24h]@2 - unsigned int v14; // [sp+60h] [bp-8h]@1 - unsigned int v15; // [sp+64h] [bp-4h]@1 + if (!a4) + a4 = Actor::GetDirectionInfo(8 * uActorID | OBJECT_Actor, uObjID, &a3, 0); + + actor->uCurrentActionLength = 8 * pSpriteFrameTable->pSpriteSFrames[actor->pSpriteIDs[ANIM_Bored]].uAnimLength; - v3 = uActorID; - v4 = a4; - v5 = &pActors[uActorID]; - v14 = uObjID; - v15 = uActorID; - if ( !a4 ) + v7 = stru_5C6E00->Atan2(actor->vPosition.x - pIndoorCamera->pos.x, actor->vPosition.y - pIndoorCamera->pos.y); + v9 = stru_5C6E00->uIntegerPi + actor->uYawAngle + ((signed int)stru_5C6E00->uIntegerPi >> 3) - v7; + + if ( BYTE1(v9) & 7 ) // turned away - just stand + Actor::AI_Stand(uActorID, uObjID, actor->uCurrentActionLength, a4); + else // facing player - play bored anim { - memcpy(&v13, Actor::GetDirectionInfo(8 * uActorID | AI_OBJECT_ACTOR, uObjID, &a3, (int)a4), sizeof(v13)); - memcpy(&v12, &v13, sizeof(v12)); - v3 = v15; - v4 = &v12; - } - v6 = pSpriteFrameTable->pSpriteSFrames; - v5->uYawAngle = LOWORD(v4->uYawAngle); - v5->uCurrentActionLength = 8 * v6[v5->pSpriteIDs[ANIM_Bored]].uAnimLength; - v7 = stru_5C6E00->Atan2(v5->vPosition.x - pIndoorCamera->pos.x, v5->vPosition.y - pIndoorCamera->pos.y); - LOWORD(v8) = v5->uYawAngle; - v9 = stru_5C6E00->uIntegerPi + v8 + ((signed int)stru_5C6E00->uIntegerPi >> 3) - v7; - if ( BYTE1(v9) & 7 ) - { - Actor::_403EB6(v3, v14, v5->uCurrentActionLength, v4); - } - else - { - v5->uAIState = Fidgeting; - v5->uCurrentActionTime = 0; - v5->vVelocity.z = 0; - v5->vVelocity.y = 0; - v5->vVelocity.x = 0; + actor->uAIState = Fidgeting; + actor->uCurrentActionTime = 0; + actor->uYawAngle = a4->uYawAngle; + actor->vVelocity.z = 0; + actor->vVelocity.y = 0; + actor->vVelocity.x = 0; if ( rand() % 100 < 5 ) - Actor::PlaySound(v3, 3u); - v5->UpdateAnimation(); + Actor::PlaySound(uActorID, 3); + actor->UpdateAnimation(); } } @@ -3278,12 +3225,11 @@ v8 = 0; } v7 = 8 * uActorID; - LOBYTE(v7) = 8 * uActorID | 3; + LOBYTE(v7) = 8 * uActorID | OBJECT_Actor; pAudioPlayer->PlaySound((SoundID)(signed __int16)v3, v7, 0, v8, v9, v10, v11, v12); } } - //----- (00402AD7) -------------------------------------------------------- void Actor::_402AD7(unsigned int uActorID, unsigned int a2, signed int arg0, signed int uActionLength, AIDirection *pDir) { @@ -3328,19 +3274,19 @@ { if ( !uActionLength ) uActionLength = 256; - Actor::_403F58(v5, 4, uActionLength, v10); + Actor::AI_StandOrBored(v5, 4, uActionLength, v10); return; } if ( (double)(signed int)v10->uDistance < 307.2 ) { if ( !uActionLength ) uActionLength = 256; - Actor::_403EB6(v5, v18, uActionLength, v10); + Actor::AI_Stand(v5, v18, uActionLength, v10); return; } if ( !v7->uMovementSpeed ) { - Actor::_403EB6(v5, v18, uActionLength, v10); + Actor::AI_Stand(v5, v18, uActionLength, v10); return; } v18 = 16; @@ -3404,7 +3350,7 @@ { if ( !uActionLength ) uActionLength = 256; - Actor::_403F58(v15, 4, uActionLength, &v13); + Actor::AI_StandOrBored(v15, 4, uActionLength, &v13); } else { @@ -3475,7 +3421,7 @@ v16 = v10; v15 = uActionLength; v11 = 4; - Actor::_403F58(v5, v11, v15, v16); + Actor::AI_StandOrBored(v5, v11, v15, v16); return; } if ( (signed int)v10->uDistance < a5 ) @@ -3485,7 +3431,7 @@ v11 = v19; v16 = v10; v15 = uActionLength; - Actor::_403F58(v5, v11, v15, v16); + Actor::AI_StandOrBored(v5, v11, v15, v16); return; } if ( uActionLength ) @@ -3562,7 +3508,7 @@ v18 = v9; v17 = uActionLength; v10 = 4; - return Actor::_403F58(v4, v10, v17, v18); + return Actor::AI_StandOrBored(v4, v10, v17, v18); } if ( (double)(signed int)v9->uDistance < 307.2 ) { @@ -3571,7 +3517,7 @@ v10 = v21; v18 = v9; v17 = uActionLength; - return Actor::_403F58(v4, v10, v17, v18); + return Actor::AI_StandOrBored(v4, v10, v17, v18); } if ( uActionLength ) { @@ -3603,146 +3549,137 @@ v6->UpdateAnimation(); } -//----- (00401221) -------------------------------------------------------- -void Actor::_401221(unsigned int uActorID, int *a2, unsigned int a3) +//----- (00SelectTarget) -------------------------------------------------------- +void Actor::_SelectTarget(unsigned int uActorID, int *a2, bool can_target_party) { - Actor *v3; // esi@1 - unsigned int v4; // ebx@1 + //Actor *v3; // esi@1 + //unsigned int v4; // ebx@1 int v5; // ecx@1 - unsigned int v6; // eax@1 - Actor *v7; // edi@2 - __int16 v8; // ax@3 + //unsigned int v6; // eax@1 + //Actor *v7; // edi@2 + //__int16 v8; // ax@3 int v9; // eax@10 signed int v10; // eax@13 int v11; // ebx@16 int v12; // eax@16 - int v13; // eax@25 + //int v13; // eax@25 signed int v14; // eax@31 int v15; // edi@43 int v16; // ebx@45 int v17; // eax@45 - int v18; // eax@51 + //int v18; // eax@51 int v19; // [sp+Ch] [bp-24h]@16 - int *v20; // [sp+10h] [bp-20h]@1 + //int *v20; // [sp+10h] [bp-20h]@1 signed int v21; // [sp+14h] [bp-1Ch]@1 - unsigned int v22; // [sp+18h] [bp-18h]@1 + //unsigned int v22; // [sp+18h] [bp-18h]@1 int v23; // [sp+1Ch] [bp-14h]@16 - unsigned int v24; // [sp+20h] [bp-10h]@1 + //unsigned int v24; // [sp+20h] [bp-10h]@1 int v25; // [sp+24h] [bp-Ch]@1 - signed int v26; // [sp+28h] [bp-8h]@1 + //signed int v26; // [sp+28h] [bp-8h]@1 int v27; // [sp+2Ch] [bp-4h]@16 int v28; // [sp+2Ch] [bp-4h]@45 v25 = -1; - v22 = uActorID; - v3 = &pActors[uActorID]; - v4 = 0; + //v22 = uActorID; + //v3 = &pActors[uActorID]; + //v4 = 0; v5 = 0; - v6 = v3->uLastCharacterIDToHit; + //v6 = v3->uLastCharacterIDToHit; *a2 = 0; - v20 = a2; + //v20 = a2; v21 = 0; - v24 = v6; - v26 = 0; - if ( (signed int)uNumActors > 0 ) + //v24 = v3->uLastCharacterIDToHit; + //v26 = 0; + assert(uActorID < uNumActors); + auto _this = pActors + uActorID; + + for (uint i = 0; i < uNumActors; ++i) { - v7 = pActors; - do - { - v8 = v7->uAIState; - if ( v7->uAIState == 5 || v8 == 4 || v8 == 11 || v8 == 17 || v8 == 19 || v22 == v5 ) + auto actor = pActors + i; + //v7 = pActors; + //do + //{ + //v8 = v7->uAIState; + if (actor->uAIState == Dead || actor->uAIState == Dying || + actor->uAIState == Removed || actor->uAIState == Summoned || actor->uAIState == Disabled || uActorID == i ) + continue; + + if (_this->uLastCharacterIDToHit == 0 || (v9 = 8 * v5, LOBYTE(v9) = 8 * v5 | 3, _this->uLastCharacterIDToHit != v9) ) { - ++v7; - v5 = v26++ + 1; + v10 = _this->GetActorsRelation(actor); + if ( v10 == 0 ) continue; } - if ( v24 == v4 || (v9 = 8 * v5, LOBYTE(v9) = 8 * v5 | 3, v24 != v9) ) + else if (_this->IsNotAlive()) { - v10 = v3->GetActorsRelation(v7); - if ( v10 == v4 ) - { - ++v7; - v5 = v26++ + 1; + _this->uLastCharacterIDToHit = 0; + v10 = _this->GetActorsRelation(actor); + if ( v10 == 0 ) continue; - } - } - else if (v7->IsNotAlive()) - { - v24 = v4; - v3->uLastCharacterIDToHit = v4; - v10 = v3->GetActorsRelation(v7); - if ( v10 == v4 ) - { - ++v7; - v5 = v26++ + 1; - continue; - } } else { - v18 = v7->uGroup; - if ( (v18 != v4 || v3->uGroup != v4) && v18 == v3->uGroup ) - { - ++v7; - v5 = v26++ + 1; + //v18 = actor->uGroup; + if ( (actor->uGroup != 0 || _this->uGroup != 0) && actor->uGroup == _this->uGroup ) continue; - } v10 = 4; } - if ( v3->pMonsterInfo.uHostilityType ) - v10 = pMonsterStats->pInfos[v3->pMonsterInfo.uID].uHostilityType; + if ( _this->pMonsterInfo.uHostilityType ) + v10 = pMonsterStats->pInfos[_this->pMonsterInfo.uID].uHostilityType; v11 = dword_4DF380[v10]; - v23 = abs(v3->vPosition.x - v7->vPosition.x); - v27 = abs(v3->vPosition.y - v7->vPosition.y); - v12 = abs(v3->vPosition.z - v7->vPosition.z); + v23 = abs(_this->vPosition.x - actor->vPosition.x); + v27 = abs(_this->vPosition.y - actor->vPosition.y); + v12 = abs(_this->vPosition.z - actor->vPosition.z); v19 = v12; if ( v23 <= v11 && v27 <= v11 && v12 <= v11 - && sub_4070EF_prolly_collide_objects(8 * v26 | 3, 8 * v22 | 3) + && sub_4070EF_prolly_collide_objects(8 * i | OBJECT_Actor, 8 * uActorID | OBJECT_Actor) && v23 * v23 + v27 * v27 + v19 * v19 < (unsigned int)v25 ) { v25 = v23 * v23 + v27 * v27 + v19 * v19; - v21 = v26; + v21 = i; } - v4 = 0; - ++v7; - v5 = v26++ + 1; - } - while ( v26 < (signed int)uNumActors ); - if ( v25 != -1 ) - { - v13 = 8 * v21; - LOBYTE(v13) = 8 * v21 | 3; - *v20 = v13; - } + //v4 = 0; + //++v7; + //v5 = v26++ + 1; + //} + //while ( v26 < (signed int)uNumActors ); + } - if ( SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) >= (signed int)v4 - && (SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) > (signed int)v4 || LODWORD(pParty->pPartyBuffs[11].uExpireTime) > v4) ) - a3 = v4; - if ( a3 != v4 ) + if ( v25 != -1 ) + { + //v13 = 8 * v21; + //LOBYTE(v13) = 8 * v21 | OBJECT_Actor; + *a2 = 8 * v21 | OBJECT_Actor; + } + + if (pParty->Invisible()) + can_target_party = false; + + if (can_target_party) { - v14 = v3->GetActorsRelation(0); - if ( BYTE2(v3->uAttributes) & 8 - && SHIDWORD(v3->pActorBuffs[12].uExpireTime) <= (signed int)v4 - && (SHIDWORD(v3->pActorBuffs[12].uExpireTime) < (signed int)v4 || LODWORD(v3->pActorBuffs[12].uExpireTime) <= v4) - && SHIDWORD(v3->pActorBuffs[1].uExpireTime) <= (signed int)v4 - && (SHIDWORD(v3->pActorBuffs[1].uExpireTime) < (signed int)v4 || LODWORD(v3->pActorBuffs[1].uExpireTime) <= v4) - && SHIDWORD(v3->pActorBuffs[2].uExpireTime) <= (signed int)v4 - && (SHIDWORD(v3->pActorBuffs[2].uExpireTime) < (signed int)v4 || LODWORD(v3->pActorBuffs[2].uExpireTime) <= v4) ) + v14 = _this->GetActorsRelation(0); + if ( BYTE2(_this->uAttributes) & 8 + && SHIDWORD(_this->pActorBuffs[12].uExpireTime) <= (signed int)0 + && (SHIDWORD(_this->pActorBuffs[12].uExpireTime) < (signed int)0 || LODWORD(_this->pActorBuffs[12].uExpireTime) <= 0) + && SHIDWORD(_this->pActorBuffs[1].uExpireTime) <= (signed int)0 + && (SHIDWORD(_this->pActorBuffs[1].uExpireTime) < (signed int)0 || LODWORD(_this->pActorBuffs[1].uExpireTime) <= 0) + && SHIDWORD(_this->pActorBuffs[2].uExpireTime) <= (signed int)0 + && (SHIDWORD(_this->pActorBuffs[2].uExpireTime) < (signed int)0 || LODWORD(_this->pActorBuffs[2].uExpireTime) <= 0) ) v14 = 4; - if ( v14 != v4 ) + if ( v14 != 0 ) { v15 = dword_4DF390; - if ( !v3->pMonsterInfo.uHostilityType ) + if ( !_this->pMonsterInfo.uHostilityType ) v15 = dword_4DF380[v14]; - v16 = abs(v3->vPosition.x - pParty->vPosition.x); - v28 = abs(v3->vPosition.y - pParty->vPosition.y); - v17 = abs(v3->vPosition.z - pParty->vPosition.z); + v16 = abs(_this->vPosition.x - pParty->vPosition.x); + v28 = abs(_this->vPosition.y - pParty->vPosition.y); + v17 = abs(_this->vPosition.z - pParty->vPosition.z); if ( v16 <= v15 && v28 <= v15 && v17 <= v15 ) { if ( v16 * v16 + v28 * v28 + v17 * v17 < (unsigned int)v25 ) - *v20 = 4; + *a2 = OBJECT_Player; } } } diff -r e65d75206263 -r 91e1ba340f39 Actor.h --- a/Actor.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Actor.h Mon Feb 25 09:09:08 2013 +0600 @@ -40,6 +40,8 @@ /* 361 */ enum ACTOR_BUFF_INDEX { + ACTOR_BUFF_CHARM = 1, // an assumption + ACTOR_BUFF_SHRINK = 3, // an assumption ACTOR_BUFF_STONED = 5, ACTOR_BUFF_PARALYZED = 6, }; @@ -199,7 +201,7 @@ bool IsPeasant(); - static void _401221(unsigned int uActorID, int *a2, unsigned int a3); + static void _SelectTarget(unsigned int uActorID, int *a2, bool can_target_party); static void _402686(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *a4); static void _40281C(unsigned int uActorID, unsigned int a2, signed int uActionLength, struct AIDirection *pDir, int a5); static void _402968(unsigned int uActorID, signed int edx0, int uActionLength, struct AIDirection *a4); @@ -207,7 +209,7 @@ static void PlaySound(unsigned int uActorID, unsigned int uSoundID); static void Die(unsigned int uActorID); static void Resurrect(unsigned int uActorID); - static void _402F87(unsigned int uActorID, unsigned int uObjID, struct AIDirection *a4); + static void AI_Bored(unsigned int uActorID, unsigned int uObjID, struct AIDirection *a4); static void _4030AD(unsigned int uActorID, signed int edx0, int arg0); static char __fastcall _4031C1_update_job(unsigned int uActorID, signed int a2, int a3); static void _4032B2(unsigned int a1, unsigned int a2, int a3, int uActionLength); @@ -217,8 +219,8 @@ static void _403A60(unsigned int uActorID, signed int edx0, struct AIDirection *pDir); static void _403C6C(unsigned int uActorID, signed int edx0, struct AIDirection *arg0); static void __fastcall StandAwhile(unsigned int uActorID); - static void _403EB6(unsigned int uActorID, unsigned int a2, unsigned int uActionLength, struct AIDirection *a4); - static void _403F58(unsigned int uActorID, signed int uObjID, int uActionLength, struct AIDirection *a4); + static void AI_Stand(unsigned int uActorID, unsigned int object_to_face_pid, unsigned int uActionLength, struct AIDirection *a4); + static void AI_StandOrBored(unsigned int uActorID, signed int uObjID, int uActionLength, struct AIDirection *a4); static void FaceObject(unsigned int uActorID, unsigned int uObjID, int _48, struct AIDirection *a4); static struct AIDirection *__fastcall GetDirectionInfo(unsigned int uObj1ID, unsigned int uObj2ID, struct AIDirection *pOut, int a4); static signed int __fastcall Explode(unsigned int uActorID); @@ -263,7 +265,7 @@ char field_B7; unsigned int uCurrentActionTime; unsigned __int16 pSpriteIDs[8]; - unsigned __int16 pSoundSampleIDs[4]; + unsigned __int16 pSoundSampleIDs[4]; // 1 die 3 bored struct SpellBuff pActorBuffs[22]; struct ItemGen array_000234[4]; unsigned int uGroup; diff -r e65d75206263 -r 91e1ba340f39 AudioPlayer.cpp --- a/AudioPlayer.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/AudioPlayer.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1,4 +1,5 @@ #include +#include #include "AudioPlayer.h" #include "Allocator.h" @@ -13,6 +14,8 @@ #include "OSInfo.h" #include "Math.h" #include "MapInfo.h" +#include "Actor.h" +#include "GUIWindow.h" #include "Log.h" #include "Bink_Smacker.h" @@ -602,9 +605,9 @@ v6 = v2->pMixerChannels; do { - if ( v6->dword_000004 == a2 ) + if ( v6->source_pid == a2 ) { - if ( AIL_sample_status(v6->hSample) == 4 ) + if ( AIL_sample_status(v6->hSample) == AIL::Sample::Playing) { AIL_end_sample(v6->hSample); _4ABE55(v6); @@ -620,17 +623,13 @@ } } } -// 4D82F4: using guessed type int __stdcall AIL_3D_sample_status(int); -// 4D82F8: using guessed type int __stdcall AIL_sample_status(int); -// 4D82FC: using guessed type int __stdcall AIL_end_sample(int); -// 4D8300: using guessed type int __stdcall AIL_end_3D_sample(int); //----- (004AA306) -------------------------------------------------------- void AudioPlayer::PlaySound(SoundID eSoundID, signed int a3, unsigned int uNumRepeats, signed int PartyX, signed int PartyY, int a7, unsigned int uVolume, int sPlaybackRate) { //AudioPlayer *pAudioPlayer1; // esi@1 - signed int pNum; // edx@5 - int *pSoundID; // ecx@6 + //signed int pNum; // edx@5 + //int *pSoundID; // ecx@6 int v12; // edi@13 signed int v13; // ecx@17 signed int v14; // eax@20 @@ -658,7 +657,7 @@ signed int v36; // ebx@74 //AudioPlayer *pAudioPlayer2; // edi@79 AudioPlayer_3DSample *pAudioPlayer_3DSample3; // esi@79 - unsigned int v39; // ebx@80 + //unsigned int v39; // ebx@80 int v40; // eax@81 char *v41; // edi@82 int v42; // esi@82 @@ -677,44 +676,44 @@ //AudioPlayer *pAudioPlayer3; // edx@106 SoundDesc *pSoundDesc; // edx@107 LayingItem *pLayingItem3; // eax@114 - int v58; // edx@115 - int v59; // ecx@115 - Actor *pActor2; // eax@118 - MixerChannel *pMixerChannel; // esi@126 + //int v58; // edx@115 + //int v59; // ecx@115 + //Actor *pActor2; // eax@118 + //MixerChannel *pMixerChannel; // esi@126 signed int v62; // esi@133 //AudioPlayer *pAudioPlayer4; // ebx@133 - MixerChannel *pMixerChannel2; // edi@134 - int v65; // ebx@141 + //MixerChannel *pMixerChannel2; // edi@134 + //int v65; // ebx@141 //AudioPlayer *pAudioPlayer5; // ecx@142 - MixerChannel *pMixerChannel3; // edi@142 + //MixerChannel *pMixerChannel3; // edi@142 int v68; // eax@143 - MixerChannel *pMixerChannel4; // edi@149 - int v70; // ecx@152 - SoundDesc *pSoundDesc2; // eax@153 - int v72; // edi@156 - MixerChannel *pMixerChannel5; // esi@157 - unsigned int pVolume; // eax@157 - int pPartyX; // ebx@159 - int v76; // ebx@160 - LayingItem *pLayingItem4; // edi@164 - unsigned int pPosY; // edx@166 - unsigned int pPosX; // ecx@166 - int v80; // eax@167 - Actor *pActor3; // edi@168 - BLVDoor *pBLVDoor2; // edi@173 - int v83; // eax@183 - int v84; // eax@183 - _SAMPLE *v85; // ST18_4@186 + //MixerChannel *pMixerChannel4; // edi@149 + //int v70; // ecx@152 + //SoundDesc *pSoundDesc2; // eax@153 + //int v72; // edi@156 + //MixerChannel *pMixerChannel5; // esi@157 + //unsigned int pVolume; // eax@157 + //int pPartyX; // ebx@159 + //int v76; // ebx@160 + //LayingItem *pLayingItem4; // edi@164 + //unsigned int pPosY; // edx@166 + //unsigned int pPosX; // ecx@166 + //int v80; // eax@167 + //Actor *pActor3; // edi@168 + //BLVDoor *pBLVDoor2; // edi@173 + //int v83; // eax@183 + //int v84; // eax@183 + //_SAMPLE *v85; // ST18_4@186 unsigned int v86; // [sp+14h] [bp-60h]@84 - int v87; // [sp+14h] [bp-60h]@115 + //int v87; // [sp+14h] [bp-60h]@115 RenderVertexSoft pRenderVertexSoft; // [sp+24h] [bp-50h]@1 - unsigned int v89; // [sp+54h] [bp-20h]@12 + //unsigned int v89; // [sp+54h] [bp-20h]@12 int v90; // [sp+58h] [bp-1Ch]@68 float v91; // [sp+5Ch] [bp-18h]@68 //unsigned int v92; // [sp+60h] [bp-14h]@10 float v93; // [sp+64h] [bp-10h]@1 signed int varC; // [sp+68h] [bp-Ch]@68 - AudioPlayer *pAudioPlayer; // [sp+6Ch] [bp-8h]@1 + //AudioPlayer *pAudioPlayer; // [sp+6Ch] [bp-8h]@1 int v96; // [sp+70h] [bp-4h]@19 signed int uNumRepeatsb; // [sp+84h] [bp+10h]@93 float uNumRepeatsa; // [sp+84h] [bp+10h]@104 @@ -724,213 +723,208 @@ int v102; // [sp+90h] [bp+1Ch]@60 int v103; // [sp+90h] [bp+1Ch]@68 - pAudioPlayer = this; - v35 = this->bPlayerReady == 0; - //pAudioPlayer = this; - pRenderVertexSoft.flt_2C = 0.0; - LODWORD(v93) = 10000; - if ( v35 || !uSoundVolumeMultiplier || !this->hDigDriver || !eSoundID ) + if (!bPlayerReady) + return; + if (!uSoundVolumeMultiplier) + return; + if (!hDigDriver) + return; + if (eSoundID == SOUND_Invalid) return; - pNum = 0; - if ( (signed int)pSoundList->uNumSounds <= 0 ) - { -LABEL_9: - pNum = 0; - } - else + + //pAudioPlayer = this; + //v35 = this->bPlayerReady == 0; + //pAudioPlayer = this; + //LODWORD(v93) = 10000; + int sample_volume = 10000; + + + int sound_id = 0; + for (uint i = 0; i < pSoundList->uNumSounds; ++i) + if (pSoundList->pSounds[i].uSoundID == eSoundID) + { + sound_id = i; + break; + } + + if (!sound_id) { - pSoundID = (int *)&pSoundList->pSounds->uSoundID; - while ( *pSoundID != eSoundID ) - { - ++pNum; - pSoundID += 30; - if ( pNum >= (signed int)pSoundList->uNumSounds ) - goto LABEL_9; - } + Log::Warning(L"SoundID = %u not found", eSoundID); + return; } - /* v92 = pNum;//38 - pNum = 0; - for ( pSoundID = (int *)&pSoundList->pSounds->uSoundID; *pSoundID != eSoundID; pSoundID += 30) - { - ++pNum; - }*/ - if ( !pNum ) - return; - if ( !pAudioPlayer->b3DSoundInitialized || (v89 = 120 * pNum, !(pSoundList->pSounds[pNum].uFlags & 2)) ) + + int start_channel = 0, + end_channel = 0; + + assert(sound_id < pSoundList->uNumSounds); + auto sound_desc = pSoundList->pSounds + sound_id; + if (!b3DSoundInitialized || sound_desc->Is3D()) { - //pSoundDesc = (SoundDesc *)7; - if ( a3 < 0 ) + if (!a3) // generic sound like from UI + { + start_channel = 10; + end_channel = 12; + goto LABEL_133; + } + else if (a3 == -1) // exclusive sounds - can override { - if ( a3 == -1 ) + start_channel = 13; + end_channel = 13; + goto LABEL_133; + } + else + { + if (a3 < 0) // exclusive sounds - no override { - varC = 13; - v96 = 13; - goto LABEL_133; + start_channel = 14; + end_channel = 14; + goto LABEL_123; } - varC = 14; - v96 = 14; -LABEL_123: - if ( a3 ) + else { - if ( a3 != -1 ) + int object_type = a3 & 7, + object_id = a3 >> 7; + switch (object_type) { - LODWORD(v91) = 0; - if ( pAudioPlayer->uMixerChannels > 0 ) + case OBJECT_BLVDoor: + case OBJECT_Player: + { + start_channel = 10; + end_channel = 12; + goto LABEL_133; + } + break; + + case OBJECT_Actor: + { + start_channel = 0; + end_channel = 3; + + assert(object_id < uNumActors); + auto actor = &pActors[object_id]; + + sample_volume = GetSoundStrengthByDistanceFromParty(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z); + if (!sample_volume) + return; + goto LABEL_123; + } + + case OBJECT_Decoration: { - pMixerChannel = pAudioPlayer->pMixerChannels; - do - { - if ( AIL_sample_status(pMixerChannel->hSample) == 4 && pMixerChannel->dword_000004 == a3 - && AIL_sample_status(pMixerChannel->hSample) == 4 ) - { - if ( pMixerChannel->uSourceTrackIdx == pNum ) - return; - AIL_end_sample(pMixerChannel->hSample); - _4ABE55(pMixerChannel); - } - ++LODWORD(v91); - ++pMixerChannel; - } - while ( SLODWORD(v91) < pAudioPlayer->uMixerChannels ); + start_channel = 4; + end_channel = 4; + + assert(object_id < uNumLevelDecorations); + auto decor = &pLevelDecorations[object_id]; + + sample_volume = GetSoundStrengthByDistanceFromParty(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z); + if (!sample_volume) + return; + goto LABEL_123; } + break; + + case OBJECT_Item: + { + start_channel = 5; + end_channel = 7; + + assert(object_id < uNumLayingItems); + auto object = &pLayingItems[object_id]; + + sample_volume = GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z); + if (!sample_volume) + return; + goto LABEL_123; + } + break; + + case OBJECT_BModel: + { + start_channel = 8; + end_channel = 9; + goto LABEL_123; + } + break; + + default: + assert(false); } } + } + + + + + + +LABEL_123: + for (uint i = 0; i < uMixerChannels; ++i) + { + auto channel = pMixerChannels + i; + if (channel->source_pid == a3 && + AIL_sample_status(channel->hSample) == AIL::Sample::Playing) + { + if (channel->uSourceTrackIdx == sound_id) + return; // already playing the same sound from the same source - return + + AIL_end_sample(channel->hSample); // requested new sound from the same source - end & switch + _4ABE55(channel); + } + } + LABEL_133: - v62 = varC; + v62 = start_channel; //pAudioPlayer4 = pAudioPlayer; - if ( varC <= v96 ) + for (v62 = start_channel; v62 <= end_channel; ++v62) { - pMixerChannel2 = &pAudioPlayer->pMixerChannels[varC]; - while ( AIL_sample_status(pMixerChannel2->hSample) != 2 ) + auto channel = pMixerChannels + v62; + if (AIL_sample_status(channel->hSample) == AIL::Sample::Done) + { + AIL_end_sample(channel->hSample); + if (channel->uSourceTrackIdx) + _4ABE55(channel); + break; + } + } + /*if ( start_channel <= end_channel) + { + pMixerChannel2 = &pAudioPlayer->pMixerChannels[start_channel]; + while ( AIL_sample_status(pMixerChannel2->hSample) != AIL::Sample::Done) { ++v62; ++pMixerChannel2; - if ( v62 > v96 ) + if ( v62 > end_channel ) goto LABEL_140; } AIL_end_sample(pMixerChannel2->hSample); if ( pMixerChannel2->uSourceTrackIdx ) _4ABE55(pMixerChannel2); } -LABEL_140: - if ( v62 != v96 + 1 )//10!=13 +LABEL_140:*/ + + if (v62 > end_channel) // no free channel - occupy the quitest one { -LABEL_150: - if ( LODWORD(v93) == 10000 ) - LODWORD(v93) = pAudioPlayer->uMasterVolume; - v70 = 0; - if ( !a7 ) + v62 = -1; + + int min_volume = sample_volume; + for (uint i = start_channel; i <= end_channel; ++i) { - //pSoundDesc = pSoundList->pSounds; - pSoundDesc2 = &pSoundList->pSounds[pNum]; - if ( !pSoundDesc2->pSoundData[0] ) + auto channel = pMixerChannels + i; + + int volume = AIL_sample_volume(channel->hSample); + if (volume < min_volume) { - if (pSoundDesc2->eType == SOUND_DESC_SWAP) - pSoundList->LoadSound(eSoundID, 0); + min_volume = volume; + v62 = i; } } - v72 = 4 * (a7 + 30 * pNum) + 44; - if ( !*(int *)&pSoundList->pSounds->pSoundName[v72] ) - return; - pMixerChannel5 = &pAudioPlayer->pMixerChannels[v62]; - AIL_init_sample(pMixerChannel5->hSample); - AIL_set_sample_file(pMixerChannel5->hSample, (void *)(*(int *)&pSoundList->pSounds->pSoundName[v72] + 4 * (a7 == 0)), -1); - pVolume = uVolume; - if ( !uVolume ) - pVolume = LODWORD(v93); - AIL_set_sample_volume(pMixerChannel5->hSample, pVolume); - pPartyX = PartyX; - if ( PartyX != -1 ) - { - if ( !PartyX ) - pPartyX = pParty->vPosition.x; - if ( !PartyY ) - PartyY = pParty->vPosition.y; - if ( uNumRepeats ) - AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1); - v83 = sub_4AB66C(pPartyX, PartyY); - AIL_set_sample_pan(pMixerChannel5->hSample, v83); - v84 = GetSoundStrengthByDistanceFromParty(pPartyX, PartyY, pParty->vPosition.z); - AIL_set_sample_volume(pMixerChannel5->hSample, v84); - v76 = a3; - goto LABEL_184; - } - v76 = a3; - if ( (a3 & 7) == 1 ) - { - if ( uCurrentlyLoadedLevelType != LEVEL_Indoor ) - goto LABEL_184; - pBLVDoor2 = &pIndoor->pDoors[a3 >> 3]; - if ( !pBLVDoor2->uDoorID ) - return; - if ( !GetSoundStrengthByDistanceFromParty(*pBLVDoor2->pXOffsets, *pBLVDoor2->pYOffsets, *pBLVDoor2->pZOffsets) ) - { - AIL_end_sample(pMixerChannel5->hSample); - pAudioPlayer->AudioPlayer::_4ABE55(pMixerChannel5); - return; - } - pPosY = *pBLVDoor2->pYOffsets; - pPosX = *pBLVDoor2->pXOffsets; - //goto LABEL_167; - v80 = sub_4AB66C(pPosX, pPosY); - AIL_set_sample_pan(pMixerChannel5->hSample, v80); - goto LABEL_184; - } - if ( (a3 & 7) == 2 ) - { - pLayingItem4 = &pLayingItems[a3 >> 3]; - if ( !GetSoundStrengthByDistanceFromParty(pLayingItem4->vPosition.x, pLayingItem4->vPosition.y, pLayingItem4->vPosition.z) ) - return; - } - else - { - if ( (a3 & 7) == 3 ) - { - pActor3 = &pActors[a3 >> 3]; - if ( !GetSoundStrengthByDistanceFromParty(pActor3->vPosition.x, pActor3->vPosition.y, pActor3->vPosition.z) ) - return; - pPosY = pActor3->vPosition.y; - pPosX = pActor3->vPosition.x; - //goto LABEL_167; - v80 = sub_4AB66C(pPosX, pPosY); - AIL_set_sample_pan(pMixerChannel5->hSample, v80); - goto LABEL_184; - } - if ( (a3 & 7) != 5 ) - { -LABEL_184: - if ( uNumRepeats ) - AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1); - v85 = pMixerChannel5->hSample; - pMixerChannel5->uSourceTrackIdx = pNum; - pMixerChannel5->dword_000004 = v76; - pMixerChannel5->uSourceTrackID = eSoundID; - AIL_start_sample(v85); - if ( sPlaybackRate ) - AIL_set_sample_playback_rate(pMixerChannel5->hSample, sPlaybackRate); - if ( (v76 & 7) == 4 ) - AIL_sample_ms_position(pMixerChannel5->hSample, &sLastTrackLengthMS, 0); - return; - } - pLayingItem4 = (LayingItem *)&pLevelDecorations[a3 >> 3]; - if ( !GetSoundStrengthByDistanceFromParty(pLayingItem4->vPosition.x, pLayingItem4->vPosition.y, pLayingItem4->vPosition.z) ) - return; - AIL_set_sample_loop_count(pMixerChannel5->hSample, uNumRepeats - 1); - } - pPosY = pLayingItem4->vPosition.y; - pPosX = pLayingItem4->vPosition.x; -//LABEL_167: - v80 = sub_4AB66C(pPosX, pPosY); - AIL_set_sample_pan(pMixerChannel5->hSample, v80); - goto LABEL_184; - } - v65 = varC; - v62 = -1; - v91 = v93; - if ( varC <= v96 ) + /*v65 = start_channel; + v91 = v93; + if (start_channel <= end_channel) { //pAudioPlayer5 = pAudioPlayer; - pMixerChannel3 = &pAudioPlayer->pMixerChannels[varC]; + pMixerChannel3 = &pAudioPlayer->pMixerChannels[start_channel]; do { v68 = AIL_sample_volume(pMixerChannel3->hSample); @@ -942,73 +936,119 @@ ++v65; ++pMixerChannel3; } - while ( v65 <= v96 ); - if ( v62 != -1 ) + while ( v65 <= end_channel );*/ + + if (v62 == -1) // no free channels at all - only channel 13 allows override (a3 == -1) { -//LABEL_149: - //pAudioPlayer4 = pAudioPlayer; - pMixerChannel4 = &pAudioPlayer->pMixerChannels[v62]; - AIL_end_sample(pMixerChannel4->hSample); - _4ABE55(pMixerChannel4); - goto LABEL_150; + if (start_channel != 13) + return; + v62 = 13; } - v65 = varC; + + auto channel = &pMixerChannels[v62]; + AIL_end_sample(channel->hSample); + _4ABE55(channel); } - v62 = 13; - if ( v65 != 13 ) + + if (v62 > end_channel)//10!=13 return; - //goto LABEL_149; - //pAudioPlayer4 = pAudioPlayer; - pMixerChannel4 = &pAudioPlayer->pMixerChannels[v62]; - AIL_end_sample(pMixerChannel4->hSample); - _4ABE55(pMixerChannel4); - goto LABEL_150; - } - if ( (a3 & 7) == 2 ) - { - varC = 5; - v96 = 7; - pLayingItem3 = &pLayingItems[a3 >> 3]; - } - else - { - if ( (a3 & 7) == 3 ) + +//LABEL_150: + if (sample_volume == 10000) + sample_volume = uMasterVolume; + + //v70 = 0; + if ( !a7 ) + { + //pSoundDesc = pSoundList->pSounds; + //pSoundDesc2 = &pSoundList->pSounds[sound_id]; + if (!sound_desc->pSoundData[0]) + { + if (sound_desc->eType == SOUND_DESC_SWAP) + pSoundList->LoadSound(eSoundID, 0); + } + } + //v72 = 4 * (a7 + 30 * sound_id) + 44; + if (!pSoundList->pSounds[sound_id].pSoundData[a7]) + return; + + //pMixerChannel5 = &pAudioPlayer->pMixerChannels[v62]; + auto channel = &pMixerChannels[v62]; + AIL_init_sample(channel->hSample); + AIL_set_sample_file(channel->hSample, (char *)pSoundList->pSounds[sound_id].pSoundData[a7] + 4 * (a7 == 0), -1); + if (uVolume) + sample_volume = uVolume; + AIL_set_sample_volume(channel->hSample, sample_volume); + + int object_type = a3 & 7, + object_id = a3 >> 7; + if (PartyX != -1) + { + if (!PartyX) PartyX = pParty->vPosition.x; + if (!PartyY) PartyY = pParty->vPosition.y; + AIL_set_sample_pan(channel->hSample, sub_4AB66C(PartyX, PartyY)); + AIL_set_sample_volume(channel->hSample, GetSoundStrengthByDistanceFromParty(PartyX, PartyY, pParty->vPosition.z)); + } + else if (object_type == OBJECT_BLVDoor) { - *(float *)&varC = 0.0; - pActor2 = &pActors[a3 >> 3]; - v96 = 3; - v58 = pActor2->vPosition.y; - v87 = pActor2->vPosition.z; - v59 = pActor2->vPosition.x; -LABEL_116: - LODWORD(v93) = GetSoundStrengthByDistanceFromParty(v59, /*(int)pSoundDesc*/ v58, v87); - if ( v93 == 0.0 ) + assert(uCurrentlyLoadedLevelType == LEVEL_Indoor); + + assert(object_id < pIndoor->uNumDoors); + auto door = &pIndoor->pDoors[object_id]; + if (!door->uDoorID) return; - goto LABEL_123; - } - if ( (a3 & 7) != 5 ) - { - if ( (a3 & 7) == 6 ) + + if (!GetSoundStrengthByDistanceFromParty(door->pXOffsets[0], door->pYOffsets[0], door->pZOffsets[0])) { - varC = 8; - v96 = 9; + AIL_end_sample(channel->hSample); + _4ABE55(channel); + return; } - else - { - varC = 10; - v96 = 12; - } - goto LABEL_123; + AIL_set_sample_pan(channel->hSample, sub_4AB66C(door->pXOffsets[0], door->pYOffsets[0])); + } + else if (object_type == OBJECT_Item) + { + assert(object_id < uNumLayingItems); + auto object = &pLayingItems[object_id]; + if (!GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z) ) + return; + AIL_set_sample_pan(channel->hSample, sub_4AB66C(object->vPosition.x, object->vPosition.y)); + } + else if (object_type == OBJECT_Actor) + { + assert(object_id < uNumActors); + auto actor = &pActors[object_id]; + if (!GetSoundStrengthByDistanceFromParty(actor->vPosition.x, actor->vPosition.y, actor->vPosition.z)) + return; + AIL_set_sample_pan(channel->hSample, sub_4AB66C(actor->vPosition.x, actor->vPosition.y)); } - varC = 4; - v96 = 4; - pLayingItem3 = (LayingItem *)&pLevelDecorations[a3 >> 3]; - } - v87 = pLayingItem3->vPosition.z; - v58 = pLayingItem3->vPosition.y; - v59 = pLayingItem3->vPosition.x; - goto LABEL_116; + else if (object_type == OBJECT_Decoration) + { + assert(object_id < uNumLevelDecorations); + auto decor = &pLevelDecorations[object_id]; + if (!GetSoundStrengthByDistanceFromParty(decor->vPosition.x, decor->vPosition.y, decor->vPosition.z)) + return; + AIL_set_sample_pan(channel->hSample, sub_4AB66C(decor->vPosition.x, decor->vPosition.y)); + } + +//LABEL_184: + if (uNumRepeats) + AIL_set_sample_loop_count(channel->hSample, uNumRepeats - 1); + channel->uSourceTrackIdx = sound_id; + channel->source_pid = a3; + channel->uSourceTrackID = eSoundID; + int rval = AIL_start_sample(channel->hSample); + if ( sPlaybackRate ) + AIL_set_sample_playback_rate(channel->hSample, sPlaybackRate); + if (object_type == OBJECT_Player) + AIL_sample_ms_position(channel->hSample, &sLastTrackLengthMS, 0); + return; } + + + + + __debugbreak(); // 3d sound stuff, refactor v12 = 13; if ( a3 < 0 ) { @@ -1144,7 +1184,7 @@ if ( AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4 && pAudioPlayer_3DSample->field_4 == a3 && AIL_3D_sample_status(pAudioPlayer_3DSample->hSample) == 4 ) { - if ( pAudioPlayer_3DSample->field_8 == pNum ) + if ( pAudioPlayer_3DSample->field_8 == sound_id ) return; AIL_end_3D_sample(pAudioPlayer_3DSample->hSample); pAudioPlayer->_4ABF23(pAudioPlayer_3DSample); @@ -1228,12 +1268,12 @@ pAudioPlayer->_4ABF23(pAudioPlayer_3DSample3); v102 = v36; } - v39 = v89; - if ( pSoundList->pSounds[v89 / 0x78].p3DSound || (LOWORD(v40) = pSoundList->LoadSound(eSoundID, 0), v40) ) + //v39 = v89; + if ( pSoundList->pSounds[sound_id].p3DSound || (LOWORD(v40) = pSoundList->LoadSound(eSoundID, 0), v40) ) { v41 = (char *)pAudioPlayer + 16 * v102; v42 = (int)(v41 + 20); - if ( AIL_set_3D_sample_file(*((int *)v41 + 5), *(void **)((char *)&pSoundList->pSounds->p3DSound + v39)) ) + if ( AIL_set_3D_sample_file(*((int *)v41 + 5), *(void **)((char *)&pSoundList->pSounds->p3DSound + sound_id * sizeof(SoundDesc))) ) { if ( uNumRepeats ) v86 = uNumRepeats - 1; @@ -1282,7 +1322,7 @@ AIL_set_3D_orientation((void *)*(int *)v42, LODWORD(v54), 0.0, LODWORD(v53), 0.0, 1.0, 0.0); //pAudioPlayer3 = pAudioPlayer; *((int *)v41 + 6) = a3; - *((int *)v41 + 7) = pNum; + *((int *)v41 + 7) = sound_id; *(&pAudioPlayer->bEAXSupported + 4 * (v102 + 2)) = eSoundID; } else @@ -1340,13 +1380,13 @@ //----- (004AAFCF) -------------------------------------------------------- -void AudioPlayer::_4AAFCF() +void AudioPlayer::UpdateSounds() { - AudioPlayer *pAudioPlayer; // edi@1 + //AudioPlayer *pAudioPlayer; // edi@1 int v2; // ebx@1 - unsigned __int8 v3; // zf@1 - int *v4; // eax@2 - unsigned __int8 v5; // sf@4 + //unsigned __int8 v3; // zf@1 + //int *v4; // eax@2 + //unsigned __int8 v5; // sf@4 AudioPlayer_3DSample *v6; // esi@5 int v7; // ebx@6 int v8; // ebx@9 @@ -1369,31 +1409,31 @@ int v25; // eax@32 float v26; // ST10_4@34 float v27; // ST08_4@34 - MixerChannel *v28; // esi@38 - unsigned __int8 v29; // of@43 - MixerChannel *v30; // esi@44 - int v31; // eax@45 - LayingItem *v32; // eax@49 - Actor *v33; // edi@50 - int v34; // eax@50 - unsigned int v35; // edx@51 - unsigned int v36; // ecx@51 - LayingItem *v37; // edi@53 + //MixerChannel *v28; // esi@38 + //unsigned __int8 v29; // of@43 + //MixerChannel *v30; // esi@44 + //int v31; // eax@45 + //LayingItem *v32; // eax@49 + //Actor *v33; // edi@50 + //int v34; // eax@50 + //unsigned int v35; // edx@51 + //unsigned int v36; // ecx@51 + //LayingItem *v37; // edi@53 int v38; // eax@53 - BLVDoor *v39; // edi@56 - int v40; // eax@57 - int v41; // eax@60 - MixerChannel *v42; // edi@65 - int v43; // ebx@68 - LevelDecoration *v44; // esi@68 - int v45; // ST1C_4@68 - int v46; // edi@68 - int v47; // eax@68 - DecorationDesc *v48; // edi@69 - __int16 v49; // ax@69 - __int16 v50; // ax@70 + //BLVDoor *v39; // edi@56 + //int v40; // eax@57 + //int v41; // eax@60 + //MixerChannel *v42; // edi@65 + //int v43; // ebx@68 + //LevelDecoration *v44; // esi@68 + //int v45; // ST1C_4@68 + //int v46; // edi@68 + //int v47; // eax@68 + //DecorationDesc *v48; // edi@69 + //__int16 v49; // ax@69 + //__int16 v50; // ax@70 __int16 v51; // ax@71 - __int16 v52; // ax@73 + //__int16 v52; // ax@73 signed int v53; // eax@88 RenderVertexSoft a1; // [sp+24h] [bp-48h]@1 float v55; // [sp+54h] [bp-18h]@22 @@ -1401,27 +1441,32 @@ int uNumRepeats; // [sp+5Ch] [bp-10h]@15 float v58; // [sp+60h] [bp-Ch]@23 int v59; // [sp+64h] [bp-8h]@4 - AudioPlayer *thisa; // [sp+68h] [bp-4h]@1 + //AudioPlayer *thisa; // [sp+68h] [bp-4h]@1 - pAudioPlayer = this; + //pAudioPlayer = this; v2 = 0; - thisa = this; - v3 = this->bPlayerReady == 0; - a1.flt_2C = 0.0; - if ( !v3 ) + //thisa = this; + //v3 = this->bPlayerReady == 0; + //a1.flt_2C = 0.0; + if (!bPlayerReady) + return; + + if (field_2D0_time_left <= pEventTimer->uTimeElapsed) + field_2D0_time_left = 32; + else { - v4 = &this->field_2D0_time_left; - *v4 -= pEventTimer->uTimeElapsed; - if ( this->field_2D0_time_left <= 0 ) - { - v3 = this->b3DSoundInitialized == 0; - *v4 = 32; - if ( !v3 ) + field_2D0_time_left -= pEventTimer->uTimeElapsed; + return; + } + + //v3 = this->b3DSoundInitialized == 0; + if (b3DSoundInitialized) { - v3 = this->uNum3DSamples == 0; - v5 = this->uNum3DSamples < 0; + __debugbreak(); // refactor refactor + //v3 = this->uNum3DSamples == 0; + //v5 = this->uNum3DSamples < 0; v59 = 0; - if ( !(v5 | v3) ) + if (uNum3DSamples > 0) { v6 = this->p3DSamples; while ( 1 ) @@ -1459,6 +1504,7 @@ goto LABEL_37; } } + v9 = v8 - 1; if ( v9 ) { @@ -1561,183 +1607,195 @@ goto LABEL_35; } } + + + + + + + LABEL_37: - if ( pAudioPlayer->uMixerChannels > v2 ) + for (uint i = 0; i < uMixerChannels; ++i) + { + auto channel = pMixerChannels + i; + + if (AIL_sample_status(channel->hSample) == AIL::Sample::Done) + { + AIL_end_sample(channel->hSample); + _4ABE55(channel); + } + } + + for (uint i = 0; i < uMixerChannels; ++i) + { + auto channel = pMixerChannels + i; + if (channel->source_pid <= 0) + continue; + + int source_type = channel->source_pid & 7, + source_id = channel->source_pid >> 3; + int source_x, + source_y, + source_z; + + switch (source_type) + { + case 0: + case OBJECT_Player: + case OBJECT_BModel: + continue; + + case OBJECT_BLVDoor: { - v28 = pAudioPlayer->pMixerChannels; - do - { - if ( AIL_sample_status(v28->hSample) == 2 ) - { - AIL_end_sample(v28->hSample); - pAudioPlayer->_4ABE55(v28); - } - ++v2; - ++v28; - } - while ( v2 < pAudioPlayer->uMixerChannels ); - v2 = 0; + assert(uCurrentlyLoadedLevelType == LEVEL_Indoor); + + assert(source_id < pIndoor->uNumDoors); + auto door = pIndoor->pDoors + source_id; + if (!door->uDoorID) + continue; + + source_x = door->pXOffsets[0]; + source_y = door->pYOffsets[0]; + source_z = door->pZOffsets[0]; } - //v29 = __OFSUB__(v1->uMixerChannels, v2); - v29 = pAudioPlayer->uMixerChannels > v2; - v3 = pAudioPlayer->uMixerChannels == v2; - v5 = pAudioPlayer->uMixerChannels - v2 < 0; - v59 = v2; - if ( !((unsigned __int8)(v5 ^ v29) | v3) ) + break; + + case OBJECT_Item: + { + assert(source_id < uNumLayingItems); + auto object = &pLayingItems[source_id]; + + source_x = object->vPosition.x; + source_y = object->vPosition.y; + source_z = object->vPosition.z; + } + break; + + case OBJECT_Decoration: { - v30 = pAudioPlayer->pMixerChannels; - while ( 1 ) - { - v31 = v30->dword_000004; - if ( (v30->dword_000004 & 7) == 1 ) - { - if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - { - v39 = &pIndoor->pDoors[v31 >> 3]; - if ( !v39->uDoorID ) - { -LABEL_61: - pAudioPlayer = thisa; - goto LABEL_62; - } - v40 = GetSoundStrengthByDistanceFromParty(*v39->pXOffsets, *v39->pYOffsets, *v39->pZOffsets); - if ( !v40 ) - { -LABEL_58: - AIL_end_sample(v30->hSample); - thisa->_4ABE55(v30); - goto LABEL_61; - } - AIL_set_sample_volume(v30->hSample, v40); - v35 = *v39->pYOffsets; - v36 = *v39->pXOffsets; -LABEL_60: - v41 = sub_4AB66C(v36, v35); - AIL_set_sample_pan(v30->hSample, v41); - goto LABEL_61; - } - } - else - { - if ( (v30->dword_000004 & 7) == 2 ) - { - v32 = &pLayingItems[v31 >> 3]; - goto LABEL_53; - } - if ( (v30->dword_000004 & 7) == 3 ) - { - v33 = &pActors[v31 >> 3]; - v34 = GetSoundStrengthByDistanceFromParty(v33->vPosition.x, v33->vPosition.y, v33->vPosition.z); - if ( !v34 ) - goto LABEL_58; - AIL_set_sample_volume(v30->hSample, v34); - v35 = v33->vPosition.y; - v36 = v33->vPosition.x; - goto LABEL_60; - } - if ( (v30->dword_000004 & 7) == 5 ) - { - v32 = (LayingItem *)&pLevelDecorations[v31 >> 3]; -LABEL_53: - v37 = v32; - v38 = GetSoundStrengthByDistanceFromParty(v32->vPosition.x, v32->vPosition.y, v32->vPosition.z); - if ( !v38 ) - goto LABEL_58; - AIL_set_sample_volume(v30->hSample, v38); - v35 = v37->vPosition.y; - v36 = v37->vPosition.x; - goto LABEL_60; - } - } -LABEL_62: - ++v59; - ++v30; - if ( v59 >= pAudioPlayer->uMixerChannels ) - { - v2 = 0; - break; - } - } + assert(source_id < uNumLevelDecorations); + auto object = (LayingItem *)&pLevelDecorations[source_id]; + + source_x = object->vPosition.x; + source_y = object->vPosition.y; + source_z = object->vPosition.z; + } + break; + + case OBJECT_Actor: + { + assert(source_id < uNumActors); + auto actor = pActors + source_id; + + source_x = actor->vPosition.x; + source_y = actor->vPosition.y; + source_z = actor->vPosition.z; } - if ( pCurrentScreen != v2 ) - { - v42 = &pAudioPlayer->pMixerChannels[4]; - if ( AIL_sample_status(v42->hSample) == 4 ) - AIL_end_sample(v42->hSample); - return; - } - v59 = v2; - if ( _6807E0_num_decorations_with_sounds_6807B8 <= v2 ) - return; - while ( 1 ) - { + break; + + default: + assert(false); + continue; + } + + if (auto sound_strength = GetSoundStrengthByDistanceFromParty(source_x, source_y, source_z)) + { + AIL_set_sample_volume(channel->hSample, sound_strength); + AIL_set_sample_pan(channel->hSample, sub_4AB66C(source_x, source_y)); + } + else + { + AIL_end_sample(channel->hSample); + _4ABE55(channel); + } + } + + + + if (pCurrentScreen != SCREEN_GAME) + { + auto channel = &pMixerChannels[4]; + if (AIL_sample_status(channel->hSample) == AIL::Sample::Playing) + AIL_end_sample(channel->hSample); + return; + } + if (!_6807E0_num_decorations_with_sounds_6807B8) + return; + + v55 = 0; + //v59 = 0; + for (uint i = 0; i < _6807E0_num_decorations_with_sounds_6807B8; ++i) + { + //while ( 1 ) + //{ LODWORD(v56) = 1; - v43 = 4 * v59 + 6817720; - v44 = &pLevelDecorations[_6807B8_level_decorations_ids[v59]]; - v45 = abs(v44->vPosition.z - pParty->vPosition.z); - v46 = abs(v44->vPosition.y - pParty->vPosition.y); - v47 = abs(v44->vPosition.x - pParty->vPosition.x); - if ( int_get_vector_length(v47, v46, v45) <= 8192 ) - break; -LABEL_89: - ++v59; - if ( v59 >= _6807E0_num_decorations_with_sounds_6807B8 ) - return; - } - v48 = &pDecorationList->pDecorations[v44->uDecorationDescID]; - v49 = v48->uFlags; - uNumRepeats = (~(unsigned __int8)v48->uFlags & 0x40) >> 6; - if ( HIBYTE(v49) & 3 ) - { - v50 = v44->field_1A; + //v43 = _6807B8_level_decorations_ids[v59]; + //v44 = &pLevelDecorations[_6807B8_level_decorations_ids[v59]]; + //v45 = abs(v44->vPosition.z - pParty->vPosition.z); + //v46 = abs(v44->vPosition.y - pParty->vPosition.y); + //v47 = abs(v44->vPosition.x - pParty->vPosition.x); + auto decor = &pLevelDecorations[_6807B8_level_decorations_ids[i]]; + if (int_get_vector_length(decor->vPosition.x - pParty->vPosition.x, + decor->vPosition.y - pParty->vPosition.y, + decor->vPosition.z - pParty->vPosition.z) > 8192) + continue; + + auto decor_desc = &pDecorationList->pDecorations[decor->uDecorationDescID]; + //v48 = &pDecorationList->pDecorations[decor->uDecorationDescID]; + //v49 = v48->uFlags; + uNumRepeats = (~(unsigned __int8)decor_desc->uFlags & 0x40) >> 6; + + if (decor_desc->SoundOnDawn() || decor_desc->SoundOnDusk()) + { + //v50 = decor->field_1A; v55 = 0.0; uNumRepeats = 2; - if ( v50 ) + if (decor->field_1A) { - v51 = v50 - 32; - v44->field_1A = v51; + v51 = decor->field_1A - 32; + decor->field_1A = v51; if ( v51 < 0 ) - v44->field_1A = 0; + decor->field_1A = 0; } - } - v52 = v48->uFlags; - if ( !(HIBYTE(v52) & 1) ) - { - if ( !(HIBYTE(v52) & 2) ) - goto LABEL_84; - if ( v55 != 0.0 ) - goto LABEL_85; - } - v56 = 0.0; - if ( pParty->uCurrentHour >= 5 && pParty->uCurrentHour < 6 - || pParty->uCurrentHour >= 0x14 && pParty->uCurrentHour < 0x15 ) - { - if ( !v44->field_1A && rand() % 100 < 100 ) + } + + //v52 = v48->uFlags; + if (!decor_desc->SoundOnDawn()) + { + if (!decor_desc->SoundOnDusk()) + goto LABEL_84; + if ( v55 != 0.0 ) + goto LABEL_85; + } + v56 = 0.0; + + if (pParty->uCurrentHour >= 5 && pParty->uCurrentHour < 6 || + pParty->uCurrentHour >= 20 && pParty->uCurrentHour < 21) + { + if ( !decor->field_1A && rand() % 100 < 100 ) LODWORD(v56) = 1; LODWORD(v55) = 1; - } + } LABEL_84: if ( v55 == 0.0 ) { LABEL_87: if ( v56 != 0.0 ) { - v53 = 8 * *(int *)v43; - LOBYTE(v53) = v53 | 5; - thisa->PlaySound((SoundID)v48->uSoundID, v53, uNumRepeats, -1, 0, 0, 0, 0); + v53 = 8 * _6807B8_level_decorations_ids[i]; + LOBYTE(v53) = v53 | OBJECT_Decoration; + PlaySound((SoundID)decor_desc->uSoundID, v53, uNumRepeats, -1, 0, 0, 0, 0); } - goto LABEL_89; + continue; } LABEL_85: - if ( !v44->field_1A ) - v44->field_1A = (rand() % 15 + 1) << 7; + if ( !decor->field_1A ) + decor->field_1A = (rand() % 15 + 1) << 7; goto LABEL_87; - } } } - //----- (004AB66C) -------------------------------------------------------- int __fastcall sub_4AB66C(int a1, int a2) { @@ -1825,7 +1883,7 @@ { AIL_end_sample(pChannel->hSample); _4ABE55(pChannel); - pChannel->dword_000004 = 0; + pChannel->source_pid = 0; } ++v6; ++pChannel; @@ -2167,8 +2225,9 @@ v2 = 0; //v3 = this; - if ( pSoundList->pSounds ) - { + if (!pSoundList->pSounds) + return; + v4 = &pSoundList->pSounds[pChannel->uSourceTrackIdx]; if ( v4->eType == SOUND_DESC_SWAP) { @@ -2189,7 +2248,7 @@ v9 = *(int *)v7; ++v16; v14[v8] = v2; - if ( AIL_sample_status((HSAMPLE)v9) == 4 ) + if ( AIL_sample_status((HSAMPLE)v9) == AIL::Sample::Playing) ++v15; } ++v2; @@ -2217,10 +2276,7 @@ } } } - } } -// 4D82F8: using guessed type int __stdcall AIL_sample_status(int); -// 4ABE55: using guessed type int var_48[16]; diff -r e65d75206263 -r 91e1ba340f39 AudioPlayer.h --- a/AudioPlayer.h Mon Feb 25 09:08:13 2013 +0600 +++ b/AudioPlayer.h Mon Feb 25 09:09:08 2013 +0600 @@ -56,11 +56,11 @@ struct MixerChannel { inline MixerChannel(): - hSample(nullptr), dword_000004(0), uSourceTrackIdx(0), uSourceTrackID(0) + hSample(nullptr), source_pid(0), uSourceTrackIdx(0), uSourceTrackID(0) {} _SAMPLE *hSample; - int dword_000004; + int source_pid; unsigned int uSourceTrackIdx; unsigned int uSourceTrackID; }; @@ -73,13 +73,14 @@ /* 308 */ enum SoundID { - SOUND_0 = 0, + SOUND_Invalid = 0, SOUND_EnteringAHouse = 0x6, SOUND_8 = 0x8, SOUND_27 = 0x1B, SOUND_Button = 66, SOUND_67 = 67, SOUND_71 = 71, + SOUND_Button2 = 75, SOUND_78 = 78, SOUND_80 = 80, SOUND_81 = 81, @@ -97,6 +98,7 @@ SOUND_Arcomage_TowerUpgrade = 0x81, SOUND_Arcomage_WallUpgrade = 0x84, SOUND_GoldReceived = 0xC8, + SOUND_OpenChest = 208, SOUND_PlayerCantCastSpell = 0xD1, SOUND_Bell = 0xD9, SOUND_20001 = 0x4E21, @@ -144,7 +146,7 @@ void SetMasterVolume(float fVolume); void _4AA258(int a2); void PlaySound(SoundID eSoundID, signed int a3, unsigned int uNumRepeats, signed int a5, signed int a6, int a7, unsigned int uVolume, int sPlaybackRate); - void _4AAFCF(); + void UpdateSounds(); void StopChannels(int uStartChannel, int uEndChannel); void LoadAudioSnd(); void Initialize(HWND hWnd); @@ -236,6 +238,8 @@ struct SoundDesc { + inline bool Is3D() {return uFlags & SOUND_DESC_3D;} + char pSoundName[32]; unsigned int uSoundID; SOUND_DESC_TYPE eType; diff -r e65d75206263 -r 91e1ba340f39 Chest.cpp --- a/Chest.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Chest.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1,8 +1,23 @@ #include +#include #include "Chest.h" #include "FrameTableInc.h" #include "Allocator.h" +#include "LOD.h" +#include "MapInfo.h" +#include "Actor.h" +#include "Indoor.h" +#include "Outdoor.h" +#include "DecorationList.h" +#include "Party.h" +#include "AudioPlayer.h" +#include "Math.h" +#include "Texts.h" +#include "ObjectList.h" +#include "GUIWindow.h" +#include "Time.h" +#include "Overlays.h" #include "mm7_data.h" @@ -17,6 +32,674 @@ +//----- (0042041E) -------------------------------------------------------- +bool Chest::Open(unsigned int uChestID) +{ + //char *v1; // edi@5 + unsigned int v2; // eax@8 + GUIWindow *v3; // eax@15 + int v5; // edx@16 + int v6; // eax@16 + ODMFace *v7; // eax@19 + int v8; // edx@19 + int v9; // edi@19 + signed int v10; // ebx@19 + int v11; // ecx@19 + int v12; // eax@19 + BLVFace *v13; // eax@20 + int v14; // ebx@21 + int v15; // edi@21 + int v16; // ecx@22 + __int64 v17; // qax@22 + double v18; // st7@23 + double v19; // st6@23 + double v20; // st7@23 + int v21; // ecx@26 + char v22[12]; // ST4C_12@28 + unsigned int *v23; // edi@28 + unsigned __int16 v24; // di@28 + signed int v25; // ecx@28 + char *v26; // edx@29 + unsigned __int16 v27; // ax@32 + //LayingItem a1; // [sp+14h] [bp-B0h]@28 + int v29; // [sp+84h] [bp-40h]@16 + int v30; // [sp+88h] [bp-3Ch]@16 + int v31; // [sp+8Ch] [bp-38h]@16 + int v32; // [sp+90h] [bp-34h]@16 + float v33; // [sp+94h] [bp-30h]@23 + //char *v34; // [sp+98h] [bp-2Ch]@5 + int v35; // [sp+9Ch] [bp-28h]@16 + Vec3_int_ pOut; // [sp+A0h] [bp-24h]@28 + int a4; // [sp+ACh] [bp-18h]@1 + int v38; // [sp+B0h] [bp-14h]@21 + int sRotX; // [sp+B4h] [bp-10h]@23 + float v40; // [sp+B8h] [bp-Ch]@23 + float v41; // [sp+BCh] [bp-8h]@23 + int sRotY; // [sp+C0h] [bp-4h]@8 + + //a4 = uChestID; + assert(uChestID < 20); + auto chest = pChests + uChestID; + + ++pIcons_LOD->uTexturePacksCount; + if (!pIcons_LOD->uNumPrevLoadedFiles) + pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; + + + //v1 = (char *)&pChests[uChestID].uFlags; + //v34 = v1; + if (!chest->Initialized()) + Chest::_420284(uChestID); + + if ( !uActiveCharacter ) + return 0; + *(float *)&sRotY = 0.0; + v2 = pMapStats->GetMapInfo(pCurrentMapName); + if ( !chest->Trapped() || !v2 ) + goto LABEL_12; + if ( pPlayers[uActiveCharacter]->GetDisarmTrap() < 2 * pMapStats->pInfos[v2].LockX5 ) + { + v29 = 811; + v30 = 812; + v31 = 813; + v32 = 814; + v5 = rand() % 4; + v6 = dword_5B5920 >> 3; + v35 = v5; + if ( (dword_5B5920 & 7) == OBJECT_Decoration) + { + v16 = v6; + v14 = pLevelDecorations[v6].vPosition.x; + v38 = pLevelDecorations[v6].vPosition.y; + v17 = pDecorationList->pDecorations[pLevelDecorations[v6].uDecorationDescID].uDecorationHeight; + v15 = pLevelDecorations[v16].vPosition.z + (((signed int)v17 - HIDWORD(v17)) >> 1); + } + else + { + if ( (dword_5B5920 & 7) != OBJECT_BModel) + goto LABEL_12; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) + { + v7 = &pOutdoor->pBModels[dword_5B5920 >> 9].pFaces[(dword_5B5920 >> 3) & 0x3F]; + v8 = v7->pBoundingBox.y1; + v9 = v7->pBoundingBox.z2; + v10 = v7->pBoundingBox.x1 + v7->pBoundingBox.x2; + v11 = v7->pBoundingBox.y2; + v12 = v7->pBoundingBox.z1; + } + else + { + v13 = &pIndoor->pFaces[v6]; + v8 = v13->pBounding.y1; + v9 = v13->pBounding.z2; + v10 = v13->pBounding.x1 + v13->pBounding.x2; + v11 = v13->pBounding.y2; + v12 = v13->pBounding.z1; + } + v14 = v10 >> 1; + v38 = (v8 + v11) >> 1; + v15 = (v12 + v9) >> 1; + } + v18 = (double)pParty->vPosition.x - (double)v14; + *(float *)&a4 = v18; + v19 = (double)pParty->vPosition.y - (double)v38; + v33 = v19; + v41 = (double)pParty->sEyelevel + (double)pParty->vPosition.z - (double)v15; + *(float *)&sRotY = v19 * v19; + *(float *)&sRotX = v18 * v18; + v20 = sqrt(v41 * v41 + *(float *)&sRotX + *(float *)&sRotY); + v40 = v20; + if ( v20 <= 1.0 ) + { + *(float *)&sRotX = 0.0; + *(float *)&sRotY = 0.0; + } + else + { + sRotY = (signed __int64)sqrt(*(float *)&sRotX + *(float *)&sRotY); + sRotX = stru_5C6E00->Atan2((signed __int64)*(float *)&a4, (signed __int64)v33); + sRotY = stru_5C6E00->Atan2(sRotY, (signed __int64)v41); + } + v21 = 256; + if ( v40 < 256.0 ) + v21 = (signed __int64)v40 / 4; + *(int *)&v22[8] = v15; + *(_QWORD *)v22 = __PAIR__(v38, v14); + Vec3_int_::Rotate(v21, sRotX, sRotY, *(Vec3_int_ *)v22, &pOut.x, &pOut.z, &pOut.y); + v23 = (unsigned int *)(&v29 + v35); + sub_42F7EB_DropItemAt(*v23, pOut.x, pOut.z, pOut.y, 0, 1, 0, 0x30u, 0); + + LayingItem a1; // [sp+14h] [bp-B0h]@28 + //LayingItem::LayingItem(&a1); + + a1.stru_24.Reset(); + v24 = *(short *)v23; + v25 = 0; + a1.field_50 = 0; + a1.field_4C = 0; + a1.field_48 = 0; + a1.field_54 = 0; + a1.uItemType = v24; + if ( (signed int)pObjectList->uNumObjects <= 0 ) + { +LABEL_32: + v27 = 0; + } + else + { + v26 = (char *)&pObjectList->pObjects->uObjectID; + while ( v24 != *(short *)v26 ) + { + ++v25; + v26 += 56; + if ( v25 >= (signed int)pObjectList->uNumObjects ) + goto LABEL_32; + } + v27 = v25; + } + a1.uObjectDescID = v27; + a1.vPosition.y = pOut.z; + a1.vPosition.x = pOut.x; + a1.vPosition.z = pOut.y; + a1.uSoundID = 0; + a1.uAttributes = 48; + a1.uSectorID = pIndoor->GetSector(pOut.x, pOut.z, pOut.y); + a1.uSpriteFrameID = 0; + a1.field_58_pid = 0; + a1.field_5C = 0; + a1.uFacing = 0; + a1.Create(0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); + a1._438E35(); + chest->SetInitialized(false);//*v34 &= 0xFEu; + if ( uActiveCharacter && !qword_A750D8 && !dword_507CD8 ) + { + qword_A750D8 = 256i64; + word_A750E0 = 5; + word_A750E2 = uActiveCharacter; + } + pIcons_LOD->_4114F2(); + dword_507CD8 = 0; + return 0; + } + chest->SetInitialized(false);//*v1 &= 0xFEu; + sRotY = 1; +LABEL_12: + pAudioPlayer->StopChannels(-1, -1); + pAudioPlayer->PlaySound(SOUND_OpenChest, 0, 0, -1, 0, 0, 0, 0); + if ( *(float *)&sRotY != 0.0 ) + { + if ( !dword_507CD8 ) + pPlayers[uActiveCharacter]->PlaySound(SPEECH_4, 0); + } + dword_507CD8 = 0; + v3 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Chest, a4, 0); + pGUIWindow_CurrentMenu = v3; + pChestWindow = v3; + pBtn_ExitCancel = v3->CreateButton( + 0x1D7u, + 0x1BDu, + 0xA9u, + 0x23u, + 1, + 0, + 0x71u, + 0, + 0, + pGlobalTXT_LocalizationStrings[79],// Exit + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + 0); + pChestWindow->CreateButton(7u, 8u, 460u, 343u, 1, 0, 0xCu, 0, 0, "", 0); + pCurrentScreen = SCREEN_CHEST; + pEventTimer->Pause(); + return 1; +} + +//----- (0042092D) -------------------------------------------------------- +void Chest::DrawChestUI(unsigned int uChestID) +{ + Render *v1; // edi@1 + unsigned int v2; // ebx@1 + unsigned int v3; // ebx@1 + int v4; // eax@1 + unsigned int v5; // eax@1 + int v6; // ecx@3 + unsigned int v7; // eax@4 + Texture *v8; // esi@4 + signed int v9; // ecx@4 + signed int v10; // edx@4 + signed int v11; // eax@4 + int v12; // eax@6 + int v13; // eax@6 + unsigned int v14; // ST34_4@8 + int v15; // edi@8 + int *v16; // [sp+Ch] [bp-28h]@1 + int v17; // [sp+10h] [bp-24h]@4 + int v18; // [sp+14h] [bp-20h]@1 + signed int v19; // [sp+18h] [bp-1Ch]@1 + int v20; // [sp+1Ch] [bp-18h]@1 + signed int v21; // [sp+20h] [bp-14h]@1 + char *v22; // [sp+2Ch] [bp-8h]@2 + signed int v23; // [sp+30h] [bp-4h]@1 + + v1 = pRenderer; + v2 = uChestID; + v16 = pRenderer->pActiveZBuffer; + pRenderer->ClearZBuffer(0, 479); + v3 = v2; + v4 = pChests[v3].uChestBitmapID; + v20 = pChestSmthn1ByType[v4]; + v18 = pChestSmthn2ByType[v4]; + v21 = pChestWidthsByType[v4]; + v19 = pChestHeightsByType[v4]; + sprintf(pTmpBuf, "chest%02d", pChestList->pChests[pChests[v3].uChestBitmapID].uTextureID); + v5 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE); + pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0)); + v23 = 0; + if ( v21 * v19 > 0 ) + { + v22 = (char *)pChests[v3].pInventoryIndices; + do + { + v6 = *(short *)v22; + if ( v6 > 0 ) + { + v17 = v18 + 32 * v23 / v19; + v7 = pIcons_LOD->LoadTexture( + pItemsTable->pItems[*(int *)((char *)&pOtherOverlayList->pOverlays[49].field_4 + 36 * v6 + v3 * 5324)].pIconName, + TEXTURE_16BIT_PALETTE); + v8 = (Texture *)(v7 != -1 ? &pIcons_LOD->pTextures[v7] : 0); + v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureHeight : 26); + v11 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v9 < 14 ) + v11 = 14; + v12 = v11 - 14; + LOBYTE(v12) = v12 & 0xE0; + v13 = v12 + 32; + if ( (signed int)v8->uTextureHeight < 14 ) + v10 = 14; + v14 = v20 + 32 * v23 % v21 + ((v13 - v9) >> 1); + v15 = v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1); + pRenderer->DrawTextureTransparent( + v14, + v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1), + v8); + sub_40F92A(&v16[v14 + pSRZBufferLineOffsets[v15]], v8, v23 + 1); + v1 = pRenderer; + } + ++v23; + v22 += 2; + } + while ( v23 < v21 * v19 ); + } + pRenderer->DrawTextureIndexed(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0)); +} + + +//----- (0041FE71) -------------------------------------------------------- +int Chest::CanPlaceItemAt(signed int a1, int a2, unsigned int uChestID) +{ + int v3; // eax@1 + unsigned int v4; // eax@1 + Texture *v5; // ecx@1 + signed int v6; // eax@1 + signed int v7; // edi@3 + signed int v8; // eax@3 + int v9; // edi@3 + int v10; // ebx@5 + int v11; // esi@9 + int v12; // edx@10 + int v13; // ecx@11 + char *v14; // eax@12 + int v16; // [sp+Ch] [bp-Ch]@1 + signed int v17; // [sp+10h] [bp-8h]@1 + signed int v18; // [sp+14h] [bp-4h]@1 + + v17 = a1; + v3 = pChests[uChestID].uChestBitmapID; + v16 = pChestHeightsByType[v3]; + v18 = pChestWidthsByType[v3]; + v4 = pIcons_LOD->LoadTexture(pItemsTable->pItems[a2].pIconName, TEXTURE_16BIT_PALETTE); + v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0); + v6 = (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureWidth : 24); + if ( v6 < 14 ) + v6 = 14; + v7 = v6 - 14; + v8 = v5->uTextureHeight; + v9 = (v7 >> 5) + 1; + if ( v8 < 14 ) + v8 = 14; + v10 = ((v8 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + v5->Release(); + pIcons_LOD->_40F9C5(); + } + if ( v9 + v17 % v18 <= v18 && v10 + v17 / v18 <= v16 ) + { + v11 = 0; + if ( v10 <= 0 ) + return 1; + v12 = 0; + while ( 1 ) + { + v13 = 0; + if ( v9 > 0 ) + break; +LABEL_15: + v12 += v18; + ++v11; + if ( v11 >= v10 ) + return 1; + } + v14 = (char *)&pChests[0].pInventoryIndices[v17 + v12 + 2662 * uChestID]; + while ( !*(short *)v14 ) + { + ++v13; + v14 += 2; + if ( v13 >= v9 ) + goto LABEL_15; + } + } + return 0; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (0041FF64) -------------------------------------------------------- +int Chest::_41FF64(unsigned int uChestID) +{ + unsigned int v1; // ecx@1 + signed int result; // eax@1 + int v3; // edx@1 + ItemGen *pItem; // ecx@2 + + v1 = uChestID; + result = 0; + v3 = pChestWidthsByType[pChests[v1].uChestBitmapID] * pChestHeightsByType[pChests[v1].uChestBitmapID]; + if ( v3 <= 0 ) + { +LABEL_5: + result = -1; + } + else + { + pItem = pChests[v1].mm7__vector_pItems; + while ( pItem->uItemID ) + { + ++result; + ++pItem; + if ( result >= v3 ) + goto LABEL_5; + } + } + return result; +} + +//----- (0041FFA2) -------------------------------------------------------- +int Chest::_41FFA2(int a1, ItemGen *a2, unsigned int uChestID) +{ + int v3; // eax@1 + ItemGen *v4; // edi@1 + int v5; // esi@1 + int result; // eax@11 + unsigned int v7; // eax@12 + int v8; // edx@12 + int v9; // ecx@12 + signed int v10; // eax@12 + signed int v11; // edi@14 + unsigned int v12; // esi@14 + int v13; // edi@16 + void *v14; // edi@21 + int v15; // edi@21 + int i; // ecx@21 + ItemGen *Src; // [sp+Ch] [bp-18h]@1 + signed int v18; // [sp+10h] [bp-14h]@2 + int v19; // [sp+14h] [bp-10h]@1 + int v20; // [sp+18h] [bp-Ch]@19 + signed int v21; // [sp+1Ch] [bp-8h]@1 + signed int v22; // [sp+20h] [bp-4h]@3 + int v23; // [sp+20h] [bp-4h]@19 + + v21 = 0; + v3 = pChests[uChestID].uChestBitmapID; + v4 = a2; + v5 = pChestWidthsByType[v3] * pChestHeightsByType[v3]; + Src = a2; + v19 = pChestWidthsByType[v3]; + if ( a1 == -1 ) + { + v18 = _41FF64(uChestID); + if ( v18 == -1 ) + return 0; + v22 = 0; + if ( v5 > 0 ) + { + while ( !Chest::CanPlaceItemAt(v22, v4->uItemID, (unsigned int)pChestWindow->ptr_1C) ) + { + ++v22; + if ( v22 >= v5 ) + goto LABEL_8; + } + v21 = v22; + } +LABEL_8: + if ( v22 == v5 ) + { + if ( uActiveCharacter ) + pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0); + return 0; + } + v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v4->uItemID].pIconName, TEXTURE_16BIT_PALETTE); + HIWORD(v8) = 0; + v9 = v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0; + v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v10 < 14 ) + v10 = 14; + v11 = *(short *)(v9 + 26); + v12 = ((v10 - 14) >> 5) + 1; + if ( v11 < 14 ) + v11 = 14; + v13 = ((v11 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + ((Texture *)v9)->Release(); + pIcons_LOD->_40F9C5(); + } + if ( v13 > 0 ) + { + v23 = 0; + v20 = v13; + do + { + if ( (signed int)v12 > 0 ) + { + v14 = &pChests[0].pInventoryIndices[v21 + v23 + 2662 * uChestID]; + LOWORD(v8) = -1 - v21; + v8 <<= 16; + LOWORD(v8) = -1 - v21; + memset32(v14, v8, v12 >> 1); + v15 = (int)((char *)v14 + 4 * (v12 >> 1)); + for ( i = v12 & 1; i; --i ) + { + *(short *)v15 = v8; + v15 += 2; + } + } + v23 += v19; + --v20; + } + while ( v20 ); + } + pChests[0].pInventoryIndices[v21 + 2662 * uChestID] = v18 + 1; + memcpy(&pChests[uChestID].mm7__vector_pItems[v18], Src, 0x24u); + result = v21 + 1; + } + else + { + result = 1; + } + return result; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (0042013E) -------------------------------------------------------- +unsigned int Chest::PlaceItemAt(unsigned int a1, unsigned int uItemIdx, unsigned int uChestID) +{ + int v3; // esi@1 + unsigned int v4; // ebx@1 + int uItemID; // edi@1 + int v6; // edx@4 + unsigned int v7; // eax@5 + Texture *v8; // ecx@5 + signed int v9; // eax@5 + signed int v10; // edi@7 + unsigned int v11; // ebx@7 + int v12; // edi@9 + int v13; // edx@12 + void *v14; // edi@14 + int v15; // edi@14 + int i; // ecx@14 + unsigned int result; // eax@18 + __int16 v18; // [sp+Ch] [bp-10h]@1 + int v19; // [sp+10h] [bp-Ch]@11 + int v20; // [sp+14h] [bp-8h]@12 + unsigned int v21; // [sp+18h] [bp-4h]@1 + + v3 = 5324 * uChestID; + v21 = a1; + v4 = 5324 * uChestID + 36 * uItemIdx; + v18 = uItemIdx; + uItemID = *(unsigned int *)((char *)&pChests[0].mm7__vector_pItems[0].uItemID + v4); + pItemsTable->SetSpecialBonus((ItemGen *)((char *)pChests[0].mm7__vector_pItems + v4)); + if ( uItemID >= 135 && uItemID <= 159 && !*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) ) + { + v6 = rand() % 21 + 10; + *(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) = v6; + *(&pChests[0].mm7__vector_pItems[0].uMaxCharges + v4) = v6; + } + v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE); + v8 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0); + v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); + if ( v9 < 14 ) + v9 = 14; + v10 = v8->uTextureHeight; + v11 = ((v9 - 14) >> 5) + 1; + if ( v10 < 14 ) + v10 = 14; + v12 = ((v10 - 14) >> 5) + 1; + if ( !areWeLoadingTexture ) + { + v8->Release(); + pIcons_LOD->_40F9C5(); + } + v19 = pChestWidthsByType[*(unsigned __int16 *)((char *)&pChests[0].uChestBitmapID + v3)]; + if ( v12 > 0 ) + { + v13 = 0; + v20 = v12; + do + { + if ( (signed int)v11 > 0 ) + { + v14 = &pChests[0].pInventoryIndices[v21 + v13 + 2662 * uChestID]; + LOWORD(v3) = -1 - v21; + v3 <<= 16; + LOWORD(v3) = -1 - v21; + memset32(v14, v3, v11 >> 1); + v15 = (int)((char *)v14 + 4 * (v11 >> 1)); + for ( i = v11 & 1; i; --i ) + { + *(short *)v15 = v3; + v15 += 2; + } + } + v13 += v19; + --v20; + } + while ( v20 ); + } + result = v21 + 2662 * uChestID; + pChests[0].pInventoryIndices[result] = v18 + 1; + return result; +} +// 506128: using guessed type int areWeLoadingTexture; + +//----- (00420284) -------------------------------------------------------- +char *Chest::_420284(unsigned int uChestID) +{ + int v1; // ebx@1 + unsigned int v2; // esi@1 + unsigned int v3; // esi@1 + int uChestArea; // edi@1 + int v5; // eax@2 + int v6; // ebx@11 + char *result; // eax@18 + char Dst[144]; // [sp+Ch] [bp-A0h]@1 + int v9; // [sp+9Ch] [bp-10h]@10 + unsigned int v10; // [sp+A0h] [bp-Ch]@1 + unsigned int v11; // [sp+A4h] [bp-8h]@8 + ItemGen *v12; // [sp+A8h] [bp-4h]@9 + + v1 = 0; + v2 = uChestID; + v10 = uChestID; + pRenderer->ClearZBuffer(0, 479); + v3 = v2; + uChestArea = pChestWidthsByType[pChests[v3].uChestBitmapID] * pChestHeightsByType[pChests[v3].uChestBitmapID]; + memset(Dst, 0, 0x90u); + if ( uChestArea > 0 ) + { + do + { + do + v5 = (unsigned __int8)rand(); + while ( v5 >= uChestArea ); + while ( Dst[v5] ) + { + ++v5; + if ( v5 == uChestArea ) + v5 = 0; + } + Dst[v5] = v1++; + } + while ( v1 < uChestArea ); + } + v11 = 0; + if ( uChestArea > 0 ) + { + v12 = pChests[v3].mm7__vector_pItems;//&pChests[v3].mm7__vector_pItems[0].uAttributes; + do + { + v9 = v12->uItemID; + if ( v9 ) + { + v6 = 0; + while ( !Chest::CanPlaceItemAt((unsigned __int8)Dst[v6], v9, v10) ) + { + ++v6; + if ( v6 >= uChestArea ) + break; + } + if(v6SetIdentified(); + } + } + ++v11; + ++v12; + } + while ( (signed int)v11 < uChestArea ); + } + result = (char *)&pChests[v3].uFlags; + pChests[v3].uFlags = pChests[v3].uFlags & 0xFFFB | 2; + return result; +} +// 420284: using guessed type char Dst[144]; + //----- (00458B03) -------------------------------------------------------- void ChestList::ToFile() { diff -r e65d75206263 -r 91e1ba340f39 Chest.h --- a/Chest.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Chest.h Mon Feb 25 09:09:08 2013 +0600 @@ -49,6 +49,10 @@ #pragma pack(push, 1) struct Chest { + inline bool Initialized() const {return uFlags & CHEST_ITEMS_PLACED;} + inline void SetInitialized(bool b) {if (b) uFlags |= CHEST_ITEMS_PLACED; else uFlags &= ~CHEST_ITEMS_PLACED;} + inline bool Trapped() const {return uFlags & CHEST_TRAPPED;} + static int CanPlaceItemAt(signed int a1, int a2, unsigned int uChestID); static int _41FF64(unsigned int uChestID); static int _41FFA2(int a1, ItemGen *a2, unsigned int uChestID); diff -r e65d75206263 -r 91e1ba340f39 DecorationList.h --- a/DecorationList.h Mon Feb 25 09:08:13 2013 +0600 +++ b/DecorationList.h Mon Feb 25 09:09:08 2013 +0600 @@ -25,6 +25,11 @@ #pragma pack(push, 1) struct DecorationDesc { + inline bool CanMoveThrough() {return uFlags & DECORATION_MOVE_THROUGH;} + inline bool DontDraw() {return uFlags & DECORATION_DONT_DRAW;} + inline bool SoundOnDawn() {return uFlags & DECORATION_SOUND_ON_DAWN;} + inline bool SoundOnDusk() {return uFlags & DECORATION_SOUND_ON_DUSK;} + char pName[32]; char field_20[32]; __int16 uType; diff -r e65d75206263 -r 91e1ba340f39 Events.cpp --- a/Events.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Events.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -25,14 +25,15 @@ #include "Events.h" #include "Events2D.h" #include "Weather.h" +#include "Party.h" EventIndex pSomeOtherEVT_Events[4400]; -unsigned int uSomeOtherEVT_NumEvents; +signed int uSomeOtherEVT_NumEvents; char *pSomeOtherEVT; EventIndex pSomeEVT_Events[4400]; -unsigned int uSomeEVT_NumEvents; +signed int uSomeEVT_NumEvents; char *pSomeEVT; unsigned int uGlobalEVT_NumEvents; @@ -43,7 +44,7 @@ unsigned int pLevelStrOffsets[500]; unsigned int uLevelStrNumStrings; unsigned int uLevelStrFileSize; -unsigned int uLevelEVT_NumEvents; +signed int uLevelEVT_NumEvents; unsigned int uLevelEVT_Size; char pLevelStr[9216]; char pLevelEVT[9216]; @@ -367,11 +368,11 @@ v16 = RemoveQuotes(Str); VideoPlayer::MovieLoop(v16, 0, v14, 1); if ( !_strcmpi(v16, "arbiter good") ) - { - pParty->uAlignment = 0; + { + pParty->alignment = PartyAlignment_Good; v18 = 0; LOBYTE(v17) = 1; - SetUserInterface(v18, v17); + SetUserInterface(PartyAlignment_Good, v17); if ( !v15 || v128 == 3 ) { pCurrentScreen = v128; @@ -392,9 +393,9 @@ if ( !_strcmpi(v16, "arbiter evil") ) { v18 = 2; - pParty->uAlignment = 2; + pParty->alignment = PartyAlignment_Evil; LOBYTE(v17) = 1; - SetUserInterface(v18, v17); + SetUserInterface(PartyAlignment_Evil, v17); if ( !v15 || v128 == 3 ) { pCurrentScreen = v128; @@ -1518,7 +1519,7 @@ pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; pCurrentScreen = SCREEN_GAME; viewparams->bRedrawGameUI = 1; - array_5913D8[6] = 0; + pDialogueNPCCount = 0; pDialogueWindow->Release(); dword_F8B19C = 0; pDialogueWindow = 0; diff -r e65d75206263 -r 91e1ba340f39 Events.h --- a/Events.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Events.h Mon Feb 25 09:09:08 2013 +0600 @@ -105,14 +105,15 @@ EVENT_GiveItem = 0x29, EVENT_ChangeEvent = 0x2A, EVENT_CheckSkill = 0x2B, - EVENT_OnCanShowDialogItemCmp = 0x2C, - EVENT_EndCanShowDialogItem = 0x2D, - EVENT_SetCanShowDialogItem = 0x2E, + EVENT_OnCanShowDialogItemCmp = 44, + EVENT_EndCanShowDialogItem = 45, + EVENT_SetCanShowDialogItem = 46, EVENT_SetNPCGroupNews = 0x2F, EVENT_SetActorGroup = 0x30, EVENT_NPCSetItem = 0x31, EVENT_SetNPCGreeting = 0x32, EVENT_IsActorAlive = 0x33, + EVENT_IsActorAssasinated =52, EVENT_OnMapLeave = 0x35, EVENT_ChangeGroup = 0x36, EVENT_ChangeGroupAlly = 0x37, @@ -298,10 +299,10 @@ #define EVT_BYTE(x) (unsigned char)x extern EventIndex pSomeOtherEVT_Events[4400]; -extern unsigned int uSomeOtherEVT_NumEvents; +extern signed int uSomeOtherEVT_NumEvents; extern char *pSomeOtherEVT; extern EventIndex pSomeEVT_Events[4400]; -extern unsigned int uSomeEVT_NumEvents; +extern signed int uSomeEVT_NumEvents; extern char *pSomeEVT; extern unsigned int uGlobalEVT_NumEvents; @@ -312,7 +313,7 @@ extern unsigned int pLevelStrOffsets[500]; extern unsigned int uLevelStrNumStrings; extern unsigned int uLevelStrFileSize; -extern unsigned int uLevelEVT_NumEvents; +extern signed int uLevelEVT_NumEvents; extern unsigned int uLevelEVT_Size; extern char pLevelStr[9216]; extern char pLevelEVT[9216]; diff -r e65d75206263 -r 91e1ba340f39 GUIProgressBar.cpp --- a/GUIProgressBar.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/GUIProgressBar.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1,3 +1,5 @@ +#include + #include "GUIProgressBar.h" #include "LOD.h" #include "Mouse.h" @@ -15,22 +17,29 @@ -//----- (00443484) -------------------------------------------------------- -bool GUIProgressBar::_443484(Type type) +//----- (00Initialize) -------------------------------------------------------- +bool GUIProgressBar::Initialize(Type type) { //GUIProgressBar *v2; // esi@1 signed int v4; // eax@7 int v5; // ecx@8 int v6; // edi@8 int v7; // edx@14 - const char *v8; // [sp-8h] [bp-84h]@20 - unsigned int v9; // [sp-4h] [bp-80h]@20 + //const char *v8; // [sp-8h] [bp-84h]@20 + //unsigned int v9; // [sp-4h] [bp-80h]@20 char Str1[64]; // [sp+4h] [bp-78h]@16 - if (type < 1 || type > 1) + switch (type) { - __debugbreak(); - return false; + case TYPE_None: + return true; + + case TYPE_Box: + case TYPE_Fullscreen: + break; + + default: + assert(false && "Invalid GUIProgressBar type"); } //v2 = this; @@ -74,7 +83,8 @@ Draw(); return true; } - if ( !pParty->uAlignment ) + + /*if ( !pParty->uAlignment ) { v9 = 2; v8 = "bardata-b"; @@ -92,7 +102,15 @@ v8 = "bardata-c"; LABEL_23: pIcons_LOD->_410522(&pBardata, v8, v9); + }*/ + switch (pParty->alignment) + { + case PartyAlignment_Good: pIcons_LOD->_410522(&pBardata, "bardata-b", 2); break; + case PartyAlignment_Neutral: pIcons_LOD->_410522(&pBardata, "bardata", 2); break; + case PartyAlignment_Evil: pIcons_LOD->_410522(&pBardata, "bardata-c", 2); break; + default: assert(false); } + uProgressCurrent = 0; uProgressMax = 26; Draw(); diff -r e65d75206263 -r 91e1ba340f39 GUIProgressBar.h --- a/GUIProgressBar.h Mon Feb 25 09:08:13 2013 +0600 +++ b/GUIProgressBar.h Mon Feb 25 09:09:08 2013 +0600 @@ -8,10 +8,12 @@ { enum Type: unsigned __int32 { - TYPE_Fullscreen = 1 + TYPE_None = 0, + TYPE_Fullscreen = 1, + TYPE_Box = 2 }; - bool _443484(Type type); + bool Initialize(Type type); void Reset(unsigned __int8 uMaxProgress); void Progress(); void Release(); diff -r e65d75206263 -r 91e1ba340f39 GUIWindow.cpp --- a/GUIWindow.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/GUIWindow.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -465,9 +465,7 @@ unsigned int v19; // edi@43 unsigned int v20; // edi@45 void *v21; // esi@45 - char *v22; // [sp+10h] [bp-5Ch]@9 signed int v23; // [sp+10h] [bp-5Ch]@38 - int v24; // [sp+14h] [bp-58h]@9 char *v25; // [sp+14h] [bp-58h]@21 GUIWindow v26; // [sp+18h] [bp-54h]@8 @@ -720,12 +718,9 @@ if ( dword_506528 < 29 ) { v3 = (__int64 *)&pParty->field_3C.field_4F0[2 * dword_506528]; - v24 = dword_506528 + 1; - //v22 = (char *)&pStorylineText->StoreLine[dword_506528].pPageTitle;//guess //field_4[3 * dword_506528 + 2]; - v22 = (char *)&pStorylineText->StoreLine[dword_506528+1].pText; - do + for(int i=dword_506528+1;iStoreLine[i].pText; if ( *v3 ) { if ( v4 ) @@ -736,7 +731,7 @@ v8 = v7 + 1; if ( (signed int)v7 + 1 > 0 ) { - memset32((char *)&pStru179 + 4 * dword_506520 , v24, v8); + memset32((char *)&pStru179 + 4 * dword_506520 , i, v8); do { LODWORD(v7) = dword_506520++; @@ -747,13 +742,9 @@ } } } - v22 += 12; + ++i; ++v3; - ++v24; - //__debugbreak(); // fix condition } - //while ( (signed int)v22 < (signed int)&pFactionTable->relations + 8 ); - while ( (signed int)v22 <= (signed int)&pStorylineText->StoreLine[30].uTime ); } } } @@ -1025,9 +1016,8 @@ } // 50640C: using guessed type int dword_50640C[]; - //----- (004B3157) -------------------------------------------------------- -void GUIWindow::_4B3157() +void GUIWindow::HouseDialogManager() { unsigned __int16 v1; // di@2 const char *v2; // edx@4 @@ -1040,11 +1030,11 @@ int v9; // eax@50 unsigned int v10; // [sp-10h] [bp-C8h]@53 unsigned __int16 v11; // [sp-Ch] [bp-C4h]@53 - unsigned int v12; // [sp-Ch] [bp-C4h]@60 + //unsigned int v12; // [sp-Ch] [bp-C4h]@60 char *v13; // [sp-8h] [bp-C0h]@50 - unsigned int v14; // [sp-8h] [bp-C0h]@60 + //unsigned int v14; // [sp-8h] [bp-C0h]@60 unsigned int v15; // [sp-4h] [bp-BCh]@50 - Texture *v16; // [sp-4h] [bp-BCh]@60 + //Texture *v16; // [sp-4h] [bp-BCh]@60 GUIWindow w; // [sp+Ch] [bp-ACh]@4 GUIWindow v18; // [sp+60h] [bp-58h]@2 int v19; // [sp+B4h] [bp-4h]@2 @@ -1057,8 +1047,8 @@ v1 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xFFu, 0xFFu, 0xFFu); v19 = 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)); - if ( array_5913D8[6] != (NPCData *)uNumDialogueNPCPortraits || !uHouse_ExitPic ) + pRenderer->DrawTextureTransparent(0x1D4u, 0, &pIcons_LOD->pTextures[uTextureID_507B04]); + if ( pDialogueNPCCount != uNumDialogueNPCPortraits || !uHouse_ExitPic ) { w.uFrameWidth = 130; w.uFrameHeight = 2 * LOBYTE(pFontCreate->uFontHeight); @@ -1078,11 +1068,10 @@ } v18.uFrameWidth += 8; v18.uFrameZ += 8; - if ( !array_5913D8[6] ) + if ( !pDialogueNPCCount ) { if ( dword_F8B198 == 31 ) { -LABEL_36: sub_4B4F4F(); goto LABEL_58; } @@ -1092,8 +1081,7 @@ w.uFrameZ = 457; v5 = pFontArrus->CalcTextHeight(ptr_F8B1E8, &w, 13, 0); v6 = v5 + 7; - pRenderer->_4A6A68(8, 352 - (v5 + 7), (Texture *)(uTextureID_Leather != -1 ? &pIcons_LOD->pTextures[uTextureID_Leather] : 0), - (uTextureID_Leather != -1 ? pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight : 26) - (v5 + 7)); + pRenderer->_4A6A68(8, 352 - (v5 + 7), &pIcons_LOD->pTextures[uTextureID_Leather], pIcons_LOD->pTextures[uTextureID_Leather].uTextureHeight - (v5 + 7)); pRenderer->DrawTextureIndexed(8u, 347 - v6, pTexture_591428); v7 = FitTextInAWindow(ptr_F8B1E8, pFontArrus, &w, 0xDu, 0); window_SpeakInHouse->DrawText(pFontArrus, 13, 354 - v6, 0, v7, 0, 0, 0); @@ -1103,11 +1091,14 @@ goto LABEL_58; while ( 1 ) { - pRenderer->DrawTextureIndexed(*(&pNPCPortraits_x + v8 + 6 * uNumDialogueNPCPortraits - 6) - 4, - *(&pNPCPortraits_y + v8 + 6 * uNumDialogueNPCPortraits - 6) - 4, - (Texture *)(uTextureID_50795C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50795C] : 0)); - pRenderer->DrawTextureIndexed(*(&pNPCPortraits_x + v8 + 6 * uNumDialogueNPCPortraits - 6), - *(&pNPCPortraits_y + v8 + 6 * uNumDialogueNPCPortraits - 6), pDialogueNPCPortraits[v8]); + //pRenderer->DrawTextureIndexed(*(&pNPCPortraits_x + v8 + 6 * uNumDialogueNPCPortraits - 6) - 4, + // *(&pNPCPortraits_y + v8 + 6 * uNumDialogueNPCPortraits - 6) - 4, + pRenderer->DrawTextureIndexed(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][v8] - 4, + pNPCPortraits_y[uNumDialogueNPCPortraits - 1][v8] - 4, &pIcons_LOD->pTextures[uTextureID_50795C]); // frame around portrait + //pRenderer->DrawTextureIndexed(*(&pNPCPortraits_x + v8 + 6 * uNumDialogueNPCPortraits - 6), + // *(&pNPCPortraits_y + v8 + 6 * uNumDialogueNPCPortraits - 6), pDialogueNPCPortraits[v8]); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][v8], + pNPCPortraits_y[uNumDialogueNPCPortraits - 1][v8], pDialogueNPCPortraits[v8]); if ( uNumDialogueNPCPortraits < 4 ) break; LABEL_57: @@ -1128,24 +1119,21 @@ v15 = 3; //v13 = (char *)p2DEvents_minus1__10[13 * (unsigned int)ptr_507BC0->ptr_1C]; v13 = (char *)p2DEvents[(unsigned int)window_SpeakInHouse->ptr_1C - 1].pProprieterTitle; - v11 = v19; - v10 = 113; -LABEL_56: - v18.DrawTitleText(pFontCreate, 0x1E3u, v10, v11, v13, v15); + v18.DrawTitleText(pFontCreate, 0x1E3u, 113, v19, v13, 3); goto LABEL_57; } v15 = 3; - v13 = array_5913D8[v8 - (dword_591080 != 0)]->pName; - v9 = dword_4E5EC8[v8 + 6 * uNumDialogueNPCPortraits] + pDialogueNPCPortraits[v8]->uTextureHeight + 2; + v13 = HouseNPCData[v8 - (dword_591080 != 0)]->pName; + v9 = pNPCPortraits_x[6 + (uNumDialogueNPCPortraits - 1)][v8] + pDialogueNPCPortraits[v8]->uTextureHeight + 2; } v11 = v19; v10 = v9; - goto LABEL_56; + v18.DrawTitleText(pFontCreate, 0x1E3u, v10, v11, v13, v15); + goto LABEL_57; } - v4 = (char *)array_5913D8[6] - 1; - pRenderer->DrawTextureIndexed(pNPCPortraits_x - 4, pNPCPortraits_y - 4, - (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0)); - pRenderer->DrawTextureIndexed(pNPCPortraits_x, pNPCPortraits_y, pDialogueNPCPortraits[(signed int)v4]); + v4 = (char *)pDialogueNPCCount - 1; + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0] - 4, pNPCPortraits_y[0][0] - 4, &pIcons_LOD->pTextures[uTextureID_50795C]); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pDialogueNPCPortraits[(signed int)v4]); if ( pCurrentScreen == SCREEN_E ) { CharacterUI_InventoryTab_Draw(uActiveCharacter, 1); @@ -1153,7 +1141,7 @@ } if ( v4 || !dword_591080 ) { - sub_4B2A74(); + SimpleHouseAndBoatsDialog(); } else { @@ -1171,23 +1159,23 @@ sub_4B6478(); break; case 1: - _4B910F_shop_interaction(); + WeaponShopDialog(); break; case 2: - sub_4BA928(); + ArmorShopDialog(); break; case 3: - ui_shop_teachers(); + MagicShopDialog(); break; case 4: - sub_4B9CC6(); + AlchemistDialog(); break; default: if ( dword_F8B198 > 4 ) { if ( dword_F8B198 <= 16 ) { - sub_4B5D7C(); + GuildDialog(); } else { @@ -1202,13 +1190,13 @@ switch ( dword_F8B198 ) { case 21: - sub_4B8285_prolly_draw_arcomage_result(); + TavernDialog(); break; case 22: _4B7D7E_bank(); break; case 23: - sub_4B705E(); + TampleDialog(); break; default: if ( dword_F8B198 <= 26 ) @@ -1223,28 +1211,24 @@ { if ( dword_F8B198 != 31 ) break; - goto LABEL_36; + sub_4B4F4F(); + goto LABEL_58; } - ui_training(); + TrainingDialog(); } break; } } LABEL_58: - if ( array_5913D8[6] == (NPCData *)uNumDialogueNPCPortraits && uHouse_ExitPic ) + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) { - pRenderer->DrawTextureIndexed(0x22Cu, 0x1C3u, (Texture *)(uTextureID_x_x_u != -1 ? &pIcons_LOD->pTextures[uTextureID_x_x_u] : 0)); - v16 = (Texture *)(uTextureID_x_ok_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_ok_u] : 0); - v14 = 451; - v12 = 476; + pRenderer->DrawTextureIndexed(556, 451, &pIcons_LOD->pTextures[uTextureID_x_x_u]); + pRenderer->DrawTextureIndexed(476, 451, &pIcons_LOD->pTextures[uTextureID_x_ok_u]); } else { - v16 = (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0); - v14 = 445; - v12 = 471; + pRenderer->DrawTextureIndexed(471, 445, &pIcons_LOD->pTextures[uTextureID_506438]); } - pRenderer->DrawTextureIndexed(v12, v14, v16); } @@ -1776,26 +1760,20 @@ //GUIWindow *pWindow; // esi@4 int v10; // eax@4 unsigned int v11; // ebx@15 - NPCData *v12; // ebp@15 - void *v13; // ecx@18 - bool v14; // eax@20 - void *v15; // ecx@23 - bool v16; // eax@25 - void *v17; // ecx@28 - bool v18; // eax@30 - void *v19; // ecx@33 - bool v20; // eax@35 - void *v21; // ecx@38 - bool v22; // eax@40 - void *v23; // ecx@43 - bool v24; // eax@45 + NPCData *speakingNPC; // ebp@15 + int v14; // eax@20 + int v16; // eax@25 + int v18; // eax@30 + int v20; // eax@35 + int v22; // eax@40 + int v24; // eax@45 int v25; // eax@65 unsigned int v26; // ebx@65 char *v27; // eax@71 const char *v29; // [sp-8h] [bp-18h]@68 char *v30; // [sp-4h] [bp-14h]@68 int uWidtha; // [sp+14h] [bp+4h]@66 - int a4a; // [sp+20h] [bp+10h]@15 + int num_menu_buttons; // [sp+20h] [bp+10h]@15 for (uNextFreeWindowID = 0; uNextFreeWindowID < 20; ++uNextFreeWindowID) { @@ -1835,95 +1813,89 @@ (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); if ( pWindow->ptr_1C != (void *)1 ) { - a4a = 0; + num_menu_buttons = 0; v11 = LOBYTE(pFontArrus->uFontHeight) - 3; - v12 = GetNPCData(uDialogue_SpeakingActorNPC_ID); + speakingNPC = GetNPCData(uDialogue_SpeakingActorNPC_ID); if ( sub_445C8B(uDialogue_SpeakingActorNPC_ID) == 1 ) { - if ( v12->joins ) + if ( speakingNPC->joins ) { pWindow->CreateButton(480, 130, 140, v11, 1, 0, 0x88u, 0xDu, 0, "", 0); - a4a = 1; + num_menu_buttons = 1; } - v13 = (void *)v12->evt_A; - if ( v13 ) + if ( speakingNPC->evt_A ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v14 = sub_4466C4(v13); + v14 = NPC_EventProcessor(speakingNPC->evt_A); if ( v14 == 1 || v14 == 2 ) - pWindow->CreateButton(0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x13u, 0, "", 0); + pWindow->CreateButton(0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x13u, 0, "", 0); } } - v15 = (void *)v12->evt_B; - if ( v15 ) + if ( speakingNPC->evt_B ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v16 = sub_4466C4(v15); + v16 = NPC_EventProcessor(speakingNPC->evt_B); if ( v16 == 1 || v16 == 2 ) - pWindow->CreateButton(0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x14u, 0, "", 0); + pWindow->CreateButton(0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x14u, 0, "", 0); } } - v17 = (void *)v12->evt_C; - if ( v17 ) + if ( speakingNPC->evt_C ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v18 = sub_4466C4(v17); + v18 = NPC_EventProcessor(speakingNPC->evt_C); if ( v18 == 1 || v18 == 2 ) - pWindow->CreateButton( 0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x15u, 0, "", 0); + pWindow->CreateButton( 0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x15u, 0, "", 0); } } - v19 = (void *)v12->evt_D; - if ( v19 ) + if ( speakingNPC->evt_D ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v20 = sub_4466C4(v19); + v20 = NPC_EventProcessor(speakingNPC->evt_D); if ( v20 == 1 || v20 == 2 ) - pWindow->CreateButton(0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x16u, 0, "", 0); + pWindow->CreateButton(0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x16u, 0, "", 0); } } - v21 = (void *)v12->evt_E; - if ( v21 ) + if ( speakingNPC->evt_E ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v22 = sub_4466C4(v21); + v22 = NPC_EventProcessor(speakingNPC->evt_E); if ( v22 == 1 || v22 == 2 ) - pWindow->CreateButton(0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x17u, 0, "", 0); + pWindow->CreateButton(0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x17u, 0, "", 0); } } - v23 = (void *)v12->evt_F; - if ( v23 ) + if (speakingNPC->evt_F ) { - if ( a4a < 4 ) + if ( num_menu_buttons < 4 ) { - v24 = sub_4466C4(v23); + v24 = NPC_EventProcessor(speakingNPC->evt_F); if ( v24 == 1 || v24 == 2 ) - pWindow->CreateButton(0x1E0u, a4a++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x18u, 0, "", 0); + pWindow->CreateButton(0x1E0u, num_menu_buttons++ * v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x18u, 0, "", 0); } } } else { - if ( v12->joins ) + if ( speakingNPC->joins ) { pWindow->CreateButton(0x1E0u, 0x82u, 0x8Cu, v11, 1, 0, 0x88u, 0x4Du, 0, pGlobalTXT_LocalizationStrings[407], 0);// - if (v12->Hired()) + if (speakingNPC->Hired()) { - sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[408], v12->pName); // + sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[408], speakingNPC->pName); // pWindow->CreateButton(0x1E0u, v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x4Cu, 0, pTmpBuf, 0); } else { pWindow->CreateButton(0x1E0u, v11 + 130, 0x8Cu, v11, 1, 0, 0x88u, 0x4Cu, 0, pGlobalTXT_LocalizationStrings[406], 0);// } - a4a = 2; + num_menu_buttons = 2; } } - pWindow->_41D08F(a4a, 1, 0, 1); + pWindow->_41D08F(num_menu_buttons, 1, 0, 1); } break; case WINDOW_ChangeLocation: @@ -1933,7 +1905,7 @@ (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); pBtn_YES = pWindow->CreateButton(0x1E6u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x5Au, 0, 0x59u, pWindow->Hint, (Texture *)(uTextureID_BUTTYES2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTYES2] : 0), 0); - pWindow->CreateButton(pNPCPortraits_x, pNPCPortraits_y, 0x3Fu, 0x49u, 1, 0, 0x5Au, 1u, 0x20u, pWindow->Hint, 0, 0, 0); + pWindow->CreateButton(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], 0x3Fu, 0x49u, 1, 0, 0x5Au, 1u, 0x20u, pWindow->Hint, 0, 0, 0); pWindow->CreateButton(8u, 8u, 0x1CCu, 0x158u, 1, 0, 0x5Au, 1u, 0, pWindow->Hint, 0); break; case WINDOW_SpellBook: // @@ -1971,21 +1943,21 @@ if ( v26 + 1 == v25 && uHouse_ExitPic ) { v30 = pMapStats->pInfos[uHouse_ExitPic].pName; - v29 = (char*)pGlobalTXT_LocalizationStrings[411];// ^Pv[%s] + v29 = (char*)pGlobalTXT_LocalizationStrings[LOCSTR_ENTER_S];// ^Pv[%s] } else { if ( v26 || !dword_591080 ) - v27 = array_5913D8[v26 - (dword_591080 != 0)]->pName; + v27 = HouseNPCData[v26 - (dword_591080 != 0)]->pName; else //v27 = (char *)p2DEvents_minus1_::08[13 * a4]; v27 = (char *)p2DEvents[pButton - 1].pProprieterName; v30 = v27; - v29 = (char*)pGlobalTXT_LocalizationStrings[435];// ^Pt[%s] + v29 = (char*)pGlobalTXT_LocalizationStrings[435];// "Converse with %s" ^Pt[%s] } sprintf(&byte_591180[100 * v26], v29, v30); - array_5913D8[v26 + 7] = (NPCData *)pWindow->CreateButton(*(&pNPCPortraits_x + v26 + 6 * uNumDialogueNPCPortraits - 6), - *(&pNPCPortraits_y + v26 + 6 * uNumDialogueNPCPortraits - 6), + HouseNPCData[v26 + 7] = (NPCData *)pWindow->CreateButton(pNPCPortraits_x[uNumDialogueNPCPortraits - 1][v26], + pNPCPortraits_y[uNumDialogueNPCPortraits - 1][v26], 0x3Fu, 0x49u, 1, 0, 0x19Au, v26, 0, &byte_591180[100 * v26], 0, 0, 0); ++v26; v25 = uNumDialogueNPCPortraits; @@ -2008,7 +1980,7 @@ (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), 0); pBtn_YES = pWindow->CreateButton(0x1E6u, 0x1BDu, 0x4Bu, 0x21u, 1, 0, 0x19Bu, 0, 0x59u, pWindow->Hint, (Texture *)(uTextureID_BUTTYES2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTYES2] : 0), 0); - pWindow->CreateButton(pNPCPortraits_x, pNPCPortraits_y, 0x3Fu, 0x49u, 1, 0, 0x19Bu, 1, 0x20u, pWindow->Hint, 0); + pWindow->CreateButton(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], 0x3Fu, 0x49u, 1, 0, 0x19Bu, 1, 0x20u, pWindow->Hint, 0); pWindow->CreateButton(8u, 8u, 0x1CCu, 0x158u, 1, 0, 0x19Bu, 1u, 0, pWindow->Hint, 0); return pWindow; } diff -r e65d75206263 -r 91e1ba340f39 GUIWindow.h --- a/GUIWindow.h Mon Feb 25 09:08:13 2013 +0600 +++ b/GUIWindow.h Mon Feb 25 09:09:08 2013 +0600 @@ -115,7 +115,7 @@ char *DrawTitleText(GUIFont *a2, unsigned int uHorizontalMargin, unsigned int uVerticalMargin, unsigned __int16 uDefaultColor, const char *pInString, unsigned int uLineSpacing); char *_4B1854(__int64 a2); - void _4B3157(); + void HouseDialogManager(); void OpenSpellBook(); void InitializeBookView(); void DrawMessageBox(int arg0); @@ -190,13 +190,13 @@ UIMSG_PlayerCreationRemoveUpSkill = 0x4A, UIMSG_PlayerCreationRemoveDownSkill = 0x4B, UIMSG_4E = 0x4E, - UIMSG_4F = 0x4F, + UIMSG_SPellbook_ShowHightlightedSpellInfo = 0x4F, UIMSG_51 = 0x51, UIMSG_LoadGame = 0x52, UIMSG_SaveGame = 0x53, UIMSG_54 = 0x54, UIMSG_55 = 0x55, - UIMSG_56 = 0x56, + UIMSG_SelectSpell = 0x56, UIMSG_57 = 0x57, UIMSG_58 = 0x58, UIMSG_5A = 0x5A, @@ -240,7 +240,7 @@ UIMSG_SelectDialogueOption = 0x88, UIMSG_8C = 0x8C, UIMSG_8D = 0x8D, - UIMSG_8E = 0x8E, + UIMSG_CastSpellFromBook = 0x8E, UIMSG_8F = 0x8F, UIMSG_PlayerCreation_VoicePrev = 0x90, UIMSG_PlayerCreation_VoiceNext = 0x91, @@ -309,7 +309,7 @@ UIMSG_195 = 0x195, UIMSG_OpenRestUI = 0x199, UIMSG_19A = 0x19A, - UIMSG_19B = 0x19B, + UIMSG_TransitionUI_Confirm = 0x19B, UIMSG_19C = 0x19C, UIMSG_OpenKeyMappingOptions = 0x19F, UIMSG_SelectKeyPage1 = 0x1A0, @@ -373,7 +373,7 @@ - +#define AddMessage(msg, param, a4) AddMessageImpl((msg), (param), (a4), __FILE__, __LINE__) /* 250 */ #pragma pack(push, 1) struct GUIMessageQueue @@ -383,10 +383,13 @@ {} void PopMessage(UIMessageType *pMsg, int *pParam, int *a4); - void SendMessage(UIMessageType msg, int param, unsigned int a4); + void AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file = nullptr, int line = 0); unsigned int uNumMessages; GUIMessage pMessages[40]; + + const char *files[40]; + int lines[40]; }; #pragma pack(pop) diff -r e65d75206263 -r 91e1ba340f39 Game.cpp --- a/Game.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Game.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -170,7 +170,7 @@ GUI_UpdateWindows(); pParty->UpdatePlayersAndHirelingsEmotions(); ++stru_51076C.field_8; - dword_5B5924 = 0; + _unused_5B5924_is_travel_ui_drawn = false; if (v4) pMouse->field_14 = 1; pMouse->_469EA4(); @@ -328,7 +328,7 @@ v16 = 0; viewparams->bRedrawGameUI = true; } - //pAudioPlayer->_4AAFCF();//Ritor1: it's temporarily, game crash. decorations sounds + pAudioPlayer->UpdateSounds(); if (uGameState == 1) //goto LABEL_96; { @@ -417,16 +417,18 @@ pTurnEngine->End(1); pParty->bTurnBasedModeOn = 0; } - pHealth = &pParty->pPlayers[0].sHealth;//193C - do + //pHealth = &pParty->pPlayers[0].sHealth;//193C + //do + for(int i=0; i<4; ++i) { - memset(pHealth - 0x64F, 0, 0xA0u);//(pConditions, 0, 160) - memset(pHealth - 0x67, 0, 0x180u);//(pPlayerBuffs[0], 0, 384) - *pHealth = 1; - pHealth += 1743; //6CF + memset(pParty->pPlayers[i].pConditions, 0, 0xA0u);//(pConditions, 0, 160) + memset(pParty->pPlayers[i].pPlayerBuffs, 0, 0x180u);//(pPlayerBuffs[0], 0, 384) + //*pHealth = 1; + pParty->pPlayers[i].sHealth=1; + //pHealth += 1743; //6CF uActiveCharacter = 1; } - while ( (signed int)pHealth < (signed int)&pParty->field_871C[567] ); + // while ( (signed int)pHealth < (signed int)&pParty->field_871C[567] ); if ( (unsigned __int16)_449B57_test_bit(pParty->_award_bits, 136) ) { pParty->vPosition.x = -17331; // respawn in harmondale diff -r e65d75206263 -r 91e1ba340f39 GameUIs.cpp --- a/GameUIs.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/GameUIs.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -35,7 +35,6 @@ uDialogueType_ = uDialogueType; dword_6BE138 = -1; ++pIcons_LOD->uTexturePacksCount; - v16 = 0; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; memset(pSavegameUsedSlots, 0, sizeof(pSavegameUsedSlots)); @@ -82,12 +81,8 @@ //v3 = 0; for (uint i = 0; i < uNumSavegameFiles; ++i) { - //Dest = pSavegameHeader; - //pTex = pSavegameThumbnails; - //Str1 = (const char *)pSavegameList->pSavesNames; - //while ( 1 ) - //{ - sprintf(pTmpBuf, "saves\\%s", pSavegameList->pSavesNames[i]); + + sprintf(pTmpBuf, "saves\\%s", pSavegameList->pFileList[i].pSaveFileName); if (_access(pTmpBuf, 6)) { pSavegameUsedSlots[i] = 0; @@ -98,13 +93,13 @@ v4 = pLODFile.FindContainer("header.bin", true); if ( v4 ) fread(&pSavegameHeader[i], 0x64, 1, v4); - if ( !_strcmpi(pSavegameList->pSavesNames[i], pGlobalTXT_LocalizationStrings[613]) )// "AutoSave.MM7" + if ( !_strcmpi(pSavegameList->pFileList[i].pSaveFileName, pGlobalTXT_LocalizationStrings[613]) )// "AutoSave.MM7" strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[16]);// "Autosave" v5 = pLODFile.FindContainer("image.pcx", true); if ( !v5 ) { pSavegameUsedSlots[i] = 0; - strcpy(pSavegameList->pSavesNames[i], ""); + strcpy(pSavegameList->pFileList[i].pSaveFileName, ""); } else { @@ -112,33 +107,20 @@ pLODFile.CloseWriteFile(); pSavegameUsedSlots[i] = 1; } -//LABEL_23: - //Str1 += 280; - //++pTex; - //++Dest; - //++v3; - //if ( v3 >= (signed int)uNumSavegameFiles ) - // goto LABEL_24; - //} - //goto LABEL_22; } //LABEL_24: pLODFile.FreeSubIndexAndIO(); if ( pCurrentScreen == SCREEN_SAVEGAME ) { - v6 = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); - v10 = (TEXTURE_TYPE)2; - v8 = "LS_saveD"; + uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); + uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD",TEXTURE_16BIT_PALETTE); } else { - v6 = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); - v10 = (TEXTURE_TYPE)2; - v8 = "LS_loadD"; + uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); + uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_loadD",TEXTURE_16BIT_PALETTE); } - uTextureID_x_d = v6; - uTextureID_LS_ = pIcons_LOD->LoadTexture(v8, v10); uTextureID_AR_UP_DN = pIcons_LOD->LoadTexture("AR_UP_DN", TEXTURE_16BIT_PALETTE); uTextureID_AR_DN_DN = pIcons_LOD->LoadTexture("AR_DN_DN", TEXTURE_16BIT_PALETTE); pGUIWindow_CurrentMenu->CreateButton(21, 198, 191, 18, 1, 0, 0xA5, 0, 0, "", 0); @@ -156,29 +138,20 @@ (Texture *)(uTextureID_AR_UP_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_UP_DN] : 0), 0); pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton(215, 0x143, 0x11, 0x11, 1, 0, 0xA3, uNumSavegameFiles, 0, "", (Texture *)(uTextureID_AR_DN_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_DN_DN] : 0), 0); - v16 = -1; - //ptr_69BD58 = v7; + } //----- (0045E93E) -------------------------------------------------------- -void __cdecl GameUI_DrawSaveMenu() +void GameUI_DrawSaveMenu() { unsigned int v0; // ebp@4 unsigned int v1; // eax@4 - unsigned int *v2; // ebp@6 char *v3; // eax@7 FILE *v4; // eax@11 FILE *v5; // eax@11 - const char *v6; // ST64_4@14 - GUIButton *v7; // eax@16 - char *v8; // [sp+10h] [bp-254h]@6 - SavegameHeader *Dest; // [sp+14h] [bp-250h]@6 - RGBTexture *this_; // [sp+18h] [bp-24Ch]@6 LODWriteableFile v11; // [sp+1Ch] [bp-248h]@1 - int v12; // [sp+260h] [bp-4h]@1 ++pIcons_LOD->uTexturePacksCount; - v12 = 0; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; memset(pSavegameUsedSlots, 0, 0xB4u); @@ -189,9 +162,7 @@ uTextureID_LS_loadU = pIcons_LOD->LoadTexture("LS_loadU", TEXTURE_16BIT_PALETTE); uTextureID_LS_saveU = pIcons_LOD->LoadTexture("LS_saveU", TEXTURE_16BIT_PALETTE); uTextureID_x_u = pIcons_LOD->LoadTexture("x_u", TEXTURE_16BIT_PALETTE); - pRenderer->DrawTextureIndexed( - 8u, - 8u, + pRenderer->DrawTextureIndexed( 8u, 8u, (Texture *)(uTextureID_loadsave != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_loadsave] : 0)); if ( pCurrentScreen == SCREEN_SAVEGAME ) { @@ -204,54 +175,48 @@ v1 = uTextureID_LS_loadU; } pRenderer->DrawTextureIndexed(0xF1u, 0x12Eu, (Texture *)(v1 != -1 ? (int)&pIcons_LOD->pTextures[v1] : 0)); - pRenderer->DrawTextureIndexed( - 0x15Fu, - 0x12Eu, + pRenderer->DrawTextureIndexed(0x15Fu, 0x12Eu, (Texture *)(uTextureID_x_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_u] : 0)); pRenderer->DrawTextureIndexed(0x12u, 0x8Du, (Texture *)(v0 != -1 ? (int)&pIcons_LOD->pTextures[v0] : 0)); pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, 25, 199, 0, pGlobalTXT_LocalizationStrings[505], 0, 0, 0); pRenderer->Present(); pSavegameList->Initialize(1u); v11.AllocSubIndicesAndIO(0x12Cu, 0); - v2 = pSavegameUsedSlots; - Dest = pSavegameHeader; - this_ = pSavegameThumbnails; - v8 = (char *)pSavegameList->pSavesNames; - do - { - v3 = v8; - if ( !*v8 ) + //v2 = pSavegameUsedSlots; + // Dest = pSavegameHeader; + // this_ = pSavegameThumbnails; + // v8 = (char *)pSavegameList->pSavesNames; + for (uint i = 0; i < 40; ++i) + { + v3 = pSavegameList->pFileList[i].pSaveFileName; + if ( !pSavegameList->pFileList[i].pSaveFileName ) v3 = "1.mm7"; sprintf(pTmpBuf, "saves\\%s", v3); if ( _access(pTmpBuf, 0) || _access(pTmpBuf, 6) ) { - v6 = pGlobalTXT_LocalizationStrings[72]; - *v2 = 0; - strcpy(Dest->pName, v6); + pSavegameUsedSlots[i] = 0; + strcpy(pSavegameHeader[i].pName, pGlobalTXT_LocalizationStrings[LOCSTR_EMPTY]); } else { v11.LoadFile(pTmpBuf, 1); v4 = v11.FindContainer("header.bin", 1); - fread(Dest, 0x64u, 1u, v4); + fread(&pSavegameHeader[i], 100, 1u, v4); v5 = v11.FindContainer("image.pcx", 1); if ( v5 ) { - this_->LoadFromFILE(v5, 0, 1u); + pSavegameThumbnails[i].LoadFromFILE(v5, 0, 1u); v11.CloseWriteFile(); - *v2 = 1; + pSavegameUsedSlots[i] = 1; } else { - *v2 = 0; + pSavegameUsedSlots[i] = 0; } } - v8 += 280; - ++this_; - ++Dest; - ++v2; + } - while ( (signed int)v8 < (signed int)&_69FBB4_ptr_iterator_end ); + v11.FreeSubIndexAndIO(); uTextureID_x_d = pIcons_LOD->LoadTexture("x_d", TEXTURE_16BIT_PALETTE); uTextureID_LS_ = pIcons_LOD->LoadTexture("LS_saveD", TEXTURE_16BIT_PALETTE); @@ -273,5 +238,4 @@ (Texture *)(uTextureID_AR_UP_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_UP_DN] : 0), 0); pBtnDownArrow = pGUIWindow_CurrentMenu->CreateButton( 0xD7u, 0x143u, 0x11u, 0x11u, 1, 0, 0xA3u, 0x22u, 0, "", (Texture *)(uTextureID_AR_DN_DN != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_AR_DN_DN] : 0), 0); - v12 = -1; } \ No newline at end of file diff -r e65d75206263 -r 91e1ba340f39 Indoor.cpp --- a/Indoor.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Indoor.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1794,15 +1794,10 @@ const char *v1; // edi@1 signed int v2; // esi@1 - v1 = Str1; - v2 = 0; - while ( _strcmpi(v1, _4E6BDC_loc_names[v2]) ) - { - ++v2; - if ( v2 >= 11 ) - return 0; - } - return v2 + 1; + for (uint i = 0; i < 11; ++i) + if (!strcmpi(Str1, _4E6BDC_loc_names[i])) + return i + 1; + return 0; } @@ -2890,7 +2885,7 @@ { memcpy(v203, pData, 0x36B); LABEL_132: - free(File); + free(pRawDLV); dlv.uLastRepawnDay = a3; if (_v244) ++dlv.uNumRespawns; @@ -2901,7 +2896,7 @@ auto v155 = header.uCompressedSize; auto Count = header.uDecompressedSize; auto Src = (BLVFace *)malloc(header.uDecompressedSize); - File = (FILE *)Src; + pRawDLV = Src; if ( v155 <= Count ) { if ( v155 == Count ) @@ -3458,32 +3453,27 @@ } //----- (0044C23B) -------------------------------------------------------- -int BLVFaceExtra::HasEventint() -{ - signed int v1; // eax@1 - EventIndex *v2; // esi@2 - signed int result; // eax@5 - signed int v4; // eax@6 - - v1 = 0; - if ( (signed int)(uLevelEVT_NumEvents - 1) <= 0 ) - goto LABEL_5; - v2 = pLevelEVT_Index; - while ( v2->uEventID != this->uEventID ) +bool BLVFaceExtra::HasEventint() + { + signed int event_index; // eax@1 + _evt_raw* start_evt; + _evt_raw* end_evt; + + event_index = 0; + if ( (uLevelEVT_NumEvents - 1) <= 0 ) + return false; + while ( pLevelEVT_Index[event_index].uEventID != this->uEventID ) { - ++v1; - ++v2; - if ( v1 >= (signed int)(uLevelEVT_NumEvents - 1) ) - goto LABEL_5; + ++event_index; + if ( event_index >= (signed int)(uLevelEVT_NumEvents - 1) ) + return false; } - v4 = v1; - if ( pLevelEVT[pLevelEVT_Index[v4 + 1].uEventOffsetInEVT + 4] != 1 - || pLevelEVT[pLevelEVT_Index[v4].uEventOffsetInEVT + 4] != 4 ) -LABEL_5: - result = 0; + end_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index+1].uEventOffsetInEVT]; + start_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT]; + if ( (end_evt->_e_type != EVENT_Exit) || (start_evt->_e_type!= EVENT_MouseOver) ) + return false; else - result = 1; - return result; + return true; } @@ -4148,7 +4138,7 @@ { do { - v54 = ai_array_4F7DB0_actor_ids[v25]; + v54 = ai_near_actors_ids[v25]; if ( v54 != v63 ) { v26 = v54; @@ -4345,7 +4335,7 @@ goto LABEL_119; } } - Actor::_403F58(v63, 4, v22, &v53); + Actor::AI_StandOrBored(v63, 4, v22, &v53); goto LABEL_119; } if ( v0->vPosition.x & 1 ) @@ -4359,7 +4349,7 @@ goto LABEL_123; if ( !v0->pMonsterInfo.uHostilityType || v56 != v22 ) { - Actor::_403F58(v63, 4, v22, &v52); + Actor::AI_StandOrBored(v63, 4, v22, &v52); goto LABEL_123; } } @@ -4616,7 +4606,7 @@ if ( !(pDecortaion->field_2 & 0x20) ) { v17 = &pDecorationList->pDecorations[pDecortaion->uDecorationDescID]; - if ( !((unsigned __int8)2 & v17->uFlags) ) + if (!v17->DontDraw()) { v18 = v17->uLightRadius; if ( v18 ) @@ -4670,8 +4660,8 @@ if (uItemID) { if (uItemID != 220 && pItemsTable->pItems[uItemID].uEquipType == EQUIP_POTION && - !p->stru_24._bonus_type) - p->stru_24._bonus_type = rand() % 15 + 5; + !p->stru_24.uEncantmentType) + p->stru_24.uEncantmentType = rand() % 15 + 5; pItemsTable->SetSpecialBonus(&p->stru_24); } } diff -r e65d75206263 -r 91e1ba340f39 Indoor.h --- a/Indoor.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Indoor.h Mon Feb 25 09:09:08 2013 +0600 @@ -316,7 +316,7 @@ #pragma pack(push, 1) struct BLVFaceExtra { - int HasEventint(); +bool HasEventint(); __int16 field_0; __int16 field_2; diff -r e65d75206263 -r 91e1ba340f39 Items.cpp --- a/Items.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Items.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -26,170 +26,111 @@ //----- (00439DF3) -------------------------------------------------------- -int ItemGen::_439DF3_get_additional_damage(int *a2, int *a3) -{ - int *v3; // edi@1 - ItemGen *v4; // ebx@1 - signed int v5; // esi@1 - unsigned int v7; // ecx@5 - signed int v8; // ebx@7 - int v9; // edx@22 - int v10; // eax@24 - int v11; // edx@25 - int v12; // ebx@28 - int v13; // ebx@29 - int v14; // ebx@30 - int v15; // ebx@31 - int v16; // ebx@32 - signed int v17; // [sp-4h] [bp-10h]@24 +int ItemGen::_439DF3_get_additional_damage(int *damage_type, bool *draintargetHP) + { + *damage_type = 0; + if ( !uItemID ) + return 0; + UpdateTempBonus(pParty->uTimePlayed); + if (uItemID == 501 ) //Iron Feather -sword + { + *damage_type = 1; + return rand() % 10 + 6; + } + if (uItemID == 507 ) //Ghoulsbane -axe + { + *damage_type = 0; + return rand() % 16 + 3; + } + if ( uItemID == 510 ) //Ullyses -bow + { + *damage_type = 2; + return rand() % 4 + 9; + } + if ( uItemID == 517 ) //Old Nick -dagger + { + *damage_type = 8; + return 8; + } - auto a1 = this; - v3 = a2; - v4 = a1; - v5 = 0; - *a2 = 0; - if ( !a1->uItemID ) - return 0; - UpdateTempBonus(pParty->uTimePlayed); - if ( v4->uItemID == 501 ) - { - *v3 = 1; - v10 = rand(); - v17 = 10; - return v10 % v17 + 6; - } - if ( v4->uItemID == 507 ) - { - *v3 = 0; - v11 = rand() % 16; - return v11 + 3; - } - v7 = 3; - if ( v4->uItemID == 510 ) - { - *v3 = 2; - v9 = rand() % 4; - return v9 + 9; - } - if ( v4->uItemID == 517 ) - { - v5 = 8; - *v3 = v5; - return v5; - } - v8 = v4->uAdditionalValue; - if ( v8 > 46 ) - { - v5 = 0; - *v3 = v5; - return v5; - } - if ( v8 == 46 ) - { - *v3 = 0; - return rand() % 11 + 10; - } - if ( v8 > 11 ) - { - v12 = v8 - 12; - if ( !v12 ) - { - *v3 = 0; - return GetDiceResult(v7, 6u); - } - v13 = v12 - 1; - if ( !v13 ) - { - *v3 = 8; - return 5; - } - v14 = v13 - 1; - if ( v14 ) - { - v15 = v14 - 1; - if ( v15 ) - { - v16 = v15 - 1; - if ( !v16 || v16 == 25 ) - { - *v3 = 10; - *a3 = 1; - return v5; - } - v5 = 0; - *v3 = v5; - return v5; - } - *v3 = 2; - return 12; - } - v5 = 8; - *v3 = v5; - return v5; - } - if ( v8 == 11 ) - { - *v3 = 0; - v7 = 2; - return GetDiceResult(v7, 6u); - } - if ( v8 == 4 ) - { - *v3 = 2; - v11 = rand() % 2; - return v11 + 3; - } - if ( v8 == 5 ) - { - *v3 = 2; - v10 = rand(); - v17 = 3; - return v10 % v17 + 6; - } - if ( v8 == 6 ) - { - *v3 = 2; - v9 = rand() % 4; - return v9 + 9; - } - if ( v8 == 7 ) - { - *v3 = 1; - return rand() % 4 + 2; - } - if ( v8 == 8 ) - { - *v3 = 1; - return rand() % 7 + 4; - } - if ( v8 == 9 ) - { - *v3 = 1; - v10 = rand(); - v17 = 10; - return v10 % v17 + 6; - } - if ( v8 != 10 ) - { - v5 = 0; - *v3 = v5; - return v5; - } - *v3 = 0; - v7 = 1; - return GetDiceResult(v7, 6u); -} + switch (uSpecEnchantmentType) + { + case 4: //Adds 3-4 points of Cold damage. + *damage_type = 2; + return rand() % 2 + 3; + break; + case 5: //Adds 6-8 points of Cold damage. + *damage_type = 2; + return rand() % 3 + 6; + break; + case 6: //Adds 9-12 points of Cold damage. + *damage_type = 2; + return rand() % 4 + 9; + break; + case 7: //Adds 2-5 points of Electrical damage. + *damage_type = 1; + return rand() % 4 + 2; + break; + case 8: //Adds 4-10 points of Electrical damage. + *damage_type = 1; + return rand() % 7 + 4; + break; + case 9: //Adds 6-15 points of Electrical damage. + *damage_type = 1; + return rand() % 10 + 6; + break; + case 10: //Adds 1-6 points of Fire damage. + *damage_type = 0; + return GetDiceResult(1, 6); + break; + case 11: //Adds 2-12 points of Fire damage. + *damage_type = 0; + return GetDiceResult(2, 6); + break; + case 12: //Adds 3-18 points of Fire damage. + *damage_type = 0; + return GetDiceResult(3, 6); + break; + case 13: //Adds 5 points of Body damage. + *damage_type = 8; + return 5; + break; + case 14: //Adds 8 points of Body damage. + *damage_type = 8; + return 8; + break; + case 15: //Adds 12 points of Body damage. + *damage_type = 8; + return 12; + break; + case 16: //Drain Hit Points from target. + case 41: //Drain Hit Points from target and Increased Weapon speed. + *damage_type = 10; + *draintargetHP = true; + return 0; + break; + case 46: //Adds 10-20 points of Fire damage and +25 Might. + *damage_type = 0; + return rand() % 11 + 10; + break; + default: + *damage_type = 0; + return 0; + + } + + } //----- (00402F07) -------------------------------------------------------- void ItemGen::Reset() { - this->field_1A = 0; + this->uHolderPlayer = 0; this->uAttributes = 0; this->uNumCharges = 0; - this->uAdditionalValue = 0; + this->uSpecEnchantmentType = 0; this->_bonus_strength = 0; - this->_bonus_type = 0; + this->uEncantmentType = 0; this->uItemID = 0; this->uBodyAnchor = 0; this->uExpireTime = 0i64; @@ -205,35 +146,31 @@ { if ( uTimePlayed > (signed __int64)this->uExpireTime ) { - this->_bonus_type = 0; + this->uEncantmentType = 0; LOBYTE(v2) = v2 & 0xF7; - this->uAdditionalValue = 0; + this->uSpecEnchantmentType = 0; this->uAttributes = v2; } } } //----- (0045814E) -------------------------------------------------------- -char *ItemsTable::Release() +void ItemsTable::Release() { - ItemsTable *v1; // edi@1 - char *result; // eax@23 - - v1 = this; if ( pMonstersTXT_Raw ) pAllocator->FreeChunk(pMonstersTXT_Raw); if ( pMonsterPlacementTXT_Raw ) pAllocator->FreeChunk(pMonsterPlacementTXT_Raw); if ( pSkillDescTXT_Raw ) pAllocator->FreeChunk(pSkillDescTXT_Raw); - if ( v1->pSpcItemsTXT_Raw ) - pAllocator->FreeChunk(v1->pSpcItemsTXT_Raw); - if ( v1->pStdItemsTXT_Raw ) - pAllocator->FreeChunk(v1->pStdItemsTXT_Raw); - if ( v1->pRndItemsTXT_Raw ) - pAllocator->FreeChunk(v1->pRndItemsTXT_Raw); - if ( v1->pItemsTXT_Raw ) - pAllocator->FreeChunk(v1->pItemsTXT_Raw); + if (pSpcItemsTXT_Raw ) + pAllocator->FreeChunk(pSpcItemsTXT_Raw); + if ( pStdItemsTXT_Raw ) + pAllocator->FreeChunk(pStdItemsTXT_Raw); + if ( pRndItemsTXT_Raw ) + pAllocator->FreeChunk(pRndItemsTXT_Raw); + if ( pItemsTXT_Raw ) + pAllocator->FreeChunk(pItemsTXT_Raw); if ( pHostileTXT_Raw ) pAllocator->FreeChunk(pHostileTXT_Raw); if ( pHistoryTXT_Raw ) @@ -242,13 +179,12 @@ pAllocator->FreeChunk(pPotionsTXT_Raw); if ( pPotionNotesTXT_Raw ) pAllocator->FreeChunk(pPotionNotesTXT_Raw); - v1->pSpcItemsTXT_Raw = 0; - pSkillDescTXT_Raw = 0; - v1->pStdItemsTXT_Raw = 0; - v1->pRndItemsTXT_Raw = pSkillDescTXT_Raw; - result = pSkillDescTXT_Raw; - v1->pItemsTXT_Raw = pSkillDescTXT_Raw; - return result; + pSpcItemsTXT_Raw = NULL; + pSkillDescTXT_Raw = NULL; + pStdItemsTXT_Raw = NULL; + pRndItemsTXT_Raw = NULL; + pItemsTXT_Raw = NULL; + } @@ -444,8 +380,6 @@ pSpecialEnchantmentsSumm[i]+=pSpecialEnchantments[j].to_item_apply[i]; } - - Initialize2DA(); pItemsTXT_Raw = NULL; @@ -573,7 +507,7 @@ } if ( !_strcmpi(test_string, "sscroll") ) { - pItems[item_counter].uEquipType = 15; + pItems[item_counter].uEquipType = EQUIP_SPELL_SCROLL; break; } if ( !_strcmpi(test_string, "book") ) @@ -583,7 +517,7 @@ } if ( !_strcmpi(test_string, "mscroll") ) { - pItems[item_counter].uEquipType = 17; + pItems[item_counter].uEquipType = EQUIP_MESSAGE_SCROLL; break; } if ( !_strcmpi(test_string, "gold") ) @@ -603,70 +537,70 @@ { if ( !_strcmpi(test_string, "staff") ) { - pItems[item_counter].uSkillType = 0; + pItems[item_counter].uSkillType = PLAYER_SKILL_STAFF; break; } if ( !_strcmpi(test_string, "sword") ) { - pItems[item_counter].uSkillType = 1; + pItems[item_counter].uSkillType = PLAYER_SKILL_SWORD; break; } if ( !_strcmpi(test_string, "dagger") ) { - pItems[item_counter].uSkillType = 2; + pItems[item_counter].uSkillType = PLAYER_SKILL_DAGGER; break; } if ( !_strcmpi(test_string, "axe") ) { - pItems[item_counter].uSkillType = 3; + pItems[item_counter].uSkillType = PLAYER_SKILL_AXE; break; } if ( !_strcmpi(test_string, "spear") ) { - pItems[item_counter].uSkillType = 4; + pItems[item_counter].uSkillType = PLAYER_SKILL_SPEAR; break; } if ( !_strcmpi(test_string, "bow") ) { - pItems[item_counter].uSkillType = 5; + pItems[item_counter].uSkillType = PLAYER_SKILL_BOW; break; } if ( !_strcmpi(test_string, "mace") ) { - pItems[item_counter].uSkillType = 6; + pItems[item_counter].uSkillType = PLAYER_SKILL_MACE; break; } if ( !_strcmpi(test_string, "blaster") ) { - pItems[item_counter].uSkillType = 7; + pItems[item_counter].uSkillType = PLAYER_SKILL_BLASTER; break; } if ( !_strcmpi(test_string, "shield") ) { - pItems[item_counter].uSkillType = 8; + pItems[item_counter].uSkillType = PLAYER_SKILL_SHIELD; break; } if ( !_strcmpi(test_string, "leather") ) { - pItems[item_counter].uSkillType = 9; + pItems[item_counter].uSkillType = PLAYER_SKILL_LEATHER; break; } if ( !_strcmpi(test_string, "chain") ) { - pItems[item_counter].uSkillType = 10; + pItems[item_counter].uSkillType = PLAYER_SKILL_CHAIN; break; } if ( !_strcmpi(test_string, "plate") ) { - pItems[item_counter].uSkillType = 11; + pItems[item_counter].uSkillType = PLAYER_SKILL_PLATE; break; } if ( !_strcmpi(test_string, "club") ) { - pItems[item_counter].uSkillType = 37; + pItems[item_counter].uSkillType = PLAYER_SKILL_CLUB; break; } - pItems[item_counter].uSkillType = 38; + pItems[item_counter].uSkillType = PLAYER_SKILL_MISC; break; } case 6: //Mod1 @@ -705,20 +639,20 @@ { if ( !_strcmpi(test_string, "artifact") ) { - pItems[item_counter].uMaterial = 1; + pItems[item_counter].uMaterial = MATERIAL_ARTEFACT; break; } if ( !_strcmpi(test_string, "relic") ) { - pItems[item_counter].uMaterial = 2; + pItems[item_counter].uMaterial = MATERIAL_RELIC; break; } if ( !_strcmpi(test_string, "special") ) { - pItems[item_counter].uMaterial = 3; + pItems[item_counter].uMaterial = MATERIAL_SPECIAL; break; } - pItems[item_counter].uMaterial = 0; + pItems[item_counter].uMaterial = MATERIAL_COMMON; break;} case 9: //ID/Rep/St pItems[item_counter].uItemID_Rep_St=atoi(test_string); @@ -733,7 +667,7 @@ { pItems[item_counter]._additional_value=0; pItems[item_counter]._bonus_type=0; - if (pItems[item_counter].uMaterial==3) + if (pItems[item_counter].uMaterial==MATERIAL_SPECIAL) { for(int ii=0; ii<24; ++ii) { @@ -758,7 +692,7 @@ break; } case 13: //VarB - if ((pItems[item_counter].uMaterial==3)&&(pItems[item_counter]._bonus_type)) + if ((pItems[item_counter].uMaterial==MATERIAL_SPECIAL)&&(pItems[item_counter]._bonus_type)) { char b_s=atoi(test_string); if (b_s) @@ -1194,30 +1128,26 @@ //----- (00456D17) -------------------------------------------------------- void ItemsTable::SetSpecialBonus(ItemGen *pItem) { - ItemDesc *v2; // eax@1 - - v2 = &this->pItems[pItem->uItemID]; - if ( v2->uMaterial == 3 ) + if ( pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL ) { - pItem->_bonus_type = v2->_bonus_type; - pItem->uAdditionalValue = v2->_additional_value; - pItem->_bonus_strength = v2->_bonus_strength; + pItem->uEncantmentType = pItems[pItem->uItemID]._bonus_type; + pItem->uSpecEnchantmentType = pItems[pItem->uItemID]._additional_value; + pItem->_bonus_strength = pItems[pItem->uItemID]._bonus_strength; } } //----- (00456D43) -------------------------------------------------------- -bool ItemsTable::_456D43_is_material_equals_3(ItemGen *pItem) +bool ItemsTable::IsMaterialSpecial(ItemGen *pItem) { - return this->pItems[pItem->uItemID].uMaterial == 3; + return this->pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL; } //----- (00456D5E) -------------------------------------------------------- -bool ItemsTable::_456D5E_is_some_material(ItemGen *pItem) +bool ItemsTable::IsMaterialNonCommon(ItemGen *pItem) { - unsigned __int8 v2; // al@1 - - v2 = this->pItems[pItem->uItemID].uMaterial; - return v2 == 3 || v2 == 1 || v2 == 2; + return pItems[pItem->uItemID].uMaterial == MATERIAL_SPECIAL || + pItems[pItem->uItemID].uMaterial == MATERIAL_RELIC || + pItems[pItem->uItemID].uMaterial == MATERIAL_ARTEFACT; } @@ -1392,14 +1322,14 @@ v1 = this; uBaseValue = pItemsTable->pItems[this->uItemID].uValue; - if ( this->uAttributes & ITEM_TEMP_BONUS || pItemsTable->_456D5E_is_some_material(this) ) + if ( this->uAttributes & ITEM_TEMP_BONUS || pItemsTable->IsMaterialNonCommon(this) ) return uBaseValue; - if ( v1->_bonus_type ) + if ( v1->uEncantmentType ) { v3 = 100 * v1->_bonus_strength; return uBaseValue + v3; } - v4 = v1->uAdditionalValue; + v4 = v1->uSpecEnchantmentType; if ( !v4 ) { result = uBaseValue; @@ -1426,94 +1356,74 @@ //----- (004564B3) -------------------------------------------------------- const char *ItemGen::GetIdentifiedName() { - ItemGen *v1; // esi@1 - unsigned int v2; // eax@1 - unsigned __int8 v3; // cl@1 - char *v4; // edi@4 - char v5; // al@6 - const char *v6; // esi@8 - int v7; // eax@15 - const char *v9; // [sp-Ch] [bp-14h]@14 - const char *v10; // [sp-8h] [bp-10h]@4 - char *v11; // [sp-4h] [bp-Ch]@4 + unsigned __int8 equip_type; + const char *player_name; + const char *nameModificator; + const char *format_str; - v1 = this; - v2 = this->uItemID; - v3 = pItemsTable->pItems[v2].uEquipType; - if ( v3 >= EQUIP_REAGENT && (v3 <= EQUIP_POTION || v3 == EQUIP_GOLD) ) + equip_type = pItemsTable->pItems[uItemID].uEquipType; + if ( (equip_type == EQUIP_REAGENT) || (equip_type == EQUIP_POTION) || (equip_type == EQUIP_GOLD) ) { - v11 = pItemsTable->pItems[v2].pName; - v4 = item__getname_buffer; - v10 = "%s"; - sprintf(v4, v10, v11); - return v4; + sprintf(item__getname_buffer, "%s", pItemsTable->pItems[uItemID].pName); + return item__getname_buffer; } - v4 = item__getname_buffer; - sprintf(item__getname_buffer, "%s", pItemsTable->pItems[v2].pName); - if ( v1->uItemID == 601 ) + sprintf(item__getname_buffer, "%s", pItemsTable->pItems[uItemID].pName); + if ( uItemID == ITEM_LICH_JAR ) //Lich Jar { - v5 = v1->field_1A; - if ( (unsigned __int8)v5 >= 1u ) - { - if ( (unsigned __int8)v5 <= 4u ) + if ( (uHolderPlayer >0 )&& (uHolderPlayer <= 4) ) { - v6 = pPlayers[(unsigned __int8)v5]->pName; - strlen(pPlayers[(unsigned __int8)v5]->pName); - v11 = (char *)v6; - if ( v6[strlen(v6) - 1] == 115 ) - v10 = pGlobalTXT_LocalizationStrings[655]; + player_name = pPlayers[uHolderPlayer]->pName; + strlen(player_name); + if ( player_name[strlen(player_name) - 1] == 's' ) + format_str = pGlobalTXT_LocalizationStrings[655]; //"%s' Jar" else - v10 = pGlobalTXT_LocalizationStrings[654]; - sprintf(v4, v10, v11); - return v4; + format_str = pGlobalTXT_LocalizationStrings[654]; //"%s's Jar" + sprintf(item__getname_buffer, format_str, pPlayers[uHolderPlayer]->pName); + return item__getname_buffer; } - } } - if ( !pItemsTable->_456D5E_is_some_material(v1) ) + if ( !pItemsTable->IsMaterialNonCommon(this) ) { - if ( v1->_bonus_type ) + if ( uEncantmentType ) { strcat(item__getname_buffer, " "); - v9 = (const char *)*((unsigned int *)&pItemsTable->pItems[799].uEquipType + 5 * v1->_bonus_type); + nameModificator = pItemsTable->pEnchantments[uEncantmentType-1].pOfName; } else { - v7 = v1->uAdditionalValue; - if ( !v7 ) - return v4; - if ( v7 == 16 - || v7 == 39 - || v7 == 40 - || v7 == 45 - || v7 == 56 - || v7 == 57 - || v7 == 58 - || v7 == 60 - || v7 == 61 - || v7 == 59 - || v7 == 63 - || v7 == 64 - || v7 == 67 - || v7 == 68 ) - { - sprintf( - item__getname_buffer, - "%s %s", - pItemsTable->pSpecialEnchantments[v7].pBonusStatement, - pItemsTable->pItems[v1->uItemID].pName); - return v4; + if ( !uSpecEnchantmentType ) + return item__getname_buffer; + if ( uSpecEnchantmentType == 16 //Drain Hit Points from target. + || uSpecEnchantmentType == 39 //Double damage vs Demons. + || uSpecEnchantmentType == 40 //Double damage vs Dragons + || uSpecEnchantmentType == 45 //+5 Speed and Accuracy + || uSpecEnchantmentType == 56 //+5 Might and Endurance. + || uSpecEnchantmentType == 57 //+5 Intellect and Personality. + || uSpecEnchantmentType == 58 //Increased Value. + || uSpecEnchantmentType == 60 //+3 Unarmed and Dodging skills + || uSpecEnchantmentType == 61 //+3 Stealing and Disarm skills. + || uSpecEnchantmentType == 59 //Increased Weapon speed. + || uSpecEnchantmentType == 63 //Double Damage vs. Elves. + || uSpecEnchantmentType == 64 //Double Damage vs. Undead. + || uSpecEnchantmentType == 67 //Adds 5 points of Body damage and +2 Disarm skill. + || uSpecEnchantmentType == 68 ) //Adds 6-8 points of Cold damage and +5 Armor Class. + { //enchantment and name positions inverted! + sprintf( item__getname_buffer, "%s %s", + pItemsTable->pSpecialEnchantments[uSpecEnchantmentType-1].pNameAdd, + pItemsTable->pItems[uItemID].pName); + return item__getname_buffer; } strcat(item__getname_buffer, " "); - v9 = pItemsTable->pSpecialEnchantments[v1->uAdditionalValue].pBonusStatement; + nameModificator = pItemsTable->pSpecialEnchantments[uSpecEnchantmentType-1].pNameAdd; } - strcat(item__getname_buffer, v9); + strcat(item__getname_buffer, nameModificator); } - return v4; + return item__getname_buffer; } //----- (00456620) -------------------------------------------------------- -void ItemsTable::GenerateItem(int treasure_level, int a3, ItemGen *out_item) +void ItemsTable::GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *out_item) { ItemGen *v4; // esi@1 @@ -1584,23 +1494,23 @@ v4 = out_item; v6 = treasure_level - 1; - //v54 = treasure_level - 1; - if ( a3 ) + v54 = treasure_level - 1; + if ( uTreasureType ) //generate known treasure type { ITEM_EQUIP_TYPE requested_equip; PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID; - switch (a3) + switch (uTreasureType) { case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break; case 21: requested_equip = EQUIP_ARMOUR; break; - case 22: requested_skill = (PLAYER_SKILL_TYPE)38; __debugbreak();/*check this skill*/ break; + case 22: requested_skill = PLAYER_SKILL_MISC; break; case 23: requested_skill = PLAYER_SKILL_SWORD; break; case 24: requested_skill = PLAYER_SKILL_DAGGER; break; case 25: requested_skill = PLAYER_SKILL_AXE; break; case 26: requested_skill = PLAYER_SKILL_SPEAR; break; case 27: requested_skill = PLAYER_SKILL_BOW; break; case 28: requested_skill = PLAYER_SKILL_MACE; break; - case 29: requested_skill = (PLAYER_SKILL_TYPE)37; __debugbreak();/*check this skill*/break; + case 29: requested_skill = PLAYER_SKILL_CLUB; break; case 30: requested_skill = PLAYER_SKILL_STAFF; break; case 31: requested_skill = PLAYER_SKILL_LEATHER; break; case 32: requested_skill = PLAYER_SKILL_CHAIN; break; @@ -1614,20 +1524,20 @@ case 40: requested_equip = EQUIP_RING; break; case 41: requested_equip = EQUIP_AMULET; break; case 42: requested_equip = EQUIP_WAND; break; - case 43: requested_equip = EQUIP_F; break; + case 43: requested_equip = EQUIP_SPELL_SCROLL; break; case 44: requested_equip = EQUIP_POTION; break; case 45: requested_equip = EQUIP_REAGENT; break; case 46: requested_equip = EQUIP_GEM; break; default: __debugbreak(); // check this condition - requested_equip = (ITEM_EQUIP_TYPE)(a3 - 1); + requested_equip = (ITEM_EQUIP_TYPE)(uTreasureType - 1); break; } memset(Dst, 0, sizeof(Dst)); v52 = 0; v7 = Dst; //a2a = 1; - if (requested_skill == PLAYER_SKILL_INVALID) + if (requested_skill == PLAYER_SKILL_INVALID) // no skill for this item needed { for (uint i = 1; i < 500; ++i) { @@ -1638,7 +1548,7 @@ } } } - else + else //have needed skill { for (uint i = 1; i < 500; ++i) { @@ -1654,11 +1564,11 @@ if ( v52 ) v10 = rand() % v52; - v4->uItemID = *Dst; - if (!v4->uItemID) - v4->uItemID = 1; + out_item->uItemID = *Dst; + if (!out_item->uItemID) + out_item->uItemID = 1; - v11 = pItems[v4->uItemID].uChanceByTreasureLvl[v6]; + v11 = pItems[out_item->uItemID].uChanceByTreasureLvl[v6]; if ( v11 < v10 ) { v12 = (uint *)Dst; @@ -1666,23 +1576,18 @@ { ++v12; v13 = *v12; - v4->uItemID = *v12; + out_item->uItemID = *v12; v11 += pItems[v13].uChanceByTreasureLvl[v6]; } while ( v11 < v10 ); } - if (pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE ) - { - v4->_bonus_type = 0; - v14 = 2; - do - { - v4->_bonus_type += rand() % 4 + 1; - v15 = v4->_bonus_type; - --v14; - } - while ( v14 ); - v4->_bonus_type = v15 * treasure_level; + + if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) + {// if it potion set potion spec + out_item->uEncantmentType = 0; + for (int i=0; i<2; ++i) + out_item->uEncantmentType += rand() % 4 + 1; + out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; } } else @@ -1693,40 +1598,38 @@ v56 += pParty->field_7BA[v16++]; while ( v16 < 29 ); v17 = rand() % 29; + if ( v6 == 5 && rand() % 100 < 5 && !pParty->field_7BA[v17] && v56 < 13 ) { pParty->field_7BA[v17] = 1; - v4->uAttributes = 0; - v4->uItemID = v17 + 500; - SetSpecialBonus(v4); + out_item->uAttributes = 0; + out_item->uItemID = v17 + 500; + SetSpecialBonus(out_item); return; } + v57 = 0; v18 = rand() % v5->uChanceByTreasureLvlSumm[v54];// v5->field_11684[v54]; - v4->uItemID = 0; + out_item->uItemID = 0; if ( v18 > 0 ) { do - v57 += pItems[v4->uItemID++ + 1].uChanceByTreasureLvl[v6]; + v57 += pItems[out_item->uItemID++ + 1].uChanceByTreasureLvl[v6]; while ( v57 < v18 ); } + if ( !v18 ) - v4->uItemID = 1; - if ( !v4->uItemID ) - v4->uItemID = 1; - if (pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE) - { - v4->_bonus_type = 0; - v19 = 2; - do - { - v4->_bonus_type += rand() % 4 + 1; - v15 = v4->_bonus_type; - --v19; - } - while ( v19 ); - v4->_bonus_type = v15 * treasure_level; - } + out_item->uItemID = 1; + if ( !out_item->uItemID ) + out_item->uItemID = 1; + if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE ) + {// if it potion set potion spec + out_item->uEncantmentType = 0; + for (int i=0; i<2; ++i) + out_item->uEncantmentType += rand() % 4 + 1; + out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; + } + out_item->uEncantmentType = out_item->uEncantmentType * treasure_level; } if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION && !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, 239) ) @@ -1735,20 +1638,20 @@ v4->uAttributes = 0; else v4->uAttributes = 1; - if ( pItems[v4->uItemID].uEquipType != EQUIP_POTION ) + if ( pItems[out_item->uItemID].uEquipType != EQUIP_POTION ) { - v4->uAdditionalValue = 0; - v4->_bonus_type = 0; + out_item->uSpecEnchantmentType = 0; + out_item->uEncantmentType = 0; } - v20 = pItems[v4->uItemID].uEquipType; + v20 = pItems[out_item->uItemID].uEquipType; if ( v20 <= EQUIP_BOW ) { v37 = v5->uBonusChanceWpSpecial[v54]; - if ( !*(unsigned int *)v37 ) + if ( !v37 ) return; v38 = rand() % 100; - v36 = __OFSUB__(v38, *(unsigned int *)v37); - v35 = v38 - *(unsigned int *)v37 < 0; + v36 = __OFSUB__(v38, v37); + v35 = v38 - v37 < 0; } else { @@ -1757,35 +1660,34 @@ if ( v20 == EQUIP_WAND ) { v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1; - v4->uNumCharges = v21; - v4->uMaxCharges = v21; + out_item->uNumCharges = v21; + out_item->uMaxCharges = v21; } return; } - v22 = (int)&uBonusChanceStandart[v6]; - if ( !*(unsigned int *)v22 ) + v22 = uBonusChanceStandart[v6]; + if ( !v22 ) return; - v23 = rand(); - v24 = *(unsigned int *)v22; - v25 = v23 % 100; - if ( !uBonusChanceSpecial[v6] && !(v23 % 100 < v24)) + v24 = v22; + v25 = rand() % 100; + if ( !uBonusChanceSpecial[v6] && !(v25 < v24)) return; - if ( v25 < v24 || v23 % 100 < v24) + if ( v25 < v24 || v25 < v24) { - v26 = rand() % 10;//v5->field_116D8[v5->pItems[v4->uItemID].uEquipType]; + v26 = rand() % v5->uBonusChanceWpSpecial[v5->pItems[v4->uItemID].uEquipType + 3]; v27 = v4->uItemID; - v4->_bonus_type = 0; + v4->uEncantmentType = 0; for ( i = pEnchantments[0].to_item[pItems[v27].uEquipType + 1]; i < v26; - i += pEnchantments[v4->_bonus_type].to_item[pItems[v29].uEquipType + 1] ) + i += pEnchantments[v4->uEncantmentType].to_item[pItems[v29].uEquipType + 1] ) { v29 = v4->uItemID; - ++v4->_bonus_type; + ++v4->uEncantmentType; } - ++v4->_bonus_type; + ++v4->uEncantmentType; v30 = 10;// v5->field_116D8[2 * v54 + 12]; v31 = rand(); - v32 = v4->_bonus_type - 1; + v32 = v4->uEncantmentType - 1; v33 = v31 % 10;//(v5->field_116D8[2 * v54 + 13] - v30 + 1) + v30; v4->_bonus_strength = v33; if ( v32 == 21 || v32 == 22 || v32 == 23 ) @@ -1889,7 +1791,7 @@ while ( a2b < pSpecialEnchantments_count ); } v45 = rand(); - v4->uAdditionalValue = *(uint *)Dst; + v4->uSpecEnchantmentType = *(uint *)Dst; v46 = v45 % v39 + 1; a2c = *((unsigned char *)&uAllItemsCount + 28 * (*(uint *)Dst + 1389) + pItems[v4->uItemID].uEquipType); if ( a2c < v46 ) @@ -1900,13 +1802,13 @@ v49 = (int)(j + 1); v59 = v49; v50 = *(unsigned int *)v49; - v4->uAdditionalValue = v50; + v4->uSpecEnchantmentType = v50; a2c += *((unsigned char *)&uAllItemsCount + 28 * (v50 + 1389) + pItems[v48].uEquipType); if ( a2c >= v46 ) break; } } - ++v4->uAdditionalValue; + ++v4->uSpecEnchantmentType; } //----- (004505CC) -------------------------------------------------------- @@ -1916,32 +1818,27 @@ signed int uNumArtifactsNotFound; // esi@1 int v3; // eax@1 bool result; // eax@6 - int v5[32]; // [sp+8h] [bp-A0h]@3 + int artifacts_list[32]; // [sp+8h] [bp-A0h]@3 char Dst[32]; // [sp+88h] [bp-20h]@1 auto a2 = this; v1 = a2; - memset(Dst, 0, 0x20u); + memset(artifacts_list, 0,sizeof(artifacts_list)); uNumArtifactsNotFound = 0; - v3 = 500; - do - { - if ( !pParty->field_3C.pIsArtifactFound[v3] ) - v5[uNumArtifactsNotFound++] = v3; - ++v3; - } - while ( v3 < 529 ); - v1->Reset(); + + for (int i=500;i<529;++i) + if ( !pParty->field_3C.pIsArtifactFound[i] ) + artifacts_list[uNumArtifactsNotFound++] = i; + + Reset(); if ( uNumArtifactsNotFound ) { - v1->uItemID = v5[rand() % uNumArtifactsNotFound]; - pItemsTable->SetSpecialBonus(v1); - result = 1; + uItemID = artifacts_list[rand() % uNumArtifactsNotFound]; + pItemsTable->SetSpecialBonus(this); + return true; } else - { - result = 0; - } - return result; + return false; + } // 4505CC: using guessed type int var_A0[32]; \ No newline at end of file diff -r e65d75206263 -r 91e1ba340f39 Items.h --- a/Items.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Items.h Mon Feb 25 09:09:08 2013 +0600 @@ -16,6 +16,14 @@ }; +enum ITEM_MATERIAL +{ + MATERIAL_COMMON =0, + MATERIAL_ARTEFACT = 1, + MATERIAL_RELIC = 2, + MATERIAL_SPECIAL = 3 +}; + /* 330 */ enum ITEM_TYPE { @@ -58,6 +66,7 @@ ITEM_ARTIFACT_PUCK = 0x1F4, ITEM_ARTIFACT_SPLITTER = 506,//1FA ITEM_RELIC_MEKORIGS_HAMMER = 0x210, + ITEM_LICH_JAR = 601 }; /* 331 */ @@ -71,19 +80,19 @@ EQUIP_HELMET = 5, EQUIP_BELT = 6, EQUIP_CLOAK = 7, - EQUIP_GAUNTLETS = 0x8, - EQUIP_BOOTS = 0x9, - EQUIP_RING = 10, - EQUIP_AMULET = 11, - EQUIP_WAND = 12, - EQUIP_REAGENT = 13, - EQUIP_POTION = 14, - EQUIP_F = 0xF, - EQUIP_BOOK = 16, - EQUIP_11 = 17, - EQUIP_GOLD = 18, - EQUIP_GEM = 19, - EQUIP_NONE = 20 + EQUIP_GAUNTLETS = 8, + EQUIP_BOOTS = 9, + EQUIP_RING = 10, + EQUIP_AMULET = 11, + EQUIP_WAND = 12, + EQUIP_REAGENT = 13, + EQUIP_POTION = 14, + EQUIP_SPELL_SCROLL = 15, + EQUIP_BOOK = 16, + EQUIP_MESSAGE_SCROLL = 17, + EQUIP_GOLD = 18, + EQUIP_GEM = 19, + EQUIP_NONE = 20 }; @@ -109,19 +118,19 @@ const char *GetIdentifiedName(); void UpdateTempBonus(__int64 uTimePlayed); void Reset(); - int _439DF3_get_additional_damage(int *a2, int *a3); + int _439DF3_get_additional_damage(int *a2, bool *vampiyr); unsigned int uItemID; - int _bonus_type; + int uEncantmentType; int _bonus_strength; - int uAdditionalValue; + int uSpecEnchantmentType; // 25: +5 levels int uNumCharges; unsigned int uAttributes; unsigned __int8 uBodyAnchor; char uMaxCharges; - char field_1A; + char uHolderPlayer; char field_1B; unsigned __int64 uExpireTime; }; @@ -225,11 +234,11 @@ void Initialize(); void LoadPotions(); void LoadPotionNotes(); - void GenerateItem(int treasure_level, int a3, ItemGen *pItem); + void GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *pItem); void SetSpecialBonus(ItemGen *pItem); - bool _456D43_is_material_equals_3(ItemGen *pItem); - bool _456D5E_is_some_material(ItemGen *pItem); - char *Release(); + bool IsMaterialSpecial(ItemGen *pItem); + bool IsMaterialNonCommon(ItemGen *pItem); + void Release(); int uAllItemsCount; ItemDesc pItems[800]; //4-9604h @@ -266,4 +275,79 @@ extern ItemGen *ptr_50C9A4; -extern struct ItemsTable *pItemsTable; \ No newline at end of file +extern struct ItemsTable *pItemsTable; + +/* ++10 to all Resistances. 1 + +10 to all Seven Statistics. 2 + Explosive Impact! 3 + Adds 3-4 points of Cold damage. 4 + Adds 6-8 points of Cold damage. 5 + Adds 9-12 points of Cold damage. 6 + Adds 2-5 points of Electrical damage. 7 + Adds 4-10 points of Electrical damage. 8 + Adds 6-15 points of Electrical damage. 9 + Adds 1-6 points of Fire damage. 10 + Adds 2-12 points of Fire damage. 11 + Adds 3-18 points of Fire damage. 12 + Adds 5 points of Body damage. 13 + Adds 8 points of Body damage. 14 + Adds 12 points of Body damage. 15 + Drain Hit Points from target. 16 + Increases rate of Recovery. 17 + Wearer resistant to Diseases. 18 + Wearer resistant to Insanity. 19 + Wearer resistant to Paralysis. 20 + Wearer resistant to Poison. 21 + Wearer resistant to Sleep. 22 + Wearer resistant to Stone. 23 + Increased Knockback. 24 + +5 Level. 25 + Increases effect of all Air spells. 26 + Increases effect of all Body spells. 27 + Increases effect of all Dark spells. 28 + Increases effect of all Earth spells. 29 + Increases effect of all Fire spells. 30 + Increases effect of all Light spells. 31 + Increases effect of all Mind spells. 32 + Increases effect of all Spirit spells. 33 + Increases effect of all Water spells. 34 + Increases chance of Disarming. 35 + Half damage from all missile attacks. 36 + Regenerate Hit points over time. 37 + Regenerate Spell points over time. 38 + Double damage vs Demons. 39 + Double damage vs Dragons 40 + Drain Hit Points from target and Increased Weapon speed. 41 + +1 to Seven Stats, HP, SP, Armor, Resistances. 42 + +10 to Endurance, Armor, Hit points. 43 + +10 Hit points and Regenerate Hit points over time. 44 + +5 Speed and Accuracy. 45 + Adds 10-20 points of Fire damage and +25 Might. 46 + +10 Spell points and Regenerate Spell points over time. 47 + +15 Endurance and +5 Armor. 48 + +10 Intellect and Luck. 49 + +30 Fire Resistance and Regenerate Hit points over time. 50 + +10 Spell points, Speed, Intellect. 51 + +10 Endurance and Accuracy. 52 + +10 Might and Personality. 53 + +15 Endurance and Regenerate Hit points over time. 54 + +15 Luck and Regenerate Spell points over time. 55 + +5 Might and Endurance. 56 + +5 Intellect and Personality. 57 + Increased Value. 58 + Increased Weapon speed. 59 + +3 Unarmed and Dodging skills. 60 + +3 Stealing and Disarm skills. 61 + +3 ID Item and ID Monster skills. 62 + Double Damage vs. Elves. 63 + Double Damage vs. Undead. 64 + Double Damage vs. Titans. 65 + Regenerate Spell points and Hit points over time. 66 + Adds 5 points of Body damage and +2 Disarm skill. 67 + Adds 6-8 points of Cold damage and +5 Armor Class. 68 + +20 Air Resistance and Shielding. 69 + +10 Water Resistance and +2 Alchemy skill. 70 + Prevents damage from drowning. 71 + Prevents damage from falling. 72 +*/ \ No newline at end of file diff -r e65d75206263 -r 91e1ba340f39 LOD.cpp --- a/LOD.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/LOD.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1947,53 +1947,36 @@ //----- (0046188A) -------------------------------------------------------- int LOD::File::LoadSubIndices(const char *pContainer) { - LOD::File *v2; // esi@1 + unsigned int uDir; // edi@1 - int uDir_dup; // ebx@2 - int result; // eax@5 - LOD::Directory *v6; // eax@7 - LOD::Directory *v7; // eax@7 - __int32 v8; // edx@7 - FILE *v9; // ST00_4@7 - LOD::Directory *pSubIndices_dup; // eax@7 + LOD::Directory *curr_index; // eax@7 - v2 = this; + ResetSubIndices(); uDir = 0; - if ( (signed int)v2->header.uNumIndices <= 0 ) - { -LABEL_5: - result = 3; - } + + if ( header.uNumIndices <= 0) + return 3; else - { - uDir_dup = 0; - while ( _strcmpi(pContainer, (const char *)&v2->pRoot[uDir_dup]) ) - { - ++uDir; - ++uDir_dup; - if ( (signed int)uDir >= (signed int)v2->header.uNumIndices ) - goto LABEL_5; - } - strcpy((char *)v2->pContainerName, pContainer); - v6 = v2->pRoot; - v2->uCurrentIndexDir = uDir; - v7 = &v6[uDir]; - v8 = v7->uOfsetFromSubindicesStart; - v2->uOffsetToSubIndex = v8; - v9 = v2->pFile; - v2->uNumSubIndices = v7->uNumSubIndices; - fseek(v9, v8, 0); - pSubIndices_dup = (LOD::Directory *)pAllocator->AllocNamedChunk( - v2->pSubIndices, - 32 * (v2->uNumSubIndices + 5), - "LOD Index"); - v2->pSubIndices = pSubIndices_dup; - if ( pSubIndices_dup ) - fread(pSubIndices_dup, 0x20u, v2->uNumSubIndices, v2->pFile); - result = 0; - } - return result; + { + while (stricmp(pContainer, pRoot[uDir].pFilename)) + { + ++uDir; + if (uDir >= header.uNumIndices ) + return 3; + } + strcpy( pContainerName, pContainer); + uCurrentIndexDir = uDir; + curr_index=(LOD::Directory *)&pRoot[uDir]; + uOffsetToSubIndex =curr_index->uOfsetFromSubindicesStart ; + uNumSubIndices =curr_index->uNumSubIndices;// *(_WORD *)(v8 + 28); + fseek( pFile, uOffsetToSubIndex, 0); + pSubIndices = (LOD::Directory *)pAllocator->AllocNamedChunk(pSubIndices, sizeof(LOD::Directory)*(uNumSubIndices + 5), "LOD Index"); + + if ( pSubIndices) + fread( pSubIndices, sizeof(LOD::Directory), uNumSubIndices, pFile); + return 0; + } } //----- (004617D5) -------------------------------------------------------- diff -r e65d75206263 -r 91e1ba340f39 LOD.h --- a/LOD.h Mon Feb 25 09:08:13 2013 +0600 +++ b/LOD.h Mon Feb 25 09:09:08 2013 +0600 @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include "Texture.h" @@ -158,6 +159,14 @@ void _4114F2(); void _4355F7(); + inline Texture *GetTexture(int idx) + { + assert(idx < 1000); + if (idx == -1) + return nullptr; + return pTextures + idx; + } + /*FILE *pFile; unsigned __int8 pLODName[256]; diff -r e65d75206263 -r 91e1ba340f39 LayingItem.cpp --- a/LayingItem.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/LayingItem.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -107,7 +107,7 @@ //----- (0042F933) -------------------------------------------------------- -void LayingItem::_42F933(unsigned int uLayingItemID) +void LayingItem::OnItemPickup(unsigned int uLayingItemID) { unsigned int v1; // ecx@1 unsigned __int16 *pAttributes; // ecx@2 diff -r e65d75206263 -r 91e1ba340f39 LayingItem.h --- a/LayingItem.h Mon Feb 25 09:08:13 2013 +0600 +++ b/LayingItem.h Mon Feb 25 09:09:08 2013 +0600 @@ -2,11 +2,18 @@ #include "VectorTypes.h" #include "Items.h" +enum +{ + OBJECT_ATTACHED_TO_ACTOR = 0x80, +}; + /* 72 */ #pragma pack(push, 1) struct LayingItem { + inline bool AttachedToActor() const {return uAttributes & OBJECT_ATTACHED_TO_ACTOR;} + LayingItem(); int Create(int yaw, int pitch, int a4, int a5); void _46BEF1_apply_spells(); @@ -14,7 +21,7 @@ static void UpdateObject_fn0_BLV(unsigned int uLayingItemID); static void UpdateObject_fn0_ODM(unsigned int uLayingItemID); - static void _42F933(unsigned int uLayingItemID); + static void OnItemPickup(unsigned int uLayingItemID); unsigned __int16 uItemType; @@ -27,7 +34,7 @@ __int16 uSectorID; unsigned __int16 uSpriteFrameID; __int16 field_20; - __int16 field_22; + __int16 field_22_glow_radius_multiplier; struct ItemGen stru_24; int field_48; int field_4C; diff -r e65d75206263 -r 91e1ba340f39 NPC.cpp --- a/NPC.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/NPC.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -670,7 +670,6 @@ pNPCDataBuff->joins = 1; } - //----- (00476387) -------------------------------------------------------- bool PartyHasDragon() { @@ -820,7 +819,6 @@ } } - //----- (00476590) -------------------------------------------------------- void InitializeMerchants() { @@ -923,7 +921,7 @@ if (temp_str_len) { if ( decode_step == 1) - pTransitionStrings[i]=RemoveQuotes(test_string); + pTransitionStrings[i + 1]=RemoveQuotes(test_string); } else { diff -r e65d75206263 -r 91e1ba340f39 NPC.h --- a/NPC.h Mon Feb 25 09:08:13 2013 +0600 +++ b/NPC.h Mon Feb 25 09:09:08 2013 +0600 @@ -1,5 +1,71 @@ #pragma once +/* +enum NPCProffession + { + Smith 1 + Armorer 2 + Alchemist 3 + Scholar 4 + Guide 5 + Tracker 6 + Pathfinder 7 + Sailor 8 + Navigator 9 + Healer 10 + Expert Healer 11 + Master Healer 12 + Teacher 13 + Instructor 14 + Arms Master 15 + Weapons Master 16 + Apprentice 17 + Mystic 18 + Spell Master 19 + Trader 20 + Merchant 21 + Scout 22 + Herbalist 23 + Apothecary 24 + Tinker 25 + Locksmith 26 + Fool 27 + Chimney Sweep 28 + Porter 29 + Quarter Master 30 + Factor 31 + Banker 32 + Cook 33 + Chef 34 + Horseman 35 + Bard 36 + Enchanter 37 + Cartographer 38 + Wind Master 39 + Water Master 40 + Gate Master 41 + Acolyte 42 + Piper 43 + Explorer 44 + Pirate 45 + Squire 46 + Psychic 47 + Gypsy 48 + Diplomat 49 + Duper 50 + Burglar 51 + Fallen Wizard 52 + Acolyte 53 + Initiate 54 + Prelate 55 + Monk 56 + Sage 57 + Hunter 58 + + + }; + */ + struct NPCTopic { @@ -25,6 +91,17 @@ unsigned int uProfession; //18 CheckHiredNPCSpeciality(uProfession) /* + v0 = uDefaultTravelTime_ByFoot; + if ( CheckHiredNPCSpeciality(5u) ) + --v0; + if ( CheckHiredNPCSpeciality(6u) ) + v0 -= 2; + if ( CheckHiredNPCSpeciality(7u) ) + v0 -= 3; + if ( CheckHiredNPCSpeciality(0x2Cu) ) + --v0; + + case PLAYER_SKILL_MONSTER_ID: if ( CheckHiredNPCSpeciality(58) ) skill += 6; @@ -147,8 +224,8 @@ #pragma pack(push, 1) struct NPCGreeting { - char *pGreeting1; - char *pGreeting2; + char *pGreeting1; //at first meet + char *pGreeting2; // at latest meets }; #pragma pack(pop) diff -r e65d75206263 -r 91e1ba340f39 ObjectList.h --- a/ObjectList.h Mon Feb 25 09:08:13 2013 +0600 +++ b/ObjectList.h Mon Feb 25 09:09:08 2013 +0600 @@ -26,6 +26,8 @@ #pragma pack(push, 1) struct ObjectDesc { + inline bool NoSprite() const {return uFlags & OBJECT_DESC_NO_SPRITE;} + char field_0[32]; __int16 uObjectID; __int16 uRadius; diff -r e65d75206263 -r 91e1ba340f39 Outdoor.cpp --- a/Outdoor.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Outdoor.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -2223,14 +2223,11 @@ pGameLoadingUI_ProgressBar->Progress(); memcpy(&uNumLayingItems, pSrc, 4); - //v93 = (char *)v92 + 4; - if (uNumLayingItems > 1000) - MessageBoxW(nullptr, L"Can't load file!", - L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Odmap.cpp:954", 0); + assert(uNumLayingItems <= 1000 && "Too many objects"); + assert(sizeof(LayingItem) == 112); pGameLoadingUI_ProgressBar->Progress(); - assert(sizeof(LayingItem) == 112); //pFilename = (char *)(112 * uNumLayingItems); memcpy(pLayingItems, pSrc + 4, uNumLayingItems * sizeof(LayingItem)); pSrc += 4 + uNumLayingItems * sizeof(LayingItem); @@ -3111,9 +3108,9 @@ } v28->uScreenSpaceX = v27; v28->uScreenSpaceY = v46; - v28->some_x = x; - v28->some_y = y; - v28->some_z = z; + v28->world_x = x; + v28->world_y = y; + v28->world_z = z; HIWORD(v34) = HIWORD(X); LOWORD(v34) = 0; v28->uPaletteSubindex = 0; @@ -3143,28 +3140,23 @@ //----- (0044C1E8) -------------------------------------------------------- bool ODMFace::HasEventHint() { - signed int v1; // eax@1 - EventIndex *v2; // esi@2 - bool result; // eax@5 - signed int v4; // eax@6 + signed int event_index; // eax@1 + _evt_raw* start_evt; + _evt_raw* end_evt; - v1 = 0; - if ( (signed int)(uLevelEVT_NumEvents - 1) <= 0 ) - goto LABEL_5; - v2 = pLevelEVT_Index; - while ( v2->uEventID != this->sCogTriggeredID ) + event_index = 0; + if ( (uLevelEVT_NumEvents - 1) <= 0 ) + return false; + while ( pLevelEVT_Index[event_index].uEventID != this->sCogTriggeredID ) { - ++v1; - ++v2; - if ( v1 >= (signed int)(uLevelEVT_NumEvents - 1) ) - goto LABEL_5; + ++event_index; + if ( event_index >= (signed int)(uLevelEVT_NumEvents - 1) ) + return false; } - v4 = v1; - if ( pLevelEVT[pLevelEVT_Index[v4 + 1].uEventOffsetInEVT + 4] != 1 - || pLevelEVT[pLevelEVT_Index[v4].uEventOffsetInEVT + 4] != 4 ) -LABEL_5: - result = 0; + end_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index+1].uEventOffsetInEVT]; + start_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT]; + if ( (end_evt->_e_type != EVENT_Exit) || (start_evt->_e_type!= EVENT_MouseOver) ) + return false; else - result = 1; - return result; + return true; } \ No newline at end of file diff -r e65d75206263 -r 91e1ba340f39 Party.cpp --- a/Party.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Party.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -398,7 +398,7 @@ Dst.Reset(); if ( bGiveItems ) { - pItemsTable->GenerateItem(2, 40, &Dst); + pItemsTable->GenerateItem(2, 40, &Dst); //ring pCharacter->AddItem2(-1, &Dst); //uSkillIdx = 0; //v18 = 0; @@ -555,9 +555,9 @@ uNumGold = 200; uNumGoldInBank = 0; uNumFoodRations = 7; - uAlignment = 1; - SetUserInterface(uAlignment, true); + alignment = PartyAlignment_Neutral; + SetUserInterface(alignment, true); uTimePlayed = 0x21C00u; uLastRegenerationTime = 0x21C00; @@ -780,7 +780,6 @@ } - //----- (0043AD34) -------------------------------------------------------- void Party::Yell() { @@ -1062,7 +1061,7 @@ v8 = 138; do { - if ( v7->uItemID == 601 && (unsigned __int8)v7->field_1A== v15 + 1 ) + if ( v7->uItemID == 601 && (unsigned __int8)v7->uHolderPlayer== v15 + 1 ) v14 = 1; ++v7; --v8; diff -r e65d75206263 -r 91e1ba340f39 Party.h --- a/Party.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Party.h Mon Feb 25 09:09:08 2013 +0600 @@ -16,7 +16,9 @@ /* 355 */ enum PARTY_FLAGS_1: __int32 { - PARTY_FLAGS_1_LANDING = 0x100, + PARTY_FLAGS_1_ALERT_RED = 0x0010, + PARTY_FLAGS_1_ALERT_YELLOW = 0x0020, + PARTY_FLAGS_1_LANDING = 0x0100, }; enum PARTY_FLAGS_2: __int32 { @@ -95,6 +97,12 @@ +enum PartyAlignment: unsigned __int32 +{ + PartyAlignment_Good = 0, + PartyAlignment_Neutral = 1, + PartyAlignment_Evil = 2 +}; @@ -180,6 +188,11 @@ inline bool FeatherFallActive() {return pPartyBuffs[PARTY_BUFF_FEATHER_FALL].uExpireTime > 0;} inline bool Invisible() {return pPartyBuffs[PARTY_BUFF_INVISIBILITY].uExpireTime > 0;} + inline bool GetRedAlert() {return uFlags & PARTY_FLAGS_1_ALERT_RED;} + inline void SetRedAlert() {uFlags |= PARTY_FLAGS_1_ALERT_RED;} + inline bool GetYellowAlert() {return uFlags & PARTY_FLAGS_1_ALERT_YELLOW;} + inline void SetYellowAlert() {uFlags |= PARTY_FLAGS_1_ALERT_YELLOW;} + int field_0; unsigned int uPartyHeight; @@ -253,28 +266,15 @@ unsigned int bTurnBasedModeOn; int field_880; int uFlags2; - unsigned int uAlignment; + PartyAlignment alignment; SpellBuff pPartyBuffs[20]; Player pPlayers[4]; NPCData pHirelings[2]; ItemGen pPickedItem; unsigned int uFlags; - int field_777C[1000]; - int field_871C[1000]; - int field_96BC[1000]; - int field_A65C[1000]; - int field_B5FC[1000]; - int field_C59C[1000]; - int field_D53C[1000]; - int field_E4DC[300]; - int field_E98C[13]; - int dword_E9C0; - int dword_E9C4; - char field_E9C8[5000]; - char field_FD50[5000]; - char field_110D8[5000]; - char field_12460[5000]; - char field_137E8[5000]; + ItemGen field_777C[53][12]; + ItemGen Recipes_Item[53][12]; //D0EC + int field_12A5C[2117]; char field_14B70[5000]; char field_15EF8[250]; char field_15FF2[130]; @@ -283,7 +283,7 @@ int armageddon_timer; int field_16140; int pTurnBasedPlayerRecoveryTimes[4]; - char field_16154[212]; + int field_16154[53]; int uFine; float flt_TorchlightColorR; float flt_TorchlightColorG; diff -r e65d75206263 -r 91e1ba340f39 Player.cpp --- a/Player.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Player.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1784,7 +1784,7 @@ } // 506128: using guessed type int areWeLoadingTexture; - +//identf //----- (00490EEE) -------------------------------------------------------- int Player::_490EEE(ItemGen *pItem, int a3, int a4, int a5) { @@ -2796,7 +2796,7 @@ v12 = pItemsTable->pItems[v8].uDamageMod + v28; if ( !uTargetActorID ) goto LABEL_28; - v13 = v6->uAdditionalValue; + v13 = v6->uSpecEnchantmentType; if ( v13 == 64 || v7 == 507 || v7 == 508 || v7 == 527 ) { v14 = (MONSTER_SUPERTYPE)1; @@ -2867,7 +2867,7 @@ v4 = pItemsTable->pItems[v17].uDamageMod + v29; if ( !uTargetActorID ) goto LABEL_57; - v19 = v15->uAdditionalValue; + v19 = v15->uSpecEnchantmentType; if ( v19 == 64 || v16 == 507 || v16 == 508 || v16 == 527 ) { v20 = (MONSTER_SUPERTYPE)1; @@ -3048,7 +3048,7 @@ v9 = pItemsTable->pItems[v6].uDamageMod + v17; if ( a2 ) { - v10 = v4->uAdditionalValue; + v10 = v4->uSpecEnchantmentType; if ( v10 == 64 ) { v11 = (MONSTER_SUPERTYPE)1; @@ -3371,7 +3371,7 @@ for (uint i = 0; i < 16; ++i) { if (HasItemEquipped((ITEM_EQUIP_TYPE)i) && - pInventoryItems[i].uAdditionalValue == uEnchantment) + pInventoryItems[i].uSpecEnchantmentType == uEnchantment) // *(int *)&this->field_1F6[36 * pEquipment[i] + 6] != uEnchantment) return true; } @@ -3532,9 +3532,9 @@ } if ( pItemsTable->pItems[v5->array_000234[3].uItemID].uEquipType != 18 ) return _steal_perma; - v20 = (int)&v5->array_000234[3].uAdditionalValue; - if ( (signed int)v19 > v5->array_000234[3].uAdditionalValue ) - v19 = v5->array_000234[3].uAdditionalValue; + v20 = (int)&v5->array_000234[3].uSpecEnchantmentType; + if ( (signed int)v19 > v5->array_000234[3].uSpecEnchantmentType ) + v19 = v5->array_000234[3].uSpecEnchantmentType; v21 = *(int *)v20 == v19; *(int *)v20 -= v19; if ( v21 ) @@ -3580,7 +3580,7 @@ if ( pItemsTable->pItems[v17].uEquipType == 14 ) { if ( v16 != 220 ) - v27._bonus_type = 2 * rand() % 4 + 2; + v27.uEncantmentType = 2 * rand() % 4 + 2; } } else @@ -4661,7 +4661,7 @@ if ( (signed int)v3 >= 16 ) return v2; } - if ( a2 != 24 || this->pInventoryItems[v5].uAdditionalValue != 24 ) + if ( a2 != 24 || this->pInventoryItems[v5].uSpecEnchantmentType != 24 ) goto LABEL_11; return 5; } @@ -4900,8 +4900,8 @@ } v63 = (int)((char *)v6 + 36 * v31); attra = (ItemGen *)(v63 + 532); - if ( pItemsTable->_456D5E_is_some_material((ItemGen *)(v63 + 532)) == 1 - && !pItemsTable->_456D43_is_material_equals_3(attra) ) + if ( pItemsTable->IsMaterialNonCommon((ItemGen *)(v63 + 532)) == 1 + && !pItemsTable->IsMaterialSpecial(attra) ) { v34 = attra->uItemID; switch ( attra->uItemID ) @@ -6969,10 +6969,10 @@ switch ( pParty->pPickedItem.uItemID ) { case 0xDEu: - v25 = pParty->pPickedItem._bonus_type + 10; + v25 = pParty->pPickedItem.uEncantmentType + 10; goto LABEL_110; case 0xDFu: - v26 = pParty->pPickedItem._bonus_type + 10; + v26 = pParty->pPickedItem.uEncantmentType + 10; goto LABEL_114; case 0xE0u: LODWORD(v3->pConditions[1]) = 0; @@ -7005,7 +7005,7 @@ v59 = 0; v50 = 5; v46 = 3; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[7]; goto LABEL_147; case 0xE5u: @@ -7013,7 +7013,7 @@ v59 = 0; v50 = 5; v46 = 3; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[8]; goto LABEL_147; case 0xE6u: @@ -7021,23 +7021,23 @@ v59 = 0; v50 = 5; v46 = 3; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[1]; goto LABEL_147; case 0xE7u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[11]; goto LABEL_147; case 0xE8u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[13]; goto LABEL_147; case 0xEAu: @@ -7045,12 +7045,12 @@ v59 = 0; v50 = 5; v46 = 3; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[14]; goto LABEL_147; case 0xEBu: v3->pPlayerBuffs[23].Apply( - pParty->uTimePlayed + (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335), + pParty->uTimePlayed + (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335), 3u, 5u, 0, @@ -7071,49 +7071,49 @@ case 0xF0u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[19]; goto LABEL_147; case 0xF1u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[17]; goto LABEL_147; case 0xF2u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[20]; goto LABEL_147; case 0xF3u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[16]; goto LABEL_147; case 0xF4u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[21]; goto LABEL_147; case 0xF5u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[15]; goto LABEL_147; case 0xFBu: @@ -7136,12 +7136,12 @@ HIDWORD(v3->pConditions[16]) = v35; goto LABEL_112; case 0xFDu: - v25 = 5 * pParty->pPickedItem._bonus_type; + v25 = 5 * pParty->pPickedItem.uEncantmentType; LABEL_110: v69 = v25; goto LABEL_111; case 0xFEu: - v26 = 5 * pParty->pPickedItem._bonus_type; + v26 = 5 * pParty->pPickedItem.uEncantmentType; LABEL_114: v27 = (char *)&v3->sMana; *(int *)v27 += v26; @@ -7149,57 +7149,57 @@ case 0xFFu: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[18]; goto LABEL_147; case 0x100u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[5]; goto LABEL_147; case 0x101u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)v3->pPlayerBuffs; goto LABEL_147; case 0x102u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[22]; goto LABEL_147; case 0x103u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[3]; goto LABEL_147; case 0x104u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[9]; goto LABEL_147; case 0x105u: v70 = 0; v59 = 0; - v50 = 3 * LOWORD(pParty->pPickedItem._bonus_type); + v50 = 3 * LOWORD(pParty->pPickedItem.uEncantmentType); v46 = 0; - v28 = (signed __int64)((double)(230400 * pParty->pPickedItem._bonus_type) * 0.033333335); + v28 = (signed __int64)((double)(230400 * pParty->pPickedItem.uEncantmentType) * 0.033333335); v29 = (char *)&v3->pPlayerBuffs[2]; LABEL_147: ((SpellBuff *)v29)->Apply(pParty->uTimePlayed + v28, v46, v50, v59, v70); @@ -7598,13 +7598,14 @@ { if ( !v73 ) goto LABEL_187; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); } if ( v73 ) { @@ -7679,27 +7680,23 @@ if ( dword_50C9E8 < 40 ) { dword_50C9EC[3 * dword_50C9E8] = 146; - dword_50C9F0[3 * dword_50C9E8] = v24; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = a2 - 1; + dword_50C9EC[3 * dword_50C9E8 + 1] = v24; + dword_50C9EC[3 * dword_50C9E8 + 2] = a2 - 1; ++dword_50C9E8; } if ( pCurrentScreen && pGUIWindow_CurrentMenu - && pGUIWindow_CurrentMenu->eWindowType != WINDOW_null - && (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) - { - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; + && pGUIWindow_CurrentMenu->eWindowType != WINDOW_null) + //&& (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + { + /*pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; - } - } -} -// 4E28F8: using guessed type int pCurrentScreen; -// 50C9AC: using guessed type int dword_50C9AC; -// 50C9EC: using guessed type int dword_50C9EC[]; -// 6BE3C4: using guessed type char bUnderwater; -// 720984: using guessed type int 720984_unused; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + } + } +} diff -r e65d75206263 -r 91e1ba340f39 Player.h --- a/Player.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Player.h Mon Feb 25 09:09:08 2013 +0600 @@ -215,7 +215,8 @@ PLAYER_SKILL_STEALING = 34, PLAYER_SKILL_ALCHEMY = 35, PLAYER_SKILL_LEARNING = 36, - + PLAYER_SKILL_CLUB = 37, + PLAYER_SKILL_MISC = 38, PLAYER_SKILL_INVALID = -1 }; diff -r e65d75206263 -r 91e1ba340f39 Render.cpp --- a/Render.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/Render.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -3053,17 +3053,17 @@ void Render::DrawLayingItems_Shooting_Magic_ODM() { //char *v0; // edi@2 - ObjectDesc *v1; // ebx@4 + //ObjectDesc *v1; // ebx@4 __int16 v2; // cx@5 RenderBillboard *v3; // esi@10 SpriteFrame *v4; // eax@10 - SpriteFrame *v5; // ebx@10 + //SpriteFrame *v5; // ebx@10 unsigned int v6; // eax@10 - int v7; // ecx@10 - int v8; // edx@10 + //int v7; // ecx@10 + //int v8; // edx@10 int v9; // ecx@10 unsigned __int16 v10; // ax@10 - int *v11; // eax@14 + //int *v11; // eax@14 int v12; // eax@22 int v13; // ST3C_4@23 int v14; // eax@23 @@ -3080,8 +3080,8 @@ int v25; // ST3C_4@30 int v26; // eax@31 char v27; // zf@31 - SpriteFrame *v28; // [sp+Ch] [bp-34h]@10 - __int16 a5; // [sp+10h] [bp-30h]@10 + //SpriteFrame *v28; // [sp+Ch] [bp-34h]@10 + //__int16 a5; // [sp+10h] [bp-30h]@10 int v30; // [sp+14h] [bp-2Ch]@23 int v31; // [sp+14h] [bp-2Ch]@29 __int16 v32; // [sp+14h] [bp-2Ch]@30 @@ -3103,56 +3103,61 @@ //v41 = 0; for (int i = 0; i < uNumLayingItems; ++i) { - auto v0 = (char *)&pLayingItems[i].uSectorID; + auto object = pLayingItems + i; + //auto v0 = (char *)&pLayingItems[i].uSectorID; //v0 = (char *)&pLayingItems[0].uSectorID; //do //{ - if ( *((short *)v0 - 13) ) - { - v1 = &pObjectList->pObjects[*((short *)v0 - 13)]; - if ( !(v1->uFlags & 1) ) - { - if ( ((v2 = *((short *)v0 - 14), v2 < 1000) || v2 >= 10000) && (v2 < 500 || v2 >= 600) - || pGame->pStru6Instance->_4A81CA((LayingItem *)(v0 - 28)) ) - { - a5 = *(short *)v0; - x = *((int *)v0 - 6); - y = *((int *)v0 - 5); - z = *((int *)v0 - 4); - v3 = &pBillboardRenderList[::uNumBillboardsToDraw]; - v4 = pSpriteFrameTable->GetFrame(v1->uSpriteID, *((short *)v0 + 1)); - v5 = v4; - v28 = v4; - v36 = v4->uFlags; - a6 = v4->uGlowRadius * *((short *)v0 + 3); - v6 = stru_5C6E00->Atan2( - *((int *)v0 - 6) - pIndoorCamera->pos.x, - *((int *)v0 - 5) - pIndoorCamera->pos.y); - LOWORD(v7) = *((short *)v0 - 3); - v8 = v36; - v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v7 - v6) >> 8) & 7; - v10 = v5->pHwSpriteIDs[v9]; + if (!object->uObjectDescID) // item probably pciked up + continue; + + assert(object->uObjectDescID < pObjectList->uNumObjects); + auto object_desc = pObjectList->pObjects + object->uObjectDescID; + if (object_desc->NoSprite()) + continue; + + //v1 = &pObjectList->pObjects[*((short *)v0 - 13)]; + //if ( !(v1->uFlags & 1) ) + //{ + //v2 = *((short *)v0 - 14) + v2 = object->uItemType; + if ( (v2 < 1000 || v2 >= 10000) && (v2 < 500 || v2 >= 600) || pGame->pStru6Instance->_4A81CA(object) ) + { + //a5 = *(short *)v0; + x = object->vPosition.x; + y = object->vPosition.y; + z = object->vPosition.z; + v3 = &pBillboardRenderList[::uNumBillboardsToDraw]; + v4 = pSpriteFrameTable->GetFrame(object_desc->uSpriteID, object->uSpriteFrameID); + //v5 = v4; + //v28 = v4; + v36 = v4->uFlags; + a6 = v4->uGlowRadius * object->field_22_glow_radius_multiplier; + v6 = stru_5C6E00->Atan2(object->vPosition.x - pIndoorCamera->pos.x, object->vPosition.y - pIndoorCamera->pos.y); + //LOWORD(v7) = object->uFacing; + //v8 = v36; + v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + object->uFacing - v6) >> 8) & 7; + v10 = v4->pHwSpriteIDs[v9]; v3->uHwSpriteID = v10; if ( v36 & 0x20 ) { - v8 = v36; - z -= (signed int)((unsigned __int64)(v5->scale - * (signed __int64)pSprites_LOD->pSpriteHeaders[(signed __int16)v10].uHeight) >> 16) >> 1; + //v8 = v36; + z -= (signed int)((unsigned __int64)(v4->scale * (signed __int64)pSprites_LOD->pSpriteHeaders[(signed __int16)v10].uHeight) >> 16) >> 1; } v46 = 0; - if ( v8 & 2 ) + if ( v36 & 2 ) v46 = 2; - v11 = (int *)(256 << v9); - if ( (256 << v9) & v8 ) + //v11 = (int *)(256 << v9); + if ( (256 << v9) & v36 ) v46 |= 4u; - if ( v8 & 0x40000 ) + if ( v36 & 0x40000 ) v46 |= 0x40u; - if ( v8 & 0x20000 ) + if ( v36 & 0x20000 ) LOBYTE(v46) = v46 | 0x80; if ( a6 ) { - LOBYTE(v11) = byte_4E94D3; - pMobileLightsStack->AddLight(x, y, z, a5, a6, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3); + //LOBYTE(v11) = byte_4E94D3; + pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3); } v12 = (x - pIndoorCamera->pos.x) << 16; if ( pIndoorCamera->sRotationX ) @@ -3185,12 +3190,9 @@ v42 = v20 + v19; if ( v20 + v19 >= 262144 && v16 <= pOutdoorCamera->shading_dist_mist << 16 ) { - v21 = (unsigned __int64)(((x - pIndoorCamera->pos.x) << 16) - * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16; - v17 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - - v21; - v40 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - - v21; + v21 = (unsigned __int64)(((x - pIndoorCamera->pos.x) << 16) * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16; + v17 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v21; + v40 = ((unsigned __int64)(v34 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - v21; v18 = (z - pIndoorCamera->pos.z) << 16; LABEL_29: v31 = v18; @@ -3203,30 +3205,31 @@ v25 = v23 / v42; LODWORD(v23) = 0; HIDWORD(v23) = SLOWORD(pOutdoorCamera->int_fov_rad); - v35 = pViewport->uScreenCenterX - - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16); - v32 = LOWORD(pViewport->uScreenCenterY) - - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16); - if (::uNumBillboardsToDraw >= 500) - return; + v35 = pViewport->uScreenCenterX - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16); + v32 = LOWORD(pViewport->uScreenCenterY) - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16); + + //if (::uNumBillboardsToDraw >= 500) + // return; + assert(::uNumBillboardsToDraw < 500); ++::uNumBillboardsToDraw; ++uNumSpritesDrawnThisFrame; - *(v0 - 2) |= 1u; - v3->uPalette = v28->uPaletteIndex; - v3->uIndoorSectorID = a5; - v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; - v26 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; - v3->pSpriteFrame = v28; + + object->uAttributes |= 1; + v3->uPalette = v4->uPaletteIndex; + v3->uIndoorSectorID = object->uSectorID; + v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16; + v26 = (unsigned __int64)(v4->scale * (signed __int64)v24) >> 16; + v3->pSpriteFrame = v4; v3->_screenspace_y_scaler_packedfloat = v26; v3->field_1E = v46; - v3->some_x = x; - v3->some_y = y; - v3->some_z = z; + v3->world_x = x; + v3->world_y = y; + v3->world_z = z; v3->uScreenSpaceX = v35; v3->uScreenSpaceY = v32; HIWORD(v26) = HIWORD(v42); LOWORD(v26) = 0; - v27 = (*(v0 - 2) & 0x20) == 0; + v27 = (object->uAttributes & 0x20) == 0; v3->sZValue = v26 + (8 * i | OBJECT_Item); v3->uPaletteSubindex = 0; v3->uTintColor = 0; @@ -3240,8 +3243,7 @@ } } } - } - } + //} LABEL_34: ; //++v41; @@ -3659,9 +3661,9 @@ HIBYTE(v29) |= 2u; v27->uPalette = v28; v27->field_1E = v29; - v27->some_x = x; - v27->some_y = y; - v27->some_z = v36; + v27->world_x = x; + v27->world_y = y; + v27->world_z = v36; v27->uScreenSpaceY = v40; HIWORD(v30) = HIWORD(v39); v31 = 8 * i | OBJECT_Decoration; @@ -10976,7 +10978,7 @@ while ( v2 < (signed int)pObjectList->uNumObjects ); } LOBYTE(v1) = 1; - SetUserInterface(pParty->uAlignment, v1); + SetUserInterface(pParty->alignment, v1); if ( pVideoPlayer->pVideoFrame.pPixels ) pVideoPlayer->pVideoFrame.Load(pVideoPlayer->pVideoFrameTextureFilename, 1); if ( uCurrentMenuID ) diff -r e65d75206263 -r 91e1ba340f39 Render.h --- a/Render.h Mon Feb 25 09:08:13 2013 +0600 +++ b/Render.h Mon Feb 25 09:09:08 2013 +0600 @@ -70,9 +70,9 @@ __int16 uPalette; __int16 uIndoorSectorID; __int16 field_1E; - __int16 some_x; - __int16 some_y; - __int16 some_z; + __int16 world_x; + __int16 world_y; + __int16 world_z; __int16 uScreenSpaceX; __int16 uScreenSpaceY; unsigned __int16 uPaletteSubindex; diff -r e65d75206263 -r 91e1ba340f39 SaveLoad.cpp --- a/SaveLoad.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/SaveLoad.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -85,7 +85,7 @@ } } - sprintf(pTmpBuf, "saves\\%s", pSavegameList->pSavesNames[uSlot]); + sprintf(pTmpBuf, "saves\\%s", pSavegameList->pFileList[uSlot].pSaveFileName); pNew_LOD->CloseWriteFile(); if (!CopyFileA(pTmpBuf, "data\\new.lod", 0)) @@ -196,7 +196,7 @@ viewparams->bRedrawGameUI = true; - SetUserInterface(pParty->uAlignment, true); + SetUserInterface(pParty->alignment, true); pEventTimer->Resume(); pEventTimer->StopGameTime(); @@ -671,12 +671,13 @@ void SavegameList::Initialize(unsigned int bHideEmptySlots) { memset(pSavegameList, 0, 0x3138); + // Reset(); uNumSavegameFiles = 0; _chdir("saves"); { if (!bHideEmptySlots && _access(pGlobalTXT_LocalizationStrings[613], 0) != -1 ) // AutoSave.MM7 - strcpy(pSavesNames[uNumSavegameFiles++], pGlobalTXT_LocalizationStrings[613]); + strcpy(pSavegameList->pFileList[uNumSavegameFiles++].pSaveFileName, pGlobalTXT_LocalizationStrings[613]); for (uint i = 0; i < 40; ++i) { @@ -687,7 +688,7 @@ uint idx = i; if (!bHideEmptySlots) idx = uNumSavegameFiles; - strcpy(pSavesNames[idx], pTmpBuf); + strcpy(pSavegameList->pFileList[idx].pSaveFileName, pTmpBuf); ++uNumSavegameFiles; } diff -r e65d75206263 -r 91e1ba340f39 SaveLoad.h --- a/SaveLoad.h Mon Feb 25 09:08:13 2013 +0600 +++ b/SaveLoad.h Mon Feb 25 09:09:08 2013 +0600 @@ -1,15 +1,28 @@ #pragma once - +#pragma pack(push, 1) +struct SaveFile_ + { + char field_0[20]; + char pSaveFileName[260]; + }; +#pragma pack(pop) /* 243 */ #pragma pack(push, 1) struct SavegameList { - void Initialize(unsigned int a1); + static void Initialize(unsigned int a1); - char field_0[20]; - char pSavesNames[40][280]; + /*inline void Reset() + { + for (int i = 0; i < 20; ++i) + field_0[i] = 0; + for (int i = 0; i < 44; ++i) + pSavesNames[i][0] = 0; + }*/ + SaveFile_ pFileList[45]; + }; #pragma pack(pop) diff -r e65d75206263 -r 91e1ba340f39 TurnEngine.h --- a/TurnEngine.h Mon Feb 25 09:08:13 2013 +0600 +++ b/TurnEngine.h Mon Feb 25 09:09:08 2013 +0600 @@ -6,6 +6,13 @@ #pragma pack(push, 1) struct TurnBased_QueueElem { + inline TurnBased_QueueElem() + { + uPackedID = 0; + field_4 = 0; + uActionLength = 0; + field_C = 0; + } int uPackedID; int field_4; int uActionLength; @@ -17,6 +24,18 @@ #pragma pack(push, 1) struct stru262_TurnBased { + inline stru262_TurnBased() + { + field_0 = 0; + field_4 = 0; + field_8 = 0; + uActorQueueSize = 0; + field_10 = 0; + uActionPointsLeft = 0; + field_18 = 0; + field_1C = 0; + } + signed int _404544(); void _40471C(); signed int Start(); diff -r e65d75206263 -r 91e1ba340f39 VideoPlayer.cpp --- a/VideoPlayer.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/VideoPlayer.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1125,7 +1125,7 @@ pParty->uFlags &= 0xFFFFFFFDu; if ( EnterHouse((enum HOUSE_TYPE)165) ) { - pAudioPlayer->PlaySound(SOUND_0, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Invalid, 0, 0, -1, 0, 0, 0, 0); window_SpeakInHouse = GUIWindow::Create(0, 0, 640, 480, WINDOW_HouseInterior, 165, 0); window_SpeakInHouse->CreateButton(0x3Du, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 1u, 0x31u, "", 0); window_SpeakInHouse->CreateButton(0xB1u, 0x1A8u, 0x1Fu, 0, 2, 94, 0x6Eu, 2u, 0x32u, "", 0); diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/all-wcprops --- a/lib/legacy_dx/lib/.svn/all-wcprops Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 40 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib -END -dinput8.lib -K 25 -svn:wc:ra_dav:version-url -V 52 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib/dinput8.lib -END -ddraw.lib -K 25 -svn:wc:ra_dav:version-url -V 50 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib/ddraw.lib -END -dinput.lib -K 25 -svn:wc:ra_dav:version-url -V 51 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib/dinput.lib -END -dxguid.lib -K 25 -svn:wc:ra_dav:version-url -V 51 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib/dxguid.lib -END -d3dxof.lib -K 25 -svn:wc:ra_dav:version-url -V 51 -/svn/bb7/!svn/ver/289/libs/legacy_dx/lib/d3dxof.lib -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/entries --- a/lib/legacy_dx/lib/.svn/entries Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -10 - -dir -316 -http://svn2.assembla.com/svn/bb7/libs/legacy_dx/lib -http://svn2.assembla.com/svn/bb7 - - - -2010-12-18T21:09:41.003199Z -289 -Feaerenil - - - - - - - - - - - - - - -0b0191bc-8333-4b8d-b53c-6b3aa212730c - -dinput8.lib -file - - - - -2004-09-03T13:18:30.000000Z -a9300cdf7a34c7da7be2117e099e15a7 -2010-12-18T21:09:41.003199Z -289 -Feaerenil -has-props - - - - - - - - - - - - - - - - - - - - -173542 - -ddraw.lib -file - - - - -2004-09-06T18:58:26.000000Z -77752b153225ae97f64688aa5c16db31 -2010-12-18T21:09:41.003199Z -289 -Feaerenil -has-props - - - - - - - - - - - - - - - - - - - - -4540 - -dinput.lib -file - - - - -2004-09-03T13:18:30.000000Z -21f11641cd6d0b29f2979fcad555a81e -2010-12-18T21:09:41.003199Z -289 -Feaerenil -has-props - - - - - - - - - - - - - - - - - - - - -161464 - -dxguid.lib -file - - - - -2005-05-26T12:11:04.000000Z -b5d00b6a24df5706d25ae59b9ff77658 -2010-12-18T21:09:41.003199Z -289 -Feaerenil -has-props - - - - - - - - - - - - - - - - - - - - -408632 - -d3dxof.lib -file - - - - -2004-09-29T14:47:54.000000Z -f17de8653cb71aa503a45d7908a6c296 -2010-12-18T21:09:41.003199Z -289 -Feaerenil -has-props - - - - - - - - - - - - - - - - - - - - -1746 - diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/prop-base/d3dxof.lib.svn-base --- a/lib/legacy_dx/lib/.svn/prop-base/d3dxof.lib.svn-base Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/prop-base/ddraw.lib.svn-base --- a/lib/legacy_dx/lib/.svn/prop-base/ddraw.lib.svn-base Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/prop-base/dinput.lib.svn-base --- a/lib/legacy_dx/lib/.svn/prop-base/dinput.lib.svn-base Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/prop-base/dinput8.lib.svn-base --- a/lib/legacy_dx/lib/.svn/prop-base/dinput8.lib.svn-base Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/prop-base/dxguid.lib.svn-base --- a/lib/legacy_dx/lib/.svn/prop-base/dxguid.lib.svn-base Mon Feb 25 09:08:13 2013 +0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -K 13 -svn:mime-type -V 24 -application/octet-stream -END diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/text-base/d3dxof.lib.svn-base Binary file lib/legacy_dx/lib/.svn/text-base/d3dxof.lib.svn-base has changed diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/text-base/ddraw.lib.svn-base Binary file lib/legacy_dx/lib/.svn/text-base/ddraw.lib.svn-base has changed diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/text-base/dinput.lib.svn-base Binary file lib/legacy_dx/lib/.svn/text-base/dinput.lib.svn-base has changed diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/text-base/dinput8.lib.svn-base Binary file lib/legacy_dx/lib/.svn/text-base/dinput8.lib.svn-base has changed diff -r e65d75206263 -r 91e1ba340f39 lib/legacy_dx/lib/.svn/text-base/dxguid.lib.svn-base Binary file lib/legacy_dx/lib/.svn/text-base/dxguid.lib.svn-base has changed diff -r e65d75206263 -r 91e1ba340f39 mm7_1.cpp --- a/mm7_1.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_1.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -5,6 +5,8 @@ */ //#include +#include + #include "MM7.h" #include "MapInfo.h" @@ -1518,13 +1520,14 @@ if ( result->uHotkey == v3 ) { v6 = result->uControlParam; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage((UIMessageType)result->uControlID, v6, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)result->uControlID; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ return result; } } @@ -2023,14 +2026,15 @@ } LABEL_26: v11 = v9->uControlParam; - if ( (signed int)v2 < 40 ) + /*if ( (signed int)v2 < 40 ) { pMessageQueue_50CBD0->pMessages[v2].eType = (UIMessageType)v9->uControlID; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v11; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = v1; v2 = pMessageQueue_50CBD0->uNumMessages + 1; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage((UIMessageType)v9->uControlID, v11, v1); goto LABEL_47; } if ( v26 != 38 ) @@ -2148,13 +2152,14 @@ } LABEL_56: v21 = v19->uControlParam; - if ( (signed int)v2 < 40 ) + /*if ( (signed int)v2 < 40 ) { pMessageQueue_50CBD0->pMessages[v2].eType = (UIMessageType)v19->uControlID; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v21; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = v1; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage((UIMessageType)v19->uControlID, v21, v1); return 1; } @@ -2360,7 +2365,7 @@ v77 = 0; //a2.y = v8->uAttributes & 2; if (pItemsTable->pItems[v8->uItemID].uEquipType == EQUIP_GOLD) - v77 = v8->uAdditionalValue; + v77 = v8->uSpecEnchantmentType; if ( uActiveCharacter ) { if (!v8->Identified()) @@ -2499,7 +2504,7 @@ //v23 = item_desc->uEquipType; if (item_desc->uEquipType == 14) { - v24 = _this->_bonus_type; + v24 = _this->uEncantmentType; if ( v24 ) goto LABEL_56; LABEL_65: @@ -2529,7 +2534,7 @@ v79.uFrameHeight = v73->uTextureHeight + v81 + 54; if ( (signed int)Str > (signed int)v79.uFrameHeight ) v79.uFrameHeight = (unsigned int)Str; - if ( _this->uAttributes & 8 && (_this->uAdditionalValue || _this->_bonus_type) ) + if ( _this->uAttributes & 8 && (_this->uSpecEnchantmentType || _this->uEncantmentType) ) v79.uFrameHeight += LOBYTE(v82->uFontHeight); v83 = 0; if ( LOBYTE(pFontArrus->uFontHeight) ) @@ -2596,7 +2601,7 @@ } else { - if ( _this->uAttributes & 8 && (_this->uAdditionalValue || _this->_bonus_type) ) + if ( _this->uAttributes & 8 && (_this->uSpecEnchantmentType || _this->uEncantmentType) ) { sub_493F79(&v67, _this->uExpireTime - pParty->uTimePlayed); strcpy(pTmpBuf, "Duration:"); @@ -2665,7 +2670,7 @@ sprintf(a1 + 200, v49, v54, v59); goto LABEL_65; } - v25 = _this->_bonus_type; + v25 = _this->uEncantmentType; if ( v25 ) { v60 = _this->_bonus_strength; @@ -2675,7 +2680,7 @@ } else { - v26 = _this->uAdditionalValue; + v26 = _this->uSpecEnchantmentType; if ( !v26 ) { if ( _this->uNumCharges ) @@ -3516,8 +3521,6 @@ return result; } - - //----- (0041F54A) -------------------------------------------------------- void __cdecl LoadActualSkyFrame() { @@ -3829,373 +3832,7 @@ (int)pGlobalTXT_LocalizationStrings[81]); } } -// 4E2BC8: using guessed type char byte_4E2BC8; -// 506F14: using guessed type int dword_506F14; -// 506F1C: using guessed type int dword_506F1C; -// 50765C: using guessed type int uTextureID_RestUI_restmain; -// 507CD4: using guessed type int 507CD4_RestUI_hourglass_anim_controller; - -//----- (0041FE71) -------------------------------------------------------- -int Chest::CanPlaceItemAt(signed int a1, int a2, unsigned int uChestID) -{ - int v3; // eax@1 - unsigned int v4; // eax@1 - Texture *v5; // ecx@1 - signed int v6; // eax@1 - signed int v7; // edi@3 - signed int v8; // eax@3 - int v9; // edi@3 - int v10; // ebx@5 - int v11; // esi@9 - int v12; // edx@10 - int v13; // ecx@11 - char *v14; // eax@12 - int v16; // [sp+Ch] [bp-Ch]@1 - signed int v17; // [sp+10h] [bp-8h]@1 - signed int v18; // [sp+14h] [bp-4h]@1 - - v17 = a1; - v3 = pChests[uChestID].uChestBitmapID; - v16 = pChestHeightsByType[v3]; - v18 = pChestWidthsByType[v3]; - v4 = pIcons_LOD->LoadTexture(pItemsTable->pItems[a2].pIconName, TEXTURE_16BIT_PALETTE); - v5 = (Texture *)(v4 != -1 ? (int)&pIcons_LOD->pTextures[v4] : 0); - v6 = (v4 != -1 ? pIcons_LOD->pTextures[v4].uTextureWidth : 24); - if ( v6 < 14 ) - v6 = 14; - v7 = v6 - 14; - v8 = v5->uTextureHeight; - v9 = (v7 >> 5) + 1; - if ( v8 < 14 ) - v8 = 14; - v10 = ((v8 - 14) >> 5) + 1; - if ( !areWeLoadingTexture ) - { - v5->Release(); - pIcons_LOD->_40F9C5(); - } - if ( v9 + v17 % v18 <= v18 && v10 + v17 / v18 <= v16 ) - { - v11 = 0; - if ( v10 <= 0 ) - return 1; - v12 = 0; - while ( 1 ) - { - v13 = 0; - if ( v9 > 0 ) - break; -LABEL_15: - v12 += v18; - ++v11; - if ( v11 >= v10 ) - return 1; - } - v14 = (char *)&pChests[0].pInventoryIndices[v17 + v12 + 2662 * uChestID]; - while ( !*(short *)v14 ) - { - ++v13; - v14 += 2; - if ( v13 >= v9 ) - goto LABEL_15; - } - } - return 0; -} -// 506128: using guessed type int areWeLoadingTexture; - -//----- (0041FF64) -------------------------------------------------------- -int Chest::_41FF64(unsigned int uChestID) -{ - unsigned int v1; // ecx@1 - signed int result; // eax@1 - int v3; // edx@1 - ItemGen *pItem; // ecx@2 - - v1 = uChestID; - result = 0; - v3 = pChestWidthsByType[pChests[v1].uChestBitmapID] * pChestHeightsByType[pChests[v1].uChestBitmapID]; - if ( v3 <= 0 ) - { -LABEL_5: - result = -1; - } - else - { - pItem = pChests[v1].mm7__vector_pItems; - while ( pItem->uItemID ) - { - ++result; - ++pItem; - if ( result >= v3 ) - goto LABEL_5; - } - } - return result; -} - -//----- (0041FFA2) -------------------------------------------------------- -int Chest::_41FFA2(int a1, ItemGen *a2, unsigned int uChestID) -{ - int v3; // eax@1 - ItemGen *v4; // edi@1 - int v5; // esi@1 - int result; // eax@11 - unsigned int v7; // eax@12 - int v8; // edx@12 - int v9; // ecx@12 - signed int v10; // eax@12 - signed int v11; // edi@14 - unsigned int v12; // esi@14 - int v13; // edi@16 - void *v14; // edi@21 - int v15; // edi@21 - int i; // ecx@21 - ItemGen *Src; // [sp+Ch] [bp-18h]@1 - signed int v18; // [sp+10h] [bp-14h]@2 - int v19; // [sp+14h] [bp-10h]@1 - int v20; // [sp+18h] [bp-Ch]@19 - signed int v21; // [sp+1Ch] [bp-8h]@1 - signed int v22; // [sp+20h] [bp-4h]@3 - int v23; // [sp+20h] [bp-4h]@19 - - v21 = 0; - v3 = pChests[uChestID].uChestBitmapID; - v4 = a2; - v5 = pChestWidthsByType[v3] * pChestHeightsByType[v3]; - Src = a2; - v19 = pChestWidthsByType[v3]; - if ( a1 == -1 ) - { - v18 = _41FF64(uChestID); - if ( v18 == -1 ) - return 0; - v22 = 0; - if ( v5 > 0 ) - { - while ( !Chest::CanPlaceItemAt(v22, v4->uItemID, (unsigned int)pChestWindow->ptr_1C) ) - { - ++v22; - if ( v22 >= v5 ) - goto LABEL_8; - } - v21 = v22; - } -LABEL_8: - if ( v22 == v5 ) - { - if ( uActiveCharacter ) - pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0); - return 0; - } - v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v4->uItemID].pIconName, TEXTURE_16BIT_PALETTE); - HIWORD(v8) = 0; - v9 = v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0; - v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); - if ( v10 < 14 ) - v10 = 14; - v11 = *(short *)(v9 + 26); - v12 = ((v10 - 14) >> 5) + 1; - if ( v11 < 14 ) - v11 = 14; - v13 = ((v11 - 14) >> 5) + 1; - if ( !areWeLoadingTexture ) - { - ((Texture *)v9)->Release(); - pIcons_LOD->_40F9C5(); - } - if ( v13 > 0 ) - { - v23 = 0; - v20 = v13; - do - { - if ( (signed int)v12 > 0 ) - { - v14 = &pChests[0].pInventoryIndices[v21 + v23 + 2662 * uChestID]; - LOWORD(v8) = -1 - v21; - v8 <<= 16; - LOWORD(v8) = -1 - v21; - memset32(v14, v8, v12 >> 1); - v15 = (int)((char *)v14 + 4 * (v12 >> 1)); - for ( i = v12 & 1; i; --i ) - { - *(short *)v15 = v8; - v15 += 2; - } - } - v23 += v19; - --v20; - } - while ( v20 ); - } - pChests[0].pInventoryIndices[v21 + 2662 * uChestID] = v18 + 1; - memcpy(&pChests[uChestID].mm7__vector_pItems[v18], Src, 0x24u); - result = v21 + 1; - } - else - { - result = 1; - } - return result; -} -// 506128: using guessed type int areWeLoadingTexture; - -//----- (0042013E) -------------------------------------------------------- -unsigned int Chest::PlaceItemAt(unsigned int a1, unsigned int uItemIdx, unsigned int uChestID) -{ - int v3; // esi@1 - unsigned int v4; // ebx@1 - int uItemID; // edi@1 - int v6; // edx@4 - unsigned int v7; // eax@5 - Texture *v8; // ecx@5 - signed int v9; // eax@5 - signed int v10; // edi@7 - unsigned int v11; // ebx@7 - int v12; // edi@9 - int v13; // edx@12 - void *v14; // edi@14 - int v15; // edi@14 - int i; // ecx@14 - unsigned int result; // eax@18 - __int16 v18; // [sp+Ch] [bp-10h]@1 - int v19; // [sp+10h] [bp-Ch]@11 - int v20; // [sp+14h] [bp-8h]@12 - unsigned int v21; // [sp+18h] [bp-4h]@1 - - v3 = 5324 * uChestID; - v21 = a1; - v4 = 5324 * uChestID + 36 * uItemIdx; - v18 = uItemIdx; - uItemID = *(unsigned int *)((char *)&pChests[0].mm7__vector_pItems[0].uItemID + v4); - pItemsTable->SetSpecialBonus((ItemGen *)((char *)pChests[0].mm7__vector_pItems + v4)); - if ( uItemID >= 135 && uItemID <= 159 && !*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) ) - { - v6 = rand() % 21 + 10; - *(int *)((char *)&pChests[0].mm7__vector_pItems[0].uNumCharges + v4) = v6; - *(&pChests[0].mm7__vector_pItems[0].uMaxCharges + v4) = v6; - } - v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE); - v8 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0); - v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); - if ( v9 < 14 ) - v9 = 14; - v10 = v8->uTextureHeight; - v11 = ((v9 - 14) >> 5) + 1; - if ( v10 < 14 ) - v10 = 14; - v12 = ((v10 - 14) >> 5) + 1; - if ( !areWeLoadingTexture ) - { - v8->Release(); - pIcons_LOD->_40F9C5(); - } - v19 = pChestWidthsByType[*(unsigned __int16 *)((char *)&pChests[0].uChestBitmapID + v3)]; - if ( v12 > 0 ) - { - v13 = 0; - v20 = v12; - do - { - if ( (signed int)v11 > 0 ) - { - v14 = &pChests[0].pInventoryIndices[v21 + v13 + 2662 * uChestID]; - LOWORD(v3) = -1 - v21; - v3 <<= 16; - LOWORD(v3) = -1 - v21; - memset32(v14, v3, v11 >> 1); - v15 = (int)((char *)v14 + 4 * (v11 >> 1)); - for ( i = v11 & 1; i; --i ) - { - *(short *)v15 = v3; - v15 += 2; - } - } - v13 += v19; - --v20; - } - while ( v20 ); - } - result = v21 + 2662 * uChestID; - pChests[0].pInventoryIndices[result] = v18 + 1; - return result; -} -// 506128: using guessed type int areWeLoadingTexture; - -//----- (00420284) -------------------------------------------------------- -char *Chest::_420284(unsigned int uChestID) -{ - int v1; // ebx@1 - unsigned int v2; // esi@1 - unsigned int v3; // esi@1 - int uChestArea; // edi@1 - int v5; // eax@2 - int v6; // ebx@11 - char *result; // eax@18 - char Dst[144]; // [sp+Ch] [bp-A0h]@1 - int v9; // [sp+9Ch] [bp-10h]@10 - unsigned int v10; // [sp+A0h] [bp-Ch]@1 - unsigned int v11; // [sp+A4h] [bp-8h]@8 - ItemGen *v12; // [sp+A8h] [bp-4h]@9 - - v1 = 0; - v2 = uChestID; - v10 = uChestID; - pRenderer->ClearZBuffer(0, 479); - v3 = v2; - uChestArea = pChestWidthsByType[pChests[v3].uChestBitmapID] * pChestHeightsByType[pChests[v3].uChestBitmapID]; - memset(Dst, 0, 0x90u); - if ( uChestArea > 0 ) - { - do - { - do - v5 = (unsigned __int8)rand(); - while ( v5 >= uChestArea ); - while ( Dst[v5] ) - { - ++v5; - if ( v5 == uChestArea ) - v5 = 0; - } - Dst[v5] = v1++; - } - while ( v1 < uChestArea ); - } - v11 = 0; - if ( uChestArea > 0 ) - { - v12 = pChests[v3].mm7__vector_pItems;//&pChests[v3].mm7__vector_pItems[0].uAttributes; - do - { - v9 = v12->uItemID; - if ( v9 ) - { - v6 = 0; - while ( !Chest::CanPlaceItemAt((unsigned __int8)Dst[v6], v9, v10) ) - { - ++v6; - if ( v6 >= uChestArea ) - break; - } - if(v6SetIdentified(); - } - } - ++v11; - ++v12; - } - while ( (signed int)v11 < uChestArea ); - } - result = (char *)&pChests[v3].uFlags; - pChests[v3].uFlags = pChests[v3].uFlags & 0xFFFB | 2; - return result; -} -// 420284: using guessed type char Dst[144]; + //----- (0042038D) -------------------------------------------------------- void __cdecl sub_42038D() @@ -4221,307 +3858,6 @@ } } -//----- (0042041E) -------------------------------------------------------- -bool Chest::Open(unsigned int uChestID) -{ - char *v1; // edi@5 - unsigned int v2; // eax@8 - GUIWindow *v3; // eax@15 - int v5; // edx@16 - int v6; // eax@16 - ODMFace *v7; // eax@19 - int v8; // edx@19 - int v9; // edi@19 - signed int v10; // ebx@19 - int v11; // ecx@19 - int v12; // eax@19 - BLVFace *v13; // eax@20 - int v14; // ebx@21 - int v15; // edi@21 - int v16; // ecx@22 - __int64 v17; // qax@22 - double v18; // st7@23 - double v19; // st6@23 - double v20; // st7@23 - int v21; // ecx@26 - char v22[12]; // ST4C_12@28 - unsigned int *v23; // edi@28 - unsigned __int16 v24; // di@28 - signed int v25; // ecx@28 - char *v26; // edx@29 - unsigned __int16 v27; // ax@32 - //LayingItem a1; // [sp+14h] [bp-B0h]@28 - int v29; // [sp+84h] [bp-40h]@16 - int v30; // [sp+88h] [bp-3Ch]@16 - int v31; // [sp+8Ch] [bp-38h]@16 - int v32; // [sp+90h] [bp-34h]@16 - float v33; // [sp+94h] [bp-30h]@23 - char *v34; // [sp+98h] [bp-2Ch]@5 - int v35; // [sp+9Ch] [bp-28h]@16 - Vec3_int_ pOut; // [sp+A0h] [bp-24h]@28 - int a4; // [sp+ACh] [bp-18h]@1 - int v38; // [sp+B0h] [bp-14h]@21 - int sRotX; // [sp+B4h] [bp-10h]@23 - float v40; // [sp+B8h] [bp-Ch]@23 - float v41; // [sp+BCh] [bp-8h]@23 - int sRotY; // [sp+C0h] [bp-4h]@8 - - a4 = uChestID; - if ( (uChestID & 0x80000000u) != 0 || (signed int)uChestID >= 20 ) - return 0; - ++pIcons_LOD->uTexturePacksCount; - if ( !pIcons_LOD->uNumPrevLoadedFiles ) - pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; - v1 = (char *)&pChests[uChestID].uFlags; - v34 = v1; - if ( !(*v1 & CHEST_ITEMS_PLACED) ) - Chest::_420284(uChestID); - if ( !uActiveCharacter ) - return 0; - *(float *)&sRotY = 0.0; - v2 = pMapStats->GetMapInfo(pCurrentMapName); - if ( !(*v1 & 1) || !v2 ) - goto LABEL_12; - if ( pPlayers[uActiveCharacter]->GetDisarmTrap() < 2 * pMapStats->pInfos[v2].LockX5 ) - { - v29 = 811; - v30 = 812; - v31 = 813; - v32 = 814; - v5 = rand() % 4; - v6 = dword_5B5920 >> 3; - v35 = v5; - if ( (dword_5B5920 & 7) == OBJECT_Decoration) - { - v16 = v6; - v14 = pLevelDecorations[v6].vPosition.x; - v38 = pLevelDecorations[v6].vPosition.y; - v17 = pDecorationList->pDecorations[pLevelDecorations[v6].uDecorationDescID].uDecorationHeight; - v15 = pLevelDecorations[v16].vPosition.z + (((signed int)v17 - HIDWORD(v17)) >> 1); - } - else - { - if ( (dword_5B5920 & 7) != OBJECT_BModel) - goto LABEL_12; - if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) - { - v7 = &pOutdoor->pBModels[dword_5B5920 >> 9].pFaces[(dword_5B5920 >> 3) & 0x3F]; - v8 = v7->pBoundingBox.y1; - v9 = v7->pBoundingBox.z2; - v10 = v7->pBoundingBox.x1 + v7->pBoundingBox.x2; - v11 = v7->pBoundingBox.y2; - v12 = v7->pBoundingBox.z1; - } - else - { - v13 = &pIndoor->pFaces[v6]; - v8 = v13->pBounding.y1; - v9 = v13->pBounding.z2; - v10 = v13->pBounding.x1 + v13->pBounding.x2; - v11 = v13->pBounding.y2; - v12 = v13->pBounding.z1; - } - v14 = v10 >> 1; - v38 = (v8 + v11) >> 1; - v15 = (v12 + v9) >> 1; - } - v18 = (double)pParty->vPosition.x - (double)v14; - *(float *)&a4 = v18; - v19 = (double)pParty->vPosition.y - (double)v38; - v33 = v19; - v41 = (double)pParty->sEyelevel + (double)pParty->vPosition.z - (double)v15; - *(float *)&sRotY = v19 * v19; - *(float *)&sRotX = v18 * v18; - v20 = sqrt(v41 * v41 + *(float *)&sRotX + *(float *)&sRotY); - v40 = v20; - if ( v20 <= 1.0 ) - { - *(float *)&sRotX = 0.0; - *(float *)&sRotY = 0.0; - } - else - { - sRotY = (signed __int64)sqrt(*(float *)&sRotX + *(float *)&sRotY); - sRotX = stru_5C6E00->Atan2((signed __int64)*(float *)&a4, (signed __int64)v33); - sRotY = stru_5C6E00->Atan2(sRotY, (signed __int64)v41); - } - v21 = 256; - if ( v40 < 256.0 ) - v21 = (signed __int64)v40 / 4; - *(int *)&v22[8] = v15; - *(_QWORD *)v22 = __PAIR__(v38, v14); - Vec3_int_::Rotate(v21, sRotX, sRotY, *(Vec3_int_ *)v22, &pOut.x, &pOut.z, &pOut.y); - v23 = (unsigned int *)(&v29 + v35); - sub_42F7EB_DropItemAt(*v23, pOut.x, pOut.z, pOut.y, 0, 1, 0, 0x30u, 0); - - LayingItem a1; // [sp+14h] [bp-B0h]@28 - //LayingItem::LayingItem(&a1); - - a1.stru_24.Reset(); - v24 = *(short *)v23; - v25 = 0; - a1.field_50 = 0; - a1.field_4C = 0; - a1.field_48 = 0; - a1.field_54 = 0; - a1.uItemType = v24; - if ( (signed int)pObjectList->uNumObjects <= 0 ) - { -LABEL_32: - v27 = 0; - } - else - { - v26 = (char *)&pObjectList->pObjects->uObjectID; - while ( v24 != *(short *)v26 ) - { - ++v25; - v26 += 56; - if ( v25 >= (signed int)pObjectList->uNumObjects ) - goto LABEL_32; - } - v27 = v25; - } - a1.uObjectDescID = v27; - a1.vPosition.y = pOut.z; - a1.vPosition.x = pOut.x; - a1.vPosition.z = pOut.y; - a1.uSoundID = 0; - a1.uAttributes = 48; - a1.uSectorID = pIndoor->GetSector(pOut.x, pOut.z, pOut.y); - a1.uSpriteFrameID = 0; - a1.field_58_pid = 0; - a1.field_5C = 0; - a1.uFacing = 0; - a1.Create(0, 0, 0, 0); - pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); - a1._438E35(); - *v34 &= 0xFEu; - if ( uActiveCharacter && !qword_A750D8 && !dword_507CD8 ) - { - qword_A750D8 = 256i64; - word_A750E0 = 5; - word_A750E2 = uActiveCharacter; - } - pIcons_LOD->_4114F2(); - dword_507CD8 = 0; - return 0; - } - *v1 &= 0xFEu; - sRotY = 1; -LABEL_12: - pAudioPlayer->StopChannels(-1, -1); - pAudioPlayer->PlaySound((SoundID)208, 0, 0, -1, 0, 0, 0, 0); - if ( *(float *)&sRotY != 0.0 ) - { - if ( !dword_507CD8 ) - pPlayers[uActiveCharacter]->PlaySound(SPEECH_4, 0); - } - dword_507CD8 = 0; - v3 = GUIWindow::Create(0, 0, 640u, 480u, WINDOW_Chest, a4, 0); - pGUIWindow_CurrentMenu = v3; - pChestWindow = v3; - pBtn_ExitCancel = v3->CreateButton( - 0x1D7u, - 0x1BDu, - 0xA9u, - 0x23u, - 1, - 0, - 0x71u, - 0, - 0, - pGlobalTXT_LocalizationStrings[79],// Exit - (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), - 0); - pChestWindow->CreateButton(7u, 8u, 460u, 343u, 1, 0, 0xCu, 0, 0, "", 0); - pCurrentScreen = SCREEN_CHEST; - pEventTimer->Pause(); - return 1; -} - -//----- (0042092D) -------------------------------------------------------- -void Chest::DrawChestUI(unsigned int uChestID) -{ - Render *v1; // edi@1 - unsigned int v2; // ebx@1 - unsigned int v3; // ebx@1 - int v4; // eax@1 - unsigned int v5; // eax@1 - int v6; // ecx@3 - unsigned int v7; // eax@4 - Texture *v8; // esi@4 - signed int v9; // ecx@4 - signed int v10; // edx@4 - signed int v11; // eax@4 - int v12; // eax@6 - int v13; // eax@6 - unsigned int v14; // ST34_4@8 - int v15; // edi@8 - int *v16; // [sp+Ch] [bp-28h]@1 - int v17; // [sp+10h] [bp-24h]@4 - int v18; // [sp+14h] [bp-20h]@1 - signed int v19; // [sp+18h] [bp-1Ch]@1 - int v20; // [sp+1Ch] [bp-18h]@1 - signed int v21; // [sp+20h] [bp-14h]@1 - char *v22; // [sp+2Ch] [bp-8h]@2 - signed int v23; // [sp+30h] [bp-4h]@1 - - v1 = pRenderer; - v2 = uChestID; - v16 = pRenderer->pActiveZBuffer; - pRenderer->ClearZBuffer(0, 479); - v3 = v2; - v4 = pChests[v3].uChestBitmapID; - v20 = pChestSmthn1ByType[v4]; - v18 = pChestSmthn2ByType[v4]; - v21 = pChestWidthsByType[v4]; - v19 = pChestHeightsByType[v4]; - sprintf(pTmpBuf, "chest%02d", pChestList->pChests[pChests[v3].uChestBitmapID].uTextureID); - v5 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE); - pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0)); - v23 = 0; - if ( v21 * v19 > 0 ) - { - v22 = (char *)pChests[v3].pInventoryIndices; - do - { - v6 = *(short *)v22; - if ( v6 > 0 ) - { - v17 = v18 + 32 * v23 / v19; - v7 = pIcons_LOD->LoadTexture( - pItemsTable->pItems[*(int *)((char *)&pOtherOverlayList->pOverlays[49].field_4 + 36 * v6 + v3 * 5324)].pIconName, - TEXTURE_16BIT_PALETTE); - v8 = (Texture *)(v7 != -1 ? &pIcons_LOD->pTextures[v7] : 0); - v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); - v10 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureHeight : 26); - v11 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24); - if ( v9 < 14 ) - v11 = 14; - v12 = v11 - 14; - LOBYTE(v12) = v12 & 0xE0; - v13 = v12 + 32; - if ( (signed int)v8->uTextureHeight < 14 ) - v10 = 14; - v14 = v20 + 32 * v23 % v21 + ((v13 - v9) >> 1); - v15 = v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1); - pRenderer->DrawTextureTransparent( - v14, - v17 + ((((v10 - 14) & 0xFFFFFFE0) - v8->uTextureHeight + 32) >> 1), - v8); - sub_40F92A(&v16[v14 + pSRZBufferLineOffsets[v15]], v8, v23 + 1); - v1 = pRenderer; - } - ++v23; - v22 += 2; - } - while ( v23 < v21 * v19 ); - } - pRenderer->DrawTextureIndexed(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, - (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0)); -} - //----- (00420B13) -------------------------------------------------------- void __fastcall sub_420B13(int a1, int a2) { @@ -4747,7 +4083,7 @@ v5 = 5324 * (int)v0 + 36 * v4; if ( pItemsTable->pItems[*(unsigned int *)((char *)&pChests[0].mm7__vector_pItems[0].uItemID + v5)].uEquipType == 18 ) { - party_finds_gold(*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uAdditionalValue + v5), 0); + party_finds_gold(*(int *)((char *)&pChests[0].mm7__vector_pItems[0].uSpecEnchantmentType + v5), 0); viewparams->bRedrawGameUI = 1; } else @@ -4918,7 +4254,7 @@ uLastPointedObjectID = pMouse->uPointingObjectID; return; } - v22 = _444732_GetEventHintString(v25); + v22 = GetEventHintString(v25); if ( !v22 ) //goto _return; { @@ -4956,7 +4292,7 @@ { v21 = pOutdoor->pBModels[(signed int)(unsigned __int16)v18 >> 9].pFaces[v19 & 0x3F].sCogTriggeredID; //goto LABEL_71; - if ( !v21 || (v22 = _444732_GetEventHintString(v21)) == 0 ) + if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) //goto LABEL_73; { pMouse->uPointingObjectID = 0; @@ -4993,7 +4329,7 @@ { v21 = pIndoor->pFaceExtras[pFace->uFaceExtraID].uEventID; //LABEL_71: - if ( !v21 || (v22 = _444732_GetEventHintString(v21)) == 0 ) + if ( !v21 || (v22 = GetEventHintString(v21)) == 0 ) //goto LABEL_73; { pMouse->uPointingObjectID = 0; @@ -5207,13 +4543,14 @@ return; } v38 = pButton->uControlParam; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = pMessageType3; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v38; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(pMessageType3, v38, 0); //goto LABEL_131; uLastPointedObjectID = 1; return; @@ -5241,11 +4578,12 @@ v36 = pButton->uControlParam; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = pMessageType2; + pMessageQueue_50CBD0->AddMessage(pMessageType2, v36, 0); + /*pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = pMessageType2; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v36; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; //goto LABEL_27; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ v13 = pButton->pButtonName; sub_41C0B8_set_status_string(v13); uLastPointedObjectID = 1; @@ -5332,14 +4670,15 @@ if ( pMessageType1 ) { v12 = pButton->uControlParam; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(pMessageType1, v12, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = pMessageType1; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v12; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; //LABEL_27: ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ } //LABEL_28: v13 = pButton->pButtonName; @@ -5368,13 +4707,14 @@ if ( pMessageType1 ) { v12 = pButton->uControlParam; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(pMessageType1, v12, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = pMessageType1; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v12; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ } v13 = pButton->pButtonName; sub_41C0B8_set_status_string(v13); @@ -5902,7 +5242,7 @@ v23 = pLayingItems[v21].stru_24.uItemID; if ( pItemsTable->pItems[v23].uEquipType == 18 ) { - party_finds_gold(v22->uAdditionalValue, 0); + party_finds_gold(v22->uSpecEnchantmentType, 0); viewparams->bRedrawGameUI = 1; } else @@ -5916,7 +5256,7 @@ if ( !pParty->AddItem(v22) ) pParty->SetHoldingItem(v22); } - LayingItem::_42F933(a2.y); + LayingItem::OnItemPickup(a2.y); return; } goto LABEL_13; @@ -6059,13 +5399,15 @@ } return; } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) return; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)161; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v18; LABEL_42: *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; + return;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_StartNPCDialogue, v18, 0); return; } if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 ) @@ -6073,11 +5415,12 @@ pTurnEngine->field_18 |= 8u; return; } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)23; goto LABEL_41; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); } else { @@ -6087,13 +5430,14 @@ return; } if ( uActiveCharacter - && sub_427769_spell(pPlayers[uActiveCharacter]->uQuickSpell) - && (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + && sub_427769_spell(pPlayers[uActiveCharacter]->uQuickSpell)) { + pMessageQueue_50CBD0->AddMessage(UIMSG_19, 0, 0); + /*&& (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)25; LABEL_41: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; - goto LABEL_42; + goto LABEL_42;*/ } } } @@ -6115,21 +5459,16 @@ // 4E28F8: using guessed type int pCurrentScreen; //----- (004226EF) -------------------------------------------------------- -void __fastcall SetUserInterface(int a1, bool bReplace) +void SetUserInterface(PartyAlignment align, bool bReplace) { - int v2; // ecx@2 unsigned int v3; // eax@7 unsigned __int16 v4; // dx@7 unsigned __int16 v5; // cx@7 unsigned __int16 v6; // [sp-4h] [bp-14h]@7 - if ( a1 ) - { - v2 = a1 - 1; - if ( v2 ) + + if (align == PartyAlignment_Evil) { - if ( v2 != 1 ) - return; if ( bReplace ) { pTexture_RightFrame->Reload("ib-r-C.pcx"); @@ -6213,7 +5552,7 @@ v6 = 0; v5 = 10; } - else + else if (align == PartyAlignment_Neutral) { if ( bReplace ) { @@ -6309,8 +5648,7 @@ v5 = 230; v6 = 193; } - } - else + else if (align == PartyAlignment_Good) { if ( bReplace ) { @@ -6361,6 +5699,8 @@ v4 = 225; v6 = 255; } + else assert(false); + uGameUIFontMain = v3; uGameUIFontShadow = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(v5, v4, v6); } @@ -6932,7 +6272,6 @@ return v55; } - //----- (00424579) -------------------------------------------------------- int __fastcall sub_424579(int uFaceID, stru320 *a2) { diff -r e65d75206263 -r 91e1ba340f39 mm7_2.cpp --- a/mm7_2.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_2.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -222,13 +222,14 @@ if ( v1 <= 0 ) { LABEL_8: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ return; } if ( v1 > pParty->uNumGold ) @@ -328,13 +329,14 @@ if ( !v6 ) { LABEL_17: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ return; } if ( v6 > pParty->uNumGold ) @@ -415,7 +417,7 @@ // F8B19C: using guessed type int dword_F8B19C; //----- (004B8285) -------------------------------------------------------- -void __cdecl sub_4B8285_prolly_draw_arcomage_result()//Maybe TavernDialogue +void __cdecl TavernDialog() { GUIWindow *v0; // ebx@1 Player *v1; // edi@1 @@ -638,12 +640,13 @@ pVideoPlayer->Unload(); window_SpeakInHouse->Release(); window_SpeakInHouse = 0; + if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; - pMessageQueue_50CBD0->pMessages[0].eType = (UIMessageType)409; + pMessageQueue_50CBD0->pMessages[0].eType = UIMSG_OpenRestUI; pMessageQueue_50CBD0->pMessages[0].param = v27; pMessageQueue_50CBD0->pMessages[0].field_8 = 1; -LABEL_51: +//LABEL_51: ++pMessageQueue_50CBD0->uNumMessages; return; } @@ -754,12 +757,9 @@ HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 3); v5 = 1; LABEL_43: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) - return; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v5; - *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - goto LABEL_51; + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v5, 0); + return; + //goto LABEL_51; } } ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); @@ -961,7 +961,7 @@ if ( v2 <= 41 ) { v4 = word_4F0576[v2]; - v9 = 22; + v9 = 22; //misc goto LABEL_12; } if ( v2 <= 53 ) @@ -969,19 +969,19 @@ if ( v1 >= 6 ) { v4 = word_4F0578[v2]; - v9 = 45; + v9 = 45; //reagent LABEL_12: v5 = v9; LABEL_13: - pItemsTable->GenerateItem(v4, v5, (ItemGen *)&pParty->field_777C[9 * (v1 + 12 * v2)]); + pItemsTable->GenerateItem(v4, v5, (ItemGen *)&pParty->field_777C[v2][v1]);//9 * (v1 + 12 * v2)]); v0 = window_SpeakInHouse; - pParty->field_777C[9 * (v1 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 5] = 1; + pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v1].uAttributes = 1; //identified goto LABEL_14; } - auto _t = (ItemGen *)&pParty->field_777C[9 * (v1 + 12 * v2)]; + auto _t = (ItemGen *)&pParty->field_777C[v2][v1]; _t->Reset(); v0 = window_SpeakInHouse; - pParty->field_777C[9 * (v1 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] = 220; + pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v1].uItemID = 220; //potion bottle } LABEL_14: v2 = (signed int)v0->ptr_1C; @@ -992,8 +992,8 @@ } v3 = 5 * v2; v2 = (signed int)v0->ptr_1C; - v4 = word_4F03FE[v3]; - v5 = word_4F0400[5 * v2 + rand() % 4]; + v4 = word_4F0404[v3 - 4]; + v5 = word_4F0404[5 * v2 + rand() % 4 - 2]; goto LABEL_13; } LABEL_15: @@ -1005,7 +1005,7 @@ //----- (004B910F) -------------------------------------------------------- -char *__cdecl _4B910F_shop_interaction() +char *__cdecl WeaponShopDialog() { Player *v0; // ebx@1 char *result; // eax@6 @@ -1486,52 +1486,53 @@ v3 = 0; if ( dword_F8B19C == 2 ) { - //v48 = 0; + v48 = 0; v108 = 0; - int a = 0; - //do - for (int i = 0; i < 6; i++) - { - if ( pParty->field_777C[9 * (i + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) - { - v49 = word_F8B158[i]; - v50 = dword_F8B168[i]; + v109 = 0; + do + { + // if ( pParty->field_777C[9 * (int)&v48[3 * (unsigned int)window_SpeakInHouse->ptr_1C]] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][(int)v48].uItemID); + { + v49 = word_F8B158[(signed int)v48]; + v50 = dword_F8B168[(signed int)v48]; v49 += 30; v51 = 60 - ((signed int)v50->uTextureWidth >> 1); pRenderer->DrawTextureTransparent(v51 + v108, v49, v50); sub_40F92A( &pRenderer->pActiveZBuffer[v51 + v108 + 640 * v49], - dword_F8B168[a], - a++); - i = a; + dword_F8B168[(signed int)v109], + (int)((char *)v109 + 1)); + v48 = v109; } v108 += 70; - i++; - a = i; - } - //while ( (signed int)v48 < 6 ); + v48 = (const char **)((char *)v48 + 1); + v109 = v48; + } + while ( (signed int)v48 < 6 ); } else { - //v109 = 0; + v109 = 0; v108 = 0; - //do - for (int i = 0; i < 6; i++) - { - if ( pParty->field_C59C[9 * (i + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) - { - v52 = word_F8B158[i] + 30; - v53 = dword_F8B168[i]; + do + { + // if ( pParty->field_C59C[9 * (int)&v109[3 * (unsigned int)window_SpeakInHouse->ptr_1C] + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)v109].uItemID) + { + v52 = word_F8B158[(signed int)v109] + 30; + v53 = dword_F8B168[(signed int)v109]; v54 = 60 - ((signed int)v53->uTextureWidth >> 1); - pRenderer->DrawTextureTransparent(v54 + v108, word_F8B158[i] + 30, v53); - sub_40F92A(&pRenderer->pActiveZBuffer[v54 + v108 + 640 * v52], - dword_F8B168[i], - i++); - } - i++; + pRenderer->DrawTextureTransparent(v54 + v108, word_F8B158[(signed int)v109] + 30, v53); + sub_40F92A( + &pRenderer->pActiveZBuffer[v54 + v108 + 640 * v52], + dword_F8B168[(signed int)v109], + (int)((char *)v109 + 1)); + } + v109 = (const char **)((char *)v109 + 1); v108 += 70; } - //while ( (signed int)v109 < 6 ); + while ( (signed int)v109 < 6 ); } result = (char *)sub_4B1784_check_if_player_concious__draw_warning_else_mess_with_dlg_win(); if ( result ) @@ -1543,7 +1544,7 @@ v106.x = 0; do { - if ( pParty->field_777C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID);//9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) ++v106.x; ++v55; } @@ -1553,7 +1554,8 @@ { do { - if ( pParty->field_C59C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + // if ( pParty->field_C59C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID) ++v106.x; ++v55; } @@ -1582,10 +1584,10 @@ v60 = (pRenderer->pActiveZBuffer[(int)result] & 0xFFFF) - 1; v106.x = v60; v61 = (int)window_SpeakInHouse->ptr_1C; - v62 = 9 * (v60 + 12 * v61); - v63 = (ItemGen *)&pParty->field_777C[v62]; + // v62 = 9 * (v60 + 12 * v61); + v63 = (ItemGen *)&pParty->field_777C[(int)v61][v60]; if ( dword_F8B19C != 2 ) - v63 = (ItemGen *)&pParty->field_C59C[v62 + 724]; + v63 = &pParty->Recipes_Item[(int)v61][v60];//v63 = (ItemGen *)&pParty->field_C59C[v62 + 724]; if ( !v56 || !Str ) { v85 = 0; @@ -1620,7 +1622,7 @@ //----- (004B9CC6) -------------------------------------------------------- -POINT *__cdecl sub_4B9CC6() +POINT *__cdecl AlchemistDialog() { Player *v0; // ebx@1 POINT *result; // eax@7 @@ -2030,7 +2032,8 @@ { do { - if ( pParty->field_777C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + // if ( pParty->field_777C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID); { v46 = dword_F8B168[v114]; v47 = 152 - v46->uTextureHeight; @@ -2060,7 +2063,8 @@ v114 = 0; do { - if ( pParty->field_777C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] ) + // if ( pParty->field_777C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v114+1].uItemID); { v50 = dword_F8B168[v114 + 6]; v51 = 308 - v50->uTextureHeight; @@ -2092,7 +2096,8 @@ { do { - if ( pParty->field_C59C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + //if ( pParty->field_C59C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v114].uItemID) { v54 = dword_F8B168[v114]; v55 = 152 - v54->uTextureHeight; @@ -2122,7 +2127,8 @@ v114 = 0; do { - if ( pParty->field_C59C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 778] ) + // if ( pParty->field_C59C[9 * (v114 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 778] ) //weak + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)v114].uItemID) //not itemid { v58 = dword_F8B168[v114 + 6]; v59 = 308 - v58->uTextureHeight; @@ -2159,7 +2165,8 @@ { do { - if ( pParty->field_777C[9 * (v62 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + // if ( pParty->field_777C[9 * (v62 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID); ++v109; ++v62; } @@ -2169,7 +2176,8 @@ { do { - if ( pParty->field_C59C[9 * (v62 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + //if ( pParty->field_C59C[9 * (v62 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v62].uItemID) ++v109; ++v62; } @@ -2202,10 +2210,10 @@ v67 = (pRenderer->pActiveZBuffer[(int)result] & 0xFFFF) - 1; v109 = v67; v68 = (int)window_SpeakInHouse->ptr_1C; - v69 = 9 * (v67 + 12 * v68); - v70 = (ItemGen *)&pParty->field_777C[v69]; + // v69 = 9 * (v67 + 12 * v68); + v70 = (ItemGen *)&pParty->field_777C[v68][v67]; if ( dword_F8B19C != 2 ) - v70 = (ItemGen *)&pParty->field_C59C[v69 + 724]; + v70 = &pParty->Recipes_Item[(int)v68][v67];//v70 = (ItemGen *)&pParty->field_C59C[v69 + 724]; if ( !v63 || !Str ) { v93 = 0; @@ -2232,7 +2240,7 @@ //----- (004BA928) -------------------------------------------------------- -void __cdecl sub_4BA928() +void __cdecl ArmorShopDialog() { Player *v0; // ebx@1 signed int v1; // esi@8 @@ -2409,7 +2417,8 @@ v93 = 0; do { - if ( pParty->field_C59C[9 * (v93 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + // if ( pParty->field_C59C[9 * (v93 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v93].uItemID) ++v149; ++v93; } @@ -2424,9 +2433,9 @@ --v149; v96 = window_SpeakInHouse->ptr_1C; v97 = uActiveCharacter - 1; - v98 = (ItemGen *)&pParty->field_C59C[9 * (v95 - 1 + 12 * (int)v96) + 724]; + // v98 = (ItemGen *)&pParty->field_C59C[9 * (v95 - 1 + 12 * (int)v96) + 724]; v99 = _this->_490EEE( - (ItemGen *)&pParty->field_C59C[9 * (v95 - 1 + 12 * (int)v96) + 724], + &pParty->Recipes_Item[(int)v96][v95-1],// (ItemGen *)&pParty->field_C59C[9 * (v95 - 1 + 12 * (int)v96) + 724], 2, (int)window_SpeakInHouse->ptr_1C, 2); @@ -2440,7 +2449,8 @@ v153 = 0; do { - if ( pParty->field_C59C[9 * (v104 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + //if ( pParty->field_C59C[9 * (v104 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v104].uItemID) { v105 = dword_F8B168[v104]; if ( v104 >= 4 ) @@ -2627,7 +2637,8 @@ v153 = 0; do { - if ( pParty->field_777C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + // if ( pParty->field_777C[9 * (v55 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v55].uItemID); { v56 = dword_F8B168[v55]; if ( v55 >= 4 ) @@ -2661,7 +2672,8 @@ v153 = 0; do { - if ( (char *)pParty->field_C59C[9 * (v61 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] != v11 ) + // if ( (char *)pParty->field_C59C[9 * (v61 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] != v11 ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v61].uItemID) { v62 = dword_F8B168[v61]; if ( v61 >= 4 ) @@ -2697,7 +2709,8 @@ { do { - if ( (char *)pParty->field_777C[9 * (v68 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] != v11 ) + // if ( (char *)pParty->field_777C[9 * (v68 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] != v11 ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v68].uItemID); ++v149; ++v68; } @@ -2707,7 +2720,8 @@ { do { - if ( (char *)pParty->field_C59C[9 * (v68 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] != v11 ) + // if ( (char *)pParty->field_C59C[9 * (v68 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] != v11 ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][(signed int)v68].uItemID) ++v149; ++v68; } @@ -2739,7 +2753,7 @@ if ( dword_F8B19C == 2 ) v77 = (ItemGen *)&pParty->field_777C[v76]; else - v77 = (ItemGen *)&pParty->field_C59C[v76 + 724]; + v77 = &pParty->Recipes_Item[(int)75][v74-1];//(ItemGen *)&pParty->field_C59C[v76 + 724]; if ( v69 == (short)v11 || Str == v11 ) { v124 = (__int64 *)v11; @@ -2967,13 +2981,14 @@ { if ( a1 == 41 ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ dword_50C9DC = 195; ptr_50C9E0 = GetNPCData(uDialogue_SpeakingActorNPC_ID); return 0; @@ -3468,13 +3483,14 @@ pParty->sRotationY = 512; pParty->sRotationX = 0; pParty->uFallSpeed = 0; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); v2 = pParty->pPlayers; do { @@ -3681,28 +3697,19 @@ //----- (004BCA33) -------------------------------------------------------- -GUIButton *__cdecl sub_4BCA33() +GUIButton *__cdecl UI_CreateEndConversationButton() { pDialogueWindow->Release(); - pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x159u, WINDOW_MainMenu, 0, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton( - 0x1D7u, - 0x1BDu, - 0xA9u, - 0x23u, - 1, - 0, - 0x71u, - 0, - 0, - pGlobalTXT_LocalizationStrings[74], - (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), + pDialogueWindow = GUIWindow::Create(0, 0, 640, 345, WINDOW_MainMenu, 0, 0); + pBtn_ExitCancel = pDialogueWindow->CreateButton( 471, 445, 169, 35, 1, 0, 0x71u, 0, 0, + pGlobalTXT_LocalizationStrings[74], //"End Conversation" + (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : NULL), 0); - return pDialogueWindow->CreateButton(8u, 8u, 0x1C2u, 0x140u, 1, 0, 0x51u, 0, 0, "", 0); + return pDialogueWindow->CreateButton(8, 8, 450, 320, 1, 0, 0x51u, 0, 0, "", 0); } //----- (004BCACC) -------------------------------------------------------- -void __fastcall sub_4BCACC_bounties(signed int a1)//Shop_MsgUI +void __fastcall sub_4BCACC_bounties(signed int a1) { unsigned int v1; // edi@1 //signed int v2; // ebx@1 @@ -4092,12 +4099,12 @@ { case 96: pDialogueWindow->eWindowType = WINDOW_MainMenu; - sub_4BCA33(); + UI_CreateEndConversationButton(); sub_4B3703((void *)dword_F8B198); break; case 101: pDialogueWindow->eWindowType = WINDOW_MainMenu; - sub_4BCA33(); + UI_CreateEndConversationButton(); sub_4B3A72(dword_F8B198); break; case 102: @@ -4107,13 +4114,14 @@ dword_F8B19C = 103; break; case 104: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)29; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = v1; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_PlayArcomage, v1, v1); dword_F8B19C = 104; break; } @@ -4183,7 +4191,7 @@ if ( a1 == 94 ) { pDialogueWindow->eWindowType = WINDOW_MainMenu; - sub_4BCA33(); + UI_CreateEndConversationButton(); sub_4B3AD4(dword_F8B198); } } @@ -4222,7 +4230,7 @@ { do { - v45 = pParty->field_777C[9 * (v43 + 12 * (int)v42)]; + v45 = pParty->field_777C[(int)v42][v43].uItemID; if ( v45 ) { v46 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v45].pIconName, TEXTURE_16BIT_PALETTE); @@ -4245,7 +4253,8 @@ { do { - if ( pParty->field_777C[9 * (v48 + 12 * (int)v47)] ) + // if ( pParty->field_777C[9 * (v48 + 12 * (int)v47)] ) + if ( pParty->field_777C[(int)v47][v48].uItemID); { v49 = rand(); v8 = window_SpeakInHouse; @@ -4265,7 +4274,8 @@ { do { - v50 = pParty->field_C59C[9 * (v43 + 12 * (int)v42) + 724]; + //v50 = pParty->field_C59C[9 * (v43 + 12 * (int)v42) + 724]; + v50=pParty->Recipes_Item[(unsigned int)v42][(signed int)v43].uItemID; if ( v50 ) { v51 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v50].pIconName, TEXTURE_16BIT_PALETTE); @@ -4288,7 +4298,8 @@ { do { - if ( pParty->field_C59C[9 * (v53 + 12 * (int)v52) + 724] ) + // if ( pParty->field_C59C[9 * (v53 + 12 * (int)v52) + 724] ) + if (pParty->Recipes_Item[(unsigned int)v52][v53].uItemID) { v54 = rand(); v8 = window_SpeakInHouse; @@ -4318,7 +4329,7 @@ pKeyActionMap->ResetKeys(); _5C3420_pDecoration = 0; ptr_F8B1E8 = 0; - if ( array_5913D8[6] ) + if ( pDialogueNPCCount ) { v0 = dword_F8B19C; if ( dword_F8B19C != 2 @@ -4336,7 +4347,7 @@ { if ( v0 == -1 ) { - _4B4224_UpdateNPCTopics((int)((char *)array_5913D8[6] - 1)); + _4B4224_UpdateNPCTopics((int)((char *)pDialogueNPCCount - 1)); LABEL_33: pVideoPlayer->_4BF5B2(); return 1; @@ -4345,7 +4356,7 @@ { if ( v0 == 3 || v0 == 5 || v0 == 4 ) { - sub_4BCA33(); + UI_CreateEndConversationButton(); dword_F8B19C = 94; sub_4B3AD4(dword_F8B198); } @@ -4360,17 +4371,17 @@ return 1; } pVideoPlayer->_4BF5B2(); - sub_4BCA33(); + UI_CreateEndConversationButton(); dword_F8B19C = 101; sub_4B3A72(dword_F8B198); } return 1; } pVideoPlayer->_4BF5B2(); - sub_4BCA33(); + UI_CreateEndConversationButton(); goto LABEL_28; } - array_5913D8[6] = 0; + pDialogueNPCCount = 0; pDialogueWindow->Release(); dword_F8B19C = 0; pDialogueWindow = 0; @@ -4385,7 +4396,7 @@ v3 = byte_591180; do { - array_5913D8[v2 + 7] = (NPCData *)window_SpeakInHouse->CreateButton(*(&pNPCPortraits_x + v2 + 6 * v1 - 6), *(&pNPCPortraits_y + v2 + 6 * v1 - 6), + HouseNPCData[v2 + 7] = (NPCData *)window_SpeakInHouse->CreateButton(pNPCPortraits_x[v1 - 1][v2], pNPCPortraits_y[v1 - 1][v2], 0x3Fu, 0x49u, 1, 0, 0x19Au, v2, 0, v3, 0, 0, 0); v1 = uNumDialogueNPCPortraits; ++v2; @@ -4598,16 +4609,16 @@ if ( !v29 ) return; v30 = window_SpeakInHouse->ptr_1C; - v31 = 9 * (v29 - 1 + 12 * (int)v30); + // v31 = 9 * (v29 - 1 + 12 * (int)v30); if ( dword_F8B19C == 2 ) { - v32 = (ItemGen *)&pParty->field_777C[v31]; - _this = (ItemGen *)&pParty->field_777C[v31]; + v32 = (ItemGen *)&pParty->field_777C[(int)v30][v29]; + _this = (ItemGen *)&pParty->field_777C[(int)v30][v29]; } else { - _this = (ItemGen *)&pParty->field_C59C[v31 + 724]; - v32 = (ItemGen *)&pParty->field_C59C[v31 + 724]; + _this =&pParty->Recipes_Item[(int)v30][v29-1]; //(ItemGen *)&pParty->field_C59C[v31 + 724]; + v32 = &pParty->Recipes_Item[(int)v30][v29-1];//(ItemGen *)&pParty->field_C59C[v31 + 724]; } //v33 = p2DEvents_minus1__20[13 * (signed int)v30]; v33 = p2DEvents[(signed int)v30 - 1].fPriceMultiplier; @@ -5208,24 +5219,28 @@ } if ( v15 ) { - if ( (signed int)result < 40 ) - { - pMessageQueue_50CBD0->pMessages[result].eType = (UIMessageType)132; + /*if ( (signed int)result < 40 ) + { + pMessageQueue_50CBD0->pMessages[result].eType = UIMSG_Quit; goto LABEL_42; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Quit, 1, 0); + goto LABEL_43; } else { - if ( (signed int)result < 40 ) - { - pMessageQueue_50CBD0->pMessages[result].eType = (UIMessageType)197; + pMessageQueue_50CBD0->AddMessage(UIMSG_ShowFinalWindow, 1, 0); + goto LABEL_43; + /*if ( (signed int)result < 40 ) + { + pMessageQueue_50CBD0->pMessages[result].eType = UIMSG_C5; LABEL_42: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; ++pMessageQueue_50CBD0->uNumMessages; goto LABEL_43; - } + }*/ } LABEL_43: bGameoverLoop = 0; @@ -7921,9 +7936,9 @@ v4 = rand(); v34 = 0; v5 = v4 % 100; - v6 = 2 * (v2->Treasure_prob + 7 * v3->uIndex) - 14; - v7 = (unsigned __int8)byte_4E8168[v6 + 16]; - v8 = (unsigned __int8)byte_4E8168[v6 + 17]; + // v6 = 2 * (v2->Treasure_prob + 7 * v3->uIndex) - 14; + v7 = (unsigned __int8)byte_4E8168[v3->uIndex-1][2*v2->Treasure_prob]; + v8 = (unsigned __int8)byte_4E8168[v3->uIndex-1][2*v2->Treasure_prob+1]; v32 = v5; v33 = v7; v9 = rand(); @@ -7990,7 +8005,7 @@ } a1a.stru_24.SetIdentified(); a1a.uObjectDescID = v18; - a1a.stru_24.uAdditionalValue = v34; + a1a.stru_24.uSpecEnchantmentType = v34; goto LABEL_35; } v14 = rand() % 3001 + 2000; @@ -8099,8 +8114,8 @@ if ( (v3->uItemID & 0x80000000u) == 0 ) goto LABEL_56; v4 = rand() % 5 + 1; - v5 = (unsigned __int8)byte_4E8168[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 2]; - v6 = (unsigned __int8)byte_4E8168[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 3]; + v5 = (unsigned __int8)byte_4E8168[abs((int)v3->uItemID)-1][2*v2->Treasure_prob];//[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 2]; + v6 = (unsigned __int8)byte_4E8168[abs((int)v3->uItemID)-1][2*v2->Treasure_prob+1];//[2 * (v2->Treasure_prob + 7 * abs((int)v3->uItemID)) + 3]; v7 = rand(); v8 = v6 - v5 + 1; v9 = v5 + v7 % v8; @@ -8148,7 +8163,7 @@ } LABEL_23: v3->SetIdentified(); - v3->uAdditionalValue = v10; + v3->uSpecEnchantmentType = v10; LABEL_25: v11 = v4 - 1; v12 = 0; @@ -8213,7 +8228,7 @@ v14->uItemID = 199; } LABEL_49: - v14->uAdditionalValue = v17; + v14->uSpecEnchantmentType = v17; LABEL_51: v12 = v13 + 1; LABEL_52: @@ -11014,13 +11029,14 @@ { pGUIWindow_CurrentMenu->field_40 = 0; strcpy((char *)&pSavegameHeader + 100 * uLoadGameUI_SelectedSlot, (const char *)pKeyActionMap->pPressedKeysBuffer); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)83; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_SaveGame, 0, 0); } else { @@ -11671,7 +11687,7 @@ //HDC v9; // edi@41 HDC v10; // edi@50 int v11; // esi@50 - char v12; // zf@132 + //char v12; // zf@132 signed int v13; // eax@135 int v14; // eax@139 int v15; // eax@140 @@ -11937,8 +11953,8 @@ v37 = 0; v36 = 2; v35 = ::hWnd; -LABEL_104: - SendMessageA(v35, v36, v37, v38); +//LABEL_104: + SendMessageA(::hWnd, WM_DESTROY, v37, v38); return 0; } if ( dword_506E68 != -1 ) @@ -11950,37 +11966,39 @@ { if ( pVideoPlayer->pVideoFrame.pPixels ) pVideoPlayer->bStopBeforeSchedule = 1; - if ( wParam != 13 ) - { - if ( wParam == 17 ) + if ( wParam != VK_RETURN ) + { + if ( wParam == VK_CONTROL ) { dword_507B98_ctrl_pressed = 1; return 0; } - if ( wParam == 27 ) - { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + if ( wParam == VK_ESCAPE ) + { + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, window_SpeakInHouse != 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { v12 = window_SpeakInHouse == 0; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = !v12; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ return 0; } - if ( wParam <= 0x24 ) + if ( wParam <= VK_HOME ) return 0; - if ( wParam > 0x28 ) - { - if ( wParam != 115 || pVideoPlayer->AnyMovieLoaded() ) + if ( wParam > VK_DOWN ) + { + if ( wParam != VK_F4 || pVideoPlayer->AnyMovieLoaded() ) return 0; v38 = 0; v37 = 104; LABEL_126: v36 = 273; v35 = hWnd; - goto LABEL_104; + SendMessageA(hWnd, WM_COMMAND, v37, v38); + return 0; } if ( pCurrentScreen && pCurrentScreen != SCREEN_PRESS_ESCAPE_MESSAGE ) @@ -12434,7 +12452,7 @@ v9 = bLoading; ResetCursor_Palettes_LODs_Level_Audio_SFT_Windows(); pDecalBuilder->Reset(0); - pGameLoadingUI_ProgressBar->_443484((GUIProgressBar::Type)v2); + pGameLoadingUI_ProgressBar->Initialize((GUIProgressBar::Type)v2); strcpy(Str1, pCurrentMapName); v3 = strtok(Str1, "."); strcpy(Str1, v3); @@ -13432,7 +13450,7 @@ Rect.bottom = 246; ClipCursor(&Rect); } - SetUserInterface(1, false); + SetUserInterface(PartyAlignment_Neutral, false); ShowIntroVideo_and_LoadingScreen(); WriteWindowsRegistryInt("Ran once", 1); dword_6BE364_game_settings_1 |= 0x4000; @@ -13807,7 +13825,6 @@ aborting_app = 1; if ( !pRenderer->bWindowMode ) pRenderer->ChangeBetweenWinFullscreenModes(); - __debugbreak; if ( MessageBoxA(0, pGlobalTXT_LocalizationStrings[176], pGlobalTXT_LocalizationStrings[59], 0x34u) == 6 ) SaveGame(1, 0); // "Internal Error" // "Might and Magic VII has detected an internal error and will be forced to close. Would you like us to autosave your game before closing?" @@ -15166,7 +15183,7 @@ v2 = a1; switch ( a1 & 7 ) { - case OBJECT_Item: + case OBJECT_Item: // take the item v17 = a1 >> 3; v26 = a1 >> 3; v18 = a1 >> 3; @@ -15176,9 +15193,9 @@ return 1; v19 = &pLayingItems[v18].stru_24; v20 = pLayingItems[v18].stru_24.uItemID; - if ( pItemsTable->pItems[v20].uEquipType == 18 ) - { - party_finds_gold(v19->uAdditionalValue, 0); + if ( pItemsTable->pItems[v20].uEquipType == EQUIP_GOLD) + { + party_finds_gold(v19->uSpecEnchantmentType, 0); viewparams->bRedrawGameUI = 1; v21 = v17; } @@ -15197,7 +15214,7 @@ pParty->SetHoldingItem(v19); v21 = v26; } - LayingItem::_42F933(v21); + LayingItem::OnItemPickup(v21); break; case OBJECT_Actor: @@ -15217,13 +15234,14 @@ Actor::FaceObject(v12, 4u, 0, 0); if ( v13->uNPC_ID ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_StartNPCDialogue, v12, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)161; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v12; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ } else { @@ -15707,7 +15725,7 @@ } if ( v22 ) { - v23 = _444732_GetEventHintString(v22); + v23 = GetEventHintString(v22); if ( v23 ) goto LABEL_36; } @@ -15722,7 +15740,7 @@ v27 = v25->field_16_event_id; if ( v27 ) { - v23 = _444732_GetEventHintString(v27); + v23 = GetEventHintString(v27); if ( !v23 ) return v19; goto LABEL_36; @@ -16128,7 +16146,7 @@ } v2->uObjectDescID = v112; if ( !v112 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v2->vVelocity.z = 0; v2->vVelocity.y = 0; v2->vVelocity.x = 0; @@ -16151,7 +16169,7 @@ goto LABEL_269; } LABEL_246: - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); return 0; } v106 = v145; @@ -16298,7 +16316,7 @@ } v2->uObjectDescID = v58; if ( !v58 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v14 = v153; v2->vVelocity.z = 0; v2->vVelocity.y = 0; @@ -16354,7 +16372,7 @@ } v2->uObjectDescID = v63; if ( !v63 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v64 = v2->uFacing - stru_5C6E00->uIntegerDoublePi; v44 = v2->field_50 == 4; v2->vVelocity.z = 0; @@ -16377,7 +16395,7 @@ LABEL_160: v14 = v153; LABEL_34: - LayingItem::_42F933(v14); + LayingItem::OnItemPickup(v14); goto LABEL_35; } if ( v151 == 6 || v151 == 5 || (v66 = 0, !v151) ) @@ -16407,7 +16425,7 @@ } v2->uObjectDescID = v71; if ( !v71 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v134 = 0; v72 = v153; v132 = 0; @@ -16463,7 +16481,7 @@ } v2->uObjectDescID = v88; if ( !v88 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v89 = v2->uFacing - stru_5C6E00->uIntegerDoublePi; v2->vVelocity.z = 0; v2->vVelocity.y = 0; @@ -16510,7 +16528,7 @@ } v2->uObjectDescID = v83; if ( !v83 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v134 = 0; v72 = v153; v132 = v2->field_61; @@ -16555,7 +16573,7 @@ LABEL_42: v2->uObjectDescID = v22; if ( v22 == v18 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v2->vVelocity.z = v18; v2->vVelocity.y = v18; v2->vVelocity.x = v18; @@ -16585,7 +16603,7 @@ break; case 545: case 550: - if ( v2->stru_24.uItemID != 405 && v2->stru_24.uAdditionalValue != 3 ) + if ( v2->stru_24.uItemID != 405 && v2->stru_24.uSpecEnchantmentType != 3 ) { v14 = v153; v9 = 0; @@ -16632,7 +16650,7 @@ LABEL_24: v2->uObjectDescID = v12; if ( !v12 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v44 = v2->uItemType == 555; v2->vVelocity.z = 0; v2->vVelocity.y = 0; @@ -16683,7 +16701,7 @@ LABEL_182: v2->uObjectDescID = v95; if ( v95 == (short)v9 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v96 = v2->uSoundID; v2->vVelocity.z = v9; v2->vVelocity.y = v9; @@ -16728,7 +16746,7 @@ } v2->uObjectDescID = v36; if ( !v36 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v37 = v2->vPosition.z; v2->vVelocity.z = 0; v38 = 8 * v153; @@ -16785,7 +16803,7 @@ LABEL_196: v2->uObjectDescID = v46; if ( v46 == (short)v32 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v100 = v2->field_61; v101 = v2->vPosition.z; v2->uSpriteFrameID = v32; @@ -16873,7 +16891,7 @@ } v2->uObjectDescID = v121; if ( !v121 ) - LayingItem::_42F933(v153); + LayingItem::OnItemPickup(v153); v2->vVelocity.z = 0; v2->vVelocity.y = 0; v2->vVelocity.x = 0; diff -r e65d75206263 -r 91e1ba340f39 mm7_3.cpp --- a/mm7_3.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_3.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -1165,7 +1165,7 @@ v31 = 0; for ( i = 0; v31 < ai_arrays_size; ++v31 ) { - v33 = ai_array_4F7DB0_actor_ids[v31]; + v33 = ai_near_actors_ids[v31]; if ( v33 != v75 && _46DF1A_collide_against_actor(v33, 40) ) ++i; } @@ -1229,7 +1229,7 @@ if ( v71 == v34 ) goto LABEL_99; LABEL_101: - Actor::_403F58(v75, 4, v34, (AIDirection *)v34); + Actor::AI_StandOrBored(v75, 4, v34, (AIDirection *)v34); break; } if ( v71 != v34 ) @@ -1448,7 +1448,7 @@ (v1->uSectorID = v4) == 0) || (v42 = _46CEC3_get_floor_level(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z, v4, &uFaceID), v42 == -30000)) ) { - LayingItem::_42F933(uLayingItemID_); + LayingItem::OnItemPickup(uLayingItemID_); return; } v5 = v2->uFlags; @@ -1844,7 +1844,7 @@ if ( v55 ) v9 = v7 + 30; sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v9); - LayingItem::_42F933(uLayingItemID_); + LayingItem::OnItemPickup(uLayingItemID_); v7 = v54; } } @@ -2035,7 +2035,7 @@ else v44 = v54 + 60; sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v44); - LayingItem::_42F933(uLayingItemID_); + LayingItem::OnItemPickup(uLayingItemID_); return; } if ( stru_721530.field_7C >= stru_721530.field_6C ) @@ -2223,9 +2223,9 @@ { //v3 = item->uObjectDescID; v4 = &pObjectList->pObjects[item->uObjectDescID]; - if (item->uAttributes) - { - v5 = *(int *)(v2 + 62) >> 3; + if (item->AttachedToActor()) + { + v5 = item->field_5C >> 3; *(int *)(v2 - 26) = pActors[v5].vPosition.x; *(int *)(v2 - 22) = pActors[v5].vPosition.y; *(int *)(v2 - 18) = pActors[v5].vPosition.z + pActors[v5].uActorHeight; @@ -2253,7 +2253,7 @@ { v10 = i; LABEL_35: - LayingItem::_42F933(v10); + LayingItem::OnItemPickup(v10); goto LABEL_36; } v11 = v4->uLifetime; @@ -3407,10 +3407,10 @@ cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0); int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; - v2 += dx; + v2 += dx * 12; int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier; - v1 += dy; + v1 += dy * 12; v128 = v1; v124 = 1; @@ -12099,9 +12099,9 @@ HIWORD(v22) = HIWORD(x); v15->_screenspace_y_scaler_packedfloat = v37; v15->field_1E = v30; - v15->some_x = a1; - v15->some_y = a2; - v15->some_z = a3; + v15->world_x = a1; + v15->world_y = a2; + v15->world_z = a3; v15->uScreenSpaceX = a5; v15->uScreenSpaceY = a6; v23 = 8 * v26; @@ -12198,10 +12198,9 @@ v5 = v4; v24 = v4; v30 = v4->uFlags; - a6 = v4->uGlowRadius * p->field_22; - v6 = stru_5C6E00->Atan2( - p->vPosition.x - pBLVRenderParams->vPartyPos.x, - p->vPosition.y - pBLVRenderParams->vPartyPos.y); + a6 = v4->uGlowRadius * p->field_22_glow_radius_multiplier; + v6 = stru_5C6E00->Atan2(p->vPosition.x - pBLVRenderParams->vPartyPos.x, + p->vPosition.y - pBLVRenderParams->vPartyPos.y); LOWORD(v7) = p->uFacing; v8 = v30; v9 = ((signed int)(stru_5C6E00->uIntegerPi + ((signed int)stru_5C6E00->uIntegerPi >> 3) + v7 - v6) >> 8) & 7; @@ -12274,9 +12273,9 @@ HIWORD(v21) = HIWORD(x); v3->_screenspace_y_scaler_packedfloat = v31; v3->field_1E = v34; - v3->some_x = a1; - v3->some_y = a2; - v3->some_z = a3; + v3->world_x = a1; + v3->world_y = a2; + v3->world_z = a3; v3->uScreenSpaceX = v36; v22 = v35; v3->uTintColor = 0; @@ -14466,7 +14465,7 @@ { if ( !(BYTE2(v12->uAttributes) & 0x10) ) { - v14 = _444732_GetEventHintString(v13); + v14 = GetEventHintString(v13); v15 = v14; if ( v14 ) { @@ -14567,7 +14566,7 @@ { if ( !(BYTE2(v11->uAttributes) & 0x10) ) { - v13 = _444732_GetEventHintString(v12); + v13 = GetEventHintString(v12); v14 = v13; if ( v13 ) { @@ -14604,11 +14603,10 @@ //----- (00444A51) -------------------------------------------------------- -char *__cdecl TransitionUI_Draw() +void TransitionUI_Draw() { MapInfo *pMapInfo; // esi@5 char *v1; // eax@6 - char *result; // eax@12 std::string v3; // [sp-18h] [bp-84h]@11 unsigned int v4; // [sp-10h] [bp-7Ch]@12 int v5; // [sp-Ch] [bp-78h]@12 @@ -14623,13 +14621,13 @@ v10 = pMapStats->GetMapInfo(pCurrentMapName); v9 = IndoorLocation::GetLocationIndex(dword_591164_teleport_map_name); pRenderer->DrawTextureIndexed(0x1DDu, 0, pTexture_Dialogue_Background); - 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, pTexture_outside); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0] - 4, pNPCPortraits_y[0][0] - 4, pIcons_LOD->GetTexture(uTextureID_50795C)); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pTexture_outside); uTextureID_507B04 = uTextureID_right_panel; - pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_right_panel != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_right_panel] : 0)); - pRenderer->DrawTextureIndexed(556, 451, (Texture *)(uTextureID_x_x_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_x_u] : 0)); - pRenderer->DrawTextureIndexed(476, 451, (Texture *)(uTextureID_x_ok_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_ok_u] : 0)); - if ( (pVideoPlayer->AnyMovieLoaded() || v9) && *dword_591164_teleport_map_name != 48 ) + pRenderer->DrawTextureTransparent(468, 0, pIcons_LOD->GetTexture(uTextureID_right_panel)); + pRenderer->DrawTextureIndexed(556, 451, pIcons_LOD->GetTexture(uTextureID_x_x_u)); + pRenderer->DrawTextureIndexed(476, 451, pIcons_LOD->GetTexture(uTextureID_x_ok_u)); + if ( (pVideoPlayer->AnyMovieLoaded() || v9) && *dword_591164_teleport_map_name != ' ' ) v10 = pMapStats->GetMapInfo(dword_591164_teleport_map_name); pMapInfo = &pMapStats->pInfos[v10]; v8.uFrameX = 493; @@ -14639,45 +14637,37 @@ v8.uFrameX = 483; v8.uFrameWidth = 148; v8.uFrameZ = 334; + + v1 = ""; if ( uCurrentHouse_Animation ) { - v1 = (&off_4EB080)[4 * uCurrentHouse_Animation]; - } - else - { - if ( v10 ) - { - sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[409], pMapInfo->pName);// "Do you wish to leave %s?" - v4 = (212 - pFontCreate->CalcTextHeight(pTmpBuf, &v8, 0, 0)) / 2 + 101; - result = v8.DrawTitleText(pFontCreate, 0, v4, 0, pTmpBuf, 3); - dword_5B5924 = 1; - return result; - } - v1 = ""; - } - if ( !v1 ) - { - MessageBoxW(nullptr, L"No transition text found!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Events.cpp:1410", 0); - v1 = ""; - } - v4 = (212 - pFontCreate->CalcTextHeight(v1, &v8, 0, 0)) / 2 + 101; - result = v8.DrawTitleText(pFontCreate, 0, v4, 0, v1, 3); - dword_5B5924 = 1; - return result; + v1 = pTransitionStrings[uCurrentHouse_Animation]; + v4 = (212 - pFontCreate->CalcTextHeight(v1, &v8, 0, 0)) / 2 + 101; + v8.DrawTitleText(pFontCreate, 0, v4, 0, v1, 3); + } + else if ( v10 ) + { + sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[409], pMapInfo->pName);// "Do you wish to leave %s?" + v4 = (212 - pFontCreate->CalcTextHeight(pTmpBuf, &v8, 0, 0)) / 2 + 101; + v8.DrawTitleText(pFontCreate, 0, v4, 0, pTmpBuf, 3); + } + else assert(false); + + _unused_5B5924_is_travel_ui_drawn = true; } //----- (00444C8F) -------------------------------------------------------- GUIWindow *__cdecl UI_CreateTravelDialogue() { - signed int v0; // eax@1 + //signed int v0; // eax@1 unsigned int v1; // eax@6 GUIWindow *result; // eax@9 - const char *v3; // [sp-4h] [bp-2Ch]@2 + //const char *v3; // [sp-4h] [bp-2Ch]@2 char pContainer[32]; // [sp+0h] [bp-28h]@1 pEventTimer->Pause(); - v0 = const_2(); + /*v0 = const_2(); sprintf(pContainer, "evt%02d", v0); if ( pParty->uAlignment ) { @@ -14690,15 +14680,23 @@ v3 = "-b"; } strcat(pContainer, v3); -LABEL_6: +LABEL_6:*/ + switch (pParty->alignment) + { + case PartyAlignment_Good: sprintf(pContainer, "evt%02d-b", const_2()); + case PartyAlignment_Neutral: sprintf(pContainer, "evt%02d", const_2()); + case PartyAlignment_Evil: sprintf(pContainer, "evt%02d-c", const_2()); + default: assert(false); + } + pTexture_Dialogue_Background = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE)]; pTexture_outside = &pIcons_LOD->pTextures[pIcons_LOD->LoadTexture("outside", TEXTURE_16BIT_PALETTE)]; v1 = pMapStats->GetMapInfo(pCurrentMapName); if ( v1 ) - sprintf(byte_591098, pGlobalTXT_LocalizationStrings[410], pMapStats->pInfos[v1].pName);// "Leave %s" - else - strcpy(byte_591098, pGlobalTXT_LocalizationStrings[79]);// "Exit" - result = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)17, 0, (int)byte_591098); + sprintf(sHouseName, pGlobalTXT_LocalizationStrings[410], pMapStats->pInfos[v1].pName);// "Leave %s" + else + strcpy(sHouseName, pGlobalTXT_LocalizationStrings[79]);// "Exit" + result = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)17, 0, (int)sHouseName); pDialogueWindow = result; return result; } @@ -14742,11 +14740,9 @@ pOutdoor->GetTravelDestination(pParty->vPosition.x, pParty->vPosition.y, pDestinationMapName, 20); v0 = pMapStats->GetMapInfo(pDestinationMapName); pRenderer->DrawTextureIndexed(0x1DDu, 0, pTexture_Dialogue_Background); - pRenderer->DrawTextureTransparent(0x1D4u, 0, - (Texture *)(uTextureID_507B04 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507B04] : 0)); - pRenderer->DrawTextureIndexed(pNPCPortraits_x, pNPCPortraits_y, pTexture_outside); - pRenderer->DrawTextureIndexed(0x22Cu, 0x1C3u, - (Texture *)(uTextureID_x_x_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_x_u] : 0)); + pRenderer->DrawTextureTransparent(0x1D4u, 0, &pIcons_LOD->pTextures[uTextureID_507B04]); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pTexture_outside); + pRenderer->DrawTextureIndexed(0x22Cu, 0x1C3u, &pIcons_LOD->pTextures[uTextureID_x_x_u]); pRenderer->DrawTextureIndexed(0x1DCu, 0x1C3u, (Texture *)(uTextureID_x_ok_u != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_x_ok_u] : 0)); if ( v0 ) @@ -14777,7 +14773,7 @@ strcat(pTmpBuf, pTmpBuf2); v4 = pFontCreate->CalcTextHeight(pTmpBuf, &v7, 0, 0); v7.DrawTitleText(pFontCreate, 0, (212 - v4) / 2 + 101, 0, pTmpBuf, 3u); - dword_5B5924 = 1; + _unused_5B5924_is_travel_ui_drawn = 1; } } @@ -14970,8 +14966,8 @@ v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); pRenderer->DrawTextureIndexed(477, 0, pTexture_Dialogue_Background); pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_507B04 != -1 ? &pIcons_LOD->pTextures[uTextureID_507B04] : 0)); - pRenderer->DrawTextureIndexed(pNPCPortraits_x - 4, pNPCPortraits_y - 4, (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0)); - pRenderer->DrawTextureIndexed(pNPCPortraits_x, pNPCPortraits_y, pDialogueNPCPortraits[0]); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0] - 4, pNPCPortraits_y[0][0] - 4, (Texture *)(uTextureID_50795C != -1 ? &pIcons_LOD->pTextures[uTextureID_50795C] : 0)); + pRenderer->DrawTextureIndexed(pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], pDialogueNPCPortraits[0]); if (pNPC->uProfession) { @@ -15127,7 +15123,7 @@ } else if (v16 == 20) { - __debugbreak(); // learn conditions of this event + //__debugbreak(); // learn conditions of this event instruments auto topic = pNPCTopics[pNPC->evt_B - 1].pTopic;//(&dword_721660)[8 * v23]; if (!topic) { @@ -15667,94 +15663,85 @@ } //----- (004466C4) -------------------------------------------------------- -bool __thiscall sub_4466C4(void *_this) -{ - signed int v1; // ebp@1 - bool result; // eax@2 - int v3; // esi@3 - signed int v4; // edx@3 - signed int v5; // eax@4 - unsigned int v6; // ebx@6 - char *v7; // eax@6 - signed int v8; // edi@18 - int v9; // eax@19 - Player *v10; // [sp+8h] [bp-10h]@18 - signed int v11; // [sp+Ch] [bp-Ch]@3 - signed int v12; // [sp+10h] [bp-8h]@3 - void *v13; // [sp+14h] [bp-4h]@1 - - v1 = 0; - v13 = _this; - if ( !_this ) +int NPC_EventProcessor( int npc_event_id ) + { + signed int event_index; // ebp@1 + int evt_seq_num; // esi@3 + bool ready_to_exit; // [sp+Ch] [bp-Ch]@3 + signed int npc_activity; // [sp+10h] [bp-8h]@3 + int result; + + event_index = 0; + if ( !npc_event_id ) return 0; - v3 = start_event_seq_number; + evt_seq_num = start_event_seq_number; pSomeOtherEVT = pGlobalEVT; uSomeOtherEVT_NumEvents = uGlobalEVT_NumEvents; - memcpy(pSomeOtherEVT_Events, pGlobalEVT_Index, 0xCE40u); - v4 = 1; - v12 = 1; - v11 = 0; - if ( (signed int)uSomeOtherEVT_NumEvents <= 0 ) - goto LABEL_16; + memcpy(pSomeOtherEVT_Events, pGlobalEVT_Index, sizeof(EventIndex)*4400); + npc_activity = 1; + ready_to_exit = false; + if ( uSomeOtherEVT_NumEvents <= 0 ) + return 2; do { - v5 = v1; - if ( (void *)pSomeOtherEVT_Events[v1].uEventID == v13 && pSomeOtherEVT_Events[v5].event_sequence_num == v3 ) - { - v6 = pSomeOtherEVT_Events[v5].uEventOffsetInEVT; - v7 = &pSomeOtherEVT[v6]; - if ( (unsigned __int8)pSomeOtherEVT[v6 + 4] == 1 ) - break; - if ( (unsigned __int8)pSomeOtherEVT[v6 + 4] == 44 ) - { - v11 = v4; - v10 = pParty->pPlayers; - v8 = (unsigned __int8)v7[7] - + (((unsigned __int8)v7[8] + (((unsigned __int8)v7[9] + ((unsigned __int8)v7[10] << 8)) << 8)) << 8); - while ( 1 ) - { - LOBYTE(v9) = v10->CompareVariable( - (enum VariableType)((unsigned __int8)pSomeOtherEVT[v6 + 5] - + ((unsigned __int8)pSomeOtherEVT[v6 + 6] << 8)), - v8); - if ( v9 ) - break; - ++v10; - if ( (signed int)v10 >= (signed int)pParty->pHirelings ) - goto LABEL_13; - } - } - else - { - if ( (unsigned __int8)pSomeOtherEVT[v6 + 4] == 45 ) - break; - if ( (unsigned __int8)pSomeOtherEVT[v6 + 4] == 46 ) - { - v11 = v4; - v12 = (unsigned __int8)v7[5]; - goto LABEL_13; - } - if ( (unsigned __int8)pSomeOtherEVT[v6 + 4] != 52 - || !IsActorAlive( - (unsigned __int8)v7[5], - (unsigned __int8)v7[6] - + (((unsigned __int8)v7[7] + (((unsigned __int8)v7[8] + ((unsigned __int8)v7[9] << 8)) << 8)) << 8), - (unsigned __int8)v7[10]) ) - goto LABEL_13; - } - v1 = -1; - v3 = (unsigned __int8)pSomeOtherEVT[v6 + 11] - 1; -LABEL_13: - ++v3; - v4 = 1; - } - ++v1; - } - while ( v1 < (signed int)uSomeOtherEVT_NumEvents ); - if ( v11 ) - result = v12 != 0; - else -LABEL_16: + if ( (pSomeOtherEVT_Events[event_index].uEventID == npc_event_id) && (pSomeOtherEVT_Events[event_index].event_sequence_num == evt_seq_num) ) + { + _evt_raw *_evt = (_evt_raw *)&pSomeOtherEVT[pSomeOtherEVT_Events[event_index].uEventOffsetInEVT]; + switch(_evt->_e_type) + { + case EVENT_Exit: + //exit + if ( ready_to_exit ) + result = npc_activity != 0; + else + result = 2; + return result; + break; + case EVENT_OnCanShowDialogItemCmp: + ready_to_exit = true; + //v8 = (unsigned __int8)v7[7] + (((unsigned __int8)v7[8] + (((unsigned __int8)v7[9] + ((unsigned __int8)v7[10] << 8)) << 8)) << 8); + for(int i=0; i<4; ++i) + { + // if (pParty->pPlayers[i].CompareVariable((enum VariableType)((unsigned __int8)pSomeOtherEVT[v6 + 5] + ((unsigned __int8)pSomeOtherEVT[v6 + 6] << 8)), + // v8)) + if (pParty->pPlayers[i].CompareVariable((enum VariableType)EVT_WORD(_evt->v5), EVT_DWORD(_evt->v7))) + { + event_index = -1; + evt_seq_num = EVT_BYTE(_evt->v11)-1;//(unsigned __int8)pSomeOtherEVT[v6 + 11] - 1; + break; + } + } + break; + case EVENT_EndCanShowDialogItem : + if ( ready_to_exit ) + result = npc_activity != 0; + else + result = 2; + return result; + break; + case EVENT_SetCanShowDialogItem : + ready_to_exit = true; + npc_activity = EVT_BYTE(_evt->v5); //(unsigned __int8)v7[5]; + break; + case EVENT_IsActorAssasinated : + // if (IsActorAlive( (unsigned __int8)v7[5], + // (unsigned __int8)v7[6] + (((unsigned __int8)v7[7] + (((unsigned __int8)v7[8] + ((unsigned __int8)v7[9] << 8)) << 8)) << 8), + // (unsigned __int8)v7[10]) ) + if (IsActorAlive( EVT_BYTE(_evt->v5), EVT_DWORD(_evt->v6), EVT_BYTE(_evt->v10))) + { // drop linear sequense, going to new seq + event_index = -1; + evt_seq_num = EVT_BYTE(_evt->v11)-1;//(unsigned __int8)pSomeOtherEVT[v6 + 11] - 1; + } + break; + } + ++evt_seq_num; + } + ++event_index; + } + while ( event_index < uSomeOtherEVT_NumEvents ); + if ( ready_to_exit ) + result = npc_activity != 0; + else result = 2; return result; } @@ -16876,7 +16863,7 @@ v2 = pMapName; v3 = uStartingPointType; pAudioPlayer->StopChannels(-1, -1); - pGameLoadingUI_ProgressBar->_443484((GUIProgressBar::Type)0); + pGameLoadingUI_ProgressBar->Initialize(GUIProgressBar::TYPE_None); if ( _strcmpi(pCurrentMapName, v2) ) SaveGame(1, 0); uGameState = 2; @@ -17270,9 +17257,8 @@ //----- (004014E6) -------------------------------------------------------- -int __cdecl ODM_4014E6_AI() -{ - Actor *v0; // esi@2 +void MakeActorAIList_ODM() +{ int v1; // eax@4 int v2; // ebx@4 unsigned int v3; // ecx@4 @@ -17280,42 +17266,28 @@ int v5; // edx@7 unsigned int v6; // edx@9 unsigned int v7; // ST20_4@10 - int v8; // eax@10 int v9; // edi@10 int v10; // ebx@14 - char v11; // zf@16 - int v12; // eax@22 - int result; // eax@24 - int v14; // edx@25 - int v15; // ecx@25 - int v16; // ebx@26 - unsigned int *v17; // ecx@27 - unsigned int v18; // esi@27 - int i; // edx@33 - char *v20; // ecx@34 int v21; // [sp+Ch] [bp-14h]@4 int v22; // [sp+10h] [bp-10h]@4 - int v23; // [sp+14h] [bp-Ch]@10 - int v24; // [sp+14h] [bp-Ch]@29 - signed int v25; // [sp+18h] [bp-8h]@1 - signed int v26; // [sp+18h] [bp-8h]@25 - int v27; // [sp+1Ch] [bp-4h]@1 pParty->uFlags &= 0xFFFFFFCFu; - v27 = 0; - v25 = 0; - if ( (signed int)uNumActors > 0 ) - { - v0 = pActors;//[0].uAttributes; - do - { - //*(char *)(v0 + 1) &= 0xFBu; - BYTE1(v0->uAttributes) &= 0xFBu; - if ( ! v0->CanAct() ) - goto LABEL_37; - v22 = abs(pParty->vPosition.z - v0->vPosition.z); - v21 = abs(pParty->vPosition.y - v0->vPosition.y); - v1 = abs(pParty->vPosition.x - v0->vPosition.x); + + ai_arrays_size = 0; + for (uint i = 0; i < uNumActors; ++i) + { + auto actor = pActors + i; + + actor->uAttributes &= 0xFFFFFBFF; + if (!actor->CanAct()) + { + actor->uAttributes &= 0xFFFFBFFF; + continue; + } + + v22 = abs(pParty->vPosition.z - actor->vPosition.z); + v21 = abs(pParty->vPosition.y - actor->vPosition.y); + v1 = abs(pParty->vPosition.x - actor->vPosition.x); v2 = v21; v3 = v22; if ( v1 < v21 ) @@ -17337,42 +17309,37 @@ v2 = v6; } v7 = ((unsigned int)(11 * v2) >> 5) + (v3 >> 2) + v1; - v8 = v0->uActorRadius; - v9 = v7 - v8; - v23 = v7 - v8; - if ( v23 < 0 ) + //v8 = actor->uActorRadius; + v9 = v7 - actor->uActorRadius; + //v23 = v7 - v8; + if ( v9 < 0 ) { v9 = 0; - v23 = 0; - } - if ( v9 < 5632 ) - { - v10 = v0->uAttributes & 0xFEFFFFFF; - v0->uAttributes = v10; - if ( v10 & 0x80000 || v0->GetActorsRelation(0) ) - { - v11 = (pParty->uFlags & 0x10) == 0; - v0->uAttributes = v10 | 0x1000000; - if ( v11 && (double)v23 < 307.2 ) - pParty->uFlags |= 0x10u; - if ( !(pParty->uFlags & 0x20) && v9 < 5120 ) - pParty->uFlags |= 0x20u; - } - BYTE1(v0->uAttributes) |= 0x40u; - v12 = v27++; - ai_array_4F75E0[v12] = v9; - ai_array_4F7DB0_actor_ids[v12] = v25; - } - else - { -LABEL_37: - BYTE1(v0->uAttributes) &= 0xBFu; - } - ++v25; - ++v0; - } - while ( v25 < (signed int)uNumActors ); - } + //v23 = 0; + } + + if (v9 < 5632) + { + v10 = actor->uAttributes & 0xFEFFFFFF; + actor->uAttributes = v10; + if ( v10 & 0x80000 || actor->GetActorsRelation(0) ) + { + //v11 = (pParty->uFlags & 0x10) == 0; + actor->uAttributes = v10 | 0x1000000; + if (v9 < 5120 ) + pParty->SetYellowAlert(); + if (v9 < 307) + pParty->SetRedAlert(); + } + actor->uAttributes |= 0x00004000; + ai_near_actors_distances[ai_arrays_size] = v9; + ai_near_actors_ids[ai_arrays_size++] = i; + } + else + actor->uAttributes &= 0xFFFFBFFF; + } + + /* result = v27; if ( v27 > 0 ) { @@ -17386,16 +17353,16 @@ v24 = v15; if ( v15 >= result ) break; - v16 = ai_array_4F75E0[v14]; - if ( v16 > ai_array_4F75E0[v15] ) - { - v17 = &ai_array_4F7DB0_actor_ids[v15]; - v18 = ai_array_4F7DB0_actor_ids[v14]; - ai_array_4F7DB0_actor_ids[v14] = *v17; + v16 = ai_near_actors_distances[v14]; + if ( v16 > ai_near_actors_distances[v15] ) + { + v17 = &ai_near_actors_ids[v15]; + v18 = ai_near_actors_ids[v14]; + ai_near_actors_ids[v14] = *v17; *v17 = v18; v15 = v24; - ai_array_4F75E0[v14] = ai_array_4F75E0[v24]; - ai_array_4F75E0[v24] = v16; + ai_near_actors_distances[v14] = ai_near_actors_distances[v24]; + ai_near_actors_distances[v24] = v16; } result = v27; ++v15; @@ -17405,24 +17372,32 @@ v26 = v15; } while ( v15 - 1 < result ); - } - ai_arrays_size = result; - if ( result > 30 ) - { - result = 30; + }*/ + + for (uint i = 0; i < ai_arrays_size; ++i) + for (uint j = 0; j < i; ++j) + if (ai_near_actors_distances[j] > ai_near_actors_distances[i]) + { + int tmp = ai_near_actors_distances[j]; + ai_near_actors_distances[j] = ai_near_actors_distances[i]; + ai_near_actors_distances[i] = tmp; + + tmp = ai_near_actors_ids[j]; + ai_near_actors_ids[j] = ai_near_actors_ids[i]; + ai_near_actors_ids[i] = tmp; + } + + + if (ai_arrays_size > 30) ai_arrays_size = 30; - } - for ( i = 0; i < result; ++i ) - { - v20 = (char *)&pActors[ai_array_4F7DB0_actor_ids[i]].uAttributes; - v20[1] |= 4u; - } - return result; + + for (uint i = 0; i < ai_arrays_size; ++i) + pActors[ai_near_actors_ids[i]].uAttributes |= 0x0400; } // 4F75D8: using guessed type int ai_arrays_size; //----- (004016FA) -------------------------------------------------------- -int __cdecl BLV_4016FA_AI() +int __cdecl MakeActorAIList_BLV() { Actor *v0; // esi@2 int v1; // eax@4 @@ -17470,6 +17445,7 @@ signed int v44; // [sp+1Ch] [bp-8h]@25 int v45; // [sp+20h] [bp-4h]@1 +// __debugbreak(); // refactor for blv ai pParty->uFlags &= 0xFFFFFFCFu; v37 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); v45 = 0; @@ -17528,8 +17504,8 @@ pParty->uFlags |= 0x20u; } v12 = v45++; - ai_array_4F75E0[v12] = v9; - ai_array_4F7DB0_actor_ids[v12] = v43; + ai_near_actors_distances[v12] = v9; + ai_near_actors_ids[v12] = v43; } else { @@ -17553,16 +17529,16 @@ v41 = v14; if ( v14 >= v45 ) break; - v15 = ai_array_4F75E0[v13]; - if ( v15 > ai_array_4F75E0[v14] ) - { - v16 = &ai_array_4F7DB0_actor_ids[v14]; - v17 = ai_array_4F7DB0_actor_ids[v13]; - ai_array_4F7DB0_actor_ids[v13] = *v16; + v15 = ai_near_actors_distances[v13]; + if ( v15 > ai_near_actors_distances[v14] ) + { + v16 = &ai_near_actors_ids[v14]; + v17 = ai_near_actors_ids[v13]; + ai_near_actors_ids[v13] = *v16; *v16 = v17; v14 = v41; - ai_array_4F75E0[v13] = ai_array_4F75E0[v41]; - ai_array_4F75E0[v41] = v15; + ai_near_actors_distances[v13] = ai_near_actors_distances[v41]; + ai_near_actors_distances[v41] = v15; } ++v14; } @@ -17576,14 +17552,14 @@ v19 = 0; for ( i = 0; v18 < v45; i = v18 ) { - v20 = &pActors[ai_array_4F7DB0_actor_ids[v18]]; + v20 = &pActors[ai_near_actors_ids[v18]]; if ( v20->uAttributes & 0x8000 - || (v21 = sub_4070EF_prolly_collide_objects(8 * ai_array_4F7DB0_actor_ids[v18] | 3, 4u), v18 = i, v21) ) - { - v22 = ai_array_4F7DB0_actor_ids[v18]; + || (v21 = sub_4070EF_prolly_collide_objects(8 * ai_near_actors_ids[v18] | 3, 4u), v18 = i, v21) ) + { + v22 = ai_near_actors_ids[v18]; v20->uAttributes |= 0x8000u; ai_array_4F6638_actor_ids[v19] = v22; - ai_array_4F5E68[v19++] = ai_array_4F75E0[v18]; + ai_array_4F5E68[v19++] = ai_near_actors_distances[v18]; if ( v19 >= 30 ) break; } @@ -17625,7 +17601,7 @@ v27 = ai_arrays_size; for ( j = 0; j < v45; ++j ) { - v29 = ai_array_4F7DB0_actor_ids[j]; + v29 = ai_near_actors_ids[j]; if ( pActors[v29].uAttributes & 0xC000 && pActors[v29].CanAct() ) { v30 = 0; @@ -17633,13 +17609,13 @@ { LABEL_51: v31 = ai_arrays_size; - v32 = ai_array_4F7DB0_actor_ids[j]; + v32 = ai_near_actors_ids[j]; ++ai_arrays_size; ai_array_4F6638_actor_ids[v31] = v32; } else { - while ( ai_array_4F6638_actor_ids[v30] != ai_array_4F7DB0_actor_ids[j] ) + while ( ai_array_4F6638_actor_ids[v30] != ai_near_actors_ids[j] ) { ++v30; if ( v30 >= v27 ) @@ -17654,14 +17630,14 @@ v33 = 30; ai_arrays_size = 30; } - memcpy(ai_array_4F7DB0_actor_ids, ai_array_4F6638_actor_ids, 4 * v33); - memcpy(ai_array_4F75E0, ai_array_4F5E68, 4 * ai_arrays_size); + memcpy(ai_near_actors_ids, ai_array_4F6638_actor_ids, 4 * v33); + memcpy(ai_near_actors_distances, ai_array_4F5E68, 4 * ai_arrays_size); v34 = (unsigned int)ai_arrays_size; if ( ai_arrays_size > 0 ) { do { - v35 = (char *)&pActors[ai_array_4F7DB0_actor_ids[HIDWORD(v34)]].uAttributes; + v35 = (char *)&pActors[ai_near_actors_ids[HIDWORD(v34)]].uAttributes; v35[1] |= 4u; ++HIDWORD(v34); } @@ -17674,7 +17650,7 @@ //----- (00401A91) -------------------------------------------------------- void __cdecl sub_401A91_AI() { - unsigned int v0; // esi@4 + //unsigned int v0; // esi@4 int v1; // eax@7 int v2; // ecx@7 int v3; // eax@7 @@ -17684,17 +17660,17 @@ __int16 v7; // cx@14 Player **v8; // esi@20 Player *pPlayer; // ecx@21 - Actor *pActor; // esi@34 - __int16 v11; // ax@34 - unsigned int v12; // eax@47 - signed int v13; // edi@47 - SpellBuff *v14; // ebx@47 - unsigned int v15; // edi@67 - char *v16; // eax@67 - unsigned int v17; // edx@67 - unsigned int v18; // ecx@67 - unsigned __int16 v19; // ax@72 - int *v20; // esi@80 + //Actor *pActor; // esi@34 + //__int16 v11; // ax@34 + //unsigned int v12; // eax@47 + //signed int v13; // edi@47 + //SpellBuff *v14; // ebx@47 + //unsigned int v15; // edi@67 + //char *v16; // eax@67 + //unsigned int v17; // edx@67 + //unsigned int v18; // ecx@67 + //unsigned __int16 v19; // ax@72 + //int *v20; // esi@80 Actor *v21; // ebx@80 unsigned __int16 v22; // ax@86 signed int v23; // eax@94 @@ -17757,15 +17733,16 @@ float v80; // [sp+98h] [bp-18h]@33 int v81; // [sp+9Ch] [bp-14h]@100 int v82; // [sp+A0h] [bp-10h]@45 - unsigned int uActorID; // [sp+A4h] [bp-Ch]@32 + //unsigned int uActorID; // [sp+A4h] [bp-Ch]@32 unsigned int v84; // [sp+A8h] [bp-8h]@11 signed int a2; // [sp+ACh] [bp-4h]@83 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) - ODM_4014E6_AI(); - else - BLV_4016FA_AI(); - v0 = 0; + MakeActorAIList_ODM(); + else + MakeActorAIList_BLV(); + + //v0 = 0; if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 ) { if ( pParty->armageddon_timer > 417 ) @@ -17826,37 +17803,48 @@ ++v8; } while ( (signed int)v8 <= (signed int)&pPlayers[4] ); - v0 = 0; - } - if ( pTurnEngine->field_1C != v0 ) + //v0 = 0; + } + if (pTurnEngine->field_1C) --pTurnEngine->field_1C; } } - if ( pParty->bTurnBasedModeOn == 1 ) + + if (pParty->bTurnBasedModeOn) { pTurnEngine->_405E14(); return; } - uActorID = v0; - if ( (signed int)uNumActors > (signed int)v0 ) - { - LODWORD(v80) = (int)(char *)pActors + 176; - do - { - pActor = (Actor *)(LODWORD(v80) - 176); - v11 = *(unsigned int *)LODWORD(v80); - v49 = *(unsigned int *)LODWORD(v80) == 5; - dword_4F6E08[uActorID] = 4; - if ( v49 || v11 == 11 || v11 == 19 || *(char *)(LODWORD(v80) - 139) & 4 ) - goto LABEL_78; - if ( !*(short *)(LODWORD(v80) - 136) && v11 != 4 ) - Actor::Die(uActorID); - v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; - v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1; - v12 = 0; - v13 = 0; - v14 = (SpellBuff *)(LODWORD(v80) + 36); - do + + + //uActorID = v0; + for (uint i = 0; i < uNumActors; ++i) + { + auto actor = pActors + i; + //LODWORD(v80) = (int)(char *)pActors + 176; // uAIState + //do + //{ + //pActor = (Actor *)(LODWORD(v80) - 176); + //v11 = *(unsigned int *)LODWORD(v80); + //v49 = *(unsigned int *)LODWORD(v80) == 5; + ai_near_actors_targets_pid[i] = OBJECT_Player; + if (actor->uAIState == Dead || actor->uAIState == Removed || actor->uAIState == Disabled || actor->uAttributes & 0x0400) + continue; + + if (!actor->sCurrentHP && actor->uAIState != Dying) + Actor::Die(i); + + //v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1; + //v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1; + //v12 = 0; + //v13 = 0; + //v14 = (SpellBuff *)(LODWORD(v80) + 36); + for (uint j = 0; j < 22; ++j) + { + if (j != 10) + actor->pActorBuffs[j]._4585CA(pParty->uTimePlayed); + } + /*do { if ( v13 != 10 ) { @@ -17866,74 +17854,74 @@ ++v13; ++v14; } - while ( v13 < 22 ); - if ( v84 != v12 - && SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 - && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12 - || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) ) - pActor->uActorHeight = pMonsterList->pMonsters[pActor->pMonsterInfo.uID - 1].uMonsterHeight; - if ( v82 != v12 ) - { - pActor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - if ( SHIDWORD(pActor->pActorBuffs[1].uExpireTime) <= (signed int)v12 ) - { - if ( SHIDWORD(pActor->pActorBuffs[1].uExpireTime) < (signed int)v12 - || LODWORD(pActor->pActorBuffs[1].uExpireTime) <= v12 ) - pActor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[pActor->pMonsterInfo.uID].uHostilityType; - } - } - if ( SHIDWORD(pActor->pActorBuffs[5].uExpireTime) > (signed int)v12 - || SHIDWORD(pActor->pActorBuffs[5].uExpireTime) >= (signed int)v12 - && LODWORD(pActor->pActorBuffs[5].uExpireTime) - || SHIDWORD(pActor->pActorBuffs[6].uExpireTime) > 0 - || SHIDWORD(pActor->pActorBuffs[6].uExpireTime) >= 0 && LODWORD(pActor->pActorBuffs[6].uExpireTime) ) - goto LABEL_78; - v15 = pMiscTimer->uTimeElapsed; - v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; - pActor->uCurrentActionTime += pMiscTimer->uTimeElapsed; - v17 = pActor->uCurrentActionTime; - v18 = pActor->pMonsterInfo.uRecoveryTime; - if ( (signed int)v18 > 0 ) - *(int *)v16 = v18 - v15; - if ( *(int *)v16 < 0 ) - *(int *)v16 = 0; - if ( (signed int)v17 < pActor->uCurrentActionLength ) - goto LABEL_78; - v19 = pActor->uAIState; - if ( v19 == Dying ) - { - pActor->uAIState = Dead; - } - else - { - if ( v19 != 17 ) - { - Actor::_403F58(uActorID, Dying, 256, 0); - goto LABEL_78; - } - pActor->uAIState = Standing; - } - pActor->uCurrentActionTime = 0; - pActor->uCurrentActionLength = 0; - pActor->UpdateAnimation(); -LABEL_78: - ++uActorID; - LODWORD(v80) += 836; - } - while ( (signed int)uActorID < (signed int)uNumActors ); - } + while ( v13 < 22 );*/ + if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime) + //&& SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12 + // || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) ) + actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight; + if (actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime) + actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; + else + actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType; + + if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime || + actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) + continue; + + //v15 = pMiscTimer->uTimeElapsed; + //v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime; + //v17 = pActor->uCurrentActionTime; + //v18 = pActor->pMonsterInfo.uRecoveryTime; + if (actor->pMonsterInfo.uRecoveryTime) + { + if (actor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed) + actor->pMonsterInfo.uRecoveryTime = 0; + else actor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed; + } + + actor->uCurrentActionTime += pMiscTimer->uTimeElapsed; + if (actor->uCurrentActionTime < actor->uCurrentActionLength) + continue; + + //v19 = actor->uAIState; + if (actor->uAIState == Dying) + actor->uAIState = Dead; + else + { + if (actor->uAIState != Summoned) + { + Actor::AI_StandOrBored(i, OBJECT_Player, 256, nullptr); + continue; + } + actor->uAIState = Standing; + } + + actor->uCurrentActionTime = 0; + actor->uCurrentActionLength = 0; + actor->UpdateAnimation(); +//LABEL_78: + //++uActorID; + //LODWORD(v80) += 836; + //} + //while ( (signed int)uActorID < (signed int)uNumActors ); + } + + v78 = 0; + int actor_id = -1; if ( ai_arrays_size > 0 ) { while ( 1 ) { - uActorID = ai_array_4F7DB0_actor_ids[v78]; - v20 = &dword_4F6E08[uActorID]; - v21 = &pActors[uActorID]; - Actor::_401221(uActorID, &dword_4F6E08[uActorID], 1u); - if ( v21->pMonsterInfo.uHostilityType && !*v20 ) + actor_id = ai_near_actors_ids[v78]; + assert(actor_id < uNumActors); + + //v20 = &ai_near_actors_targets_pid[actor_id]; + v21 = &pActors[actor_id]; + Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true); + if (v21->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id]) v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - a2 = *v20; + a2 = ai_near_actors_targets_pid[actor_id]; v76 = a2 & 7; if ( (a2 & 7) == OBJECT_Actor) v80 = 0.5; @@ -17943,7 +17931,7 @@ if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned) goto LABEL_254; if ( !v21->sCurrentHP ) - Actor::Die(uActorID); + Actor::Die(actor_id); if ( (signed __int64)v21->pActorBuffs[3].uExpireTime <= 0 ) { v84 = 0; @@ -18011,8 +17999,8 @@ v29 = v21->uAttributes; if ( !(v29 & 0x8000) ) v21->uAttributes = v29 | 0x8000; - a1 = 8 * uActorID | 3; - v30 = Actor::GetDirectionInfo(8 * uActorID | 3, a2, &a3, 0); + a1 = 8 * actor_id | OBJECT_Actor; + v30 = Actor::GetDirectionInfo(8 * actor_id | OBJECT_Actor, a2, &a3, 0); v49 = v21->pMonsterInfo.uHostilityType == 0; memcpy(&v75, v30, sizeof(v75)); memcpy(&pDir, &v75, sizeof(pDir)); @@ -18022,7 +18010,7 @@ && ((v31 = v21->uAIState, v31 == 6) || !v31 || v31 == 1 || v31 == 9) || v21->pMonsterInfo.uMissleAttack1Type && v21->uAIState == 8 ) { - v32 = uActorID; + v32 = actor_id; goto LABEL_152; } } @@ -18030,8 +18018,8 @@ goto LABEL_254; if ( v21->uAIState == 2 ) { - v32 = uActorID; - v35 = stru_50C198.special_ability_use_check(v21, uActorID); + v32 = actor_id; + v35 = stru_50C198.special_ability_use_check(v21, actor_id); stru_50FE08.Add( a1, 5120, @@ -18053,11 +18041,11 @@ v34 = v21->pMonsterInfo.uMissleAttack2Type; v66 = 1; LABEL_149: - v32 = uActorID; - Actor::_404874(uActorID, &pDir, v34, v66); + v32 = actor_id; + Actor::_404874(actor_id, &pDir, v34, v66); goto LABEL_152; } - v32 = uActorID; + v32 = actor_id; if ( v21->uAIState == 13 ) break; if ( v21->uAIState == 18 ) @@ -18066,7 +18054,7 @@ v60 = 3; v33 = v21->pMonsterInfo.uSpell2ID; LABEL_146: - Actor::_404AC7(uActorID, &pDir, v33, v60, v65); + Actor::_404AC7(actor_id, &pDir, v33, v60, v65); } LABEL_152: v36 = v75.uDistance; @@ -18130,7 +18118,7 @@ v67 = &pDir; if ( v21->pMonsterInfo.uMovementType != 5 ) goto LABEL_181; - Actor::_403EB6( + Actor::AI_Stand( v32, a2, (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333), @@ -18246,7 +18234,7 @@ v64 = (signed __int64)v47; v52 = v32; LABEL_247: - Actor::_403EB6(v52, v51, v64, v69); + Actor::AI_Stand(v52, v51, v64, v69); goto LABEL_254; } v69 = &pDir; @@ -18315,7 +18303,7 @@ memcpy(&v74, v57, sizeof(v74)); memcpy(&pDir, &v74, sizeof(pDir)); v69 = &pDir; - v52 = uActorID; + v52 = actor_id; v64 = (signed __int64)v58; v51 = 4; goto LABEL_247; @@ -18580,7 +18568,7 @@ LayingItem *v1; // esi@1 v1 = this; - v1->field_22 = 1; + v1->field_22_glow_radius_multiplier = 1; v1->uSoundID = 0; v1->uFacing = 0; v1->vVelocity.z = 0; @@ -18674,7 +18662,7 @@ v40b = v35; if ( v40b < v40b + ai_arrays_size ) { - v34 = (int *)ai_array_4F7DB0_actor_ids; + v34 = (int *)ai_near_actors_ids; do { v37 = *v34; @@ -18687,13 +18675,13 @@ v7 = v6->uAttributes; if ( v7 & 0x8000 < 0 ) { - v8 = dword_4F6E08[v5]; + v8 = ai_near_actors_targets_pid[v5]; LOBYTE(v7) = v7 | 0x80; v6->uAttributes = v7; v33 = 8 * v5 | OBJECT_Actor; memcpy(&v31, Actor::GetDirectionInfo(8 * v5 | OBJECT_Actor, v8, &a3, 0), sizeof(v31)); memcpy(&v30, &v31, sizeof(v30)); - Actor::_403F58(v37, 4, 32, &v30); + Actor::AI_StandOrBored(v37, 4, 32, &v30); *(&v1->field_0 + 4 * (v1->uActorQueueSize + 2)) = v33; v1->pQueue[v1->uActorQueueSize].field_C = 2; v1->pQueue[v1->uActorQueueSize++].uActionLength = 0; diff -r e65d75206263 -r 91e1ba340f39 mm7_4.cpp --- a/mm7_4.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_4.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -260,7 +260,7 @@ //BLVFace *v23; // eax@33 //int v24; // esi@39 //int v25; // edi@39 - int v26; // esi@41 + //int v26; // esi@41 int v27; // ecx@43 signed int v28; // eax@45 int v29; // ebx@47 @@ -446,7 +446,7 @@ v54 = 0; v51 = 0; v49 = word_721390[0] >= y; - if ( v26 > 0 ) + if ( portal->uNumVertices > 0 ) { do { @@ -480,7 +480,8 @@ ++v51; v49 = v47; } - while ( v51 < v26 ); + while ( v51 < 2 * portal->uNumVertices ); + if ( v54 == 1 ) { if ( v55 >= 50 ) @@ -1012,7 +1013,7 @@ side1_dx = (double)(grid_pos_x1 - grid_pos_x1); side2_dz = (double)(grid_pos_z2 - grid_pos_z2); // bug? z2 - z2 side1_dz = (double)(grid_pos_z2 - grid_pos_z2); // z1 - z2 - Log::Warning(L"%s %s %u\n", __FILE__, __FUNCTION__, __LINE__); + Log::Warning(L"%S %S %u\n", __FILE__, __FUNCTION__, __LINE__); /* |\ side1 | \ |____\ @@ -1165,7 +1166,7 @@ if ( !(v1->field_2 & 0x20) ) { v2 = &pDecorationList->pDecorations[v1->uDecorationDescID]; - if ( !(v2->uFlags & 1) ) + if (!v2->CanMoveThrough()) { v3 = v2->uRadius; v4 = v1->vPosition.x; @@ -1274,7 +1275,7 @@ if ( !(v5->field_2 & 0x20) ) { v6 = &pDecorationList->pDecorations[v5->uDecorationDescID]; - if ( !(v6->uFlags & 1) ) + if (!v6->CanMoveThrough()) { v7 = v6->uRadius; v8 = v5->vPosition.x; @@ -3562,7 +3563,7 @@ } else { - v25 = v21->pInventoryItems[_idx].uAdditionalValue; + v25 = v21->pInventoryItems[_idx].uSpecEnchantmentType; if ( v25 <= 50 ) { if ( v25 != 50 ) @@ -4914,8 +4915,8 @@ NPCData *npc = nullptr; if ( dword_5C35D4 ) { - __debugbreak(); // fix - npc = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + __debugbreak(); // fix + npc = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) - 1)]; } else npc = GetNPCData(uDialogue_SpeakingActorNPC_ID); @@ -5865,7 +5866,7 @@ LONG uMouseX; // edi@6 LONG uMouseY; // eax@6 GUIButton *pControlsHead; // edx@6 - unsigned int pNumMessage; // ecx@7 + //unsigned int pNumMessage; // ecx@7 int pControlParam; // esi@12 signed int v8; // edi@30 int v9; // edx@31 @@ -5906,7 +5907,9 @@ uMouseX = pMouse->GetCursorPos(&v25)->x; uMouseY = pMouse->GetCursorPos(&v25)->y; pControlsHead = pGUIWindow_CurrentMenu->pControlsHead; - if ( pControlsHead != (GUIButton *)v1 ) + + //does nothing actually + /*if ( pControlsHead != (GUIButton *)v1 ) { pNumMessage = pMessageQueue_50CBD0->uNumMessages; do @@ -5915,21 +5918,14 @@ && uMouseY >= (signed int)pControlsHead->uY && uMouseY <= (signed int)pControlsHead->uW )//mouse movement { pControlParam = pControlsHead->uControlParam; - if ( (signed int)pNumMessage < 40 ) - { - pMessageQueue_50CBD0->pMessages[pNumMessage].eType = (UIMessageType)pControlsHead->field_1C; - //pTexture = &pTexture_PCX; - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = pControlParam; - *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - pNumMessage = pMessageQueue_50CBD0->uNumMessages + 1; - ++pMessageQueue_50CBD0->uNumMessages; - } + pMessageQueue_50CBD0->AddMessage((UIMessageType)pControlsHead->field_1C, pControlParam, 0); v1 = 0; } pControlsHead = pControlsHead->pNext; } while ( pControlsHead != (GUIButton *)v1 ); - } + }*/ + while ( PeekMessageA(&Msg, (HWND)v1, v1, v1, PM_REMOVE) ) { if ( Msg.message == WM_QUIT ) @@ -6181,6 +6177,7 @@ pColor2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xECu, 0xE6u, 0x9Cu); pString = (char *)operator new(2 * pSize); strncpy(pString, ptr, pSize); + pString[pSize]=0; pFontQuick->_44D2FD_prolly_draw_credits_entry(pFontCChar, 0, a4, (signed __int16)pTexture2.uWidth, (signed __int16)pTexture2.uHeight, pColor1, pColor2, pString, pTexture2.pPixels, (signed __int16)pTexture2.uWidth); free(pString); @@ -9115,7 +9112,8 @@ v6 = 9 * (v5 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C); v7 = (ItemGen *)((char *)&pParty->pPickedItem + 4 * v6 + 4); if ( dword_F8B19C != 2 ) - v7 = (ItemGen *)&pParty->field_C59C[v6 + 715]; + // v7 = (ItemGen *)&pParty->field_C59C[v6 + 715]; + v7 =&pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v5]; goto LABEL_15; } if ( dword_F8B198 <= 16 && dword_F8B19C == 18 ) @@ -9348,9 +9346,9 @@ { if ( v7->uItemID == 601 ) { - if ( !v7->field_1A ) + if ( !v7->uHolderPlayer ) v9 = v7; - if ( v7->field_1A == v5 ) + if ( v7->uHolderPlayer == v5 ) v10 = 1; } ++v7; @@ -9369,7 +9367,7 @@ return; } if ( v9 ) - v9->field_1A = v5; + v9->uHolderPlayer = v5; } } // 4F08EC: using guessed type int dword_4F08EC[]; @@ -9378,11 +9376,11 @@ // F8B1A8: using guessed type int dword_F8B1A8; //----- (004B2001) -------------------------------------------------------- -void __fastcall sub_4B2001(signed int a1) -{ - signed int v1; // eax@1 - NPCData *v2; // ebp@1 - int v3; // ecx@8 +void __fastcall ClickNPCTopic(signed int uMessageParam) +{ + //signed int v1; // eax@1 + NPCData *pCurrentNPCInfo; // ebp@1 + int pEventNumber; // ecx@8 Player *v4; // esi@20 int v5; // eax@28 int v6; // eax@31 @@ -9406,60 +9404,51 @@ char *v24; // [sp-8h] [bp-14h]@73 int v25; // [sp-4h] [bp-10h]@49 - v1 = a1; - uDialogueType = a1 + 1; - v2 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; - if ( a1 <= 23 ) - { - if ( a1 == 23 ) - { - v3 = v2->evt_E; - } - else - { - if ( a1 == 13 ) - { - ptr_F8B1E8 = pNPCStats->pProfessions[v2->uProfession].pJoinText;//(char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession); - ptr_F8B1E8 = BuilDialogueString((char *)ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0); - sub_4B40E6(); - dialogue_show_profession_details = false; + //v1 = a1; + uDialogueType = uMessageParam + 1; + pCurrentNPCInfo = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) - 1)]; + if ( uMessageParam <= 23 ) + { + switch ( uMessageParam ) + { + case 13: + ptr_F8B1E8 = pNPCStats->pProfessions[pCurrentNPCInfo->uProfession].pJoinText;//(char *)*(&pNPCStats->field_13A64 + 5 * v2->uProfession); + ptr_F8B1E8 = BuilDialogueString((char *)ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0); + sub_4B40E6(); + dialogue_show_profession_details = false; + goto _return; + case 19: + pEventNumber = pCurrentNPCInfo->evt_A; + break; + case 20: + pEventNumber = pCurrentNPCInfo->evt_B; + break; + case 21: + pEventNumber = pCurrentNPCInfo->evt_C; + break; + case 22: + pEventNumber = pCurrentNPCInfo->evt_D; + break; + case 23: + pEventNumber = pCurrentNPCInfo->evt_E; + break; + case 24: + pEventNumber = pCurrentNPCInfo->evt_F; + break; + default: goto _return; - } - switch ( a1 ) - { - case 19: - v3 = v2->evt_A; - break; - case 20: - v3 = v2->evt_B; - break; - case 21: - v3 = v2->evt_C; - break; - default: - if ( a1 != 22 ) - goto _return; - v3 = v2->evt_D; - break; - } - } - goto LABEL_84; - } - if ( a1 == 24 ) - { - v3 = v2->evt_F; -LABEL_84: - if ( v3 < 200 || v3 > 310 ) - { - if ( v3 < 400 || v3 > 410 ) - { - if ( v3 == 139 ) + } + if ( pEventNumber < 200 || pEventNumber > 310 ) + { + if ( pEventNumber < 400 || pEventNumber > 410 ) + { + if ( pEventNumber == 139 ) { sub_4B1ECE(); } else { - if ( v3 == 311 ) + if ( pEventNumber == 311 ) { sub_4BBA85_bounties(); } @@ -9467,32 +9456,32 @@ { ptr_F8B1E8 = 0; _5C3420_pDecoration = (LevelDecoration *)1; - EventProcessor(v3, 0, 1); + EventProcessor(pEventNumber, 0, 1); _5C3420_pDecoration = 0; } } } else { - dword_F8B1D8 = v1; - sub_4B3EF0(v3 - 400); + dword_F8B1D8 = uMessageParam; + DrawJoinGuildWindow(pEventNumber - 400); } } else { - sub_4B3FE5(v3); + sub_4B3FE5(pEventNumber); } goto _return; } - if ( a1 != 76 ) - { - if ( a1 == 77 ) - { - v16 = v2->uProfession; + if ( uMessageParam != 76 ) + { + if ( uMessageParam == 77 ) + { + v16 = pCurrentNPCInfo->uProfession; if (dialogue_show_profession_details) - v17 = pNPCStats->pProfessions[v2->uProfession - 1].pJoinText; + v17 = pNPCStats->pProfessions[pCurrentNPCInfo->uProfession - 1].pJoinText; else - v17 = pNPCStats->pProfessions[v2->uProfession - 1].pBenefits; + v17 = pNPCStats->pProfessions[pCurrentNPCInfo->uProfession - 1].pBenefits; ptr_F8B1E8 = v17; v18 = BuilDialogueString(v17, uActiveCharacter - 1, 0, 0, 0, 0); dialogue_show_profession_details = ~dialogue_show_profession_details; @@ -9500,7 +9489,7 @@ } else { - if ( a1 == 79 ) + if ( uMessageParam == 79 ) { if ( dword_F8B1A8 ) { @@ -9526,18 +9515,19 @@ } pPlayers[uActiveCharacter]->PlaySound(SPEECH_85, 0); } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ } } else { - if ( a1 == 82 && dword_F8B1A8 ) + if ( uMessageParam == 82 && dword_F8B1A8 ) { Party::TakeGold(gold_transaction_amount); v4 = pParty->pPlayers; @@ -9550,46 +9540,47 @@ switch ( dword_F8B1D8 ) { case 19: - v10 = v2->evt_A; + v10 = pCurrentNPCInfo->evt_A; if ( (signed int)v10 >= 400 && (signed int)v10 <= 416 ) - v2->evt_A = 0; + pCurrentNPCInfo->evt_A = 0; break; case 20: - v9 = v2->evt_B; + v9 = pCurrentNPCInfo->evt_B; if ( v9 >= 400 && v9 <= 416 ) - v2->evt_B = 0; + pCurrentNPCInfo->evt_B = 0; break; case 21: - v8 = v2->evt_C; + v8 = pCurrentNPCInfo->evt_C; if ( v8 >= 400 && v8 <= 416 ) - v2->evt_C = 0; + pCurrentNPCInfo->evt_C = 0; break; case 22: - v7 = v2->evt_D; + v7 = pCurrentNPCInfo->evt_D; if ( v7 >= 400 && v7 <= 416 ) - v2->evt_D = 0; + pCurrentNPCInfo->evt_D = 0; break; case 23: - v6 = v2->evt_E; + v6 = pCurrentNPCInfo->evt_E; if ( v6 >= 400 && v6 <= 416 ) - v2->evt_E = 0; + pCurrentNPCInfo->evt_E = 0; break; case 24: - v5 = v2->evt_F; + v5 = pCurrentNPCInfo->evt_F; if ( v5 >= 400 ) { if ( v5 <= 416 ) - v2->evt_F = 0; + pCurrentNPCInfo->evt_F = 0; } break; } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ v11 = uActiveCharacter; if ( uActiveCharacter ) { @@ -9612,15 +9603,15 @@ goto _return; } //v20 = v2->uProfession; - if ( v2->uProfession != 51 ) - { - v21 = pNPCStats->pProfessions[v2->uProfession - 1].uHirePrice; + if ( pCurrentNPCInfo->uProfession != 51 ) + { + v21 = pNPCStats->pProfessions[pCurrentNPCInfo->uProfession - 1].uHirePrice; if ( pParty->uNumGold < v21 ) { ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); dialogue_show_profession_details = false; uDialogueType = 13; - ptr_F8B1E8 = pNPCStats->pProfessions[v2->uProfession - 1].pJoinText; + ptr_F8B1E8 = pNPCStats->pProfessions[pCurrentNPCInfo->uProfession - 1].pJoinText; ptr_F8B1E8 = BuilDialogueString((char *)ptr_F8B1E8, uActiveCharacter - 1, 0, 0, 0, 0); if ( uActiveCharacter ) pPlayers[uActiveCharacter]->PlaySound(SPEECH_NotEnoughGold, 0); @@ -9630,19 +9621,19 @@ Party::TakeGold(v21); } //LOBYTE(v2->uFlags) |= 0x80u; - v2->uFlags = 128; + pCurrentNPCInfo->uFlags = 128; pParty->field_709 = 0; sub_44A56A(); if ( pParty->pHirelings[0].pName ) { - memcpy(&pParty->pHirelings[1], v2, sizeof(pParty->pHirelings[1])); - v24 = v2->pName; + memcpy(&pParty->pHirelings[1], pCurrentNPCInfo, sizeof(pParty->pHirelings[1])); + v24 = pCurrentNPCInfo->pName; v22 = pParty->pHireling2Name; } else { - memcpy(pParty->pHirelings, v2, 0x4Cu); - v24 = v2->pName; + memcpy(pParty->pHirelings, pCurrentNPCInfo, 0x4Cu); + v24 = pCurrentNPCInfo->pName; v22 = pParty->pHireling1Name; } strcpy(v22, v24); @@ -9650,13 +9641,15 @@ sub_44A56A(); PrepareHouse((HOUSE_TYPE)(int)window_SpeakInHouse->ptr_1C); dword_F8B19C = 1; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ v11 = uActiveCharacter; if ( uActiveCharacter ) { @@ -9665,7 +9658,7 @@ goto LABEL_50; } _return: - pVideoPlayer->_4BF5B2(); + pVideoPlayer->_4BF5B2();//HouseVideo } @@ -10000,23 +9993,14 @@ //----- (004B29F2) -------------------------------------------------------- -const char *__fastcall sub_4B29F2(int a1) -{ - int v1; // esi@1 - Player *v2; // edi@1 - int v3; // eax@1 - Player *v4; // ecx@1 - - v1 = a1; +const char *__fastcall ContractSelectText(int pEventNumber) +{ dword_F8B1A8 = 0; - v2 = pPlayers[uActiveCharacter]; - v3 = a1 + 50; - v4 = pPlayers[uActiveCharacter]; - dword_F8B1AC_something_todo_with_awards = v3; - gold_transaction_amount = dword_4F08EC[v1]; - if ( v4->CanAct() ) - { - if ( (unsigned __int16)_449B57_test_bit((unsigned __int8 *)v2->field_152, dword_F8B1AC_something_todo_with_awards) ) + dword_F8B1AC_something_todo_with_awards = pEventNumber + 50; + gold_transaction_amount = dword_4F08EC[pEventNumber]; + if ( pPlayers[uActiveCharacter]->CanAct() ) + { + if ( (unsigned __int16)_449B57_test_bit((unsigned __int8 *)pPlayers[uActiveCharacter]->field_152, dword_F8B1AC_something_todo_with_awards) ) { return pNPCTopics[123].pText; } @@ -10025,7 +10009,7 @@ if ( gold_transaction_amount <= pParty->uNumGold ) { dword_F8B1A8 = 1; - return pNPCTopics[v1 + 110].pText; + return pNPCTopics[pEventNumber + 110].pText; } else { @@ -10041,7 +10025,7 @@ //----- (004B2A74) -------------------------------------------------------- -char __cdecl sub_4B2A74() +char __cdecl SimpleHouseAndBoatsDialog() { char *v0; // esi@3 char *v1; // ST1C_4@3 @@ -10103,7 +10087,7 @@ NPCData *v58; // [sp+118h] [bp-4h]@6 memcpy(&a1, pDialogueWindow, sizeof(a1)); - if ( array_5913D8[6] == (NPCData *)uNumDialogueNPCPortraits && uHouse_ExitPic ) + if ( pDialogueNPCCount == uNumDialogueNPCPortraits && uHouse_ExitPic ) { v0 = pMapStats->pInfos[uHouse_ExitPic].pName; v1 = pMapStats->pInfos[uHouse_ExitPic].pName; @@ -10114,7 +10098,7 @@ a1.uFrameX = 483; a1.uFrameWidth = 148; a1.uFrameZ = 334; - v2 = (&off_4EB080)[4 * uHouse_ExitPic]; + v2 = pTransitionStrings[uHouse_ExitPic]; if ( !v2 ) { sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[411], v0); @@ -10127,7 +10111,7 @@ } a1.uFrameWidth -= 10; a1.uFrameZ -= 10; - v58 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + v58 = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) - 1)]; v6 = v58; v55 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); v7 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); @@ -10202,7 +10186,7 @@ v27 = v26 - 3; if ( !v27 ) { - v33 = (char *)sub_4B29F2((int)v52.ptr_1C); + v33 = (char *)ContractSelectText((int)v52.ptr_1C); goto LABEL_44; } v28 = v27 - 1; @@ -10447,7 +10431,7 @@ if ( v1 ) v21 = word_4F063E[(signed int)v20]; else - v21 = word_4F03FE[(signed int)v20]; + v21 = word_4F0404[(signed int)v20 - 4];//word_4F03FE[(signed int)v20]; v22 = v21 - 23; if ( v22 ) { @@ -11059,42 +11043,17 @@ } //----- (004B3EF0) -------------------------------------------------------- -void __fastcall sub_4B3EF0(int a4) -{ - int v1; // edi@1 - - v1 = a4; +void __fastcall DrawJoinGuildWindow(int pEventNumber) +{ uDialogueType = 81; - ptr_F8B1E8 = (char *)pNPCTopics[a4 + 99].pText; - sub_4B29F2(a4); + ptr_F8B1E8 = (char *)pNPCTopics[pEventNumber + 99].pText; + ContractSelectText(pEventNumber); pDialogueWindow->Release(); - pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15E, WINDOW_MainMenu, v1, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton( - 0x1D7, - 0x1BD, - 0xA9, - 0x23, - 1, - 0, - 0x71, - 0, - 0, - pGlobalTXT_LocalizationStrings[34], - (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0), - 0); + pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15E, WINDOW_MainMenu, pEventNumber, 0); + pBtn_ExitCancel = pDialogueWindow->CreateButton(0x1D7, 0x1BD, 0xA9, 0x23, 1, 0, 0x71, 0, 0, pGlobalTXT_LocalizationStrings[34], + (Texture *)(uTextureID_506438 != -1 ? &pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); pDialogueWindow->CreateButton(0, 0, 0, 0, 1, 0, 0x51u, 0, 0, "", 0); - pDialogueWindow->CreateButton( - 0x1E0u, - 0xA0u, - 0x8Cu, - 0x1Eu, - 1, - 0, - 0xAFu, - 0x52u, - 0, - pGlobalTXT_LocalizationStrings[122], - 0); + pDialogueWindow->CreateButton(0x1E0u, 0xA0u, 0x8Cu, 0x1Eu, 1, 0, 0xAFu, 0x52u, 0, pGlobalTXT_LocalizationStrings[122], 0); pDialogueWindow->_41D08F(1, 1, 0, 2); dword_F8B19C = -1; } @@ -11143,7 +11102,7 @@ NPCData *v1; // edi@1 v0 = 0; - v1 = array_5913D8[(unsigned int)((char *)array_5913D8[6] + -(dword_591080 != 0) - 1)]; + v1 = HouseNPCData[(unsigned int)((char *)pDialogueNPCCount + -(dword_591080 != 0) - 1)]; pDialogueWindow->Release(); pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x15Eu, WINDOW_MainMenu, 0, 0); pBtn_ExitCancel = pDialogueWindow->CreateButton( @@ -11194,76 +11153,38 @@ //----- (004B4224) -------------------------------------------------------- -GUIButton *_4B4224_UpdateNPCTopics(int _this) -{ - int v1; // ebx@1 - GUIButton *result; // eax@3 +void _4B4224_UpdateNPCTopics( int _this ) + { + int num_menu_buttons; // ebx@1 int i; // ebp@5 - signed int v4; // ebp@9 - void *v5; // ecx@14 - bool v6; // eax@16 - void *v7; // ecx@19 - bool v8; // eax@21 - void *v9; // ecx@24 - bool v10; // eax@26 - void *v11; // ecx@29 - bool v12; // eax@31 - void *v13; // ecx@34 - bool v14; // eax@36 - void *v15; // ecx@39 - bool v16; // eax@41 + // signed int v4; // ebp@9 + int v6; // eax@16 + int v8; // eax@21 + int v10; // eax@26 + int v12; // eax@31 + int v14; // eax@36 + int v16; // eax@41 NPCData *v17; // [sp+10h] [bp-4h]@4 - v1 = 0; - array_5913D8[6] = (NPCData *)(_this + 1); + num_menu_buttons = 0; + pDialogueNPCCount = (_this + 1); if ( _this + 1 == uNumDialogueNPCPortraits && uHouse_ExitPic ) { pDialogueWindow->Release(); pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, WINDOW_MainMenu, 0, 0); - sprintf(byte_591098, pGlobalTXT_LocalizationStrings[411], pMapStats->pInfos[uHouse_ExitPic].pName); - pBtn_ExitCancel = pDialogueWindow->CreateButton( - 0x236u, - 0x1BDu, - 0x4Bu, - 0x21u, - 1, - 0, - 0x71u, - 0, - 0x4Eu, + sprintf(sHouseName, pGlobalTXT_LocalizationStrings[LOCSTR_ENTER_S], pMapStats->pInfos[uHouse_ExitPic].pName); + pBtn_ExitCancel = pDialogueWindow->CreateButton( 566, 445, 75, 33, 1, 0, 0x71u, 0, 0x4Eu, pGlobalTXT_LocalizationStrings[34],// "Cancel" - (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0), - 0); - pBtn_YES = pDialogueWindow->CreateButton( - 486u, - 445u, - 75u, - 33u, - 1, - 0, - 0xBFu, - 1u, - 0x59u, - byte_591098, - (Texture *)(uTextureID_BUTTYES2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTYES2] : 0), - 0); - pDialogueWindow->CreateButton( - pNPCPortraits_x, - pNPCPortraits_y, - 63u, - 73u, - 1, - 0, - 0xBFu, - 1u, - 0x20u, - byte_591098, - 0); - result = pDialogueWindow->CreateButton(8u, 8u, 460u, 344u, 1, 0, 0xBFu, 1u, 0x59u, byte_591098, 0); + (Texture *)(uTextureID_BUTTDESC2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTDESC2] : 0),0); + pBtn_YES = pDialogueWindow->CreateButton( 486u, 445u, 75u, 33u, 1, 0, 0xBFu, 1u, 0x59u, + sHouseName, + (Texture *)(uTextureID_BUTTYES2 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_BUTTYES2] : 0), 0); + pDialogueWindow->CreateButton( pNPCPortraits_x[0][0], pNPCPortraits_y[0][0], 63u, 73u, 1, 0, 0xBFu, 1u, 0x20u, sHouseName, 0); + pDialogueWindow->CreateButton(8u, 8u, 460u, 344u, 1, 0, 0xBFu, 1u, 0x59u, sHouseName, 0); } else { - v17 = array_5913D8[_this + 1 - ((dword_591080 != 0) + 1)]; + v17 = HouseNPCData[_this + 1 - ((dword_591080 != 0) + 1)]; if ( dword_F8B19C == -1 ) { pDialogueWindow->Release(); @@ -11271,169 +11192,85 @@ else { for ( i = 0; i < uNumDialogueNPCPortraits; ++i ) - GUIButton::_41D0D8((GUIButton *)array_5913D8[i + 7]); - } - v4 = 1; + GUIButton::_41D0D8((GUIButton *)HouseNPCData[i + 7]); + } pDialogueWindow = GUIWindow::Create(0, 0, 640, 0x159u, WINDOW_MainMenu, 0, 0); - pBtn_ExitCancel = pDialogueWindow->CreateButton( - 471u, - 445u, - 169u, - 35u, - 1, - 0, - 0x71u, - 0, - 0, + pBtn_ExitCancel = pDialogueWindow->CreateButton( 471u, 445u, 169u, 35u, 1, 0, 0x71u, 0, 0, pGlobalTXT_LocalizationStrings[74],// "End Conversation" - (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), - 0); + (Texture *)(uTextureID_506438 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_506438] : 0), 0); pDialogueWindow->CreateButton(8u, 8u, 0x1C2u, 0x140u, 1, 0, 0x51u, 0, 0, "", 0); - if ( array_5913D8[6] == (NPCData *)1 && dword_591080 ) - { - result = (GUIButton *)sub_4B3B42(dword_F8B198); + if ( pDialogueNPCCount == 1 && dword_591080 ) + { + sub_4B3B42(dword_F8B198); } else { if ( v17->joins ) { - v1 = 1; + num_menu_buttons = 1; pDialogueWindow->CreateButton(480u, 160u, 140u, 30u, 1, 0, 0xAFu, 0xDu, 0, "", 0); } - v5 = (void *)v17->evt_A; - if ( v5 ) - { - if ( v1 < 4 ) - { - v6 = sub_4466C4(v5); + if ( v17->evt_A) + { + if ( num_menu_buttons < 4 ) + { + v6 = NPC_EventProcessor(v17->evt_A); if ( v6 == 1 || v6 == 2 ) - pDialogueWindow->CreateButton( - 480u, - 30 * v1++ + 160, - 140u, - 30u, - 1, - 0, - 0xAFu, - 0x13u, - 0, - "", - 0); - } - } - v7 = (void *)v17->evt_B; - if ( v7 ) - { - if ( v1 < 4 ) - { - v8 = sub_4466C4(v7); + pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, 0xAFu, 0x13u, 0, "", 0); + } + } + if ( v17->evt_B ) + { + if ( num_menu_buttons < 4 ) + { + v8 = NPC_EventProcessor(v17->evt_B); if ( v8 == 1 || v8 == 2 ) - pDialogueWindow->CreateButton( - 480u, - 30 * v1++ + 160, - 140u, - 30u, - 1, - 0, - 0xAFu, - 0x14u, - 0, - "", - 0); - } - } - v9 = (void *)v17->evt_C; - if ( v9 ) - { - if ( v1 < 4 ) - { - v10 = sub_4466C4(v9); + pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, 0xAFu, 0x14u, 0, "", 0); + } + } + if ( v17->evt_C ) + { + if ( num_menu_buttons < 4 ) + { + v10 = NPC_EventProcessor(v17->evt_C); if ( v10 == 1 || v10 == 2 ) - pDialogueWindow->CreateButton( - 480u, - 30 * v1++ + 160, - 140u, - 30u, - 1, - 0, - 0xAFu, - 0x15u, - 0, - "", - 0); - } - } - v11 = (void *)v17->evt_D; - if ( v11 ) - { - if ( v1 < 4 ) - { - v12 = sub_4466C4(v11); + pDialogueWindow->CreateButton( 480u, 30 * num_menu_buttons++ + 160, 140u, 30u, 1, 0, 0xAFu, 0x15u, 0, "", 0); + } + } + + if ( v17->evt_D ) + { + if ( num_menu_buttons < 4 ) + { + v12 = NPC_EventProcessor(v17->evt_D); if ( v12 == 1 || v12 == 2 ) - pDialogueWindow->CreateButton( - 0x1E0u, - 30 * v1++ + 160, - 0x8Cu, - 0x1Eu, - 1, - 0, - 0xAFu, - 0x16u, - 0, - "", - 0); - } - } - v13 = (void *)v17->evt_E; - if ( v13 ) - { - if ( v1 < 4 ) - { - v14 = sub_4466C4(v13); + pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, 0xAFu, 0x16u, 0, "", 0); + } + } + if ( v17->evt_E ) + { + if ( num_menu_buttons < 4 ) + { + v14 = NPC_EventProcessor(v17->evt_E); if ( v14 == 1 || v14 == 2 ) - pDialogueWindow->CreateButton( - 0x1E0u, - 30 * v1++ + 160, - 0x8Cu, - 0x1Eu, - 1, - 0, - 0xAFu, - 0x17u, - 0, - "", - 0); - } - } - v15 = (void *)v17->evt_F; - if ( v15 ) - { - if ( v1 < 4 ) - { - v16 = sub_4466C4(v15); + pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, 0xAFu, 0x17u, 0, "", 0); + } + } + if ( v17->evt_F ) + { + if ( num_menu_buttons < 4 ) + { + v16 = NPC_EventProcessor(v17->evt_F); if ( v16 == 1 || v16 == 2 ) - pDialogueWindow->CreateButton( - 0x1E0u, - 30 * v1++ + 160, - 0x8Cu, - 0x1Eu, - 1, - 0, - 0xAFu, - 0x18u, - 0, - "", - 0); - } - } - pDialogueWindow->_41D08F(v1, 1, 0, 2); - v4 = 1; - result = (GUIButton *)pDialogueWindow->pNumPresenceButton; + pDialogueWindow->CreateButton( 0x1E0u, 30 * num_menu_buttons++ + 160, 0x8Cu, 0x1Eu, 1, 0, 0xAFu, 0x18u, 0, "", 0); + } + } + pDialogueWindow->_41D08F(num_menu_buttons, 1, 0, 2); dword_F8B1E0 = pDialogueWindow->pNumPresenceButton; } - dword_F8B19C = v4; - } - return result; + dword_F8B19C = 1; + } + } @@ -11465,7 +11302,7 @@ } //----- (004B4710) -------------------------------------------------------- -int __cdecl ui_training() +int __cdecl TrainingDialog() { Player *v0; // ebx@1 int color2; // eax@1 @@ -11732,7 +11569,7 @@ LABEL_55: HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, v63); LABEL_56: - result = pMessageQueue_50CBD0->uNumMessages; + /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; @@ -11741,7 +11578,9 @@ *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; ++pMessageQueue_50CBD0->uNumMessages; } - return result; + return result;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + return 1; // void function actually } sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[538], v5 - LODWORD(v0->uExperience), v34 + 1);// // "You need %d more experience to train to level %d" @@ -11861,7 +11700,7 @@ //----- (004B4FCF) -------------------------------------------------------- -int __cdecl ui_shop_teachers() +int __cdecl MagicShopDialog() { Player *v0; // ebx@1 int result; // eax@6 @@ -12328,7 +12167,8 @@ { do { - if ( pParty->field_777C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + // if ( pParty->field_777C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID); { v50 = dword_F8B168[v49]; v51 = 152 - v50->uTextureHeight; @@ -12360,7 +12200,8 @@ v122 = 0; do { - if ( pParty->field_777C[9 * (v122 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] ) + //if ( pParty->field_777C[9 * (v122 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 54] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v122+1].uItemID); { v54 = dword_F8B168[v122 + 6]; v55 = 306 - v54->uTextureHeight; @@ -12390,7 +12231,8 @@ { do { - if ( pParty->field_C59C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + // if ( pParty->field_C59C[9 * (v49 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uItemID) { v58 = dword_F8B168[v49]; v59 = 152 - v58->uTextureHeight; @@ -12422,7 +12264,8 @@ v122 = 0; do { - if ( pParty->field_C59C[9 * (v122 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 778] ) + //if ( pParty->Spell_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v49] + 778] ) //weak + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v49].uAttributes) { v62 = dword_F8B168[v122 + 6]; v63 = 306 - v62->uTextureHeight; @@ -12459,7 +12302,7 @@ { do { - if ( pParty->field_777C[9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) + if ( pParty->field_777C[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID); //9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C)] ) ++v117; ++v66; } @@ -12469,7 +12312,8 @@ { do { - if ( pParty->field_C59C[9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + //if ( pParty->field_C59C[9 * (v66 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 724] ) + if (pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v66].uItemID) ++v117; ++v66; } @@ -12502,10 +12346,11 @@ v71 = (pRenderer->pActiveZBuffer[result] & 0xFFFF) - 1; v117 = v71; v72 = (int)window_SpeakInHouse->ptr_1C; - v73 = 9 * (v71 + 12 * v72); - v74 = (ItemGen *)&pParty->field_777C[v73]; + // v73 = 9 * (v71 + 12 * v72); + v74 = (ItemGen *)&pParty->field_777C[v72][v71]; if ( dword_F8B19C != 2 ) - v74 = (ItemGen *)&pParty->field_C59C[v73 + 724]; + // v74 = (ItemGen *)&pParty->field_C59C[v73 + 724]; + v74 =&pParty->Recipes_Item[v72][v71]; if ( v67 && Str ) { v10 = pGlobalTXT_LocalizationStrings[181];// "Steal %24" @@ -12612,13 +12457,14 @@ pParty->field_709 = 0; sub_44A56A(); dword_591084 = 0; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ goto LABEL_89; } v14 = 76; @@ -12673,13 +12519,15 @@ strcpy(v13, v15); pParty->field_709 = 0; sub_44A56A(); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ if ( (uDialogue_SpeakingActorNPC_ID & 0x80000000u) == 0 ) pDialogue_SpeakingActor->uAIState = Removed; if ( uActiveCharacter ) @@ -12697,13 +12545,14 @@ { if ( v2->uProfession != 41 ) v2->bHasUsedTheAbility = 1; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); goto LABEL_87; } v7 = pGlobalTXT_LocalizationStrings[140]; @@ -12774,7 +12623,7 @@ else { dword_F8B1D8 = newDialogueType; - sub_4B3EF0(v4 - 400); + DrawJoinGuildWindow(v4 - 400); } } else @@ -12859,7 +12708,7 @@ //----- (004B5D7C) -------------------------------------------------------- -int __cdecl sub_4B5D7C() +int __cdecl GuildDialog() { GUIWindow *v0; // ebx@1 Player *v1; // edi@1 @@ -12972,7 +12821,7 @@ } } } - result = pMessageQueue_50CBD0->uNumMessages; + /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; @@ -12980,8 +12829,9 @@ result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } - return result; + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); + return 1; // void function actually } pRenderer->DrawTextureIndexed(8u, 8u, dword_F8B164); v5 = 0; @@ -13206,7 +13056,7 @@ //----- (004B705E) -------------------------------------------------------- -int __cdecl sub_4B705E() +int __cdecl TampleDialog() { GUIWindow *v0; // ebx@1 Player *v1; // esi@1 @@ -13262,9 +13112,7 @@ int v51; // eax@73 unsigned int v52; // ecx@73 unsigned __int16 v53; // ax@73 - char a1[100]; // [sp+10h] [bp-1B4h]@64 - char Dest; // [sp+74h] [bp-150h]@66 - char v56; // [sp+D8h] [bp-ECh]@66 + char a1[300]; // [sp+10h] [bp-1B4h]@64 GUIWindow v57; // [sp+13Ch] [bp-88h]@1 __int64 v58; // [sp+190h] [bp-34h]@1 __int64 v59; // [sp+198h] [bp-2Ch]@1 @@ -13518,7 +13366,7 @@ v1->PlaySound(SPEECH_82, 0); pOtherOverlayList->_4418B1(20, uActiveCharacter + 99, 0, 65536); LABEL_46: - result = pMessageQueue_50CBD0->uNumMessages; + /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; @@ -13526,8 +13374,9 @@ result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = v25; ++pMessageQueue_50CBD0->uNumMessages; - } - return result; + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, v25); + return result; // void func } v63 = 1; v41 = pDialogueWindow->GetControl(pDialogueWindow->pStartingPosActiveItem); @@ -13539,8 +13388,8 @@ sprintf(a1, "%s %d %s", pGlobalTXT_LocalizationStrings[104], HIDWORD(v60), pGlobalTXT_LocalizationStrings[97]); v63 = 0; } - strcpy(&Dest, pGlobalTXT_LocalizationStrings[68]); - strcpy(&v56, pGlobalTXT_LocalizationStrings[160]); + strcpy(&a1[100], pGlobalTXT_LocalizationStrings[68]); + strcpy(&a1[200], pGlobalTXT_LocalizationStrings[160]); v42 = v63; v43 = pDialogueWindow; v44 = v63; @@ -13598,7 +13447,7 @@ //----- (004B8F94) -------------------------------------------------------- -void *__cdecl sub_4B8F94() +void sub_4B8F94() { GUIWindow *v0; // edi@1 signed int v1; // ebp@1 @@ -13648,18 +13497,21 @@ LABEL_12: v6 = v12; LABEL_13: - pItemsTable->GenerateItem(v5, v6, (ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]); + pItemsTable->GenerateItem(v5, v6,&pParty->Recipes_Item[v3][v1]);//(ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]); v0 = window_SpeakInHouse; v2 = (int)&window_SpeakInHouse->ptr_1C; - pParty->field_C59C[9 * (v1 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 729] = 1; + // pParty->field_C59C[9 * (v1 + 12 * (unsigned int)window_SpeakInHouse->ptr_1C) + 729] = 1; + pParty->Recipes_Item[(unsigned int)window_SpeakInHouse->ptr_1C][v1].uAttributes= 1; goto LABEL_14; } - auto _a = (ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]; + // auto _a = (ItemGen *)&pParty->field_C59C[9 * (v1 + 12 * v3) + 724]; + auto _a =&pParty->Recipes_Item[v3][v1]; _a->Reset(); - v2 = (int)&v0->ptr_1C; - v10 = rand(); - v0 = window_SpeakInHouse; - pParty->field_C59C[9 * (v1 + 12 * *(int *)v2) + 724] = v10 % 32 + 740; + // v2 = (int)&v0->ptr_1C; + //v10 = rand(); + // v0 = window_SpeakInHouse; + // pParty->field_C59C[9 * (v1 + 12 * *(int *)v2) + 724] = v10 % 32 + 740; + pParty->Recipes_Item[(int)v0->ptr_1C][v1].uItemID= rand() % 32 + 740; } LABEL_14: v3 = *(int *)v2; @@ -13676,8 +13528,7 @@ } LABEL_15: result = v0->ptr_1C; - *(int *)&pParty->field_16154[4 * (int)result] = 0; - return result; + pParty->field_16154[(int)v0->ptr_1C] = 0; } @@ -13780,7 +13631,7 @@ { v5 = 0; } - result = pMessageQueue_50CBD0->uNumMessages; + /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; @@ -13788,8 +13639,9 @@ result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = v5; ++pMessageQueue_50CBD0->uNumMessages; - } - return result; + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, v5); + return result; // void func } if ( !(unsigned __int16)_449B57_test_bit( (unsigned __int8 *)v1->field_152, @@ -14130,11 +13982,12 @@ { ShowStatusBarString(pGlobalTXT_LocalizationStrings[155], 2u); HousePlaySomeSound((unsigned int)window_SpeakInHouse->ptr_1C, 3); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) return; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 1; - goto LABEL_33; + goto LABEL_33;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 1, 0); } Party::TakeGold(s1); v47[1] = (const char *)7; @@ -14206,7 +14059,8 @@ sqrt(3.1415926); while ( sub_4BD8B5() ) ; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; @@ -14214,7 +14068,7 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; return; - } + }*/ } else { @@ -14381,8 +14235,8 @@ v4->uCurrentActionTime += pMiscTimer->uTimeElapsed; if ( (signed int)v4->uCurrentActionTime >= v5 ) { - v17 = dword_4F6E08[v20]; - v6 = Actor::GetDirectionInfo(8 * v20 | 3, v17, &a3, v2); + v17 = ai_near_actors_targets_pid[v20]; + v6 = Actor::GetDirectionInfo(8 * v20 | OBJECT_Actor, v17, &a3, v2); v7 = v4->uAIState; memcpy(&v15, v6, sizeof(v15)); v8 = v7 - 4; @@ -14396,7 +14250,7 @@ if ( v10 ) { if ( v10 != 8 ) - Actor::_403F58(v20, v17, 32, &v14); + Actor::AI_StandOrBored(v20, v17, 32, &v14); } } } @@ -14667,9 +14521,9 @@ } LABEL_44: HIWORD(v25) = HIWORD(x); - v0->some_x = a1a; - v0->some_y = a2; - v0->some_z = a3; + v0->world_x = a1a; + v0->world_y = a2; + v0->world_z = a3; v0->uScreenSpaceX = v43; v0->uScreenSpaceY = a6; LOWORD(v25) = 0; @@ -14700,66 +14554,57 @@ //----- (00444732) -------------------------------------------------------- -char *_444732_GetEventHintString(unsigned int uEventID) -{ - signed int v1; // edx@1 - char *v2; // eax@2 - int v3; // ebx@4 - int v4; // esi@4 +char *GetEventHintString(unsigned int uEventID) +{ + signed int event_index; // edx@1 + int event_pos; // esi@4 char *result; // eax@6 - int v6; // eax@9 - char *i; // esi@11 - int v8; // edx@12 - - v1 = 0; - if ( (signed int)uLevelEVT_NumEvents <= 0 ) - { -LABEL_6: - result = 0; - } - else - { - v2 = (char *)&pLevelEVT_Index[0].uEventOffsetInEVT; + unsigned int str_index; // eax@9 + int i; // esi@11 + _evt_raw* test_evt; + _evt_raw* last_evt; + + event_index = 0; + if ( uLevelEVT_NumEvents <= 0 ) + return NULL; + + //v2 = (char *)&pLevelEVT_Index[0].uEventOffsetInEVT; while ( 1 ) { - if ( *((int *)v2 - 2) == uEventID ) - { - v3 = *(int *)v2; - v4 = *((int *)v2 + 3); - if ( pLevelEVT[*(int *)v2 + 4] == 4 ) + if ( pLevelEVT_Index[event_index].uEventID == uEventID ) + { + test_evt=(_evt_raw*)&pLevelEVT[pLevelEVT_Index[event_index].uEventOffsetInEVT]; + last_evt=test_evt; + event_pos = pLevelEVT_Index[event_index+1].uEventOffsetInEVT; + if ( test_evt->_e_type == EVENT_MouseOver ) break; } - ++v1; - v2 += 12; - if ( v1 >= (signed int)uLevelEVT_NumEvents ) - goto LABEL_6; - } - if ( pLevelEVT[v4 + 4] == 2 ) - { - v6 = (unsigned __int8)pLevelEVT[v4 + 5] - + (((unsigned __int8)pLevelEVT[v4 + 6] - + (((unsigned __int8)pLevelEVT[v4 + 7] + ((unsigned __int8)pLevelEVT[v4 + 8] << 8)) << 8)) << 8); -LABEL_10: - //result = (char *)p2DEvents_minus1_::04[13 * v6]; - result = (char *)p2DEvents[v6 - 1].pName; + ++event_index; + if ( event_index >= uLevelEVT_NumEvents ) + return NULL; + } + test_evt=(_evt_raw*)&pLevelEVT[event_pos]; + if ( test_evt->_e_type== EVENT_SpeakInHouse ) + { + str_index = EVT_DWORD(test_evt->v5); + result = (char *)p2DEvents[str_index - 1].pName; } else { - for ( i = (char *)pLevelEVT_Index + 4 * (3 * v1 + 3); *(int *)i == uEventID; i += 12 ) - { - v8 = *((int *)i + 2); - if ( pLevelEVT[v8 + 4] == 2 ) - { - v6 = (unsigned __int8)pLevelEVT[v8 + 5] - + (((unsigned __int8)pLevelEVT[v8 + 6] - + (((unsigned __int8)pLevelEVT[v8 + 7] + ((unsigned __int8)pLevelEVT[v8 + 8] << 8)) << 8)) << 8); - if ( (unsigned int)v6 < 0x258 ) - goto LABEL_10; - } - } - result = &pLevelStr[pLevelStrOffsets[(unsigned __int8)pLevelEVT[v3 + 5]]]; - } - } + for ( i = event_index+1; pLevelEVT_Index[i].uEventID == uEventID; ++i ) + { + event_pos = pLevelEVT_Index[i].uEventOffsetInEVT; + test_evt=(_evt_raw*)&pLevelEVT[event_pos]; + if ( test_evt->_e_type == EVENT_SpeakInHouse ) + { + str_index = EVT_DWORD(test_evt->v5); + if ( str_index < 600 ) + return (char *)p2DEvents[str_index - 1].pName; + } + } + result = &pLevelStr[pLevelStrOffsets[EVT_BYTE(last_evt->v5)]]; + } + return result; } @@ -14771,7 +14616,7 @@ { unsigned int v9; // ebx@1 int v10; // edi@1 - signed int v11; // eax@1 + //signed int v11; // eax@1 unsigned int v12; // eax@6 const char *v13; // ST0C_4@6 unsigned int v14; // eax@8 @@ -14779,7 +14624,7 @@ unsigned int v16; // eax@16 unsigned int result; // eax@26 const char *v18; // [sp-8h] [bp-40h]@9 - const char *v19; // [sp-4h] [bp-3Ch]@2 + //const char *v19; // [sp-4h] [bp-3Ch]@2 char *v20; // [sp-4h] [bp-3Ch]@9 const char *v21; // [sp-4h] [bp-3Ch]@11 char pContainer[40]; // [sp+Ch] [bp-2Ch]@1 @@ -14798,7 +14643,15 @@ uCurrentHouse_Animation = v9; pEventTimer->Pause(); pAudioPlayer->StopChannels(-1, -1); - v11 = const_2(); + + switch (pParty->alignment) + { + case PartyAlignment_Good: sprintf(pContainer, "evt%02d-b", const_2()); break; + case PartyAlignment_Neutral: sprintf(pContainer, "evt%02d", const_2()); break; + case PartyAlignment_Evil: sprintf(pContainer, "evt%02d-c", const_2()); break; + default: assert(false); + } + /*v11 = const_2(); sprintf(pContainer, "evt%02d", v11); if ( pParty->uAlignment ) { @@ -14810,8 +14663,9 @@ { v19 = "-b"; } - strcat(pContainer, v19); -LABEL_6: + strcat(pContainer, v19);*/ + +//LABEL_6: v12 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); v13 = pHouse_ExitPictures[v10]; pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v12]; @@ -14832,7 +14686,7 @@ v20 = pMapStats->pInfos[v14].pName; v18 = pGlobalTXT_LocalizationStrings[410]; LABEL_10: - sprintf(byte_591098, v18, v20); + sprintf(sHouseName, v18, v20); goto LABEL_20; } v21 = pGlobalTXT_LocalizationStrings[79]; @@ -14851,9 +14705,9 @@ } v21 = pGlobalTXT_LocalizationStrings[73]; LABEL_19: - strcpy(byte_591098, v21); + strcpy(sHouseName, v21); LABEL_20: - pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)26, 0, (int)byte_591098); + pDialogueWindow = GUIWindow::Create(0, 0, 640, 480, (enum WindowType)26, 0, (int)sHouseName); //if ( BYTE1(pAnimatedRooms[p2DEvents_minus1___02[26 * v9]].field_C) ) if ( BYTE1(pAnimatedRooms[p2DEvents[v9 - 1].uAnimationID].field_C) ) HousePlaySomeSound(v9, 1); @@ -14939,7 +14793,7 @@ //if ( !(*(char *)v6 & 0x80) ) { v7 = uNumDialogueNPCPortraits++ - dword_591080 ? 1 : 0; - array_5913D8[v7] = npc; + HouseNPCData[v7] = npc; //v6 = v17; //*(&v13 + v2) = *(v17 - 1); Dst[uNumDialogueNPCPortraits - 1] = npc->uPortraitID; @@ -14988,7 +14842,6 @@ - //----- (0044622E) -------------------------------------------------------- bool __fastcall EnterHouse(HOUSE_TYPE uHouseID) { @@ -15007,12 +14860,12 @@ //Player *v13; // esi@25 int v14; // eax@25 //Player *v15; // esi@27 - signed int v16; // eax@32 + //signed int v16; // eax@32 unsigned int v17; // eax@37 signed int v18; // edi@37 signed int v19; // edi@41 //unsigned int v20; // ecx@41 - const char *v22; // [sp-4h] [bp-40h]@33 + //const char *v22; // [sp-4h] [bp-40h]@33 char pContainer[40]; // [sp+Ch] [bp-30h]@32 unsigned int v24; // [sp+34h] [bp-8h]@5 //enum HOUSE_TYPE v25; // [sp+38h] [bp-4h]@1 @@ -15130,7 +14983,8 @@ ++pIcons_LOD->uTexturePacksCount; if ( !pIcons_LOD->uNumPrevLoadedFiles ) pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles; - v16 = const_2(); + + /*v16 = const_2(); sprintf(pContainer, "evt%02d", v16); if ( pParty->uAlignment ) { @@ -15142,17 +14996,25 @@ { v22 = "-b"; } - strcat(pContainer, v22); -LABEL_37: + strcat(pContainer, v22);*/ +//LABEL_37: + switch (pParty->alignment) + { + case PartyAlignment_Good: sprintf(pContainer, "evt%02d-b", const_2()); break; + case PartyAlignment_Neutral: sprintf(pContainer, "evt%02d", const_2()); break; + case PartyAlignment_Evil: sprintf(pContainer, "evt%02d-c", const_2()); break; + default: assert(false); + } + v17 = pIcons_LOD->LoadTexture(pContainer, TEXTURE_16BIT_PALETTE); - array_5913D8[6] = 0; + pDialogueNPCCount = 0; pTexture_Dialogue_Background = &pIcons_LOD->pTextures[v17]; uTextureID_507B04 = uTextureID_right_panel; PrepareHouse(uHouseID); v18 = 1; uTextureID_507B04 = uTextureID_right_panel; if ( uNumDialogueNPCPortraits == 1 ) - array_5913D8[6] = (NPCData *)1; + pDialogueNPCCount = 1; pVideoPlayer->_4BF28F(pAnimatedRooms[uCurrentHouse_Animation].field_0, 1u); if ( (signed int)uHouseID < 139 || (signed int)uHouseID > 172 ) { diff -r e65d75206263 -r 91e1ba340f39 mm7_5.cpp --- a/mm7_5.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_5.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -77,7 +77,7 @@ unsigned int v8; // edx@59 unsigned int v9; // ecx@60 unsigned int v10; // ecx@73 - unsigned int v11; // eax@75 + //unsigned int v11; // eax@75 unsigned __int8 v12; // sf@75 unsigned __int8 v13; // of@75 int v14; // eax@98 @@ -393,8 +393,8 @@ case UIMSG_51: sub_4BDB56_buy_skill____(); continue; - case UIMSG_AF: - sub_4B2001(uMessageParam); + case UIMSG_AF://Click topic + ClickNPCTopic(uMessageParam);//CheckNPCTopic continue; case UIMSG_195: sub_4BCACC_bounties(uMessageParam); @@ -489,23 +489,25 @@ v10 = pSaveListPosition + uMessageParam; if ( dword_6BE138 == pSaveListPosition + uMessageParam ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_LoadSlot, 0, 0); + pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { - pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)164; + pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_LoadSlot; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - v11 = pMessageQueue_50CBD0->uNumMessages + 1; - v13 = pMessageQueue_50CBD0->uNumMessages + 1 > 40; - v12 = (signed int)pMessageQueue_50CBD0->uNumMessages - 39 < 0; + //v11 = pMessageQueue_50CBD0->uNumMessages + 1; + //v13 = pMessageQueue_50CBD0->uNumMessages + 1 > 40; + //v12 = (signed int)pMessageQueue_50CBD0->uNumMessages - 39 < 0; ++pMessageQueue_50CBD0->uNumMessages; if ( v12 ^ v13 ) { - pMessageQueue_50CBD0->pMessages[v11].eType = (UIMessageType)82; + pMessageQueue_50CBD0->pMessages[v11].eType = UIMSG_LoadGame; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; } - } + }*/ } uLoadGameUI_SelectedSlot = v10; dword_6BE138 = v10; @@ -1570,7 +1572,7 @@ } DrawHiredNPCs(); continue; - case UIMSG_19B: + case UIMSG_TransitionUI_Confirm: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; dword_50CDC8 = v0; @@ -1673,7 +1675,7 @@ pStru277->_427D48(v0); sub_44603D(); pEventTimer->Pause(); - pGameLoadingUI_ProgressBar->_443484((GUIProgressBar::Type)2); + pGameLoadingUI_ProgressBar->Initialize(GUIProgressBar::TYPE_Box); ++pGameLoadingUI_ProgressBar->uProgressMax; SaveGame(v0, 0); pGameLoadingUI_ProgressBar->Progress(); @@ -1918,13 +1920,14 @@ } sub_4BD8B5(); //goto LABEL_434; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); continue; case UIMSG_C3: pAudioPlayer->StopChannels(-1, -1); @@ -1987,12 +1990,13 @@ case UIMSG_B5: dword_50CDC8 = v0; //goto LABEL_453; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ continue; case UIMSG_B3: pPlayer9 = pPlayers[_506348_current_lloyd_playerid + 1]; @@ -2038,13 +2042,14 @@ pParty->sRotationY = LOWORD(pNPCData4->Location2D); pParty->sRotationX = HIWORD(pNPCData4->Location2D); } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ //crt_deconstruct_ptr_6A0118(); pBooksWindow->Release(); pGUIWindow_CurrentMenu->Release(); @@ -2135,14 +2140,15 @@ else pParty->pPlayers[(unsigned __int8)byte_50C0C0].CanCastSpell(0x14u); //LABEL_434: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v0; //LABEL_771: *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, v0, 0); continue; } v63 = 210; @@ -2688,13 +2694,14 @@ Rest(v95 % 6 + 60); _506F18_num_hours_to_sleep = 0; dword_506F14 = 0; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); ShowStatusBarString(pGlobalTXT_LocalizationStrings[481], 2u);// "Encounter!" v165 = 0; v151 = 0; @@ -2753,7 +2760,7 @@ //_set_status_string_pTmpBuf_and_continue: sub_41C0B8_set_status_string(pTmpBuf); continue; - case UIMSG_4F: + case UIMSG_SPellbook_ShowHightlightedSpellInfo: if ( !uActiveCharacter || (uNumSeconds = (unsigned int)pPlayers[uActiveCharacter], !*(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402)) ) continue; @@ -2874,14 +2881,18 @@ v130 = 0; v127 = rand() % 2 + 204; goto _play_sound_and_continue; - case UIMSG_56: - if ( pTurnEngine->field_4 != 3 ) - { - if ( uActiveCharacter ) - { - uNumSeconds = (unsigned int)pPlayers[uActiveCharacter]; - if ( *(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + 6734) + uMessageParam + 402) ) - { + case UIMSG_SelectSpell: + { + if (pTurnEngine->field_4 == 3) + continue; + if (!uActiveCharacter) + continue; + + // uNumSeconds = (unsigned int)pPlayers[uActiveCharacter]; + auto player = pPlayers[uActiveCharacter]; + if (player->spellbook.pChapters[player->lastOpenedSpellbookPage].bIsSpellAvailable[uMessageParam]) + //if ( *(char *)(uNumSeconds + 11 * *(char *)(uNumSeconds + &lastOpenedSpellbookPage) + uMessageParam + 402) ) + { if ( dword_50654C - 1 == uMessageParam ) { pGUIWindow_CurrentMenu->Release(); @@ -2889,12 +2900,12 @@ viewparams->bRedrawGameUI = v0; pCurrentScreen = SCREEN_GAME; pIcons_LOD->_4114F2(); - v103 = dword_50654C + 11 * *(char *)(uNumSeconds + 6734); + v103 = dword_50654C + 11 * player->lastOpenedSpellbookPage; if ( dword_50C9E8 < 40 ) { - dword_50C9EC[3 * dword_50C9E8] = 142; - dword_50C9F0[3 * dword_50C9E8] = v103; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = uActiveCharacter - 1; + dword_50C9EC[3 * dword_50C9E8] = UIMSG_CastSpellFromBook; + dword_50C9EC[3 * dword_50C9E8 + 1] = v103; + dword_50C9EC[3 * dword_50C9E8 + 2] = uActiveCharacter - 1; ++dword_50C9E8; } } @@ -2903,21 +2914,15 @@ byte_506550 = 1; dword_50654C = uMessageParam + 1; } - } - } - } - continue; - case UIMSG_8E: - if ( pTurnEngine->field_4 == 3 ) - continue; - v175 = 0; - v159 = 0; - v147 = 0; - //goto LABEL_678; - v80 = v199; - v79 = uMessageParam; - _42777D_CastSpell_UseWand_ShootArrow(v79, v80, v147, v159, v175); - continue; + } + } + continue; + + case UIMSG_CastSpellFromBook: + if ( pTurnEngine->field_4 != 3 ) + _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 0, 0, 0); + continue; + case UIMSG_92: if ( pTurnEngine->field_4 != 3 ) { @@ -3018,13 +3023,14 @@ GUIWindow::Create(0x25Au, 0x1C2u, 0, 0, WINDOW_VoiceSwitcherButton, (int)pBtn_GameSettings, 0); uNumVisibleWindows = uNumVisibleWindows - 1; //Ritor1: Insert //LABEL_453: - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; //goto LABEL_770; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; case UIMSG_C0: dword_50651C = v0; @@ -3314,7 +3320,8 @@ if ( !pMessageQueue_50CBD0->uNumMessages ) //goto LABEL_768; { - if ( (signed int)v115 < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); + /*if ( (signed int)v115 < 40 ) //goto LABEL_769; { pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; @@ -3322,26 +3329,26 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ continue; } if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) { - v115 = v0; pMessageQueue_50CBD0->uNumMessages = v0; -//LABEL_769: + pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); + /*v115 = v0; + pMessageQueue_50CBD0->uNumMessages = v0; pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; -//LABEL_770: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; //goto LABEL_771; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ continue; } v115 = 0; pMessageQueue_50CBD0->uNumMessages = 0; -//LABEL_768: - if ( (signed int)v115 < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_E, 0, 0); + /*if ( (signed int)v115 < 40 ) //goto LABEL_769; { pMessageQueue_50CBD0->pMessages[v115].eType = (UIMessageType)14; @@ -3349,10 +3356,9 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ continue; case UIMSG_E: -//LABEL_772: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnGameViewportClick(); @@ -3368,28 +3374,12 @@ pPoint3 = pMouse->GetCursorPos(&v204); v116 = pRenderer->pActiveZBuffer[*(int *)uNumSeconds + pSRZBufferLineOffsets[pPoint3->y]]; } - v163 = 0; pButton2 = (GUIButton *)(unsigned __int16)v116; - pWindowType1 = (WindowType)15; - //goto LABEL_779; - v8 = 0; - v9 = 0; - v137 = 0; - v133 = 0; - GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); + GUIWindow::Create(0, 0, 0, 0, (WindowType)15, (int)pButton2, 0); continue; case UIMSG_54: - v163 = 0; pButton2 = (GUIButton *)uMessageParam; - pWindowType1 = (WindowType)22; -//LABEL_779: - v8 = 0; - v9 = 0; -//LABEL_732: - v137 = 0; - v133 = 0; -//LABEL_733: - GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); + GUIWindow::Create(0, 0, 0, 0, (WindowType)22, (int)pButton2, 0); continue; case UIMSG_Game_Action: if ( pMessageQueue_50CBD0->uNumMessages ) @@ -3460,13 +3450,14 @@ dword_50C9E8 = 0; if ( dword_50C9DC ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9DC; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = (int)ptr_50C9E0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage((UIMessageType)dword_50C9DC, (int)ptr_50C9E0, 0); dword_50C9DC = 0; } else @@ -3476,13 +3467,14 @@ dword_50C9D8 -= pEventTimer->uTimeElapsed; if ( dword_50C9D8 <= 0 ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)dword_50C9D0; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = dword_50C9D4; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage((UIMessageType)dword_50C9D0, dword_50C9D4, 0); dword_50C9D0 = 0; dword_50C9D4 = 0; dword_50C9D8 = 0; @@ -3704,8 +3696,8 @@ v26 = uNum + pSaveListPosition; if ( dword_6BE138 == uNum + pSaveListPosition ) { - pMessageQueue_50CBD0->SendMessage(UIMSG_LoadSlot, 0, 0); - pMessageQueue_50CBD0->SendMessage(UIMSG_LoadGame, 0, 0); + pMessageQueue_50CBD0->AddMessage(UIMSG_LoadSlot, 0, 0); + pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); } uLoadGameUI_SelectedSlot = v26; dword_6BE138 = v26; @@ -3782,12 +3774,13 @@ viewparams->bRedrawGameUI = 1; } GUIWindow::Create(602, 450, 0, 0, WINDOW_VoiceSwitcherButton, (int)pBtn_GameSettings, 0); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Escape; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } if ( pUIMessageType == UIMSG_Escape ) @@ -3818,7 +3811,7 @@ SetCurrentMenuID(MENU_CREDITSCLOSE); continue; } - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)5; //LABEL_93: @@ -3826,7 +3819,8 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_ChangeGameState, 0, 0); continue; } v16 = GetCurrentMenuID() == 8; @@ -4754,7 +4748,7 @@ v37 = v3; if ( stru_50FE08.field_3EC[v0] & 1 ) { - v6 = dword_4F6E08[v3]; + v6 = ai_near_actors_targets_pid[v3]; v7 = v6 >> 3; v8 = (v6 & 7) - 3; uActorID = v7; @@ -4968,7 +4962,7 @@ int v59; // [sp+50h] [bp-1Ch]@1 unsigned int uActorID_Monster_; // [sp+54h] [bp-18h]@1 int v61; // [sp+58h] [bp-14h]@1 - int v62; // [sp+5Ch] [bp-10h]@1 + bool v62; // [sp+5Ch] [bp-10h]@1 int uDamageAmount; // [sp+60h] [bp-Ch]@1 int a2; // [sp+64h] [bp-8h]@27 int a3; // [sp+6Bh] [bp-1h]@6 @@ -5179,7 +5173,7 @@ v19 = v4->stru_24.uItemID == 0; uDamageAmount = v17; v57 = 0; - if ( !v19 && v4->stru_24.uAdditionalValue == 3 ) + if ( !v19 && v4->stru_24.uSpecEnchantmentType == 3 ) { a2 = 0; v57 = (PlayerEquipment *)1; @@ -6278,8 +6272,8 @@ char pContainer[128]; // [sp+24h] [bp-14h]@12 uTextureID_MAGNIF_B = pIcons_LOD->LoadTexture("MAGNIF-B", TEXTURE_16BIT_PALETTE); - if ( !pParty->uAlignment || pParty->uAlignment == 1 || pParty->uAlignment == 2 ) - uTextureID_BACKDOLL = pIcons_LOD->LoadTexture("BACKDOLL", TEXTURE_16BIT_PALETTE); + //if ( !pParty->uAlignment || pParty->uAlignment == 1 || pParty->uAlignment == 2 ) + uTextureID_BACKDOLL = pIcons_LOD->LoadTexture("BACKDOLL", TEXTURE_16BIT_PALETTE); uTextureID_507B04 = uTextureID_right_panel; v30 = 0; uTextureID_BACKHAND = pIcons_LOD->LoadTexture("BACKHAND", TEXTURE_16BIT_PALETTE); @@ -9324,7 +9318,7 @@ else v3 = uBaseLightLevel; } - return _43F5C8_get_point_light_level_with_respect_to_lights(v3, a1->uIndoorSectorID, a1->some_x, a1->some_y, a1->some_z); + return _43F5C8_get_point_light_level_with_respect_to_lights(v3, a1->uIndoorSectorID, a1->world_x, a1->world_y, a1->world_z); } //----- (0043F5C8) -------------------------------------------------------- @@ -9592,7 +9586,7 @@ v8 = v1->pQueue; do { - if ( (v8->uPackedID & 7) == OBJECT_Actor && ai_array_4F7DB0_actor_ids[v20] == v8->uPackedID >> 3 ) + if ( (v8->uPackedID & 7) == OBJECT_Actor && ai_near_actors_ids[v20] == v8->uPackedID >> 3 ) break; ++v18; ++v8; @@ -9602,7 +9596,7 @@ } if ( v18 == v1->uActorQueueSize ) { - v9 = ai_array_4F7DB0_actor_ids[v20]; + v9 = ai_near_actors_ids[v20]; *(int *)v7 = 1; *((int *)v7 + 2) = v2; *((int *)v7 - 1) = 8 * v9 | 3; @@ -9726,7 +9720,7 @@ if ( v6 != 8 ) goto LABEL_19; v3 = 0; - Actor::_403F58(v2->uPackedID >> 3, dword_4F6E08[v2->uPackedID >> 3], 32, 0); + Actor::AI_StandOrBored(v2->uPackedID >> 3, ai_near_actors_targets_pid[v2->uPackedID >> 3], 32, 0); } } } @@ -9758,9 +9752,9 @@ { if ( v11 != 17 ) { - v12 = dword_4F6E08[v10]; + v12 = ai_near_actors_targets_pid[v10]; v9->uActionLength = v3; - Actor::_403F58(v10, v12, 32, (AIDirection *)v3); + Actor::AI_StandOrBored(v10, v12, 32, (AIDirection *)v3); } } } @@ -10049,8 +10043,8 @@ if ( (v1->uPackedID & 7) != OBJECT_Player) { v4 = v3 >> 3; // turn based only stuff - a2a = dword_4F6E08[v3 >> 3]; - memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, dword_4F6E08[v3 >> 3], &a3, 0), sizeof(a3)); + a2a = ai_near_actors_targets_pid[v3 >> 3]; + memcpy(&a3, Actor::GetDirectionInfo(v1->uPackedID, ai_near_actors_targets_pid[v3 >> 3], &a3, 0), sizeof(a3)); memcpy(&a4, &a3, sizeof(a4)); v5 = &pActors[v3 >> 3]; LOWORD(v3) = v5->uAIState; @@ -10104,12 +10098,12 @@ v16 = a2a; if ( !(v14 % 2) ) { - Actor::_402F87(v4, a2a, &a4); + Actor::AI_Bored(v4, a2a, &a4); return; } v21 = 64; LABEL_26: - Actor::_403EB6(v15, v16, v21, v23); + Actor::AI_Stand(v15, v16, v21, v23); return; } LABEL_21: @@ -10194,8 +10188,8 @@ { if ( (short)v3 != 4 && (short)v3 != 11 && (short)v3 != 19 && (short)v3 != 17 ) { - v6 = (unsigned int *)&dword_4F6E08[(int)v4]; - Actor::_401221((unsigned int)v4, &dword_4F6E08[(int)v4], 1u); + v6 = (unsigned int *)&ai_near_actors_targets_pid[(int)v4]; + Actor::_SelectTarget((unsigned int)v4, &ai_near_actors_targets_pid[(int)v4], true); if ( v5->pMonsterInfo.uHostilityType && !*v6 ) v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v22 = *v6; @@ -10305,7 +10299,7 @@ goto LABEL_48; } LABEL_47: - Actor::_403EB6(v13, v22, 0x40u, &v18); + Actor::AI_Stand(v13, v22, 0x40u, &v18); v3 = v21; v21->field_C = 0; goto LABEL_48; @@ -10345,10 +10339,10 @@ v5 = v10->uPackedID; if ( (v10->uPackedID & 7) == OBJECT_Actor) { - v8 = dword_4F6E08[v5 >> 3]; + v8 = ai_near_actors_targets_pid[v5 >> 3]; memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, v2), sizeof(v7)); if ( !v1->_406D10(a2) ) - Actor::_403EB6(v10->uPackedID >> 3, v8, 0x20u, &v7); + Actor::AI_Stand(v10->uPackedID >> 3, v8, 0x20u, &v7); } ++a2; ++v10; @@ -10389,9 +10383,9 @@ if ( pActors[v3].CanAct() ) { v4 = v2->uPackedID; - v9 = dword_4F6E08[v3]; + v9 = ai_near_actors_targets_pid[v3]; memcpy(&v6, Actor::GetDirectionInfo(v4, v9, &a3, 0), sizeof(v6)); - Actor::_403EB6(v8, v9, 0x20u, &v6); + Actor::AI_Stand(v8, v9, 0x20u, &v6); v2->field_C = 0; v2->uActionLength = 0; v1 = v7; @@ -10452,7 +10446,7 @@ result = 1; if ( !(v13 | result | v6->uAIState == 5 | v6->uAIState == 11 | v6->uAIState == 19) ) { - v13 = dword_4F6E08[v5]; + v13 = ai_near_actors_targets_pid[v5]; memcpy(&v9, Actor::GetDirectionInfo(a1, v13, &a3, 0), sizeof(v9)); v7 = v6->uAIState; if ( v7 == 6 || v7 == 1 ) @@ -10472,7 +10466,7 @@ } if ( !thisa->_406D10(a2) ) LABEL_26: - Actor::_403EB6(v12, v13, 0x20u, &v9); + Actor::AI_Stand(v12, v13, 0x20u, &v9); } } } @@ -10529,12 +10523,12 @@ v5 = v4->uAIState; if ( v5 == 5 || v5 == 4 || v5 == 11 || v5 == 19 || v5 == 17 ) return 1; - v6 = &dword_4F6E08[v3]; + v6 = &ai_near_actors_targets_pid[v3]; v7 = &pTurnEngine->pQueue[a2]; v8 = *v6; v29 = &pTurnEngine->pQueue[a2]; a2a = v8; - Actor::_401221(v3, &dword_4F6E08[v3], 1u); + Actor::_SelectTarget(v3, &ai_near_actors_targets_pid[v3], true); if ( v4->pMonsterInfo.uHostilityType && !*v6 ) v4->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; v9 = Actor::GetDirectionInfo(v7->uPackedID, a2a, &a3, 0); @@ -10614,7 +10608,7 @@ v21 = 32; if ( v4->pMonsterInfo.uMovementType == 5 ) { - Actor::_403EB6(uActorID, a2a, 0x20u, 0); + Actor::AI_Stand(uActorID, a2a, 0x20u, 0); goto LABEL_25; } LABEL_24: @@ -10673,7 +10667,7 @@ } if ( v4->pMonsterInfo.uMovementType == 5 ) { - Actor::_403EB6(uActorID, a2a, 0x20u, 0); + Actor::AI_Stand(uActorID, a2a, 0x20u, 0); LABEL_53: v17 = v29; v29->field_C = 2; @@ -10729,10 +10723,10 @@ { if ( v6 != 17 ) { - v7 = (unsigned int *)&dword_4F6E08[v4]; + v7 = (unsigned int *)&ai_near_actors_targets_pid[v4]; a2 = *v7; v8 = a2; - Actor::_401221(v4, (int *)v7, 1u); + Actor::_SelectTarget(v4, (int *)v7, true); memcpy(&v11, Actor::GetDirectionInfo(*(int *)((char *)&v3->uPackedID + v18), v8, &a3, 0), sizeof(v11)); memcpy(&a4, &v11, sizeof(a4)); v5->uCurrentActionTime += pMiscTimer->uTimeElapsed; @@ -10747,9 +10741,9 @@ return; } if ( rand() % 2 ) - Actor::_403EB6(uActorID, a2, 0x40u, &a4); + Actor::AI_Stand(uActorID, a2, 0x40u, &a4); else - Actor::_402F87(uActorID, a2, &a4); + Actor::AI_Bored(uActorID, a2, &a4); } } } @@ -12103,6 +12097,8 @@ v7 = 1; if (_449B57_test_bit(pParty->_award_bits, 100)) v5 = 1; + + Log::Warning(L"%S %S %u", __FILE__, __FUNCTION__, __LINE__); // ai_near_actors_targets_pid[i] for AI_Stand seems always 0; original code behaviour is identical for (uint i = 0; i < uNumActors; ++i) { auto actor = pActors + i; @@ -12114,7 +12110,9 @@ actor->vPosition.z = actor->vInitialPosition.z; actor->sCurrentHP = actor->pMonsterInfo.uHP; if (actor->uAIState != Disabled) - Actor::_403EB6(i, dword_4F6E08[i], actor->pMonsterInfo.uRecoveryTime, 0); + { + Actor::AI_Stand(i, ai_near_actors_targets_pid[i], actor->pMonsterInfo.uRecoveryTime, 0); + } } actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; @@ -12139,7 +12137,7 @@ if (item->uItemType && (item->uSoundID & 8 || pObjectList->pObjects[item->uItemType].uFlags & 0x10)) - LayingItem::_42F933(i); + LayingItem::OnItemPickup(i); } for (uint i = 0; i < 100; ++i) @@ -13108,7 +13106,7 @@ LABEL_30: if ( byte_506360 ) { - result = pMessageQueue_50CBD0->uNumMessages; + /*result = pMessageQueue_50CBD0->uNumMessages; if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)181; @@ -13116,7 +13114,8 @@ result = 3 * pMessageQueue_50CBD0->uNumMessages + 3; *(&pMessageQueue_50CBD0->uNumMessages + result) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_B5, 0, 0); } return result; } @@ -13874,7 +13873,7 @@ } v2 = 1; v31 = 1; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); LABEL_15: dword_506568 = 0; pRenderer->DrawTextureTransparent(pViewport->uViewportX + 398, pViewport->uViewportY + 113, pTexture_506394); @@ -13884,7 +13883,7 @@ if ( dword_506568 != v2 ) { v31 = v2; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else @@ -13908,7 +13907,7 @@ if ( dword_506568 != 2 ) { v31 = v2; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else @@ -13932,7 +13931,7 @@ if ( dword_506568 != 3 ) { v31 = v2; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else @@ -13956,7 +13955,7 @@ if ( dword_506568 != 4 ) { v31 = v2; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else @@ -13980,7 +13979,7 @@ if ( dword_506568 != 5 ) { v31 = v2; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); } } else @@ -14216,7 +14215,7 @@ //v6 = dword_506534; } if ( dword_506548 | dword_506544 | dword_506540 | dword_50653C | dword_506538 | dword_506534 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); dword_506548 = 0; dword_506544 = 0; dword_506534 = 0; @@ -14477,13 +14476,14 @@ GUIWindow *v0; // ecx@1 v0 = ptr_507BDC; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage((UIMessageType)(int)ptr_507BDC->ptr_1C, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)(int)ptr_507BDC->ptr_1C; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ v0->Release(); ptr_507BDC = 0; pCurrentScreen = dword_506F0C[0]; @@ -14863,8 +14863,6 @@ } - - //----- (004151D9) -------------------------------------------------------- void __fastcall DrawPopupWindow(unsigned int uX, unsigned int uY, unsigned int uWidth, unsigned int uHeight) { @@ -15085,7 +15083,7 @@ case WINDOW_5E: // window that initiates savegame loading { if (pWindow->Hint != (char *)1) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); auto pGUIButton3 = (GUIButton *)pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, pGUIButton3->pTextures[0]); pHint = pWindow->Hint; @@ -15094,9 +15092,9 @@ pGUIButton3->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); if (pCurrentScreen == SCREEN_SAVEGAME) - pMessageQueue_50CBD0->SendMessage(UIMSG_SaveGame, 0, 0); + pMessageQueue_50CBD0->AddMessage(UIMSG_SaveGame, 0, 0); else - pMessageQueue_50CBD0->SendMessage(UIMSG_LoadGame, 0, 0); + pMessageQueue_50CBD0->AddMessage(UIMSG_LoadGame, 0, 0); } continue; } @@ -15108,7 +15106,7 @@ if ( pWindowType == WINDOW_60 )//96 { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pGUIButton = (GUIButton *)pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, pGUIButton->pTextures[0]); pHint = pWindow->Hint; @@ -15116,7 +15114,7 @@ if ( pHint && pHint != (char *)1 ) pGUIButton->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) continue; pNumMessages = pMessageQueue_50CBD0->uNumMessages; //LABEL_151: @@ -15124,7 +15122,8 @@ //LABEL_152: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } v34 = v33 - 1; @@ -15189,7 +15188,7 @@ GUIButton2.uWidth = 171; GUIButton2.uHeight = 37; GUIButton2.pParent = pButton_RestUI_WaitUntilDawn->pParent; - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)pWindow->ptr_1C + 15)); viewparams->bRedrawGameUI = 1; GUIButton2.DrawLabel(pGlobalTXT_LocalizationStrings[183], pFontCreate, 0, 0);// 8 @@ -15201,7 +15200,7 @@ continue; } if ( pWindow->Hint != (char *)1 )//pWindowType == WINDOW_61 - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); v32 = pWindow->ptr_1C; pRenderer->DrawTextureIndexed(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)v32 + 16)); //goto LABEL_138; @@ -15211,21 +15210,22 @@ ((GUIButton *)v32)->DrawLabel(pHint, pFontCreate, 0, 0); pWindow->Release(); pNumMessages = pMessageQueue_50CBD0->uNumMessages; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } if ( pWindowType == WINDOW_5F ) { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); v32 = pWindow->ptr_1C; pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)v32 + 15)); //LABEL_138: @@ -15236,7 +15236,7 @@ pWindow->Release(); //LABEL_142: pNumMessages = pMessageQueue_50CBD0->uNumMessages; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) //goto LABEL_151; { pMessageQueue_50CBD0->pMessages[pNumMessages].eType = (UIMessageType)113; //0x71 @@ -15244,7 +15244,8 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } v14 = pWindowType - 80; @@ -15278,7 +15279,7 @@ else { if ( v26 >= 221 && v26 < 271 ) - pItemGen._bonus_type = rand() % 10 + 1; + pItemGen.uEncantmentType = rand() % 10 + 1; } pItemsTable->SetSpecialBonus(&pItemGen); pParty->SetHoldingItem(&pItemGen); @@ -15291,7 +15292,7 @@ if ( pWindowType == WINDOW_5A ) // Press buttons in title menu and in game, and escape in game { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pButtonPtr_1C = (GUIButton *)pWindow->ptr_1C; if ( pButtonPtr_1C->uX >= 0 )//if ( (pButtonPtr_1C->uX & 0x80000000u) == 0 ) { @@ -15342,7 +15343,7 @@ if ( pWindowType == WINDOW_5B )//Change button in Character window { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pButtonPtr_1C = (GUIButton *)pWindow->ptr_1C; pTexture2 = pButtonPtr_1C->pTextures[1]; //LABEL_94: @@ -15367,7 +15368,7 @@ if ( pWindowType == WINDOW_VoiceSwitcherButton ) // Change page in AutonotesBook { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pButtonPtr_1C = (GUIButton *)pWindow->ptr_1C; pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, pButtonPtr_1C->pTextures[0]); //goto LABEL_80; @@ -15387,7 +15388,7 @@ if ( pWindowType == WINDOW_5D ) { if ( pWindow->Hint != (char *)1 ) - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pRenderer->DrawTextureTransparent(pWindow->uFrameX, pWindow->uFrameY, *((Texture **)pWindow->ptr_1C + 16)); viewparams->bRedrawGameUI = 1; //goto LABEL_134; @@ -15413,13 +15414,14 @@ { v29 = pMessageQueue_50CBD0->uNumMessages; pWindow->field_40 = 0; - if ( (signed int)v29 < 40 ) + /*if ( (signed int)v29 < 40 ) { pMessageQueue_50CBD0->pMessages[v29].eType = (UIMessageType)(int)ptr_507BD0->ptr_1C; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage((UIMessageType)(int)ptr_507BD0->ptr_1C, 0, 0); pEventTimer->Resume(); ptr_507BD0->Release(); pCurrentScreen = SCREEN_GAME; @@ -15520,7 +15522,7 @@ } continue; } - pWindowList[pVisibleWindowsIdxs[i] - 1]._4B3157(); + pWindowList[pVisibleWindowsIdxs[i] - 1].HouseDialogManager(); if ( !window_SpeakInHouse ) continue; v10 = window_SpeakInHouse->ptr_1C; @@ -15541,14 +15543,15 @@ } //goto LABEL_142; pNumMessages = pMessageQueue_50CBD0->uNumMessages; - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; continue; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); continue; } if ( pWindowType == WINDOW_SpellBook ) @@ -15747,7 +15750,7 @@ v27 = &v0->pInventoryItems[pOut.z]; v28 = v27->uItemID; v51 = pItemsTable->pItems[v27->uItemID].uEquipType; - v29 = (ItemGen *)(1800 * pParty->pPickedItem._bonus_type); + v29 = (ItemGen *)(1800 * pParty->pPickedItem.uEncantmentType); if ( pParty->pPickedItem.uItemID != 233 ) { if ( pParty->pPickedItem.uItemID == 236 ) @@ -15768,15 +15771,15 @@ v33 = v27->uItemID; if ( (signed int)v27->uItemID >= 64 && (signed int)v33 <= 65 || (pOut.y = v27->uAttributes, pOut.y & 2) - || v27->uAdditionalValue - || v27->_bonus_type + || v27->uSpecEnchantmentType + || v27->uEncantmentType || v51 && v51 != 1 && v51 != 2 || (signed int)v33 >= 500 ) goto LABEL_92; v34 = *(int *)&aSbwb00[4 * pParty->pPickedItem.uItemID + 4]; a2.y = (int)v29 << 7; v31 = (double)(signed int)((int)v29 << 7); - v27->uAdditionalValue = v34; + v27->uSpecEnchantmentType = v34; } else { @@ -15784,13 +15787,13 @@ || (v27->UpdateTempBonus(pParty->uTimePlayed), v30 = v27->uItemID, (signed int)v27->uItemID >= 64) && (signed int)v30 <= 65 || (pOut.y = v27->uAttributes, pOut.y & 2) - || v27->uAdditionalValue - || v27->_bonus_type + || v27->uSpecEnchantmentType + || v27->uEncantmentType || v51 && v51 != 1 && v51 != 2 || (signed int)v30 >= 500 ) goto LABEL_92; a2.y = (int)v29 << 7; - v27->uAdditionalValue = 40; + v27->uSpecEnchantmentType = 40; v31 = (double)a2.y; } v32 = pParty->uTimePlayed + (signed int)(signed __int64)(v31 * 0.033333335); @@ -15803,7 +15806,7 @@ dword_50C9A8 = 256; goto LABEL_92; } - v36 = (70.0 - (double)pParty->pPickedItem._bonus_type) * 0.01; + v36 = (70.0 - (double)pParty->pPickedItem.uEncantmentType) * 0.01; if ( v36 < 0.0 ) v36 = 0.0; if ( v51 != 12 ) @@ -15909,13 +15912,15 @@ v26 = rand(); v0->ReceiveDamage(v26 % 11 + 10, 0); pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ v42 = (int *)&a2.y; v41 = (int *)&y.y; v40 = (int *)&pOut; @@ -15950,8 +15955,8 @@ *(int *)&v0->field_1F5[36 * v19 + 15] = 1; v20 = v47 + 50 * v15; v0->pInventoryItems[pOut.z].uItemID = v51; - v0->pInventoryItems[pOut.z]._bonus_type = (pParty->pPickedItem._bonus_type - + v0->pInventoryItems[pOut.z]._bonus_type) + v0->pInventoryItems[pOut.z].uEncantmentType = (pParty->pPickedItem.uEncantmentType + + v0->pInventoryItems[pOut.z].uEncantmentType) / 2; v0->SetVariable(VAR_AutoNotes, *(short *)&pItemsTable->potion_note[2 * v20 ]);//field_10168 + 388 LABEL_74: @@ -15968,7 +15973,7 @@ if ( *(int *)(a2.y + 532) == 221 ) *(int *)(a2.y + 532) = pParty->pPickedItem.uItemID; else - *(int *)(a2.y + 536) = pParty->pPickedItem._bonus_type; + *(int *)(a2.y + 536) = pParty->pPickedItem.uEncantmentType; v21 = v0->AddItem(0xFFFFFFFFu, 0xDCu); if ( v21 ) *(int *)&v0->field_1F5[36 * v21 + 15] = 1; @@ -15983,13 +15988,15 @@ } v0->_4160CA(v23); pAudioPlayer->PlaySound(SOUND_8, 0, 0, -1, 0, 0, 0, 0); - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)113; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ v42 = (int *)&a2.y; v41 = (int *)&y.y; v40 = (int *)&pOut; @@ -16639,7 +16646,7 @@ pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; } //v11 = i->uControlParam; - pMessageQueue_50CBD0->SendMessage((UIMessageType)i->uControlID, i->uControlParam, 0); + pMessageQueue_50CBD0->AddMessage((UIMessageType)i->uControlID, i->uControlParam, 0); return; } goto LABEL_45; @@ -16658,13 +16665,15 @@ && pPlayers[uActiveCharacter]->CanAct() && pPlayers[uActiveCharacter]->CanSteal() ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)27; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = v6 >> 3; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_1B, v6 >> 3, 0); + if ( pParty->bTurnBasedModeOn == 1 ) { if ( pTurnEngine->field_4 == 3 ) diff -r e65d75206263 -r 91e1ba340f39 mm7_6.cpp --- a/mm7_6.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_6.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -42,6 +42,7 @@ #include "texts.h" #include "StorylineTextTable.h" #include "Events2D.h" +#include "Log.h" #include "mm7_data.h" @@ -1401,7 +1402,7 @@ { if ( pItemsTable->pItems[pActor->array_000234[3].uItemID].uEquipType != 18 ) goto LABEL_9; - v14 = pActor->array_000234[3].uAdditionalValue; + v14 = pActor->array_000234[3].uSpecEnchantmentType; pActor->array_000234[3].Reset(); } if ( v14 ) @@ -1431,7 +1432,7 @@ v4 = Dst.uItemID; } if ( pItemsTable->pItems[v5].uEquipType == 14 && v4 != 220 ) - Dst._bonus_type = 2 * rand() % 4 + 2; + Dst.uEncantmentType = 2 * rand() % 4 + 2; pItemsTable->SetSpecialBonus(&Dst); if ( !pParty->AddItem(&Dst) ) pParty->SetHoldingItem(&Dst); @@ -2172,9 +2173,9 @@ //----- (0042777D) -------------------------------------------------------- void _42777D_CastSpell_UseWand_ShootArrow(int a1, unsigned int uPlayerID, unsigned int a4, __int16 a5, int a6) { - bool result; // eax@2 + //bool result; // eax@2 __int16 v6; // bx@4 - Player *v7; // eax@4 + //Player *v7; // eax@4 char v8; // zf@12 unsigned __int16 v9; // cx@16 unsigned int v10; // eax@18 @@ -2202,11 +2203,20 @@ a3a = uPlayerID; a2a = a1; - if ( pParty->bTurnBasedModeOn != 1 - || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 ) + + //if ( pParty->bTurnBasedModeOn != 1 + // || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 ) + if (pParty->bTurnBasedModeOn) { + if (pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3) + return; + } + + v6 = a5; - v7 = &pParty->pPlayers[uPlayerID]; + //v7 = &pParty->pPlayers[uPlayerID]; + assert(uPlayerID < 4); + auto player = &pParty->pPlayers[uPlayerID]; if ( !(a5 & 0x10) ) { switch ( a1 ) @@ -2267,19 +2277,19 @@ if ( a4 ) v8 = (a4 & 0x1C0) == 0; else - v8 = (v7->pActiveSkills[16] & 0x1C0) == 0; + v8 = (player->pActiveSkills[PLAYER_SKILL_SPIRIT] & 0x1C0) == 0; if ( v8 ) goto LABEL_25; break; case 50: v9 = a4; if ( !a4 ) - v9 = v7->pActiveSkills[16]; + v9 = player->pActiveSkills[PLAYER_SKILL_SPIRIT]; goto LABEL_18; case 95: v9 = a4; if ( !a4 ) - v9 = v7->pActiveSkills[20]; + v9 = player->pActiveSkills[PLAYER_SKILL_DARK]; LABEL_18: v10 = SkillToMastery(v9); v12 = __OFSUB__(v10, 3); @@ -2288,7 +2298,7 @@ case 73: v13 = a4; if ( !a4 ) - v13 = v7->pActiveSkills[18]; + v13 = player->pActiveSkills[PLAYER_SKILL_BODY]; v14 = SkillToMastery(v13); v12 = __OFSUB__(v14, 4); v11 = ((v14 - 4) & 0x80000000u) != 0; @@ -2317,6 +2327,7 @@ break; } } + v15 = pStru277; if ( v6 & 0x3CA ) { @@ -2348,8 +2359,8 @@ } ++v15; } - while ( (signed int)v15 < (signed int)&unk_50C190 ); - result = pStru277->PushStru277(a2a, a3a, a4, v6, a6); + while (v15 < pStru277 + 10); + int result = pStru277->PushStru277(a2a, a3a, a4, v6, a6); if ( result != -1 ) { if ( v6 & 2 ) @@ -2422,19 +2433,8 @@ pGUIWindow_Settings->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 1u, 0x32u, "", 0); pGUIWindow_Settings->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 2u, 0x33u, "", 0); pGUIWindow_Settings->CreateButton(0x186u, 0x1A6u, 0x23u, 0, 2, 0, 0x8Du, 3u, 0x34u, "", 0); - v29 = 0; - v28 = ""; - v27 = 0; - v26 = 0; - v25 = 140; - v24 = 0; - v23 = 1; - v22 = 344; - v21 = 460; - v20 = 8; - v19 = 8; - v18 = pGUIWindow_Settings; - goto LABEL_56; + pGUIWindow_Settings->CreateButton(8, 8, 460, 344, 1, 0, 140, 0, 0, "", NULL); + sub_421B2C_PlaceInInventory_or_DropPickedItem(); } if ( HIBYTE(v6) & 2 && !pGUIWindow_Settings ) { @@ -2469,7 +2469,6 @@ pGUIWindow_Settings->CreateButton(0x231u, 0x95u, 0x40u, 0x4Au, 1, 0, 0x8Fu, 5u, 0x36u, "", 0); } } - } } @@ -3852,7 +3851,7 @@ v721 = (int)&pActors[a2 >> 3], !stru_50C198.GetMagicalResistance(&pActors[a2 >> 3], 9u)) ) goto LABEL_1056; - Actor::_403EB6(v730, 4u, 0x80u, (AIDirection *)v1); + Actor::AI_Stand(v730, 4u, 0x80u, (AIDirection *)v1); v726 = (Player *)(23040 * v2); v54 = (signed __int64)((double)(23040 * v2) * 0.033333335); v55 = v721; @@ -4004,14 +4003,14 @@ { if (!v730c->Broken()) { - if ( v730c->uAdditionalValue == v1 ) + if ( v730c->uSpecEnchantmentType == v1 ) { - if ( v730c->_bonus_type == v1 ) + if ( v730c->uEncantmentType == v1 ) { v68 = BYTE4(v726->pConditions[3]); if ( !v68 || v68 == 1 || v68 == 2 ) { - if ( !pItemsTable->_456D5E_is_some_material(v730c) ) + if ( !pItemsTable->IsMaterialNonCommon(v730c) ) { v69 = v730c; v14 = v731 == 4; @@ -5413,8 +5412,8 @@ { if ( v731 != 4 || (v245 = (int)&v726->pInventoryItems[a2], v246 = *(int *)v245, *(int *)v245 > 134) - || v726->pInventoryItems[a2].uAdditionalValue != v1 - || v726->pInventoryItems[a2]._bonus_type != v1 + || v726->pInventoryItems[a2].uSpecEnchantmentType != v1 + || v726->pInventoryItems[a2].uEncantmentType != v1 || v726->pInventoryItems[a2]._bonus_strength != v1 || (_this = (ItemGen *)((char *)&v726->pInventoryItems[a2] + 20), v726->pInventoryItems[a2].Broken()) ) goto LABEL_616; @@ -5518,8 +5517,8 @@ v290 = v289->uItemID; LODWORD(v725) = (int)(char *)&pItemsTable + 48 * v290 + 4; if ( v290 > 134 - || _this->uAdditionalValue != v1 - || _this->_bonus_type != v1 + || _this->uSpecEnchantmentType != v1 + || _this->uEncantmentType != v1 || _this->_bonus_strength != v1 || (v291 = pItemsTable->pItems[v290].uEquipType) == 0 || v291 == 1 @@ -5571,7 +5570,7 @@ } v302 = rand() % SLODWORD(v725); v303 = v679; - v294->uAdditionalValue = v679; + v294->uSpecEnchantmentType = v679; v304 = pItemsTable->pSpecialEnchantments[v303].to_item_apply[pItemsTable->pItems[v294->uItemID].uEquipType + 4]; v305 = v302 + 1; if ( v304 < v305 ) @@ -5581,26 +5580,26 @@ v307 = (int)(jj + 1); v732 = v307; v308 = *(int *)v307; - v294->uAdditionalValue = v308; + v294->uSpecEnchantmentType = v308; v304 += pItemsTable->pSpecialEnchantments[v308].to_item_apply[pItemsTable->pItems[v294->uItemID].uEquipType + 4]; if ( v304 >= v305 ) break; } } - ++v294->uAdditionalValue; + ++v294->uSpecEnchantmentType; } else { v293 = rand(); v294 = _this; v295 = v293 % 10;// pItemsTable->field_116D8[pItemsTable->pItems[_this->uItemID].uEquipType]; - _this->_bonus_type = 0; + _this->uEncantmentType = 0; for ( kk = pItemsTable->pEnchantments[0].to_item[pItemsTable->pItems[v294->uItemID].uEquipType + 1]; ; - kk += pItemsTable->pEnchantments[v294->_bonus_type].to_item[pItemsTable->pItems[v294->uItemID].uEquipType + kk += pItemsTable->pEnchantments[v294->uEncantmentType].to_item[pItemsTable->pItems[v294->uItemID].uEquipType + 1] ) { - ++v294->_bonus_type; + ++v294->uEncantmentType; if ( kk >= v295 ) break; } @@ -5616,7 +5615,7 @@ if ( pParty->uFlags & 0x30 && v12 != 4 || rand() % 100 >= amount && v731 != 4 ) goto LABEL_200; byte_50C0C0 = LOBYTE(v3->uPlayerID); - pMessageQueue_50CBD0->SendMessage((UIMessageType)195, v1, v1); + pMessageQueue_50CBD0->AddMessage(UIMSG_C3, v1, v1); goto LABEL_1056; case 33: LODWORD(v733) = 604800 * v2; @@ -5626,7 +5625,7 @@ if ( pPlayer->sMana >= (signed int)uRequiredMana ) { pEventTimer->Pause(); - pMessageQueue_50CBD0->SendMessage((UIMessageType)177, v1, v1); + pMessageQueue_50CBD0->AddMessage(UIMSG_B1, v1, v1); qword_506350 = (signed int)v733; _506348_current_lloyd_playerid = v3->uPlayerID; ::uRequiredMana = v319; @@ -6472,7 +6471,7 @@ if ( !pParty->AddItem(&pLayingItems[v445].stru_24) ) pParty->SetHoldingItem(&pLayingItems[v445].stru_24); } - LayingItem::_42F933(v445); + LayingItem::OnItemPickup(v445); } else { @@ -7327,7 +7326,7 @@ || *(int *)(HIDWORD(v733) + 12) != v1 || *(int *)(HIDWORD(v733) + 4) != v1 || (v591 = *(char *)(v732 + 28)) != 0 && v591 != 1 && v591 != 2 - || pItemsTable->_456D5E_is_some_material((ItemGen *)HIDWORD(v733)) ) + || pItemsTable->IsMaterialNonCommon((ItemGen *)HIDWORD(v733)) ) goto LABEL_199; v592 = HIDWORD(v733); v14 = v731 == 4; @@ -7798,11 +7797,115 @@ return 8 * this->pIcons[uIconID].uAnimLength; } + +const wchar_t *UIMessage2String(UIMessageType msg) +{ + #define CASE(xxx) case xxx: _swprintf(b, L"%03X/%s", msg, L#xxx); return b; + static wchar_t b[256]; // bad for threads + switch (msg) + { + CASE(UIMSG_SelectSpell) + CASE(UIMSG_ChangeGameState) + CASE(UIMSG_Attack) + CASE(UIMSG_PlayArcomage) + CASE(UIMSG_MainMenu_ShowPartyCreationWnd) + CASE(UIMSG_MainMenu_ShowLoadWindow) + CASE(UIMSG_ShowCredits) + CASE(UIMSG_ExitToWindows) + CASE(UIMSG_PlayerCreationChangeName) + CASE(UIMSG_PlayerCreationClickPlus) + CASE(UIMSG_PlayerCreationClickMinus) + CASE(UIMSG_PlayerCreationSelectActiveSkill) + CASE(UIMSG_PlayerCreationSelectClass) + CASE(UIMSG_PlayerCreationClickOK) + CASE(UIMSG_PlayerCreationClickReset) + CASE(UIMSG_AutonotesBook) + CASE(UIMSG_PlayerCreationRemoveUpSkill) + CASE(UIMSG_PlayerCreationRemoveDownSkill) + CASE(UIMSG_SPellbook_ShowHightlightedSpellInfo) + CASE(UIMSG_LoadGame) + CASE(UIMSG_SaveGame) + CASE(UIMSG_ShowStatus_DateTime) + CASE(UIMSG_ShowStatus_ManaHP) + CASE(UIMSG_ShowStatus_Player) + CASE(UIMSG_Wait5Minutes) + CASE(UIMSG_Wait1Hour) + CASE(UIMSG_ShowStatus_Food) + CASE(UIMSG_ShowStatus_Funds) + CASE(UIMSG_QuickReference) + CASE(UIMSG_GameMenuButton) + CASE(UIMSG_AlreadyResting) + CASE(UIMSG_SelectCharacter) + CASE(UIMSG_ChangeSoundVolume) + CASE(UIMSG_ChangeMusicVolume) + CASE(UIMSG_Escape) + CASE(UIMSG_PlayerCreation_SelectAttribute) + CASE(UIMSG_InventoryLeftClick) + CASE(UIMSG_SkillUp) + CASE(UIMSG_GameMenu_ReturnToGame) + CASE(UIMSG_StartNewGame) + CASE(UIMSG_Game_OpenLoadGameDialog) + CASE(UIMSG_Game_OpenSaveGameDialog) + CASE(UIMSG_Game_OpenOptionsDialog) + CASE(UIMSG_SetGraphicsMode) + CASE(UIMSG_Quit) + CASE(UIMSG_StartHireling1Dialogue) + CASE(UIMSG_StartHireling2Dialogue) + CASE(UIMSG_SelectDialogueOption) + CASE(UIMSG_CastSpellFromBook) + CASE(UIMSG_PlayerCreation_VoicePrev) + CASE(UIMSG_PlayerCreation_VoiceNext) + CASE(UIMSG_StartNPCDialogue) + CASE(UIMSG_ArrowUp) + CASE(UIMSG_DownArrow) + CASE(UIMSG_LoadSlot) + CASE(UIMSG_SelectLoadSlot) + CASE(UIMSG_Cancel) + CASE(UIMSG_ExitRest) + CASE(UIMSG_PlayerCreation_FacePrev) + CASE(UIMSG_PlayerCreation_FaceNext) + CASE(UIMSG_CycleCharacters) + CASE(UIMSG_SetTurnSpeed) + CASE(UIMSG_ToggleWalkSound) + CASE(UIMSG_ChangeVoiceVolume) + CASE(UIMSG_ToggleShowDamage) + CASE(UIMSG_ScrollNPCPanel) + CASE(UIMSG_ShowFinalWindow) + CASE(UIMSG_OpenQuestBook) + CASE(UIMSG_OpenAutonotes) + CASE(UIMSG_OpenMapBook) + CASE(UIMSG_OpenCalendar) + CASE(UIMSG_OpenHistoryBook) + CASE(UIMSG_ToggleAlwaysRun) + CASE(UIMSG_ToggleFlipOnExit) + CASE(UIMSG_Game_Action) + CASE(UIMSG_OpenRestUI) + CASE(UIMSG_TransitionUI_Confirm) + CASE(UIMSG_OpenKeyMappingOptions) + CASE(UIMSG_SelectKeyPage1) + CASE(UIMSG_SelectKeyPage2) + CASE(UIMSG_ResetKeyMapping) + CASE(UIMSG_ChangeKeyButton) + CASE(UIMSG_OpenVideoOptions) + CASE(UIMSG_ToggleBloodsplats) + CASE(UIMSG_ToggleColoredLights) + CASE(UIMSG_ToggleTint) + default: + _swprintf(b, L"UIMSG_%03X", msg); return b; + }; + #undef CASE +} + + //----- (0042EB8D) -------------------------------------------------------- -void GUIMessageQueue::SendMessage(UIMessageType msg, int param, unsigned int a4) +void GUIMessageQueue::AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file, int line) { + Log::Warning(L"%s @ (%S %u)", UIMessage2String(msg), file, line); if (uNumMessages < 40) { + files[uNumMessages] = file; + lines[uNumMessages] = line; + pMessages[uNumMessages].eType = msg; pMessages[uNumMessages].param = param; pMessages[uNumMessages++].field_8 = a4; @@ -8777,7 +8880,7 @@ //----- (0042FBDD) -------------------------------------------------------- void __cdecl sub_42FBDD() { - pAudioPlayer->PlaySound((SoundID)75, 0, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, 0, 0, -1, 0, 0, 0, 0); pRenderer->DrawTextureTransparent(pBtn_YES->uX, pBtn_YES->uY, pBtn_YES->pTextures[0]); pRenderer->Present(); } @@ -8785,7 +8888,7 @@ //----- (0042FC15) -------------------------------------------------------- void __cdecl CloseWindowBackground() { - pAudioPlayer->PlaySound((SoundID)75, -2, 0, -1, 0, 0, 0, 0); + pAudioPlayer->PlaySound(SOUND_Button2, -2, 0, -1, 0, 0, 0, 0); pRenderer->DrawTextureTransparent(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY, pBtn_ExitCancel->pTextures[0]); pRenderer->Present(); } @@ -9087,8 +9190,9 @@ { pActionQueue = pPartyActionQueue; LABEL_120: - - if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) + pMessageQueue_50CBD0->AddMessage(UIMSG_Attack, 0, 0); + break; + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages < 40 ) { pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Attack; //goto _send_message; @@ -9096,7 +9200,7 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; break; - } + }*/ } else { @@ -9104,8 +9208,8 @@ if ( dword_50C9E8 < 40 ) { dword_50C9EC[3 * dword_50C9E8] = 25; - dword_50C9F0[3 * dword_50C9E8] = 0; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = 0; + dword_50C9EC[3 * dword_50C9E8 + 1] = 0; + dword_50C9EC[3 * dword_50C9E8 + 2] = 0; ++dword_50C9E8; } } @@ -9122,13 +9226,15 @@ case INPUT_EventTrigger: if (pCurrentScreen == SCREEN_GAME) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) break; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = UIMSG_Game_Action; //goto _send_message; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; + break;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); break; } if ( pCurrentScreen == SCREEN_NPC_DIALOGUE ) @@ -9136,6 +9242,8 @@ v11 = pMessageQueue_50CBD0->uNumMessages; if ( pMessageQueue_50CBD0->uNumMessages ) { + v11 = 0; + pMessageQueue_50CBD0->uNumMessages = 0; if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) { v11 = 1; @@ -9148,10 +9256,9 @@ ++pMessageQueue_50CBD0->uNumMessages; break; } - v11 = 0; - pMessageQueue_50CBD0->uNumMessages = 0; + break; } - if ( (signed int)v11 < 40 ) + /*if ( (signed int)v11 < 40 ) //goto LABEL_132; { pMessageQueue_50CBD0->pMessages[v11].eType = UIMSG_Escape; @@ -9159,7 +9266,8 @@ *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; break; - } + }*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); } break; case INPUT_CharCycle: @@ -9169,8 +9277,8 @@ break; dword_50C9EC[3 * dword_50C9E8] = 176; //goto LABEL_155; - dword_50C9F0[3 * dword_50C9E8] = 0; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = 0; + dword_50C9EC[3 * dword_50C9E8 + 1] = 0; + dword_50C9EC[3 * dword_50C9E8 + 2] = 0; ++dword_50C9E8; break; case INPUT_LookUp: @@ -9238,8 +9346,8 @@ break; dword_50C9EC[3 * dword_50C9E8] = 367; //goto LABEL_155; - dword_50C9F0[3 * dword_50C9E8] = 0; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = 0; + dword_50C9EC[3 * dword_50C9E8 + 1] = 0; + dword_50C9EC[3 * dword_50C9E8 + 2] = 0; ++dword_50C9E8; break; case INPUT_ZoomOut: @@ -9248,8 +9356,8 @@ { dword_50C9EC[3 * dword_50C9E8] = 368; //LABEL_155: - dword_50C9F0[3 * dword_50C9E8] = 0; - *(&dword_50C9E8 + 3 * dword_50C9E8 + 3) = 0; + dword_50C9EC[3 * dword_50C9E8 + 1] = 0; + dword_50C9EC[3 * dword_50C9E8 + 2] = 0; ++dword_50C9E8; } break; @@ -9279,13 +9387,14 @@ { if ( !pCurrentScreen ) { - if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) + /*if ( (signed int)pMessageQueue_50CBD0->uNumMessages >= 40 ) goto LABEL_175; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].eType = (UIMessageType)404; //goto LABEL_174; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Game_Action, 0, 0); goto LABEL_175; } if ( pCurrentScreen == SCREEN_NPC_DIALOGUE @@ -9298,9 +9407,9 @@ if ( pMessageQueue_50CBD0->pMessages[0].field_8 ) { v15 = 1; - pMessageQueue_50CBD0->uNumMessages = 1; + pMessageQueue_50CBD0->uNumMessages = 0; //goto LABEL_173; - pMessageQueue_50CBD0->pMessages[v15].eType = (UIMessageType)113; + pMessageQueue_50CBD0->pMessages[v15].eType = UIMSG_Escape; pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; ++pMessageQueue_50CBD0->uNumMessages; @@ -9308,14 +9417,15 @@ } pMessageQueue_50CBD0->uNumMessages = 0; } - if ( (signed int)v15 >= 40 ) + /*if ( (signed int)v15 >= 40 ) goto LABEL_175; //LABEL_173: pMessageQueue_50CBD0->pMessages[v15].eType = (UIMessageType)113; //LABEL_174: pMessageQueue_50CBD0->pMessages[pMessageQueue_50CBD0->uNumMessages].param = 0; *(&pMessageQueue_50CBD0->uNumMessages + 3 * pMessageQueue_50CBD0->uNumMessages + 3) = 0; - ++pMessageQueue_50CBD0->uNumMessages; + ++pMessageQueue_50CBD0->uNumMessages;*/ + pMessageQueue_50CBD0->AddMessage(UIMSG_Escape, 0, 0); goto LABEL_175; } } diff -r e65d75206263 -r 91e1ba340f39 mm7_data.cpp --- a/mm7_data.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_data.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -67,7 +67,7 @@ Award pAwards[104]; #include "stru159.h" -stru159 pAnimatedRooms[196] = +stru159 pAnimatedRooms[196] = //0x4E5F70 { "", 0x4, 0x1F4, 0, "Human Armor01", 0x20, 0x2C0, 0x3A02, @@ -144,10 +144,13 @@ "Lord And Judge Out01", 1, 0, 0x271D, "Human Poor House 1", 8, 0, 0x1D, "Human Poor House 2", 8, 0, 0x1D, + "Human Poor House 3", 8, 0, 0x1D, "Human Medium House 1", 8, 0, 0x1D, "Human Medium House 2", 8, 0, 0x1D, + "Human Medium House 3", 8, 0, 0x1D, "Human Rich House 1", 8, 0, 0x1D, "Human Rich House 2", 8, 0, 0x1D, + "Human Rich House 3", 8, 0, 0x1D, "Elven Poor House 1", 8, 0, 0x1D, "Elven Poor House 2", 8, 0, 0x1D, "Elven Poor House 3", 8, 0, 0x1D, @@ -219,11 +222,13 @@ "Out10 The Maze", 0x24, 0, 0x19, "Out10 Connecting Tunnel Cave #1", 0x24, 0, 0x19, "", 0x24, 0, 0x19, + "", 0x24, 0, 0x19, "Out11 Stone City", 0x24, 0, 0x19, "", 0x24, 0, 0x19, "Out12 Colony Zod", 0x24, 0, 0x19, "Out12 Connecting Tunnel Cave #1", 0x24, 0, 0x19, "", 0x24, 0, 0x19, + "", 0x24, 0, 0x19, "Out13 Mercenary Guild", 0x24, 0, 0x19, "Out13 Tidewater Caverns", 0x24, 0, 0x19, "Out13 Wine Cellar", 0x24, 0, 0x19, @@ -247,9 +252,13 @@ "Arbiter Evil Town", 0x24, 0, 0x1D, "Necromancer Throne Room Empty", 0x24, 0, 0x14, "", 0x24, 0, 0x1D, + "", 0x24, 0, 0x1D, + "", 0x24, 0, 0x1D, + "", 0x24, 0, 0x1D, "Boat01", 0xF, 0, 0x3351D, "", 0x24, 0, 0x1C, "", 0x24, 0, 0x1D, + "", 0x24, 0, 0x1D, "Arbiter Room Neutral", 0x24, 0, 0x1D, "Out02 Castle Harmondy Abandoned", 0x24, 0, 0x19, "Human Temple02", 0x24, 0x3AB, 0x1B17, @@ -676,10 +685,10 @@ char _4E2B21_buff_spell_tooltip_colors[80]; char byte_4E2B70[777]; // weak char byte_4E2BC8; // weak -int pChestSmthn1ByType[8]; -int pChestSmthn2ByType[8]; -int pChestWidthsByType[8]; -int pChestHeightsByType[8]; +int pChestSmthn1ByType[8] = {42, 18, 18, 42, 42, 42, 18, 42}; +int pChestSmthn2ByType[8] = {34, 30, 30, 34, 34, 34, 30, 34}; +int pChestWidthsByType[8] = {9, 9, 9, 9, 9, 9, 9, 9}; +int pChestHeightsByType[8] = {9, 9, 9, 9, 9, 9, 9, 9}; char aSS[777]; // idb char ascii_4E2C54[6]; char ascii_4E2C5C[7]; @@ -949,9 +958,24 @@ char aBardataC[10]; // weak char aLoadprog[777]; // idb char aLoadingD_pcx[777]; // idb -int pNPCPortraits_x = 521; // idb -int dword_4E5EC8[777]; // weak -int pNPCPortraits_y = 38; // idb +int pNPCPortraits_x[6][6] = // 004E5E50 +{ + {521, 0, 0, 0, 0, 0}, + {521, 521, 0, 0, 0, 0}, + {521, 521, 521, 0, 0, 0}, + {521, 486, 564, 521, 0, 0}, + {521, 486, 564, 486, 564, 0}, + {486, 564, 486, 564, 486, 564} +}; +int pNPCPortraits_y[6][6] = // 004E5EE0 +{ + {38, 0, 0, 0, 0, 0}, + {38, 165, 0, 0, 0, 0}, + {38, 133, 228, 0, 0, 0}, + {38, 133, 133, 228, 0, 0}, + {38, 133, 133, 228, 228, 0}, + {38, 38, 133, 133, 228, 228} +}; const char *pHouse_ExitPictures[11]= { "", @@ -1080,7 +1104,14 @@ char aEWorkMsdevMm_7[777]; // idb char aGammaControlNo[777]; // idb __int16 word_4E8152[11] = {0, 0, 0, 90, 8, 2, 70, 20, 10, 50, 30}; -char byte_4E8168[116]; +char byte_4E8168[7][14]={ //byte_4E8178 + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, + { 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + { 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4}, + { 2, 2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}, + { 2, 2, 2, 2, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6}, + { 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}}; char aD3dTextureName[777]; // idb char aLogd3d_txt[777]; // idb char byte_4E8394[204] = @@ -1106,8 +1137,8 @@ unsigned int saveload_dlg_zs[2] = {460, 640}; unsigned int saveload_dlg_ws[2] = {344, 480}; int dword_4E98BC_bApplicationActive; // weak -char *off_4EB080; // idb -char *pTransitionStrings[464]; +//char *off_4EB080; // idb +char *pTransitionStrings[465] = {"", nullptr}; // 004EB080 char aAwards_txt[777]; // idb char aScroll_txt[777]; // idb char aMerchant_txt[777]; // idb @@ -1585,15 +1616,53 @@ "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", "MAGSHELF", - "MAGSHELF" + "MAGSHELF", "MAGSHELF", "MAGSHELF" +}; +//__int16 word_4F03FE[777]; // weak +//__int16 word_4F0400[777]; // weak +__int16 word_4F0404[] = +{ + 0, 0, 1, 0x17, 0x1B, 0x14, 0x14, 1, 0x17, 0x18, 0x1C, + 0x14, 2, 0x17, 0x18, 0x19, 0x14, 2, 0x1B, 0x1B, 0x1A, 0x1A, + 4, 0x18, 0x1E, 0x19, 0x1B, 4, 0x18, 0x1E, 0x19, 0x1B, 3, 0x1E, + 0x18, 0x14, 0x14, 2, 0x14, 0x14, 0x14, 0x14, 3, 0x1B, 0x1B, 0x1A, 0x1A, + 3, 0x1C, 0x1C, 0x19, 0x19, 2, 0x17, 0x17, 0x18, 0x18, + 3, 0x17, 0x17, 0x1A, 0x1A, 2, 0x1E, 0x1A, 0x1A, 0x1A, 2, 0x1C, + 0x19, 0x1C, 0x1D, 0, 0 }; -__int16 word_4F03FE[777]; // weak -__int16 word_4F0400[777]; // weak -__int16 word_4F0498[777]; // weak -__int16 word_4F0576[777]; // weak +//__int16 word_4F0498[777]; // weak +__int16 word_4F0498[] = +{ +1, 0x23, 0x23, 0x26, 0x26, 1, 0x1F, 0x1F, 0x1F, 0x22, 1, 0x23, 0x23, +0x26, 0x26, 1, 0x1F, 0x1F, 0x20, 0x22, 2, 0x23, 0x23, +0x26, 0x26, 2, 0x1F, 0x20, 0x20, 0x21, 2, 0x23, 0x23, +0x26, 0x26, 2, 0x1F, 0x1F, 0x20, 0x20, 4, 0x23, 0x23, +0x26, 0x26, 4, 0x1F, 0x20, 0x21, 0x22, 4, 0x23, 0x23, 0x26, 0x26, +4, 0x1F, 0x20, 0x21, 0x22, 3, 0x23, 0x23, 0x26, 0x26, 3, +0x1F, 0x1F, 0x1F, 0x1F, 2, 0x23, 0x23, 0x26, 0x26, 2, 0x1F, 0x20, +0x22, 0x22, 3, 0x23, 0x23, 0x26, 0x26, 3, 0x1F, 0x1F, +0x20, 0x20, 3, 0x23, 0x23, 0x26, 0x26, 3, 0x20, 0x20, 0x20, +0x21, 3, 0x23, 0x23, 0x26, 0x26, 3, 0x1F, 0x1F, 0x1F, 0x20 +}; +//__int16 word_4F0576[777]; // weak +__int16 word_4F0576[] = +{ +0x23, 0x23, 0x26, 0x26, 3, 0x21, 0x1F, 0x20, 0x22, 3, 0x23, 0x23, +0x26, 0x26, 3, 0x21, 0x1F, 0x20, 0x22, 4, 0x23, 0x23, 0x26, 0x26, +4, 0x21, 0x1F, 0x20, 0x22, 0x1, 0x1, 0x2, 0x2, 0x4, 0x4, +3, 2, 2, 2, 2, 2, 2, 0, 0x1, 0x1, 0x2, 0x2, 0x3, 0x3, 0x4, 0x4, +2, 2, 2, 2, 0x0, 0x0, 1, 0, 0xA3, 0xA3, 0xA2, 0xA1, 0xA0, +2, 0, 0xA3, 0xA3, 0xA2, 0xA1, 0xA0, 2, 0, 0xA3, 0xA3, +0xA2, 0xA1, 0xA0, 2, 0, 0x0A3, 0x0A3, 0xA2, 0xA1, 0xA0, +3, 0, 0xA3, 0xA3, 0xA2, 0xA1, 0xA0, 3, 0, 0xA3, 0xA3, +0xA2, 0xA1, 0xA0 +}; + __int16 word_4F0578[777]; // weak __int16 word_4F05AE[777]; // weak -char _4F063C_smthn_by_2da_uType[3] = {0, 6, 8}; // weak +char _4F063C_smthn_by_2da_uType[31]={ // weak +0, 6, 8, 12, 12, 0, 0, 0, 0, 0, 0, 0, 2, 0, 25, 0, 30, +0, 20, 0, 20, 0, 2, 0, 23, 0, 24, 0, 28, 0, 20}; __int16 word_4F063E[290]; __int16 word_4F06D8[22]; __int16 word_4F0704[40]; @@ -1666,10 +1735,10 @@ int dword_4F5D98_xs[777]; // idb int ai_array_4F5E68[500]; int ai_array_4F6638_actor_ids[500]; -int dword_4F6E08[500]; +int ai_near_actors_targets_pid[500]; int ai_arrays_size; // weak -int ai_array_4F75E0[500]; -unsigned int ai_array_4F7DB0_actor_ids[500]; +int ai_near_actors_distances[500]; +unsigned int ai_near_actors_ids[500]; int dword_4F8580[182]; // weak int dword_4FA9B0[777]; // weak int dword_4FA9B4[777]; // weak @@ -1875,9 +1944,8 @@ int dword_50C9DC; // weak struct NPCData *ptr_50C9E0; int dword_50C9E8; // idb -int dword_50C9EC[777]; // weak -int dword_50C9F0[120]; // idb -int dword_50CDC8; // weak +int dword_50C9EC[120]; // weak +int dword_50CDC8; int dword_50CDCC; // weak int bProcessorIsNotIntel; // weak Vec3_int_ layingitem_vel_50FDFC; @@ -1922,7 +1990,7 @@ unsigned int uDialogueType; unsigned int uDialogue_SpeakingActorNPC_ID; struct LevelDecoration *_591094_decoration; -char byte_591098[200]; // idb +char sHouseName[200]; // idb int uCurrentHouse_Animation; // weak char *dword_591164_teleport_map_name; // idb int dword_591168_teleport_speedz; // weak @@ -1932,7 +2000,8 @@ int dword_591178_teleporty; // weak int dword_59117C_teleportx; // weak char byte_591180[600]; // idb -struct NPCData *array_5913D8[12]; +struct NPCData *HouseNPCData[6];//array_5913D8 +int pDialogueNPCCount; struct Texture *pDialogueNPCPortraits[6]; int uNumDialogueNPCPortraits; // weak struct Texture *pTexture_591428; @@ -1942,7 +2011,7 @@ int start_event_seq_number; // weak char byte_5B0938[2000]; int dword_5B5920; // weak -int dword_5B5924; // weak +int _unused_5B5924_is_travel_ui_drawn = false; // 005B5924 int _5B65A8_npcdata_uflags_or_other; // weak int _5B65AC_npcdata_fame_or_other; // weak int _5B65B0_npcdata_rep_or_other; // weak diff -r e65d75206263 -r 91e1ba340f39 mm7_data.h --- a/mm7_data.h Mon Feb 25 09:08:13 2013 +0600 +++ b/mm7_data.h Mon Feb 25 09:09:08 2013 +0600 @@ -681,9 +681,8 @@ extern char aBardataC[10]; // weak extern char aLoadprog[]; // idb extern char aLoadingD_pcx[]; // idb -extern int pNPCPortraits_x; // idb -extern int dword_4E5EC8[]; // weak -extern int pNPCPortraits_y; // idb +extern int pNPCPortraits_x[6][6]; // 004E5E50 +extern int pNPCPortraits_y[6][6]; // 004E5EE0 extern const char *pHouse_ExitPictures[11]; extern const char *_4E6BDC_loc_names[11]; extern char aOutside[]; // idb @@ -787,7 +786,7 @@ extern char aEWorkMsdevMm_7[]; // idb extern char aGammaControlNo[]; // idb extern __int16 word_4E8152[11]; -extern char byte_4E8168[116]; +extern char byte_4E8168[7][14]; extern char aD3dTextureName[]; // idb extern char aLogd3d_txt[]; // idb extern char byte_4E8394[]; // weak @@ -802,8 +801,7 @@ extern unsigned int saveload_dlg_zs[2]; extern unsigned int saveload_dlg_ws[2]; extern int dword_4E98BC_bApplicationActive; // weak -extern char *off_4EB080; // idb -extern char *pTransitionStrings[464]; +extern char *pTransitionStrings[]; // 4EB080 extern char aAwards_txt[]; // idb extern char aScroll_txt[]; // idb extern char aMerchant_txt[]; // idb @@ -1000,8 +998,9 @@ extern void *off_4EFDB0; // weak extern int dword_4F031C[]; // weak extern const char *off_4F03B8[]; // idb -extern __int16 word_4F03FE[]; // weak -extern __int16 word_4F0400[]; // weak +//extern __int16 word_4F03FE[]; // weak +//extern __int16 word_4F0400[]; // weak +extern __int16 word_4F0404[]; extern __int16 word_4F0498[]; // weak extern __int16 word_4F0576[]; // weak extern __int16 word_4F0578[]; // weak @@ -1070,10 +1069,10 @@ extern int dword_4F5D98_xs[]; // idb extern int ai_array_4F5E68[500]; extern int ai_array_4F6638_actor_ids[500]; -extern int dword_4F6E08[500]; +extern int ai_near_actors_targets_pid[500]; extern int ai_arrays_size; // weak -extern int ai_array_4F75E0[500]; -extern unsigned int ai_array_4F7DB0_actor_ids[500]; +extern int ai_near_actors_distances[500]; +extern unsigned int ai_near_actors_ids[500]; extern int dword_4F8580[]; // weak extern int dword_4FA9B0[]; // weak extern int dword_4FA9B4[]; // weak @@ -1278,9 +1277,8 @@ extern int dword_50C9DC; // weak extern struct NPCData *ptr_50C9E0; extern int dword_50C9E8; // idb -extern int dword_50C9EC[]; // weak -extern int dword_50C9F0[120]; // idb -extern int dword_50CDC8; // weak +extern int dword_50C9EC[]; // 50C9EC +extern int dword_50CDC8; extern int dword_50CDCC; // weak extern int bProcessorIsNotIntel; // weak extern Vec3_int_ layingitem_vel_50FDFC; @@ -1325,7 +1323,7 @@ extern unsigned int uDialogueType; extern unsigned int uDialogue_SpeakingActorNPC_ID; extern struct LevelDecoration *_591094_decoration; -extern char byte_591098[200]; // idb +extern char sHouseName[200]; // idb extern int uCurrentHouse_Animation; // weak extern char *dword_591164_teleport_map_name; // idb extern int dword_591168_teleport_speedz; // weak @@ -1335,7 +1333,8 @@ extern int dword_591178_teleporty; // weak extern int dword_59117C_teleportx; // weak extern char byte_591180[600]; // idb -extern struct NPCData *array_5913D8[12]; +extern struct NPCData *HouseNPCData[6]; +extern int pDialogueNPCCount; extern struct Texture *pDialogueNPCPortraits[6]; extern int uNumDialogueNPCPortraits; // weak extern struct Texture *pTexture_591428; @@ -1345,7 +1344,7 @@ extern int start_event_seq_number; // weak extern char byte_5B0938[2000]; extern int dword_5B5920; // weak -extern int dword_5B5924; // weak +extern int _unused_5B5924_is_travel_ui_drawn; // 005B5924 extern int _5B65A8_npcdata_uflags_or_other; // weak extern int _5B65AC_npcdata_fame_or_other; // weak extern int _5B65B0_npcdata_rep_or_other; // weak @@ -1753,8 +1752,8 @@ #define __thiscall __cdecl // Test compile in C mode void __stdcall mm7__vector_constructor(void *a1, int objSize, int numObjs, int (__thiscall *constructor)(int)); -int __cdecl ODM_4014E6_AI(); -int __cdecl BLV_4016FA_AI(); +void MakeActorAIList_ODM(); +int __cdecl MakeActorAIList_BLV(); void __cdecl sub_401A91_AI(); bool __fastcall sub_4070EF_prolly_collide_objects(unsigned int uObjID, unsigned int uObj2ID); bool __fastcall sub_4075DB(int a1, int a2, int a3, struct BLVFace *a4); @@ -1915,7 +1914,7 @@ void __cdecl sub_421EA6_OnInventoryLeftClick(); void __cdecl OnGameViewportClick(); bool PauseGameDrawing(); -void __fastcall SetUserInterface(int a1, bool bReplace); +void SetUserInterface(enum PartyAlignment alignment, bool bReplace); void __cdecl reset_some_strus_flt_2Cs(); void __cdecl j_sub_423B4A(); void __cdecl sub_423B4A(); @@ -2011,9 +2010,9 @@ void __thiscall Level_LoadEvtAndStr(const char *pLevelName); char *__cdecl _4443D5_GetMinimapRightClickText(); const char *__cdecl sub_444564(); -char *__thiscall _444732_GetEventHintString(unsigned int uEventID); // idb +char *__thiscall GetEventHintString(unsigned int uEventID); // idb unsigned int __fastcall sub_444839_move_map(unsigned int a1, int a2, int x, int y, int z, int directiony, int directionx, int a8, const char *pLocationName); // idb -char *__cdecl TransitionUI_Draw(); +void TransitionUI_Draw(); struct GUIWindow *__cdecl UI_CreateTravelDialogue(); signed int __cdecl GetTravelTime(); void __cdecl TravelUI_Draw(); @@ -2031,7 +2030,7 @@ int sub_4465DF_check_season(int a1); int __fastcall IsActorAlive(unsigned int uType, unsigned int uParam, unsigned int uNumAlive); // idb // void __cdecl crt_construct_5773C4(); -bool __thiscall sub_4466C4(void *_this); +int NPC_EventProcessor(int npc_event_id); void __fastcall sub_448518_npc_set_item(int npc, unsigned int item, int a3); void __fastcall sub_44861E_set_texture(unsigned int uFaceCog, const char *pFilename); @@ -2304,45 +2303,45 @@ void __cdecl sub_4B1D27(); void __fastcall HousePlaySomeSound(unsigned int uHouseID, int a2); // idb void __cdecl sub_4B1ECE(); -void __fastcall sub_4B2001(signed int a1); +void __fastcall ClickNPCTopic(signed int uMessageParam); char *__thiscall _4B254D_SkillMasteryTeacher(int _this); -const char *__fastcall sub_4B29F2(int a1); -char __cdecl sub_4B2A74(); +const char *__fastcall ContractSelectText(int pEventNumber); +char __cdecl SimpleHouseAndBoatsDialog(); struct GUIButton *__fastcall sub_4B36CC(int a1, unsigned int a2); int __thiscall sub_4B3703(void *_this); int __thiscall sub_4B3A72(int a1); // idb int __fastcall sub_4B3AD4(signed int a1); int __fastcall sub_4B3B42(signed int a1); void __cdecl sub_4B3E1E(); -void __fastcall sub_4B3EF0(int a4); +void __fastcall DrawJoinGuildWindow(int pEventNumber); void __fastcall sub_4B3FE5(int a4); void __cdecl sub_4B40E6(); -struct GUIButton *__thiscall _4B4224_UpdateNPCTopics(int _this); +void _4B4224_UpdateNPCTopics(int _this); char __fastcall sub_4B46A5(const char *Str, int a5); int __fastcall sub_4B46F8(int a1); -int __cdecl ui_training(); +int __cdecl TrainingDialog(); char *__cdecl sub_4B4F4F(); -int __cdecl ui_shop_teachers(); -int __cdecl sub_4B5D7C(); +int __cdecl MagicShopDialog(); +int __cdecl GuildDialog(); int __cdecl sub_4B6478(); bool __fastcall sub_4B68EA(int a1); void __cdecl TravelByTransport(); -int __cdecl sub_4B705E(); +int __cdecl TampleDialog(); void __cdecl sub_4B7911(); void __cdecl _4B7D7E_bank(); -void __cdecl sub_4B8285_prolly_draw_arcomage_result(); +void __cdecl TavernDialog(); void *__cdecl GenerateShopItems(); -void *__cdecl sub_4B8F94(); -char *__cdecl _4B910F_shop_interaction(); -POINT *__cdecl sub_4B9CC6(); -void __cdecl sub_4BA928(); +void sub_4B8F94(); +char *__cdecl WeaponShopDialog(); +POINT *__cdecl AlchemistDialog(); +void __cdecl ArmorShopDialog(); signed int __fastcall sub_4BB756(signed int a1); const char *sub_4BBA85_bounties(); void __cdecl sub_4BBCDD(); void __fastcall _4BBF61_summon_actor(int a1, __int16 x, int y, int z); // idb void __cdecl ArenaFight(); struct Texture *__cdecl sub_4BC8D5(); -struct GUIButton *__cdecl sub_4BCA33(); +struct GUIButton *__cdecl UI_CreateEndConversationButton(); void __fastcall sub_4BCACC_bounties(signed int a1); signed int __cdecl sub_4BD8B5(); bool __fastcall sub_4BDAAF(ItemGen *a1, int _2da_idx); diff -r e65d75206263 -r 91e1ba340f39 stru6.cpp --- a/stru6.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/stru6.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -777,6 +777,7 @@ signed int v35; // [sp+0h] [bp-18h]@81 char pContainer[7]; // [sp+10h] [bp-8h]@81 + __debugbreak(); // need to refactor carefully & collect data v2 = this; result = a2->uItemType; if ( result <= 545 ) diff -r e65d75206263 -r 91e1ba340f39 stru9.cpp --- a/stru9.cpp Mon Feb 25 09:08:13 2013 +0600 +++ b/stru9.cpp Mon Feb 25 09:09:08 2013 +0600 @@ -227,7 +227,7 @@ //----- (00498737) -------------------------------------------------------- void stru9::AddVertex(struct VertexBuffer *pVertexBuffer, struct RenderVertexSoft *pVertex) { - __debugbreak(); +// __debugbreak(); RenderVertexSoft *v3; // eax@1 v3 = &pVertexBuffer->pVertices[pVertexBuffer->uNumVertices];