Exemple #1
0
 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");
     }
 }
Exemple #2
0
 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);
 }
Exemple #3
0
        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
                       ));
        }