private string GetActiveName(MODULE_ACTIVE Active) { if (Active == MODULE_ACTIVE.PASSIVE) { return("ACTIVE.PASSIVE"); } else if (Active == MODULE_ACTIVE.ACTIVE) { return("ACTIVE.ACTIVE"); } else if (Active == MODULE_ACTIVE.ASSAULT_PASSIVE) { return("ACTIVE.ASSAULT_PASSIVE"); } else if (Active == MODULE_ACTIVE.ASSAULT_ACTIVE) { return("ACTIVE.ASSAULT_ACTIVE"); } else { return("FAIL_COMPILATION"); } }
static void AddTo(ref Dictionary <MODULE_ATTRIBUTES, Dictionary <MODULE_ACTIVE, Tuple <float, int> > > Attributes, MODULE_ATTRIBUTES Attr, MODULE_ACTIVE Active, float Value, int StackingGroup) { if (!Attributes.ContainsKey(Attr)) { Attributes.Add(Attr, new Dictionary <MODULE_ACTIVE, Tuple <float, int> >()); } Attributes[Attr][Active] = new Tuple <float, int>(Value, StackingGroup); }
static ModuleDescription GetModuleDescription(string moduleName, int typeID, int groupID, MODULE_SLOT slot, NpgsqlConnection conn) { IReadOnlyDictionary <MODULE_ATTRIBUTES_DB, Tuple <bool, int, bool, float> > moduleAttributesDB = GetModuleAttributes(typeID, conn); // Tuple is : value + stacking group Dictionary <MODULE_ATTRIBUTES, Dictionary <MODULE_ACTIVE, Tuple <float, int> > > Attributes = new Dictionary <MODULE_ATTRIBUTES, Dictionary <MODULE_ACTIVE, Tuple <float, int> > >(); float OverloadBonus = 0.0f; int ShipTypeID = -1; bool bActiveModule = false; if (moduleAttributesDB.ContainsKey(MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_CAPACITOR_NEEDED)) { float attrDBValue = GetValue(moduleAttributesDB[MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_CAPACITOR_NEEDED]); bActiveModule = attrDBValue > 0.0f; } if (!bActiveModule) { if (moduleAttributesDB.ContainsKey(MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_DURATION)) { float attrDBValue = GetValue(moduleAttributesDB[MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_DURATION]); bActiveModule = attrDBValue > 0.0f; } } bool isADC = moduleAttributesDB.ContainsKey(MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ALL_RESONANCES); foreach (MODULE_ATTRIBUTES_DB attrDB in moduleAttributesDB.Keys) { float attrDBValue = GetValue(moduleAttributesDB[attrDB]); switch (attrDB) { case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_POLARIZED: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_POLARIZED, GetActive(false, false, false), 1.0f, 1); break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_EM_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EM_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_THERMAL_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_THERMAL_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_KINETIC_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_KINETIC_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_EXPLOSIVE_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EXPLOSIVE_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_EM_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EM_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_THERMAL_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_THERMAL_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_KINETIC_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_KINETIC_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_EXPLOSIVE_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EXPLOSIVE_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HULL_EM_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_EM_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HULL_THERMAL_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_THERMAL_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HULL_KINETIC_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_KINETIC_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HULL_EXPLOSIVE_RESONANCE: AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_EXPLOSIVE_RESIST, GetActive(false, isADC, bActiveModule), 1.0f - attrDBValue, GetStackingGroup(groupID)); break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_EM_RESIST_BONUS: Debug.Assert(attrDBValue <= 0.0f); if (attrDBValue < 0.0f) { if (groupID == 77 || groupID == 1700) { // active shield resist modules: Invulnerability Fields, Ward Fields, Flex Hardeners Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EM_RESIST); } else if (groupID == 328 || groupID == 1699) { // active armor resist modules Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EM_RESIST); } else if (groupID == 295) { // passive shield resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EM_RESIST); } else if (groupID == 98 || groupID == 326) { // passive armor resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EM_RESIST); } else if (groupID == 774) { // shield rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EM_RESIST); } else if (groupID == 773) { // armor rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EM_RESIST); } else { Console.WriteLine("Unknown EM resist module: {0}, groupID={1}", moduleName, groupID); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_THERMAL_RESIST_BONUS: Debug.Assert(attrDBValue <= 0.0f); if (attrDBValue < 0.0f) { if (groupID == 77 || groupID == 1700) { // active shield resist modules: Invulnerability Fields, Ward Fields, Flex Hardeners Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_THERMAL_RESIST); } else if (groupID == 328 || groupID == 1699) { // active armor resist modules Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_THERMAL_RESIST); } else if (groupID == 295) { // passive shield resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_THERMAL_RESIST); } else if (groupID == 98 || groupID == 326) { // passive armor resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_THERMAL_RESIST); } else if (groupID == 774) { // shield rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_THERMAL_RESIST); } else if (groupID == 773) { // armor rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_THERMAL_RESIST); } else { Console.WriteLine("Unknown THERMAL resist module: {0}, groupID={1}", moduleName, groupID); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_KINETIC_RESIST_BONUS: Debug.Assert(attrDBValue <= 0.0f); if (attrDBValue < 0.0f) { if (groupID == 77 || groupID == 1700) { // active shield resist modules: Invulnerability Fields, Ward Fields, Flex Hardeners Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_KINETIC_RESIST); } else if (groupID == 328 || groupID == 1699) { // active armor resist modules Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_KINETIC_RESIST); } else if (groupID == 295) { // passive shield resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_KINETIC_RESIST); } else if (groupID == 98 || groupID == 326) { // passive armor resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_KINETIC_RESIST); } else if (groupID == 774) { // shield rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_KINETIC_RESIST); } else if (groupID == 773) { // armor rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_KINETIC_RESIST); } else { Console.WriteLine("Unknown KINETIC resist module: {0}, groupID={1}", moduleName, groupID); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_EXPLOSIVE_RESIST_BONUS: Debug.Assert(attrDBValue <= 0.0f); if (attrDBValue < 0.0f) { if (groupID == 77 || groupID == 1700) { // active shield resist modules: Invulnerability Fields, Ward Fields, Flex Hardeners Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EXPLOSIVE_RESIST); } else if (groupID == 328 || groupID == 1699) { // active armor resist modules Debug.Assert(bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, true, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EXPLOSIVE_RESIST); } else if (groupID == 295) { // passive shield resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EXPLOSIVE_RESIST); } else if (groupID == 98 || groupID == 326) { // passive armor resist modules Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, false, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EXPLOSIVE_RESIST); } else if (groupID == 774) { // shield rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EXPLOSIVE_RESIST); } else if (groupID == 773) { // armor rigs Debug.Assert(!bActiveModule); AddResitAttributesWithHeat(ref Attributes, attrDBValue, false, true, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EXPLOSIVE_RESIST); } else { Console.WriteLine("Unknown EM resist module: {0}, groupID={1}", moduleName, groupID); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ALL_RESONANCES: Debug.Assert(bActiveModule == true); Debug.Assert(isADC == true); MODULE_ACTIVE Active = GetActive(true, true, true); Debug.Assert(Active == MODULE_ACTIVE.ASSAULT_ACTIVE); float Resist = 1.0f - attrDBValue; int StackingGroup = GetStackingGroup(groupID); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EM_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_THERMAL_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_KINETIC_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_EXPLOSIVE_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EM_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_THERMAL_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_KINETIC_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_EXPLOSIVE_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_EM_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_THERMAL_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_KINETIC_RESIST, Active, Resist, StackingGroup); AddTo(ref Attributes, MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_EXPLOSIVE_RESIST, Active, Resist, StackingGroup); break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_OVERLOAD_HARDENING_BONUS: { if (attrDBValue > 1.0f) { OverloadBonus = attrDBValue * 0.01f; } } break; // case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_CAPACITY_MULTIPLIER: { // power diagnostic systems, reactor control units, shield flux coils Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue - 1.0f); if (bonus > 0.01f) { // filter out reactor control units, they have shield multiplier = 1 Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_HP_MULTIPLIER: { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue - 1.0f); if (bonus > 0.01f) { // filter out armor resist modules, they have armor multiplier = 1 Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_STRUCTURE_HP_MULTIPLIER: { // bulkheads, expanded cargoholds, nanofibers Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue - 1.0f); if (bonus > 0.01f) { // filter out nanofibers, they have hull multiplier = 1 Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_HP_BONUS_ADD: { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_BONUS_ADD, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_CAPACITY_BONUS: case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_CAPACITY: { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { // filter out shield resist amplifiers, they have shield bonus = 0 Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_BONUS_ADD, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_STRUCTURE_HP_BONUS_ADD: { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_BONUS_ADD, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIELD_CAPACITY_BONUS: if (groupID == 774) // shield rigs only { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { // shield % bonus bonus = 1.0f + 0.01f * bonus; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_ARMOR_HP_BONUS: if (groupID == 773) // armor/hull rigs only { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { // armor % bonus bonus = 1.0f + 0.01f * bonus; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HULL_HP_BONUS: if (groupID == 773) // armor/hull rigs only { Debug.Assert(bActiveModule == false); float bonus = Math.Abs(attrDBValue); if (bonus > 0.01f) { // hull % bonus bonus = 1.0f + 0.01f * bonus; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HULL_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_DRAWBACK: if (Math.Abs(attrDBValue) > 0.0f) { Debug.Assert(bActiveModule == false); float drawback = 0.5f * attrDBValue; // rig drawback can be halved by training appropriate rigging skill drawback = 1.0f + 0.01f * drawback; if ( moduleName.Contains("Inverted Signal Field Projector") || moduleName.Contains("Particle Dispersion Augmentor") || moduleName.Contains("Particle Dispersion Projector") || moduleName.Contains("Targeting Systems Stabilizer") || moduleName.Contains("Tracking Diagnostics Subroutines") || moduleName.Contains("Signal Focusing Kit") || moduleName.Contains("Ionic Field Projector") || moduleName.Contains("Targeting System Subcontroller") ) { Debug.Assert(drawback < 1.0f); Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(drawback, 1) } } ); } else if ( moduleName.Contains("Auxiliary Thrusters") || moduleName.Contains("Cargohold Optimization") || moduleName.Contains("Dynamic Fuel Valve") || moduleName.Contains("Engine Thermal Shielding") || moduleName.Contains("Low Friction Nozzle Joints") || moduleName.Contains("Polycarbon Engine Housing") ) { Debug.Assert(drawback < 1.0f); Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(drawback, 1) } } ); } } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_SHIP_TYPE: ShipTypeID = (int)attrDBValue; break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_HIGH_SLOTS: if (attrDBValue > 0.01f) { Debug.Assert(bActiveModule == false); Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_HIGH_SLOTS, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_MEDIUM_SLOTS: if (attrDBValue > 0.01f) { Debug.Assert(bActiveModule == false); Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_MEDIUM_SLOTS, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } break; case MODULE_ATTRIBUTES_DB.MODULE_ATTR_DB_LOW_SLOTS: if (attrDBValue > 0.01f) { Debug.Assert(bActiveModule == false); Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_LOW_SLOTS, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(attrDBValue, 1) } } ); } break; } } if (ShipTypeID > 0) { IReadOnlyDictionary <MODULE_TRAITS, float> moduleTraits = GetModuleTraits(typeID, conn); float traitShieldHPPercentPerLevel = 0.0f; if (moduleTraits.TryGetValue(MODULE_TRAITS.MODULE_TRAIT_SHIELD_HP_PERCENT_PER_LEVEL, out traitShieldHPPercentPerLevel)) { // shield % bonus Debug.Assert(bActiveModule == false); float bonus = 1.0f + traitShieldHPPercentPerLevel * 0.01f * 5.0f; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } float traitArmorHPPercentPerLevel = 0.0f; if (moduleTraits.TryGetValue(MODULE_TRAITS.MODULE_TRAIT_ARMOR_HP_PERCENT_PER_LEVEL, out traitArmorHPPercentPerLevel)) { // armor % bonus Debug.Assert(bActiveModule == false); float bonus = 1.0f + traitArmorHPPercentPerLevel * 0.01f * 5.0f; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_BONUS_MULTIPLY, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } float traitShieldHardenersOHBonusPerLevel = 0.0f; if (moduleTraits.TryGetValue(MODULE_TRAITS.MODULE_TRAIT_SHIELD_HARDENERS_OVERHEATING_BONUS, out traitShieldHardenersOHBonusPerLevel)) { // shield hardeners overheating bonus Debug.Assert(bActiveModule == false); float bonus = traitShieldHardenersOHBonusPerLevel * 0.01f * 5.0f; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_SHIELD_HARDENERS_OVERLOAD_BONUS, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } float traitArmorHardenersOHBonusPerLevel = 0.0f; if (moduleTraits.TryGetValue(MODULE_TRAITS.MODULE_TRAIT_ARMOR_HARDENERS_OVERHEATING_BONUS, out traitArmorHardenersOHBonusPerLevel)) { // shield hardeners overheating bonus Debug.Assert(bActiveModule == false); float bonus = traitArmorHardenersOHBonusPerLevel * 0.01f * 5.0f; Attributes.Add( MODULE_ATTRIBUTES.MODULE_ATTRIBUTE_ARMOR_HARDENERS_OVERLOAD_BONUS, new Dictionary <MODULE_ACTIVE, Tuple <float, int> > { { GetActive(false, false, false), new Tuple <float, int>(bonus, 1) } } ); } } return(new ModuleDescription( moduleName, typeID, slot, Attributes, OverloadBonus, ShipTypeID )); }