ICCItem *CArmorClass::GetItemProperty (CItemCtx &Ctx, const CString &sName) // GetItemProperty // // Returns armor property { CCodeChain &CC = g_pUniverse->GetCC(); if (strEquals(sName, PROPERTY_BLINDING_IMMUNE)) return CC.CreateBool(IsBlindingDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_COMPLETE_HP)) return CC.CreateInteger(GetMaxHP(Ctx, true)); else if (strEquals(sName, PROPERTY_DEVICE_DAMAGE_IMMUNE)) return CC.CreateBool(IsDeviceDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_DEVICE_DISRUPT_IMMUNE)) return CC.CreateBool(IsDeviceDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_DISINTEGRATION_IMMUNE)) return CC.CreateBool(IsDisintegrationImmune(Ctx)); else if (strEquals(sName, PROPERTY_EMP_IMMUNE)) return CC.CreateBool(IsEMPDamageImmune(Ctx)); else if (strEquals(sName, PROPERTY_HP)) return CC.CreateInteger(GetMaxHP(Ctx)); else if (strEquals(sName, PROPERTY_RADIATION_IMMUNE)) return CC.CreateBool(IsRadiationImmune(Ctx)); else if (strEquals(sName, PROPERTY_SHATTER_IMMUNE)) return CC.CreateBool(IsShatterImmune(Ctx)); else if (m_pItemType) return CreateResultFromDataField(CC, m_pItemType->GetDataField(sName)); else return CC.CreateNil(); }
void CArmorClass::CalcDamageEffects (CItemCtx &ItemCtx, SDamageCtx &Ctx) // CalcDamageEffects // // Initialize the damage effects based on the damage and on this armor type. { CSpaceObject *pSource = ItemCtx.GetSource(); CInstalledArmor *pArmor = ItemCtx.GetArmor(); // Compute all the effects (if we don't have installed armor, then the // caller is responsible for setting this). if (pArmor) Ctx.iHPLeft = pArmor->GetHitPoints(); // Reflect Ctx.bReflect = (IsReflective(ItemCtx, Ctx.Damage) && Ctx.iDamage > 0); // Disintegration int iDisintegration = Ctx.Damage.GetDisintegrationDamage(); Ctx.bDisintegrate = (iDisintegration > 0 && !IsDisintegrationImmune(ItemCtx)); // Shatter int iShatter = Ctx.Damage.GetShatterDamage(); if (iShatter) { // Compute the threshold mass. Below this size, we shatter the object int iMassLimit = 10 * mathPower(5, iShatter); Ctx.bShatter = (pSource && pSource->GetMass() < iMassLimit); } else Ctx.bShatter = false; // Blinding int iBlinding = Ctx.Damage.GetBlindingDamage(); if (iBlinding && !IsBlindingDamageImmune(ItemCtx)) { // The chance of being blinded is dependent // on the rating. int iChance = 4 * iBlinding * iBlinding * GetBlindingDamageAdj() / 100; Ctx.bBlind = (mathRandom(1, 100) <= iChance); Ctx.iBlindTime = Ctx.iDamage * g_TicksPerSecond / 2; } else Ctx.bBlind = false; // EMP int iEMP = Ctx.Damage.GetEMPDamage(); if (iEMP && !IsEMPDamageImmune(ItemCtx)) { // The chance of being paralyzed is dependent // on the EMP rating. int iChance = 4 * iEMP * iEMP * GetEMPDamageAdj() / 100; Ctx.bParalyze = (mathRandom(1, 100) <= iChance); Ctx.iParalyzeTime = Ctx.iDamage * g_TicksPerSecond / 2; } else Ctx.bParalyze = false; // Device disrupt int iDeviceDisrupt = Ctx.Damage.GetDeviceDisruptDamage(); if (iDeviceDisrupt && !IsDeviceDamageImmune(ItemCtx)) { // The chance of damaging a device depends on the rating. int iChance = 4 * iDeviceDisrupt * iDeviceDisrupt * GetDeviceDamageAdj() / 100; Ctx.bDeviceDisrupt = (mathRandom(1, 100) <= iChance); Ctx.iDisruptTime = 2 * Ctx.iDamage * g_TicksPerSecond; } else Ctx.bDeviceDisrupt = false; // Device damage int iDeviceDamage = Ctx.Damage.GetDeviceDamage(); if (iDeviceDamage && !IsDeviceDamageImmune(ItemCtx)) { // The chance of damaging a device depends on the rating. int iChance = 4 * iDeviceDamage * iDeviceDamage * GetDeviceDamageAdj() / 100; Ctx.bDeviceDamage = (mathRandom(1, 100) <= iChance); } else Ctx.bDeviceDamage = false; // Radiation int iRadioactive = Ctx.Damage.GetRadiationDamage(); Ctx.bRadioactive = (iRadioactive > 0 && !IsRadiationImmune(ItemCtx)); // Some effects decrease damage if (iBlinding || iEMP) Ctx.iDamage = 0; else if (iDeviceDamage) Ctx.iDamage = Ctx.iDamage / 2; }