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; } } }
void CSingleItem::AddItems (SItemAddCtx &Ctx) // AddItems // // Add items { // Ignore if not debugging if (m_bDebugOnly && !g_pUniverse->InDebugMode()) return; // Create item CItem NewItem(m_pItemType, 1); if (mathRandom(1, 100) <= m_iDamaged) NewItem.SetDamaged(); else m_Enhanced.EnhanceItem(NewItem); Ctx.ItemList.AddItem(NewItem); }
void CSingleDevice::AddDevices (SDeviceGenerateCtx &Ctx) // AddDevices // // Add devices to list { int i; if (m_pItemType == NULL) return; int iCount = m_Count.Roll(); for (i = 0; i < iCount; i++) { // Initialize the desc SDeviceDesc Desc; Desc.Item = CItem(m_pItemType, 1); if (mathRandom(1, 100) <= m_iDamaged) Desc.Item.SetDamaged(); else m_Enhanced.EnhanceItem(Desc.Item); // Find the default settings for the device slot for this device SDeviceDesc SlotDesc; bool bUseSlotDesc = (Ctx.pRoot ? Ctx.pRoot->FindDefaultDesc(Desc.Item, &SlotDesc) : false); // Set the device position appropriately, either from the <Device> element, // from the slot descriptor at the root, or from defaults. if (!m_bDefaultPos) { Desc.iPosAngle = m_iPosAngle; Desc.iPosRadius = m_iPosRadius; Desc.iPosZ = m_iPosZ; Desc.b3DPosition = m_b3DPosition; } else if (bUseSlotDesc) { Desc.iPosAngle = SlotDesc.iPosAngle; Desc.iPosRadius = SlotDesc.iPosRadius; Desc.iPosZ = SlotDesc.iPosZ; Desc.b3DPosition = SlotDesc.b3DPosition; } // Set the device fire arc appropriately. if (!m_bDefaultFireArc) { Desc.bOmnidirectional = m_bOmnidirectional; Desc.iMinFireArc = m_iMinFireArc; Desc.iMaxFireArc = m_iMaxFireArc; } else if (bUseSlotDesc) { Desc.bOmnidirectional = SlotDesc.bOmnidirectional; Desc.iMinFireArc = SlotDesc.iMinFireArc; Desc.iMaxFireArc = SlotDesc.iMaxFireArc; } // Set linked fire if (!m_bDefaultLinkedFire) Desc.dwLinkedFireOptions = m_dwLinkedFireOptions; else if (bUseSlotDesc) Desc.dwLinkedFireOptions = SlotDesc.dwLinkedFireOptions; else Desc.dwLinkedFireOptions = 0; Desc.bSecondary = m_bSecondary; // Slot bonus if (!m_bDefaultSlotBonus) Desc.iSlotBonus = m_iSlotBonus; else if (bUseSlotDesc) Desc.iSlotBonus = SlotDesc.iSlotBonus; else Desc.iSlotBonus = 0; // Add extra items if (m_pExtraItems) { CItemListManipulator ItemList(Desc.ExtraItems); SItemAddCtx ItemCtx(ItemList); ItemCtx.iLevel = Ctx.iLevel; m_pExtraItems->AddItems(ItemCtx); } // Done Ctx.pResult->AddDeviceDesc(Desc); } }