bool CDeviceClass::FindAmmoDataField (CItemType *pItem, const CString &sField, CString *retsValue) // FindAmmoDataField // // Finds the device that fires this item and returns the given field { int i; for (i = 0; i < g_pUniverse->GetItemTypeCount(); i++) { CItemType *pType = g_pUniverse->GetItemType(i); CDeviceClass *pWeapon; if (pType->IsDevice() && (pWeapon = pType->GetDeviceClass())) { int iVariant = pWeapon->GetAmmoVariant(pItem); if (iVariant != -1) return pWeapon->FindDataField(iVariant, sField, retsValue); } } return false; }
bool CDeviceClass::FindWeaponFor (CItemType *pItem, CDeviceClass **retpWeapon, int *retiVariant, CWeaponFireDesc **retpDesc) // FindWeaponFor // // Returns weapon data for the given item (which may be a weapon or a missile). { int i; CDeviceClass *pDevice; int iVariant; // Get the device and variant if (pItem->IsMissile()) { iVariant = -1; for (i = 0; i < g_pUniverse->GetItemTypeCount(); i++) { CItemType *pType = g_pUniverse->GetItemType(i); if (pDevice = pType->GetDeviceClass()) { iVariant = pDevice->GetAmmoVariant(pItem); if (iVariant != -1) break; } } if (iVariant == -1) return false; } else { pDevice = pItem->GetDeviceClass(); if (pDevice == NULL) return false; iVariant = 0; } CWeaponClass *pWeapon = pDevice->AsWeaponClass(); if (pWeapon == NULL) return false; CWeaponFireDesc *pDesc = pWeapon->GetVariant(iVariant); // Done if (retpWeapon) *retpWeapon = pDevice; if (retiVariant) *retiVariant = iVariant; if (retpDesc) *retpDesc = pDesc; return true; }
CWeaponFireDesc *GetWeaponFireDescArg (ICCItem *pArg) // GetWeaponFireDescArg // // If arg is a weapon UNID, then we return the first weapon desc // If arg is a missile, then we return the first weapon desc we find for the missile // If arg is a list, then the first is a weapon UNID and the second is a missile UNID // Returns NULL on error { int i; DWORD dwWeaponUNID; DWORD dwVariantUNID; // If the argument is a list, then we get the weapon UNID and the variant // from the list. if (pArg->IsList() && pArg->GetCount() >= 2) { dwWeaponUNID = (DWORD)pArg->GetElement(0)->GetIntegerValue(); dwVariantUNID = (DWORD)pArg->GetElement(1)->GetIntegerValue(); } // Otherwise, get the first variant of the weapon else { dwWeaponUNID = (DWORD)pArg->GetIntegerValue(); dwVariantUNID = 0; } // Get the item associated with the UNID CItemType *pType = g_pUniverse->FindItemType(dwWeaponUNID); if (pType == NULL) return NULL; // If this is a weapon, then return the weapon fire desc if (pType->GetCategory() == itemcatWeapon || pType->GetCategory() == itemcatLauncher) { CDeviceClass *pClass = pType->GetDeviceClass(); if (pClass == NULL) return NULL; CWeaponClass *pWeapon = pClass->AsWeaponClass(); if (pWeapon == NULL) return NULL; // If variant UNID is 0, then we just want the weapon if (dwVariantUNID == 0) return pWeapon->GetVariant(0); // Otherwise, we need to find the variant index for the given UNID int i; for (i = 0; i < pWeapon->GetVariantCount(); i++) { CWeaponFireDesc *pDesc = pWeapon->GetVariant(i); if (pDesc->GetAmmoType()->GetUNID() == dwVariantUNID) return pDesc; } // If we get this far, then we couldn't find the missile return NULL; } // Otherwise, if this is a missile, then find the appropriate weapon else if (pType->GetCategory() == itemcatMissile) { for (i = 0; i < g_pUniverse->GetItemTypeCount(); i++) { CItemType *pWeaponType = g_pUniverse->GetItemType(i); CDeviceClass *pClass; if (pClass = pWeaponType->GetDeviceClass()) { int iWeaponVariant; if ((iWeaponVariant = pClass->GetAmmoVariant(pType)) != -1) { CWeaponClass *pWeapon = dynamic_cast<CWeaponClass *>(pClass); if (pWeapon) return pWeapon->GetVariant(iWeaponVariant); } } } return NULL; } // Otherwise, nothing else return NULL; }