bool CChar::ItemEquipWeapon( bool fForce ) { ADDTOCALLSTACK("CChar::ItemEquipWeapon"); // Find my best weapon and equip it if ( !fForce && m_uidWeapon.IsValidUID() ) // we already have a weapon equipped return true; CCharBase *pCharDef = Char_GetDef(); CItemContainer *pPack = GetPack(); if ( !pPack || !pCharDef || !pCharDef->Can(CAN_C_USEHANDS) ) return false; // Loop through all my weapons and come up with a score for it's usefulness CItem *pBestWeapon = NULL; int iWeaponScoreMax = NPC_GetWeaponUseScore(NULL); // wrestling for ( CItem *pItem = pPack->GetContentHead(); pItem != NULL; pItem = pItem->GetNext() ) { int iWeaponScore = NPC_GetWeaponUseScore(pItem); if ( iWeaponScore > iWeaponScoreMax ) { iWeaponScoreMax = iWeaponScore; pBestWeapon = pItem; } } if ( pBestWeapon ) return ItemEquip(pBestWeapon); return true; }
bool CChar::ItemEquipArmor( bool fForce ) { ADDTOCALLSTACK("CChar::ItemEquipArmor"); // Equip ourselves as best as possible. CCharBase *pCharDef = Char_GetDef(); CItemContainer *pPack = GetPack(); if ( !pPack || !pCharDef || !pCharDef->Can(CAN_C_EQUIP) ) return false; int iBestScore[LAYER_HORSE]; memset(iBestScore, 0, sizeof(iBestScore)); CItem *pBestArmor[LAYER_HORSE]; memset(pBestArmor, 0, sizeof(pBestArmor)); if ( !fForce ) { // Block those layers that are already used for ( size_t i = 0; i < COUNTOF(iBestScore); i++ ) { pBestArmor[i] = LayerFind(static_cast<LAYER_TYPE>(i)); if ( pBestArmor[i] != NULL ) iBestScore[i] = INT_MAX; } } for ( CItem *pItem = pPack->GetContentHead(); pItem != NULL; pItem = pItem->GetNext() ) { int iScore = pItem->Armor_GetDefense(); if ( !iScore ) // might not be armor continue; // Can I even equip this? LAYER_TYPE layer = CanEquipLayer(pItem, LAYER_QTY, NULL, true); if ( layer == LAYER_NONE ) continue; if ( iScore > iBestScore[layer] ) { iBestScore[layer] = iScore; pBestArmor[layer] = pItem; } } // Equip all the stuff we found for ( size_t i = 0; i < COUNTOF(iBestScore); i++ ) { if ( pBestArmor[i] ) ItemEquip(pBestArmor[i], this); } return true; }