int CChar::NPC_WantThisItem( CItem * pItem ) const { ADDTOCALLSTACK("CChar::NPC_WantThisItem"); // This should be the ULTIMATE place to check if the NPC wants this in any way. // May not want to use it but rather just put it in my pack. // // NOTE: // Don't check if i can see this or i can reach it. // Don't check if i can carry this ? // // RETURN: // 0-100 percent = how bad do we want it ? if ( !CanMove(pItem, false) ) return 0; CCharBase * pCharDef = Char_GetDef(); ASSERT(pCharDef != NULL); size_t iRet = pCharDef->m_Desires.FindResourceMatch(pItem); if ( iRet != pCharDef->m_Desires.BadIndex() ) return static_cast<int>(pCharDef->m_Desires[iRet].GetResQty()); // I'm hungry and this is food ? int iFoodLevel = Food_GetLevelPercent(); if ( Food_CanEat(pItem) && iFoodLevel < 100 ) return 100 - iFoodLevel; if ( NPC_IsVendor() ) { // Vendors always want money if ( pItem->IsType(IT_GOLD) ) return 100; // Is it something I would buy? CItemVendable * pItemSell = NPC_FindVendableItem(dynamic_cast<CItemVendable *>(pItem), const_cast<CChar *>(this)->GetBank(LAYER_VENDOR_BUYS), const_cast<CChar *>(this)->GetBank(LAYER_VENDOR_STOCK)); if ( pItemSell ) return pItemSell->GetVendorPrice(0); } return 0; }
bool CChar::Use_Eat( CItem * pItemFood, short iQty ) { ADDTOCALLSTACK("CChar::Use_Eat"); // What we can eat should depend on body type. // How much we can eat should depend on body size and current fullness. // // ??? monsters should be able to eat corpses / raw meat // IT_FOOD or IT_FOOD_RAW // NOTE: Some foods like apples are stackable ! if ( !CanMove(pItemFood) ) { SysMessageDefault(DEFMSG_FOOD_CANTMOVE); return false; } if ( Stat_GetMax(STAT_FOOD) == 0 ) { SysMessageDefault(DEFMSG_FOOD_CANTEAT); return false; } // Is this edible by me ? if ( !Food_CanEat(pItemFood) ) { SysMessageDefault(DEFMSG_FOOD_RCANTEAT); return false; } if ( Stat_GetVal(STAT_FOOD) >= Stat_GetMax(STAT_FOOD) ) { SysMessageDefault(DEFMSG_FOOD_CANTEATF); return false; } Use_EatQty(pItemFood, iQty); LPCTSTR pMsg; int index = IMULDIV(Stat_GetVal(STAT_FOOD), 5, Stat_GetMax(STAT_FOOD)); switch ( index ) { case 0: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_1); break; case 1: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_2); break; case 2: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_3); break; case 3: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_4); break; case 4: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_5); break; case 5: default: pMsg = g_Cfg.GetDefaultMsg(DEFMSG_FOOD_FULL_6); break; } SysMessage(pMsg); return true; }