void CRandomItems::AddItems (SItemAddCtx &Ctx) // AddItems // // Add items { int i, j; int iRoll = mathRandom(1, 1000); bool bAllAtOnce = (m_iDamaged == 0 && m_Enhanced.GetChance() == 0); for (i = 0; i < m_iCount; i++) { iRoll -= m_Table[i].iProbability; if (iRoll <= 0) { CItemType *pType = m_Table[i].pType; int iCount = pType->GetNumberAppearing().Roll(); // If we don't have a chance of enhancement or damage, just optimize the // result by adding a group of items. if (bAllAtOnce) Ctx.ItemList.AddItem(CItem(m_Table[i].pType, iCount)); // If this is armor, then treat them as a block else if (pType->GetCategory() == itemcatArmor) { CItem Item(m_Table[i].pType, iCount); if (mathRandom(1, 100) <= m_iDamaged) Item.SetDamaged(); else m_Enhanced.EnhanceItem(Item); Ctx.ItemList.AddItem(Item); } // Otherwise, enhance/damage each item individually else { for (j = 0; j < iCount; j++) { CItem Item(m_Table[i].pType, 1); if (mathRandom(1, 100) <= m_iDamaged) Item.SetDamaged(); else m_Enhanced.EnhanceItem(Item); Ctx.ItemList.AddItem(Item); } } break; } } }
CurrencyValue CRandomItems::GetAverageValue (int iLevel) // GetAverageValue // // Returns the average value. { int i; // If this is a dynamic table we need to compute all levels if (m_bDynamicLevelFrequency) { Metric rTotal = 0.0; InitTable(GenerateLevelFrequency(m_sLevelFrequency, iLevel)); m_iDynamicLevel = iLevel; for (i = 0; i < m_iCount; i++) { CItemType *pType = m_Table[i].pType; CurrencyValue ItemValue = CEconomyType::ExchangeToCredits(pType->GetCurrencyType(), pType->GetValue(CItemCtx(), true)); rTotal += (pType->GetNumberAppearing().GetAveValueFloat() * (Metric)ItemValue * (Metric)m_Table[i].iProbability / 1000.0); } return (CurrencyValue)(rTotal + 0.5); } // Otherwise the table is already initialized. else { // Average value is proportional to chances. Metric rTotal = 0.0; for (i = 0; i < m_iCount; i++) { CItemType *pType = m_Table[i].pType; CurrencyValue ItemValue = CEconomyType::ExchangeToCredits(pType->GetCurrencyType(), pType->GetValue(CItemCtx(), true)); rTotal += (pType->GetNumberAppearing().GetAveValueFloat() * (Metric)ItemValue * (Metric)m_Table[i].iProbability / 1000.0); } return (CurrencyValue)(rTotal + 0.5); } }