void OutfitInfoDisplay::UpdateAttributes(const Outfit &outfit) { attributeLabels.clear(); attributeValues.clear(); attributesHeight = 20; map<string, map<string, int>> listing; for(const auto &it : outfit.Attributes()) { if(it.first == "outfit space" || it.first == "weapon capacity" || it.first == "engine capacity" || it.first == "gun ports" || it.first == "turret mounts") continue; string value; double scale = 1.; if(it.first == "thrust" || it.first == "reverse thrust" || it.first == "afterburner thrust") scale = 60. * 60.; else if(ATTRIBUTES_TO_SCALE.count(it.first)) scale = 60.; if(BOOLEAN_ATTRIBUTES.count(it.first)) { attributeLabels.push_back("This outfit is " + it.first + "."); attributeValues.push_back(" "); attributesHeight += 20; } else { attributeLabels.push_back(it.first + ':'); attributeValues.push_back(Format::Number(it.second * scale)); attributesHeight += 20; } } if(!outfit.IsWeapon()) return; attributeLabels.push_back(string()); attributeValues.push_back(string()); attributesHeight += 10; if(outfit.Ammo()) { attributeLabels.push_back("ammo:"); attributeValues.push_back(outfit.Ammo()->Name()); attributesHeight += 20; } attributeLabels.push_back("range:"); attributeValues.push_back(Format::Number(outfit.Range())); attributesHeight += 20; if(outfit.ShieldDamage() && outfit.Reload()) { attributeLabels.push_back("shield damage / second:"); attributeValues.push_back(Format::Number(60. * outfit.ShieldDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.HullDamage() && outfit.Reload()) { attributeLabels.push_back("hull damage / second:"); attributeValues.push_back(Format::Number(60. * outfit.HullDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.HeatDamage() && outfit.Reload()) { attributeLabels.push_back("heat damage / second:"); attributeValues.push_back(Format::Number(60. * outfit.HeatDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.IonDamage() && outfit.Reload()) { attributeLabels.push_back("ion damage / second:"); attributeValues.push_back(Format::Number(6000. * outfit.IonDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.SlowingDamage() && outfit.Reload()) { attributeLabels.push_back("slowing damage / second:"); attributeValues.push_back(Format::Number(6000. * outfit.SlowingDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.DisruptionDamage() && outfit.Reload()) { attributeLabels.push_back("disruption damage / second:"); attributeValues.push_back(Format::Number(6000. * outfit.DisruptionDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.FiringEnergy() && outfit.Reload()) { attributeLabels.push_back("firing energy / second:"); attributeValues.push_back(Format::Number(60. * outfit.FiringEnergy() / outfit.Reload())); attributesHeight += 20; } if(outfit.FiringHeat() && outfit.Reload()) { attributeLabels.push_back("firing heat / second:"); attributeValues.push_back(Format::Number(60. * outfit.FiringHeat() / outfit.Reload())); attributesHeight += 20; } if(outfit.FiringFuel() && outfit.Reload()) { attributeLabels.push_back("firing fuel / second:"); attributeValues.push_back(Format::Number(60. * outfit.FiringFuel() / outfit.Reload())); attributesHeight += 20; } bool isContinuous = (outfit.Reload() <= 1); attributeLabels.push_back("shots / second:"); if(isContinuous) attributeValues.push_back("continuous"); else attributeValues.push_back(Format::Number(60. / outfit.Reload())); attributesHeight += 20; int homing = outfit.Homing(); if(homing) { static const string skill[] = { "no", "poor", "fair", "good", "excellent" }; attributeLabels.push_back("homing:"); attributeValues.push_back(skill[max(0, min(4, homing))]); attributesHeight += 20; } static const string percentNames[] = { "tracking:", "optical tracking:", "infrared tracking:", "radar tracking:", "piercing:" }; double percentValues[] = { outfit.Tracking(), outfit.OpticalTracking(), outfit.InfraredTracking(), outfit.RadarTracking(), outfit.Piercing() }; for(unsigned i = 0; i < sizeof(percentValues) / sizeof(percentValues[0]); ++i) if(percentValues[i]) { int percent = 100. * percentValues[i] + .5; attributeLabels.push_back(percentNames[i]); attributeValues.push_back(Format::Number(percent) + "%"); attributesHeight += 20; } attributeLabels.push_back(string()); attributeValues.push_back(string()); attributesHeight += 10; static const string names[] = { "shield damage / shot:", "hull damage / shot:", "heat damage / shot:", "ion damage / shot:", "slowing damage / shot:", "disruption damage / shot:", "firing energy / shot:", "firing heat / shot:", "firing fuel / shot:", "inaccuracy:", "blast radius:", "missile strength:", "anti-missile:", }; double values[] = { outfit.ShieldDamage(), outfit.HullDamage(), outfit.HeatDamage(), outfit.IonDamage() * 100., outfit.SlowingDamage() * 100., outfit.DisruptionDamage() * 100., outfit.FiringEnergy(), outfit.FiringHeat(), outfit.FiringFuel(), outfit.Inaccuracy(), outfit.BlastRadius(), static_cast<double>(outfit.MissileStrength()), static_cast<double>(outfit.AntiMissile()) }; static const int NAMES = sizeof(names) / sizeof(names[0]); for(int i = (isContinuous ? 9 : 0); i < NAMES; ++i) if(values[i]) { attributeLabels.push_back(names[i]); attributeValues.push_back(Format::Number(values[i])); attributesHeight += 20; } }
void OutfitInfoDisplay::UpdateAttributes(const Outfit &outfit) { attributeLabels.clear(); attributeValues.clear(); attributesHeight = 20; map<string, map<string, int>> listing; for(const auto &it : outfit.Attributes()) { if(it.first == "cost" || it.first == "outfit space" || it.first == "weapon capacity" || it.first == "engine capacity" || it.first == "gun ports" || it.first == "turret mounts") continue; attributeLabels.push_back(it.first + ':'); attributeValues.push_back(Format::Number(it.second)); attributesHeight += 20; } if(!outfit.IsWeapon()) return; attributeLabels.push_back(string()); attributeValues.push_back(string()); attributesHeight += 10; if(outfit.Ammo()) { attributeLabels.push_back("ammo:"); attributeValues.push_back(outfit.Ammo()->Name()); attributesHeight += 20; } attributeLabels.push_back("range:"); attributeValues.push_back(Format::Number(outfit.Range())); attributesHeight += 20; if(outfit.ShieldDamage() && outfit.Reload()) { attributeLabels.push_back("shield damage / second:"); attributeValues.push_back(Format::Number(60. * outfit.ShieldDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.HullDamage() && outfit.Reload()) { attributeLabels.push_back("hull damage / second:"); attributeValues.push_back(Format::Number(60. * outfit.HullDamage() / outfit.Reload())); attributesHeight += 20; } if(outfit.FiringEnergy() && outfit.Reload()) { attributeLabels.push_back("firing energy / second:"); attributeValues.push_back(Format::Number(60. * outfit.FiringEnergy() / outfit.Reload())); attributesHeight += 20; } if(outfit.Reload() > 1) { attributeLabels.push_back("shots / second:"); attributeValues.push_back(Format::Number(60. / outfit.Reload())); attributesHeight += 20; } int homing = outfit.Homing(); if(homing) { static const string skill[] = { "no", "poor", "fair", "good", "excellent" }; attributeLabels.push_back("homing:"); attributeValues.push_back(skill[max(0, min(4, homing))]); attributesHeight += 20; } attributeLabels.push_back(string()); attributeValues.push_back(string()); attributesHeight += 10; static const string names[] = { "inaccuracy:", "firing energy:", "firing heat:", "blast radius:", "missile strength:", "anti-missile:", }; double values[] = { outfit.Inaccuracy(), outfit.FiringEnergy(), outfit.FiringHeat(), outfit.BlastRadius(), static_cast<double>(outfit.MissileStrength()), static_cast<double>(outfit.AntiMissile()) }; static const int NAMES = sizeof(names) / sizeof(names[0]); for(int i = 0; i < NAMES; ++i) if(values[i]) { attributeLabels.push_back(names[i]); attributeValues.push_back(Format::Number(values[i])); attributesHeight += 20; } }