# HG changeset patch # User Nomad # Date 1361053008 -7200 # Node ID 30aa44013f7a4b10d86bd35190239e9aef4d5241 # Parent 1527f66fd81ba5ce9386cc7f7b0965013e7954a9 On Items diff -r 1527f66fd81b -r 30aa44013f7a GUIWindow.h --- a/GUIWindow.h Sat Feb 16 22:35:58 2013 +0200 +++ b/GUIWindow.h Sun Feb 17 00:16:48 2013 +0200 @@ -298,7 +298,7 @@ UIMSG_ToggleFlipOnExit = 0xE2, UIMSG_16F = 0x16F, UIMSG_170 = 0x170, - UIMSG_194 = 0x194, + UIMSG_Game_Action = 0x194, UIMSG_195 = 0x195, UIMSG_OpenRestUI = 0x199, UIMSG_19A = 0x19A, diff -r 1527f66fd81b -r 30aa44013f7a Items.cpp --- a/Items.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/Items.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -1029,18 +1029,10 @@ { switch ( v101 ) { - case 2: - pItems[v35].field_2C = atoi(v36); - break; - case 3: - pItems[v35].field_2D = atoi(v36); - break; - case 4: - pItems[v35].field_2E = atoi(v36); - break; - case 5: - pItems[v35].field_2F = atoi(v36); - break; + case 2: pItems[v35].field_2C[0] = atoi(v36); break; + case 3: pItems[v35].field_2C[1] = atoi(v36); break; + case 4: pItems[v35].field_2C[2] = atoi(v36); break; + case 5: pItems[v35].field_2C[3] = atoi(v36); break; case 6: *((unsigned char *)&pItems[0].uItemID + 16 * (3 * v35 + 3)) = atoi(v36); break; @@ -1073,7 +1065,7 @@ } v39 = (char *)field_11684; memset(field_11684, 0, 0x18u); - v40 = &pItems[0].field_2C; + v40 = pItems[0].field_2C; v77 = 6; do { @@ -1787,14 +1779,14 @@ //----- (00456620) -------------------------------------------------------- -void ItemsTable::GenerateItem(int a2, int a3, ItemGen *pItem) +void ItemsTable::GenerateItem(int a2, int a3, ItemGen *out_item) { - ItemGen *v4; // esi@1 - ItemsTable *v5; // edi@1 + //ItemGen *v4; // esi@1 + //ItemsTable *v5; // edi@1 int v6; // ebx@3 int *v7; // ecx@33 - int v8; // eax@34 - int v9; // eax@39 + //int v8; // eax@34 + //int v9; // eax@39 int v10; // ebx@43 int v11; // ecx@47 unsigned int *v12; // edx@48 @@ -1836,163 +1828,101 @@ unsigned int v48; // ecx@123 int v49; // eax@123 int v50; // eax@123 - unsigned char Dst[0xC80]; // [sp+Ch] [bp-C88h]@33 + int Dst[800]; // [sp+Ch] [bp-C88h]@33 int v52; // [sp+C8Ch] [bp-8h]@33 - int v53; // [sp+C90h] [bp-4h]@1 + //int v53; // [sp+C90h] [bp-4h]@1 int v54; // [sp+C9Ch] [bp+8h]@3 - int v55; // [sp+CA0h] [bp+Ch]@34 + //int v55; // [sp+CA0h] [bp+Ch]@34 signed int v56; // [sp+CA0h] [bp+Ch]@55 int v57; // [sp+CA0h] [bp+Ch]@62 int *v58; // [sp+CA0h] [bp+Ch]@102 int v59; // [sp+CA0h] [bp+Ch]@123 - signed int a2a; // [sp+CA4h] [bp+10h]@33 + //signed int a2a; // [sp+CA4h] [bp+10h]@33 int a2b; // [sp+CA4h] [bp+10h]@101 int a2c; // [sp+CA4h] [bp+10h]@120 - v53 = -1; - v4 = pItem; - v5 = this; - if ( !pItem ) - v4 = (ItemGen *)pAllocator->AllocNamedChunk(pItem, 0x24u, "newItemGen"); - memset(v4, 0, 0x24u); + //v53 = -1; + //v4 = pItem; + //v5 = this; + if ( !out_item ) + out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen"); + memset(out_item, 0, sizeof(*out_item)); v6 = a2 - 1; v54 = a2 - 1; if ( a3 ) { - switch ( a3 ) + ITEM_EQUIP_TYPE requested_equip; + PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID; + switch (a3) { - case 20: - a3 = EQUIP_ONE_OR_TWO_HANDS; - break; - case 21: - a3 = 3; - break; - case 22: - v53 = 38; - break; - case 23: - v53 = 1; - break; - case 24: - v53 = 2; - break; - case 25: - v53 = 3; - break; - case 26: - v53 = 4; - break; - case 27: - v53 = 5; - break; - case 28: - v53 = 6; - break; - case 30: - v53 = 0; - break; - case 31: - v53 = 9; - break; - case 32: - v53 = 10; - break; - case 33: - v53 = 0xBu; - break; - case 34: - a3 = 4; - break; - case 35: - a3 = 5; - break; - case 36: - a3 = 6; - break; - case 37: - a3 = 7; - break; - case 38: - a3 = 8; - break; - case 39: - a3 = EQUIP_BOOTS; - break; - case 40: - a3 = EQUIP_RING; - break; - case 41: - a3 = 0xBu; - break; - case 42: - a3 = EQUIP_C; - break; - case 43: - a3 = EQUIP_F; - break; - case 44: - a3 = EQUIP_POTION; - break; - case 45: - a3 = EQUIP_REAGENT; - break; - case 46: - a3 = EQUIP_GEM; - break; - case 29: - v53 = 37; - break; + 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 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 30: requested_skill = PLAYER_SKILL_STAFF; break; + case 31: requested_skill = PLAYER_SKILL_LEATHER; break; + case 32: requested_skill = PLAYER_SKILL_CHAIN; break; + case 33: requested_skill = PLAYER_SKILL_PLATE; break; + case 34: requested_equip = EQUIP_SHIELD; break; + case 35: requested_equip = EQUIP_HELMET; break; + case 36: requested_equip = EQUIP_BELT; break; + case 37: requested_equip = EQUIP_CLOAK; break; + case 38: requested_equip = EQUIP_GAUNTLETS; break; + case 39: requested_equip = EQUIP_BOOTS; break; + case 40: requested_equip = EQUIP_RING; break; + case 41: requested_equip = EQUIP_AMULET; break; + case 42: requested_equip = EQUIP_C; break; + case 43: requested_equip = EQUIP_F; break; + case 44: requested_equip = EQUIP_POTION; break; + case 45: requested_equip = EQUIP_REAGENT; break; + case 46: requested_equip = EQUIP_GEM; break; default: - --a3; + __debugbreak(); // check this condition + requested_equip = (ITEM_EQUIP_TYPE)(a3 - 1); break; } - memset(&Dst, 0, 0xC80u); + + memset(Dst, 0, sizeof(Dst)); + v52 = 0; - v7 = (int *)&Dst; - a2a = 1; - if ( v53 == -1 ) + v7 = Dst; + + if (requested_skill == PLAYER_SKILL_INVALID) { - v53 = (int)&v5->pItems[1].uEquipType; - v9 = (int)(&v5->pItems[1].field_2C + v6); - do + for (uint i = 1; i < 500; ++i) { - if ( *(unsigned char *)v53 == a3 ) + if (pItems[i].uEquipType == requested_equip) { - *v7 = a2a; - ++v7; - v52 += *(unsigned char *)v9; + *v7++ = i; + v52 += pItems[i].field_2C[v6]; } - ++a2a; - v53 += 48; - v9 += 48; } - while ( a2a < 500 ); } else { - v55 = (int)&v5->pItems[1].uSkillType; - v8 = (int)(&v5->pItems[1].field_2C + v6); - do + for (uint i = 1; i < 500; ++i) { - if ( *(unsigned char *)v55 == v53 ) + if (pItems[i].uSkillType == requested_skill) { - *v7 = a2a; - ++v7; - v52 += *(unsigned char *)v8; + *v7++ = i; + v52 += pItems[i].field_2C[v6]; } - ++a2a; - v55 += 48; - v8 += 48; } - while ( a2a < 500 ); } + v10 = 0; if ( v52 ) v10 = rand() % v52; - v4->uItemID = *(uint *)Dst; - if ( !Dst ) - v4->uItemID = 1; - v11 = *(&v5->pItems[v4->uItemID].field_2C + v54); + out_item->uItemID = *Dst; + if ( !*Dst ) + out_item->uItemID = 1; + v11 = pItems[out_item->uItemID].field_2C[v54]; if ( v11 < v10 ) { v12 = (uint *)Dst; @@ -2000,24 +1930,24 @@ { ++v12; v13 = *v12; - v4->uItemID = *v12; - v11 += *(&v5->pItems[v13].field_2C + v54); + out_item->uItemID = *v12; + v11 += pItems[v13].field_2C[v54]; } while ( v11 < v10 ); } - if ( v5->pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE ) + if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE) { - v4->_bonus_type = 0; + out_item->_bonus_type = 0; v14 = 2; do { - v4->_bonus_type += rand() % 4 + 1; - v15 = v4->_bonus_type; + out_item->_bonus_type += rand() % 4 + 1; + v15 = out_item->_bonus_type; --v14; } while ( v14 ); LABEL_72: - v4->_bonus_type = v15 * (v54 + 1); + out_item->_bonus_type = v15 * (v54 + 1); goto LABEL_73; } } @@ -2032,32 +1962,32 @@ if ( v54 == 5 && rand() % 100 < 5 && !pParty->field_7BA[v17] && v56 < 13 ) { pParty->field_7BA[v17] = 1; - v4->uAttributes = 0; - v4->uItemID = v17 + 500; - v5->SetSpecialBonus(v4); + out_item->uAttributes = 0; + out_item->uItemID = v17 + 500; + SetSpecialBonus(out_item); return; } v57 = 0; - v18 = rand() % v5->field_11684[v54]; - v4->uItemID = 0; + v18 = rand() % field_11684[v54]; + out_item->uItemID = 0; if ( v18 > 0 ) { do - v57 += *(&v5->pItems[v4->uItemID++ + 1].field_2C + v54); + v57 += pItems[out_item->uItemID++ + 1].field_2C[v54]; while ( v57 < v18 ); } if ( !v18 ) - v4->uItemID = 1; - if ( !v4->uItemID ) - v4->uItemID = 1; - if ( v5->pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE ) + 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 ) { - v4->_bonus_type = 0; + out_item->_bonus_type = 0; v19 = 2; do { - v4->_bonus_type += rand() % 4 + 1; - v15 = v4->_bonus_type; + out_item->_bonus_type += rand() % 4 + 1; + v15 = out_item->_bonus_type; --v19; } while ( v19 ); @@ -2065,22 +1995,22 @@ } } LABEL_73: - if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION + if (out_item->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION && !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, 239) ) - v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST; - if ( BYTE2(pItemsTable->pItems[v4->uItemID + 1].uItemID) ) - v4->uAttributes = 0; + out_item->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST; + if ( BYTE2(pItems[out_item->uItemID + 1].uItemID) ) + out_item->uAttributes = 0; else - v4->uAttributes = 1; - if ( v5->pItems[v4->uItemID].uEquipType != EQUIP_POTION ) + out_item->uAttributes = 1; + if (pItems[out_item->uItemID].uEquipType != EQUIP_POTION ) { - v4->uAdditionalValue = 0; - v4->_bonus_type = 0; + out_item->uAdditionalValue = 0; + out_item->_bonus_type = 0; } - v20 = v5->pItems[v4->uItemID].uEquipType; + v20 = pItems[out_item->uItemID].uEquipType; if ( v20 <= EQUIP_BOW ) { - v37 = (int)&v5->field_1169C[4 * v54 + 48]; + v37 = (int)&field_1169C[4 * v54 + 48]; if ( !*(unsigned int *)v37 ) return; v38 = rand() % 100; @@ -2093,13 +2023,13 @@ { if ( v20 == EQUIP_C ) { - v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1; - v4->uNumCharges = v21; - v4->uMaxCharges = v21; + v21 = rand() % 6 + pItems[out_item->uItemID].uDamageMod + 1; + out_item->uNumCharges = v21; + out_item->uMaxCharges = v21; } return; } - v22 = (int)&v5->field_1169C[4 * v54]; + v22 = (int)&field_1169C[4 * v54]; if ( !*(unsigned int *)v22 ) return; v23 = rand(); @@ -2107,34 +2037,34 @@ v25 = v23 % 100; if ( v23 % 100 < v24 ) goto LABEL_127; - if ( !*(unsigned int *)&v5->field_1169C[4 * v54 + 24] ) + if ( !*(unsigned int *)&field_1169C[4 * v54 + 24] ) return; if ( v25 < v24 ) { LABEL_127: - v26 = rand() % v5->field_116D8[v5->pItems[v4->uItemID].uEquipType]; - v27 = v4->uItemID; - v4->_bonus_type = 0; - for ( i = v5->pEnchantments[0].field_8[v5->pItems[v27].uEquipType + 1]; + v26 = rand() % field_116D8[pItems[out_item->uItemID].uEquipType]; + v27 = out_item->uItemID; + out_item->_bonus_type = 0; + for ( i = pEnchantments[0].field_8[pItems[v27].uEquipType + 1]; i < v26; - i += v5->pEnchantments[v4->_bonus_type].field_8[v5->pItems[v29].uEquipType + 1] ) + i += pEnchantments[out_item->_bonus_type].field_8[pItems[v29].uEquipType + 1] ) { - v29 = v4->uItemID; - ++v4->_bonus_type; + v29 = out_item->uItemID; + ++out_item->_bonus_type; } - ++v4->_bonus_type; - v30 = v5->field_116D8[2 * v54 + 12]; + ++out_item->_bonus_type; + v30 = field_116D8[2 * v54 + 12]; v31 = rand(); - v32 = v4->_bonus_type - 1; - v33 = v31 % (v5->field_116D8[2 * v54 + 13] - v30 + 1) + v30; - v4->_bonus_strength = v33; + v32 = out_item->_bonus_type - 1; + v33 = v31 % (field_116D8[2 * v54 + 13] - v30 + 1) + v30; + out_item->_bonus_strength = v33; if ( v32 == 21 || v32 == 22 || v32 == 23 ) - v4->_bonus_strength = v33 >> 1; - if ( v4->_bonus_strength <= 0 ) - v4->_bonus_strength = 1; + out_item->_bonus_strength = v33 >> 1; + if ( out_item->_bonus_strength <= 0 ) + out_item->_bonus_strength = 1; return; } - v34 = v24 + *(unsigned int *)&v5->field_1169C[4 * v54 + 24]; + v34 = v24 + *(unsigned int *)&field_1169C[4 * v54 + 24]; v36 = __OFSUB__(v25, v34); v35 = v25 - v34 < 0; } @@ -2143,11 +2073,11 @@ memset(&Dst, 0, 0xC80u); v39 = 0; a2b = 0; - if ( v5->field_11798 > 0 ) + if ( field_11798 > 0 ) { - v52 = -16 - (uint)v5; + v52 = -16 - (uint)this; v58 = (int *)&Dst; - v40 = (int)&v5->pSpecialEnchantments[1]; + v40 = (int)&pSpecialEnchantments[1]; do { switch ( v54 ) @@ -2162,8 +2092,8 @@ if ( !*(unsigned char *)v40 || v43 == 1 ) { LABEL_117: - v39 += *((unsigned char *)&v5->pItems[0].uItemID + v40 + v52 + v5->pItems[v4->uItemID].uEquipType); - if ( *((unsigned char *)&v5->pItems[0].uItemID + v40 + v52 + v5->pItems[v4->uItemID].uEquipType) ) + v39 += *((unsigned char *)&pItems[0].uItemID + v40 + v52 + pItems[out_item->uItemID].uEquipType); + if ( *((unsigned char *)&pItems[0].uItemID + v40 + v52 + pItems[out_item->uItemID].uEquipType) ) { v44 = v58; ++v58; @@ -2191,27 +2121,27 @@ ++a2b; v40 += 28; } - while ( a2b < v5->field_11798 ); + while ( a2b < field_11798 ); } v45 = rand(); - v4->uAdditionalValue = *(uint *)Dst; + out_item->uAdditionalValue = *Dst; v46 = v45 % v39 + 1; - a2c = *((unsigned char *)&v5->pItems[0].uItemID + 28 * (*(uint *)Dst + 1389) + v5->pItems[v4->uItemID].uEquipType); + a2c = *((unsigned char *)&pItems[0].uItemID + 28 * (*(uint *)Dst + 1389) + pItems[out_item->uItemID].uEquipType); if ( a2c < v46 ) { for ( j = (int *)&Dst; ; j = (int *)v59 ) { - v48 = v4->uItemID; + v48 = out_item->uItemID; v49 = (int)(j + 1); v59 = v49; v50 = *(unsigned int *)v49; - v4->uAdditionalValue = v50; - a2c += *((unsigned char *)&v5->pItems[0].uItemID + 28 * (v50 + 1389) + v5->pItems[v48].uEquipType); + out_item->uAdditionalValue = v50; + a2c += *((unsigned char *)&pItems[0].uItemID + 28 * (v50 + 1389) + pItems[v48].uEquipType); if ( a2c >= v46 ) break; } } - ++v4->uAdditionalValue; + ++out_item->uAdditionalValue; } //----- (004505CC) -------------------------------------------------------- diff -r 1527f66fd81b -r 30aa44013f7a Items.h --- a/Items.h Sat Feb 16 22:35:58 2013 +0200 +++ b/Items.h Sun Feb 17 00:16:48 2013 +0200 @@ -72,7 +72,7 @@ EQUIP_BOOTS = 0x9, EQUIP_RING = 0xA, EQUIP_AMULET = 0xB, - EQUIP_C = 0xC, + EQUIP_C = 0xC, // wand? EQUIP_REAGENT = 0xD, EQUIP_POTION = 0xE, EQUIP_F = 0xF, @@ -146,10 +146,7 @@ char field_29; char field_2A; char field_2B; - char field_2C; - char field_2D; - char field_2E; - char field_2F; + char field_2C[4]; }; #pragma pack(pop) diff -r 1527f66fd81b -r 30aa44013f7a Party.cpp --- a/Party.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/Party.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -71,12 +71,9 @@ //----- (004936E1) -------------------------------------------------------- void Party::SetHoldingItem(ItemGen *pItem) { - Party *v2; // esi@1 - - v2 = this; sub_421B2C_PlaceInInventory_or_DropPickedItem(); - memcpy(&v2->pPickedItem, pItem, sizeof(v2->pPickedItem)); - pMouse->SetCursorBitmapFromItemID(v2->pPickedItem.uItemID); + memcpy(&pPickedItem, pItem, sizeof(pPickedItem)); + pMouse->SetCursorBitmapFromItemID(pPickedItem.uItemID); } //----- (0049370F) -------------------------------------------------------- diff -r 1527f66fd81b -r 30aa44013f7a Player.cpp --- a/Player.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/Player.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -1463,7 +1463,7 @@ if ( v12 == -1 ) { if ( uActiveCharacter ) - pPlayers[uActiveCharacter]->PlaySound(SPEECH_15, 0); + pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0); result = 0; } else diff -r 1527f66fd81b -r 30aa44013f7a Player.h --- a/Player.h Sat Feb 16 22:35:58 2013 +0200 +++ b/Player.h Sun Feb 17 00:16:48 2013 +0200 @@ -24,14 +24,14 @@ SPEECH_11 = 11, SPEECH_12 = 12, SPEECH_14 = 14, - SPEECH_15 = 15, + SPEECH_NoRoom = 15, // when placing to inventory SPEECH_16 = 16, SPEECH_17 = 17, SPEECH_18 = 18, SPEECH_19 = 19, SPEECH_20 = 20, SPEECH_21 = 21, - SPEECH_GoodDay = 22, + SPEECH_GoodDay = 22, // greets on dialogue start SPEECH_GoodEvening = 23, SPEECH_24 = 24, SPEECH_25 = 25, @@ -215,6 +215,8 @@ PLAYER_SKILL_STEALING = 34, PLAYER_SKILL_ALCHEMY = 35, PLAYER_SKILL_LEARNING = 36, + + PLAYER_SKILL_INVALID = -1 }; /* 329 */ diff -r 1527f66fd81b -r 30aa44013f7a mm7_1.cpp --- a/mm7_1.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/mm7_1.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -3432,6 +3432,7 @@ a4 = (char *)v106.uViewportY; if ( v119 ) { + __debugbreak(); // following format strings are decompiled incorrectly sprintf(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[108], 0, v121->pMonsterInfo.uHP); a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; @@ -3442,6 +3443,7 @@ } else { + __debugbreak(); // following format strings are decompiled incorrectly sprintf(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[108], 0, pGlobalTXT_LocalizationStrings[630]); a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); v79 = (unsigned int)pGlobalTXT_LocalizationStrings[630]; @@ -3466,6 +3468,7 @@ v105 = pGlobalTXT_LocalizationStrings[54]; if ( v116 ) { + __debugbreak(); // following format strings are decompiled incorrectly sprintf(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[18], 0, (&v95)[4 * v121->pMonsterInfo.uAttack1Type]); a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; @@ -3490,6 +3493,7 @@ } else { + __debugbreak(); // following format strings are decompiled incorrectly sprintf(pTmpBuf, "%s", pGlobalTXT_LocalizationStrings[18], 0, pGlobalTXT_LocalizationStrings[630]); a1->DrawText(v56, 150, (int)a4, a5, pTmpBuf, 0, 0, 0); a4 = &a4[LOBYTE(v56->uFontHeight) - 3]; @@ -3597,7 +3601,8 @@ i = 0; do { - sprintf(pTmpBuf, "%s", (&v85)[4 * i], 0, pGlobalTXT_LocalizationStrings[630]); + __debugbreak(); // string argument is decompiled incorrectry + sprintf(pTmpBuf, "%s", (&v85)[4 * i], 0, pGlobalTXT_LocalizationStrings[630]); // "?" a1->DrawText(v56, 170, (int)a4, a5, pTmpBuf, 0, 0, 0); v65 = LOBYTE(v56->uFontHeight); ++i; @@ -4090,7 +4095,7 @@ if ( v22 == v5 ) { if ( uActiveCharacter ) - pPlayers[uActiveCharacter]->PlaySound(SPEECH_15, 0); + pPlayers[uActiveCharacter]->PlaySound(SPEECH_NoRoom, 0); return 0; } v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[v4->uItemID].pIconName, TEXTURE_16BIT_PALETTE); @@ -5729,46 +5734,46 @@ //----- (00421D00) -------------------------------------------------------- void __fastcall GameUI_OnPlayerPortraitLeftClick(unsigned int uPlayerID) { - unsigned int v1; // esi@1 - int v2; // eax@2 - Player *v3; // ecx@2 - Player *v4; // ecx@5 + //unsigned int v1; // esi@1 + //int v2; // eax@2 + //Player *v3; // ecx@2 + //Player *v4; // ecx@5 unsigned int v5; // [sp-4h] [bp-10h]@21 - v1 = uPlayerID; - if ( pParty->pPickedItem.uItemID ) - { - v2 = pPlayers[uPlayerID]->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID); - v3 = pPlayers[v1]; - if ( v2 ) - { - memcpy(&v3->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v2 + 5], &pParty->pPickedItem, 0x24u); - viewparams->bRedrawGameUI = 1; + //v1 = uPlayerID; + auto player = &pParty->pPlayers[uPlayerID - 1]; + if (pParty->pPickedItem.uItemID) + { + //v3 = player; + if (auto slot = player->AddItem(0xFFFFFFFFu, pParty->pPickedItem.uItemID)) + { + __debugbreak(); // invalid inventory indexing + memcpy(&player->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * slot + 5], &pParty->pPickedItem, 0x24u); + viewparams->bRedrawGameUI = true; pMouse->RemoveHoldingItem(); return; } - if ( v3->CanAct() ) - { - v4 = pPlayers[v1]; - } - else - { - if ( !pPlayers[uActiveCharacter]->CanAct() ) + + if (!player->CanAct()) + { + if ( pPlayers[uActiveCharacter]->CanAct()) goto LABEL_9; - v4 = pPlayers[uActiveCharacter]; - } - v4->PlaySound(SPEECH_15, 0); - } + player = pPlayers[uActiveCharacter]; + } + player->PlaySound(SPEECH_NoRoom, 0); + } + LABEL_9: - if ( !pCurrentScreen ) - { - viewparams->bRedrawGameUI = 1; - if ( uActiveCharacter != v1 ) + if (pCurrentScreen == SCREEN_GAME) + { + viewparams->bRedrawGameUI = true; + if ( uActiveCharacter != uPlayerID ) //goto LABEL_27; { - if ( pPlayers[v1]->uTimeToRecovery ) + if ( pPlayers[uPlayerID]->uTimeToRecovery ) return; - uActiveCharacter = v1; + + uActiveCharacter = uPlayerID; return; } v5 = 7; @@ -5781,20 +5786,20 @@ if ( pCurrentScreen == SCREEN_CHEST ) { //LABEL_23: - viewparams->bRedrawGameUI = 1; - if ( uActiveCharacter == v1 ) + viewparams->bRedrawGameUI = true; + if ( uActiveCharacter == uPlayerID ) { pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; pCurrentScreen = SCREEN_F; //goto LABEL_28; - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; } //LABEL_27: - if ( pPlayers[v1]->uTimeToRecovery ) + if ( pPlayers[uPlayerID]->uTimeToRecovery ) return; //goto LABEL_28; - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; } if ( pCurrentScreen != SCREEN_HOUSE ) @@ -5802,40 +5807,40 @@ if ( pCurrentScreen == SCREEN_E ) { //LABEL_28: - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; } if ( pCurrentScreen != SCREEN_F ) { - viewparams->bRedrawGameUI = 1; - uActiveCharacter = v1; + viewparams->bRedrawGameUI = true; + uActiveCharacter = uPlayerID; if ( pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] == 102 ) sub_419100(); return; } //goto LABEL_23; - viewparams->bRedrawGameUI = 1; - if ( uActiveCharacter == v1 ) + viewparams->bRedrawGameUI = true; + if ( uActiveCharacter == uPlayerID ) { pWindowList_at_506F50_minus1_indexing_buttons____and_an_int_[0] = 103; pCurrentScreen = SCREEN_F; //goto LABEL_28; - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; } //LABEL_27: - if ( pPlayers[v1]->uTimeToRecovery ) + if ( pPlayers[uPlayerID]->uTimeToRecovery ) return; //goto LABEL_28; - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; } if ( ptr_507BC0->field_40 == 1 ) return; - viewparams->bRedrawGameUI = 1; - if ( uActiveCharacter != v1 ) + viewparams->bRedrawGameUI = true; + if ( uActiveCharacter != uPlayerID ) //goto LABEL_28; - uActiveCharacter = v1; + uActiveCharacter = uPlayerID; return; if ( dword_F8B19C == 2 || dword_F8B19C == 6 ) { diff -r 1527f66fd81b -r 30aa44013f7a mm7_2.cpp --- a/mm7_2.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/mm7_2.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -4599,7 +4599,7 @@ memcpy(&v0->spellbook.pDarkSpellbook.bIsSpellAvailable[36 * v25 + 5], v20, 0x24u); goto LABEL_42; } - v0->PlaySound(SPEECH_15, 0); + v0->PlaySound(SPEECH_NoRoom, 0); v54 = 5; LABEL_70: v9 = pGlobalTXT_LocalizationStrings[563]; // "Pack is Full!" @@ -4694,7 +4694,7 @@ v27->PlaySound((PlayerSpeech)v51, v53); return; } - v0->PlaySound(SPEECH_15, 0); + v0->PlaySound(SPEECH_NoRoom, 0); v54 = 2; goto LABEL_70; } diff -r 1527f66fd81b -r 30aa44013f7a mm7_3.cpp --- a/mm7_3.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/mm7_3.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -16478,8 +16478,8 @@ GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0xE1u, 0xCDu, 0x23u); v2 = GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(0x15u, 0x99u, 0xE9u); pRenderer->DrawTextureIndexed(477, 0, pTexture_Dialogue_Background); - pRenderer->DrawTextureTransparent(468, 0, (Texture *)(uTextureID_507B04 != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_507B04] : 0)); - pRenderer->DrawTextureIndexed(pNPCPortraits_x - 4, pNPCPortraits_y - 4, (Texture *)(uTextureID_50795C != -1 ? (int)&pIcons_LOD->pTextures[uTextureID_50795C] : 0)); + pRenderer->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]); if ( pNPC->uProfession ) { diff -r 1527f66fd81b -r 30aa44013f7a mm7_5.cpp --- a/mm7_5.cpp Sat Feb 16 22:35:58 2013 +0200 +++ b/mm7_5.cpp Sun Feb 17 00:16:48 2013 +0200 @@ -342,7 +342,7 @@ if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; uAction = 0; - uNumSeconds = uMessage - 134; + int hireling_idx = uMessage - UIMSG_StartHireling1Dialogue; v4 = 0; for (uint i = 0; i < 2; ++i) @@ -377,11 +377,12 @@ //} //while ( _this < (signed int)pNPCStats->uNumNewNPCs ); } - if ( (signed int)(uNumSeconds + (unsigned __int8)pParty->field_709) < uAction ) + + if ( (signed int)(hireling_idx + (unsigned __int8)pParty->field_709) < uAction ) { //Actor::Actor(&actor); memset(&actor, 0, 0x344u); - actor.uNPC_ID += -1 - (unsigned __int8)pParty->field_709 - uNumSeconds; + actor.uNPC_ID += -1 - (unsigned __int8)pParty->field_709 - hireling_idx; pActor = &actor; //_actor_init_dlg: pActor->InitializeDialogue(v0); @@ -3624,7 +3625,7 @@ //LABEL_733: GUIWindow::Create(v9, v8, v133, v137, pWindowType1, (int)pButton2, v163); continue; - case UIMSG_194: + case UIMSG_Game_Action: if ( pMessageQueue_50CBD0->uNumMessages ) pMessageQueue_50CBD0->uNumMessages = pMessageQueue_50CBD0->pMessages[0].field_8 != 0; OnPressSpace(); @@ -16172,6 +16173,7 @@ return; } } + if ( pParty->pPickedItem.uItemID )//нажатие на портрет перса правой кнопкой мыши с раствором { //v1 = 0; @@ -16188,6 +16190,7 @@ } //while ( v1 < 4 ); } + pEventTimer->Pause(); if ( pCurrentScreen <= SCREEN_CHEST ) {