Mercurial > mm7
diff Items.cpp @ 201:30aa44013f7a
On Items
author | Nomad |
---|---|
date | Sun, 17 Feb 2013 00:16:48 +0200 |
parents | 821fd955c379 |
children | 1bd823f52e3a |
line wrap: on
line diff
--- 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) --------------------------------------------------------