# HG changeset patch # User Ritor1 # Date 1380716868 -21600 # Node ID 722883bd7fed62d0211ade1f2e1124a2c9240a9c # Parent db16b4d76f9d86a234f68d7ffe64f35096fae937# Parent 53c0453f4eb26281c6e260347db4a5d4426e7610 Merge diff -r db16b4d76f9d -r 722883bd7fed Actor.cpp --- a/Actor.cpp Wed Oct 02 18:27:27 2013 +0600 +++ b/Actor.cpp Wed Oct 02 18:27:48 2013 +0600 @@ -46,55 +46,40 @@ //----- (0041AF52) -------------------------------------------------------- -void Actor::DrawHealthBar(Actor *a1, GUIWindow *a2) +void Actor::DrawHealthBar(Actor *actor, GUIWindow *window) { - unsigned int v2; // eax@1 - GUIWindow *v3; // edi@1 - unsigned int v4; // esi@1 - signed int v5; // ebx@4 - double v6; // st7@5 - unsigned int v7; // eax@6 - unsigned int v8; // ebx@10 + unsigned int bar_length; // esi@1 + unsigned int uX; // ebx@10 unsigned int v9; // [sp+14h] [bp-Ch]@4 unsigned int v10; // [sp+1Ch] [bp-4h]@4 - v2 = a1->pMonsterInfo.uHP; - v3 = a2; - v4 = 25; - if ( (signed int)v2 > 25 ) + bar_length = 25; + if ( actor->pMonsterInfo.uHP > 25 ) { - v4 = 200; - if ( (signed int)v2 < 200 ) - v4 = a1->pMonsterInfo.uHP; + bar_length = 200; + if ( actor->pMonsterInfo.uHP < 200 ) + bar_length = actor->pMonsterInfo.uHP; } - v5 = a1->sCurrentHP; - v10 = v4; + v10 = bar_length; v9 = uTextureID_mhp_grn; - if ( v5 < (signed int)v2 ) + if ( actor->sCurrentHP < actor->pMonsterInfo.uHP ) { - v6 = (double)(signed int)v2; - v10 = (signed __int64)((double)(signed int)v4 / (double)(signed int)v2 * (double)a1->sCurrentHP); - if ( v5 <= (signed int)(signed __int64)(0.34 * v6) ) - { - v7 = uTextureID_mhp_red; - v9 = v7; - } - else if ( v5 <= (signed int)(signed __int64)(v6 * 0.67) ) - { - v7 = uTextureID_mhp_yel; - v9 = v7; - } + v10 = bar_length / actor->pMonsterInfo.uHP * actor->sCurrentHP; + if ( actor->sCurrentHP <= (signed int)(signed __int64)(0.34 * (double)(signed int)actor->pMonsterInfo.uHP) ) + v9 = uTextureID_mhp_red; + else if ( actor->sCurrentHP <= (signed int)(signed __int64)((double)(signed int)actor->pMonsterInfo.uHP * 0.67) ) + v9 = uTextureID_mhp_yel; } - v8 = a2->uFrameX + (signed int)(a2->uFrameWidth - v4) / 2; + uX = window->uFrameX + (signed int)(window->uFrameWidth - bar_length) / 2; - pRenderer->SetTextureClipRect(v8, a2->uFrameY + 32, v8 + v4, a2->uFrameY + 52); - pRenderer->DrawTextureIndexed(v8, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_bd)); - pRenderer->SetTextureClipRect(v8, v3->uFrameY + 32, v8 + v10, v3->uFrameY + 52); - pRenderer->DrawTextureIndexed(v8, v3->uFrameY + 34, pIcons_LOD->GetTexture(v9)); + pRenderer->SetTextureClipRect(uX, window->uFrameY + 32, uX + bar_length, window->uFrameY + 52); + pRenderer->DrawTextureIndexed(uX, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_bd)); + pRenderer->SetTextureClipRect(uX, window->uFrameY + 32, uX + v10, window->uFrameY + 52); + pRenderer->DrawTextureIndexed(uX, window->uFrameY + 34, pIcons_LOD->GetTexture(v9)); pRenderer->ResetTextureClipRect(); - pRenderer->DrawTextureIndexed(v8 - 5, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capl)); - pRenderer->DrawTextureIndexed(v8 + v4, v3->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capr)); + pRenderer->DrawTextureIndexed(uX - 5, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capl)); + pRenderer->DrawTextureIndexed(uX + bar_length, window->uFrameY + 32, pIcons_LOD->GetTexture(uTextureID_mhp_capr)); } //----- (00448A40) -------------------------------------------------------- @@ -227,7 +212,6 @@ } } - //----- (0040894B) -------------------------------------------------------- bool Actor::CanAct() { @@ -1910,16 +1894,13 @@ //----- (00403E61) -------------------------------------------------------- void __fastcall Actor::StandAwhile(unsigned int uActorID) { - Actor *v1; // esi@1 - - v1 = &pActors[uActorID]; - v1->uCurrentActionLength = rand() % 128 + 128; - v1->uCurrentActionTime = 0; - v1->uAIState = Standing; - v1->vVelocity.z = 0; - v1->vVelocity.y = 0; - v1->vVelocity.x = 0; - v1->UpdateAnimation(); + pActors[uActorID].uCurrentActionLength = rand() % 128 + 128; + pActors[uActorID].uCurrentActionTime = 0; + pActors[uActorID].uAIState = Standing; + pActors[uActorID].vVelocity.z = 0; + pActors[uActorID].vVelocity.y = 0; + pActors[uActorID].vVelocity.x = 0; + pActors[uActorID].UpdateAnimation(); } //----- (00403C6C) -------------------------------------------------------- @@ -3012,7 +2993,7 @@ break; } - if (rand() % 100 < 20) + if (rand() % 100 < 20 && drop.uItemID != 0) { sub_42F7EB_DropItemAt(pItemsTable->pItems[drop.uItemID].uSpriteID, actor->vPosition.x, diff -r db16b4d76f9d -r 722883bd7fed Actor.h --- a/Actor.h Wed Oct 02 18:27:27 2013 +0600 +++ b/Actor.h Wed Oct 02 18:27:48 2013 +0600 @@ -237,7 +237,7 @@ static void GiveItem(signed int uActorID, unsigned int uItemID, unsigned int bGive); static void ToggleFlag(signed int uActorID, unsigned int uFlag, int bToggle); static void ApplyFineForKillingPeasant(unsigned int uActorID); - static void DrawHealthBar(Actor *a1, struct GUIWindow *a2); + static void DrawHealthBar(Actor *actor, struct GUIWindow *window); static int _43B3E0_CalcDamage(Actor *a1, signed int a2); static void AddBloodsplatOnDamageOverlay(unsigned int uActorID, int a2, signed int a3); diff -r db16b4d76f9d -r 722883bd7fed Items.h --- a/Items.h Wed Oct 02 18:27:27 2013 +0600 +++ b/Items.h Wed Oct 02 18:27:48 2013 +0600 @@ -273,11 +273,11 @@ // 72 Prevents falling damage. int uNumCharges; //10 unsigned int uAttributes; //14 - unsigned __int8 uBodyAnchor; - char uMaxCharges; - char uHolderPlayer; - char field_1B; - unsigned __int64 uExpireTime; + unsigned __int8 uBodyAnchor; //18 + char uMaxCharges; //19 + char uHolderPlayer; //1A + char field_1B; //1B + unsigned __int64 uExpireTime; //1C }; #pragma pack(pop) diff -r db16b4d76f9d -r 722883bd7fed Player.cpp --- a/Player.cpp Wed Oct 02 18:27:27 2013 +0600 +++ b/Player.cpp Wed Oct 02 18:27:48 2013 +0600 @@ -2564,7 +2564,6 @@ int Player::GetAttackRecoveryTime(bool bRangedAttack) { ItemGen *weapon = nullptr; - ItemDesc *weapon_desc = nullptr; uint weapon_recovery = base_recovery_times_per_weapon_type[0]; if (bRangedAttack) { @@ -2647,9 +2646,9 @@ (weapon->GetPlayerSkillType() == PLAYER_SKILL_SWORD || weapon->GetPlayerSkillType() == PLAYER_SKILL_AXE || weapon->GetPlayerSkillType() == PLAYER_SKILL_BOW) ) { if (SkillToMastery(pActiveSkills[weapon->GetPlayerSkillType()]) >= 2 ) // Expert Sword, Axe & Bow reduce recovery - sword_axe_bow_recovery_reduction = pActiveSkills[weapon_desc->uSkillType] & 0x3F; - } - if (weapon_desc->uSkillType == PLAYER_SKILL_BLASTER) + sword_axe_bow_recovery_reduction = pActiveSkills[weapon->GetPlayerSkillType()] & 0x3F; + } + if (weapon->GetPlayerSkillType() == PLAYER_SKILL_BLASTER) shooting_laser = true; } @@ -5515,8 +5514,7 @@ || var_type > VAR_History_28 || (v22 = var_type - VAR_History_0, pParty->PartyTimes.HistoryEventTimes[v22]) || (pParty->PartyTimes.HistoryEventTimes[v22] = pParty->uTimePlayed, - v23 = pStorylineText->StoreLine[v22].pText == 0,//*(&pStorylineText->field_0 + 3 * v22) == 0, - v23) ) + pStorylineText->StoreLine[v22].pText == 0) )//*(&pStorylineText->field_0 + 3 * v22) == 0, return; bFlashHistoryBook = 1; } @@ -5579,18 +5577,18 @@ this->classType = (PLAYER_CLASS_TYPE)var_value; if ( (char)var_value == PLAYER_CLASS_LICH ) { - v9 = NULL; for (int i = 0; i < 138; i++) { v9 = &this->pInventoryItemList[i]; if (v9->uItemID == ITEM_LICH_JAR_EMPTY) + { + v9->uItemID = ITEM_LICH_JAR_FULL; + v9->uHolderPlayer = currPlayerId + 1; + v10 = (int)((char *)this + 36 * 138); + *(int *)(v10 + 532) = 601; + *(char *)(v10 + 558) = currPlayerId + 1; break; - } - if (v9 != NULL && v9->uItemID != ITEM_LICH_JAR_EMPTY) - { - v10 = (int)((char *)this + 36 * 138); //originally 36 * v8. the code got to this condition only if v8 was equal to 138 - *(int *)(v10 + 532) = 601; - *(char *)(v10 + 558) = currPlayerId + 1; + } } if ( this->sResFireBase < 20 ) this->sResFireBase = 20; @@ -5602,10 +5600,9 @@ this->sResEarthBase = 20; this->sResMindBase = 200; this->sResBodyBase = 200; - v11 = this->GetSexByVoice(); this->uPrevVoiceID = this->uVoiceID; this->uPrevFace = this->uCurrentFace; - if ( v11 ) + if ( IsFemale() ) { this->uCurrentFace = 21; this->uVoiceID = 21; @@ -5857,10 +5854,10 @@ { v16 = (int)((char *)&this->pConditions[16] + 2 * var_type); v17 = *(char *)v16; - if ( var_value <= VAR_BodyResistanceBonus ) + if ( var_value <= 63 ) { LOWORD(v15) = (unsigned __int8)var_value; - v18 = v15 | v17 & VAR_BodyResistanceBonus; + v18 = v15 | v17 & 63; } else { diff -r db16b4d76f9d -r 722883bd7fed mm7_2.cpp --- a/mm7_2.cpp Wed Oct 02 18:27:27 2013 +0600 +++ b/mm7_2.cpp Wed Oct 02 18:27:48 2013 +0600 @@ -5104,6 +5104,7 @@ } bool new_sky = false; +bool new_draw_object_dist = true; bool change_seasons = false; bool all_magic = true; bool wizard_eye = false; @@ -5398,7 +5399,12 @@ mipmapping_building_mm3 = GetPrivateProfileIntW(L"mipmapping", L"bld_mm3", 4096, pIniFilename); pODMRenderParams->shading_dist_shade = GetPrivateProfileIntW(L"shading", L"dist_shade", 2048, pIniFilename); pODMRenderParams->shading_dist_shademist = GetPrivateProfileIntW(L"shading", L"dist_shademist", 4096, pIniFilename); - pODMRenderParams->shading_dist_mist = GetPrivateProfileIntW(L"shading", L"dist_mist", 8192, pIniFilename); + + int dist = 0x2000; + extern bool new_draw_object_dist; + if ( new_draw_object_dist ) + dist = 0x6000; + pODMRenderParams->shading_dist_mist = GetPrivateProfileIntW(L"shading", L"dist_mist", dist, pIniFilename); wchar_t pDefaultSkyTextureW[1024]; GetPrivateProfileStringW(L"textures", L"sky", L"plansky1", pDefaultSkyTextureW, 0x10u, pIniFilename); diff -r db16b4d76f9d -r 722883bd7fed mm7_6.cpp --- a/mm7_6.cpp Wed Oct 02 18:27:27 2013 +0600 +++ b/mm7_6.cpp Wed Oct 02 18:27:48 2013 +0600 @@ -45,12 +45,12 @@ //----- (00424EE0) -------------------------------------------------------- int __fastcall sr_424EE0_MakeFanFromTriangle(unsigned int uVertexID) { - unsigned int v1; // edx@1 + //unsigned int v1; // edx@1 double v2; // st7@1 signed int v3; // edi@1 char *v4; // esi@4 char *v5; // ecx@4 - unsigned int v6; // eax@4 + //unsigned int v6; // eax@4 char *v7; // edx@4 double v8; // st6@10 double v9; // st5@10 @@ -74,18 +74,16 @@ char *v27; // [sp+2Ch] [bp-8h]@4 char *v28; // [sp+30h] [bp-4h]@4 - v1 = uVertexID; v2 = (double)pODMRenderParams->shading_dist_mist; memcpy(&array_50AC10[uVertexID], array_50AC10, sizeof(array_50AC10[uVertexID])); v3 = 0; v22 = 0; - if ( array_50AC10[0].vWorldViewPosition.x <= v2 ) + if ( array_50AC10[0].vWorldViewPosition.x <= (double)pODMRenderParams->shading_dist_mist ) v3 = 1; if ( (signed int)(uVertexID + 1) <= 1 ) return 0; v4 = (char *)&array_507D30[0].vWorldViewPosition.z; v5 = (char *)&array_507D30[0].vWorldViewPosition.y; - v6 = v1; v23 = (char *)&array_507D30[0].flt_2C; v26 = (char *)&array_507D30[0]._rhw; v24 = array_507D30; @@ -95,27 +93,26 @@ v27 = (char *)&array_507D30[0].v; v28 = (char *)&array_507D30[0].u; v7 = (char *)&array_50AC10[0].v; - v18 = v6; - do + for ( v18 = 1; v18 <= uVertexID; ++v18 ) { - v19 = v2 >= *((float *)v7 + 5); + v19 = v2 >= array_50AC10[v18].vWorldViewPosition.x; if ( v3 != v19 ) { if ( v19 ) { - v8 = (v2 - *((float *)v7 - 7)) / (*((float *)v7 + 5) - *((float *)v7 - 7)); - *(float *)v5 = (*((float *)v7 + 6) - *((float *)v7 - 6)) * v8 + *((float *)v7 - 6); - *(float *)v4 = (*((float *)v7 + 7) - *((float *)v7 - 5)) * v8 + *((float *)v7 - 5); - *(float *)v28 = (*((float *)v7 + 11) - *((float *)v7 - 1)) * v8 + *((float *)v7 - 1); - v9 = (*((float *)v7 + 12) - *(float *)v7) * v8 + *(float *)v7; + v8 = (v2 - array_50AC10[v18 - 1].vWorldViewPosition.x) / (array_50AC10[v18].vWorldViewPosition.x - array_50AC10[v18 - 1].vWorldViewPosition.x); + *(float *)v5 = (array_50AC10[v18].vWorldViewPosition.y - array_50AC10[v18 - 1].vWorldViewPosition.y) * v8 + array_50AC10[v18 - 1].vWorldViewPosition.y; + *(float *)v4 = (array_50AC10[v18].vWorldViewPosition.z - array_50AC10[v18 - 1].vWorldViewPosition.z) * v8 + array_50AC10[v18 - 1].vWorldViewPosition.z; + *(float *)v28 = (array_50AC10[v18].u - array_50AC10[v18 - 1].u) * v8 + array_50AC10[v18 - 1].u; + v9 = (array_50AC10[v18].v - array_50AC10[v18 - 1].v) * v8 + array_50AC10[v18 - 1].v; } else { - v10 = (v2 - *((float *)v7 + 5)) / (*((float *)v7 - 7) - *((float *)v7 + 5)); - *(float *)v5 = (*((float *)v7 - 6) - *((float *)v7 + 6)) * v10 + *((float *)v7 + 6); - *(float *)v4 = (*((float *)v7 - 5) - *((float *)v7 + 7)) * v10 + *((float *)v7 + 7); - *(float *)v28 = (*((float *)v7 - 1) - *((float *)v7 + 11)) * v10 + *((float *)v7 + 11); - v9 = (*(float *)v7 - *((float *)v7 + 12)) * v10 + *((float *)v7 + 12); + v10 = (v2 - array_50AC10[v18].vWorldViewPosition.x) / (array_50AC10[v18 - 1].vWorldViewPosition.x - array_50AC10[v18].vWorldViewPosition.x); + *(float *)v5 = (array_50AC10[v18 - 1].vWorldViewPosition.y - array_50AC10[v18].vWorldViewPosition.y) * v10 + array_50AC10[v18].vWorldViewPosition.y; + *(float *)v4 = (array_50AC10[v18 - 1].vWorldViewPosition.z - array_50AC10[v18].vWorldViewPosition.z) * v10 + array_50AC10[v18].vWorldViewPosition.z; + *(float *)v28 = (array_50AC10[v18 - 1].u - array_50AC10[v18].u) * v10 + array_50AC10[v18].u; + v9 = (array_50AC10[v18 - 1].v - array_50AC10[v18].v) * v10 + array_50AC10[v18].v; } *(float *)v27 = v9; *(float *)v25 = v2; @@ -199,9 +196,9 @@ } v3 = v19; v7 += 48; - --v18; + //--v18; } - while ( v18 ); + //while ( v18 ); result = v22; if ( v22 < 3 ) return 0; @@ -251,7 +248,7 @@ } else { - if ( pActor->array_000234[3].GetItemEquipType() == 18 ) + if ( pActor->array_000234[3].uItemID != 0 && pActor->array_000234[3].GetItemEquipType() == 18 ) { v14 = pActor->array_000234[3].uSpecEnchantmentType; pActor->array_000234[3].Reset(); @@ -262,7 +259,6 @@ } } } - pActor->uCarriedItemID = 1; if ( pActor->uCarriedItemID ) { Dst.Reset(); @@ -326,21 +322,21 @@ pParty->SetHoldingItem(&Dst); v13 = 1; } - goto LABEL_44; + v8 = pParty; + goto LABEL_45; } if ( rand() % 100 >= pActor->pMonsterInfo.uTreasureDropChance || (v7 = pActor->pMonsterInfo.uTreasureLevel) == 0 ) { -LABEL_44: v8 = pParty; goto LABEL_45; } pItemsTable->GenerateItem(v7, pActor->pMonsterInfo.uTreasureType, &Dst); v10 = pItemsTable->pItems[Dst.uItemID].pUnidentifiedName; if ( v14 ) - sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, v10); + sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, v10);//Вы нашли ^I[%d] золот^L[ой;ых;ых] и предмет (%s)! else - sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], v10); - ShowStatusBarString(pTmpBuf2.data(), 2u); + sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], v10);//Вы нашли ^Pv[%s]! + ShowStatusBarString(pTmpBuf2.data(), 2); v8 = pParty; if ( !pParty->AddItemToParty(&Dst) ) pParty->SetHoldingItem(&Dst); @@ -892,9 +888,6 @@ v5 = pActor->pActorBuffs[14].uPower; switch ( a2 ) { - case 4: - v6 = pActor->pMonsterInfo.uResPhysical; - break; case 0: v6 = pActor->pMonsterInfo.uResFire; v4 = v5; @@ -911,6 +904,9 @@ v6 = pActor->pMonsterInfo.uResEarth; v4 = v5; break; + case 4: + v6 = pActor->pMonsterInfo.uResPhysical; + break; case 6: v6 = pActor->pMonsterInfo.uResSpirit; break; @@ -961,50 +957,47 @@ //----- (00427662) -------------------------------------------------------- bool stru319::GetMagicalResistance(Actor *pActor, unsigned int uType) { - Actor *v3; // edi@2 - signed int v4; // esi@2 + signed int resist; // esi@2 bool result; // eax@13 switch ( uType ) { - case 0u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResFire; - case 1u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResAir; - case 2u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResWater; - case 3u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResEarth; - case 7u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResMind; - case 6u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResSpirit; - case 8u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResBody; - case 9u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResLight; - case 0xAu: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResDark; - case 4u: - v3 = pActor; - v4 = pActor->pMonsterInfo.uResPhysical; + case 0: + resist = pActor->pMonsterInfo.uResFire; + break; + case 1: + resist = pActor->pMonsterInfo.uResAir; + break; + case 2: + resist = pActor->pMonsterInfo.uResWater; + break; + case 3: + resist = pActor->pMonsterInfo.uResEarth; + break; + case 4: + resist = pActor->pMonsterInfo.uResPhysical; + break; + case 6: + resist = pActor->pMonsterInfo.uResSpirit; + break; + case 7: + resist = pActor->pMonsterInfo.uResMind; + case 8: + resist = pActor->pMonsterInfo.uResBody; + break; + case 9: + resist = pActor->pMonsterInfo.uResLight; + break; + case 10: + resist = pActor->pMonsterInfo.uResDark; break; default: return 1; } - if ( v4 < 200 ) - result = rand() % (signed int)(((unsigned int)v3->pMonsterInfo.uLevel >> 2) + v4 + 30) < 30; + if ( resist < 200 ) + result = rand() % (signed int)(((unsigned int)pActor->pMonsterInfo.uLevel >> 2) + resist + 30) < 30; else - result = 0; + result = 0; return result; }