static DamageAnalysis()
 {
     using (var service = new FittingService())
     {
         ALL_V_CHARACTER = service.GetAllVCharacter();
         _hobgoblin = service.CreateItem("Hobgoblin II");
         _hammerhead = service.CreateItem("Hammerhead II");
         _ogre = service.CreateItem("Ogre II");
     }
 }
 public void Init()
 {
     _service = new FittingService();
 }
        public static DamageOutput.WeaponEntry GetDamageEntry(Context context, Item item)
        {
            WeaponSystem weaponSystem;
            if (!TryGetWeaponSystem(item, out weaponSystem))
            {
                throw new ArgumentException("invalid item group for weapon analysis: " + item.GroupId);
            }

            List<DamageOutput.WeaponEntry.AmmoEntry> ammoEntries = new List<DamageOutput.WeaponEntry.AmmoEntry>();

            if (!IsNeedingAmmo(weaponSystem))
            {
                ammoEntries.Add(
                                new DamageOutput.WeaponEntry.AmmoEntry
                                {
                                    Ammunition = "(none)",
                                    Damage = GetDamage(item, item),
                                    OptimalInKm = item.GetAttributeById(OPTIMAL_ID)
                                                      .Value / 1000.0,
                                    FalloffInKm = item.GetAttributeById(FALLOFF_ID)
                                                      .Value / 1000.0,
                                    TrackingInRadPerSecond = item.GetAttributeById(TRACKING_ID)
                                        .Value
                                });
            }
            else
            {
                //TODO create service/DI
                using (var service = new FittingService())
                {
                    var ammo = new Ammo(service);

                    var factionAmmo = ammo.GetFactionAmmoForWeapon(item);
                    if (factionAmmo != null)
                    {
                        var factionEntry = GetAmmoEntry(context, item, factionAmmo);
                        ammoEntries.Add(factionEntry);
                    }

                    var t2Range = ammo.GetLongRangeT2AmmoForWeapon(item);
                    if (t2Range != null)
                    {
                        var t2RangeEntry = GetAmmoEntry(context, item, t2Range);
                        ammoEntries.Add(t2RangeEntry);
                    }

                    var t2Dps = ammo.GetHighDamageT2AmmoForWeapon(item);
                    if (t2Dps != null)
                    {
                        var t2DpsEntry = GetAmmoEntry(context, item, t2Dps);
                        ammoEntries.Add(t2DpsEntry);
                    }
                }
            }

            return new DamageOutput.WeaponEntry
                   {
                       AmmoEntries = ammoEntries.ToArray(),
                       WeaponSystem = weaponSystem,
                       WeaponType = item.TypeName
                   };
        }
        public Ammo(FittingService service)
        {
            IDictionary<ChargeSize, Item> factionHybridAmmo = new Dictionary<ChargeSize, Item>
                                                              {
                                                                  {
                                                                      ChargeSize.Small,
                                                                      service.CreateItem("Federation Navy Antimatter Charge S")
                                                                  },
                                                                  {
                                                                      ChargeSize.Medium,
                                                                      service.CreateItem("Federation Navy Antimatter Charge M")
                                                                  },
                                                                  {
                                                                      ChargeSize.Large,
                                                                      service.CreateItem("Federation Navy Antimatter Charge L")
                                                                  },
                                                                  {ChargeSize.XLarge, service.CreateItem("Antimatter Charge XL")}
                                                              };

            IDictionary<ChargeSize, Item> factionEnergyAmmo = new Dictionary<ChargeSize, Item>
                                                              {
                                                                  {ChargeSize.Small, service.CreateItem("Imperial Navy Multifrequency S")},
                                                                  {ChargeSize.Medium, service.CreateItem("Imperial Navy Multifrequency M")},
                                                                  {ChargeSize.Large, service.CreateItem("Imperial Navy Multifrequency L")},
                                                                  {ChargeSize.XLarge, service.CreateItem("Multifrequency XL")}
                                                              };

            IDictionary<ChargeSize, Item> factionProjectileAmmo = new Dictionary<ChargeSize, Item>
                                                                  {
                                                                      {ChargeSize.Small, service.CreateItem("Republic Fleet EMP S")},
                                                                      {ChargeSize.Medium, service.CreateItem("Republic Fleet EMP M")},
                                                                      {ChargeSize.Large, service.CreateItem("Republic Fleet EMP L")},
                                                                      {ChargeSize.XLarge, service.CreateItem("EMP XL")}
                                                                  };

            _factionAmmoTypesByWeaponType = new Dictionary<int, IDictionary<ChargeSize, Item>>
                                            {
                                                {HYBRID_WEAPON_GROUP_ID, factionHybridAmmo},
                                                {ENERGY_WEAPON_GROUP_ID, factionEnergyAmmo},
                                                {PROJECTILE_WEAPON_GROUP_ID, factionProjectileAmmo},
                                                {
                                                    LIGHT_MISSILE_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                                   {
                                                                                       {
                                                                                           ChargeSize.NoSize,
                                                                                           service.CreateItem(
                                                                                                              "Caldari Navy Inferno Light Missile")
                                                                                       }
                                                                                   }
                                                },
                                                {
                                                    HEAVY_MISSILE_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                                   {
                                                                                       {
                                                                                           ChargeSize.NoSize,
                                                                                           service.CreateItem(
                                                                                                              "Caldari Navy Inferno Heavy Missile")
                                                                                       }
                                                                                   }
                                                },
                                                {
                                                    HEAVY_ASSAULT_MISSILE_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                                           {
                                                                                               {
                                                                                                   ChargeSize.NoSize,
                                                                                                   service.CreateItem(
                                                                                                                      "Caldari Navy Inferno Heavy Assault Missile")
                                                                                               }
                                                                                           }
                                                },
                                                {
                                                    ROCKET_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                            {
                                                                                {
                                                                                    ChargeSize.NoSize,
                                                                                    service.CreateItem("Caldari Navy Inferno Rocket")
                                                                                }
                                                                            }
                                                },
                                                {
                                                    RAPID_LIGHT_MISSILE_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                                         {
                                                                                             {
                                                                                                 ChargeSize.NoSize,
                                                                                                 service.CreateItem(
                                                                                                                    "Caldari Navy Inferno Light Missile")
                                                                                             }
                                                                                         }
                                                },
                                                {
                                                    RAPID_HEAVY_MISSILE_WEAPON_GROUP_ID, new Dictionary<ChargeSize, Item>
                                                                                         {
                                                                                             {
                                                                                                 ChargeSize.NoSize,
                                                                                                 service.CreateItem(
                                                                                                                    "Caldari Navy Inferno Heavy Missile")
                                                                                             }
                                                                                         }
                                                },
                                            };

            //TODO torpedo + bomb

            IDictionary<ChargeSize, Item> t2BlasterHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                    {
                                                                        {ChargeSize.Small, service.CreateItem("Void S")},
                                                                        {ChargeSize.Medium, service.CreateItem("Void M")},
                                                                        {ChargeSize.Large, service.CreateItem("Void L")}
                                                                    };

            IDictionary<ChargeSize, Item> t2BlasterRangeAmmo = new Dictionary<ChargeSize, Item>
                                                               {
                                                                   {ChargeSize.Small, service.CreateItem("Null S")},
                                                                   {ChargeSize.Medium, service.CreateItem("Null M")},
                                                                   {ChargeSize.Large, service.CreateItem("Null L")}
                                                               };

            IDictionary<ChargeSize, Item> t2RailgunHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                    {
                                                                        {ChargeSize.Small, service.CreateItem("Spike S")},
                                                                        {ChargeSize.Medium, service.CreateItem("Spike M")},
                                                                        {ChargeSize.Large, service.CreateItem("Spike L")}
                                                                    };

            IDictionary<ChargeSize, Item> t2RailgunRangeAmmo = new Dictionary<ChargeSize, Item>
                                                               {
                                                                   {ChargeSize.Small, service.CreateItem("Javelin S")},
                                                                   {ChargeSize.Medium, service.CreateItem("Javelin M")},
                                                                   {ChargeSize.Large, service.CreateItem("Javelin L")}
                                                               };

            IDictionary<ChargeSize, Item> t2PulseHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                  {
                                                                      {ChargeSize.Small, service.CreateItem("Conflagration S")},
                                                                      {ChargeSize.Medium, service.CreateItem("Conflagration M")},
                                                                      {ChargeSize.Large, service.CreateItem("Conflagration L")}
                                                                  };

            IDictionary<ChargeSize, Item> t2PulseRangeAmmo = new Dictionary<ChargeSize, Item>
                                                             {
                                                                 {ChargeSize.Small, service.CreateItem("Scorch S")},
                                                                 {ChargeSize.Medium, service.CreateItem("Scorch M")},
                                                                 {ChargeSize.Large, service.CreateItem("Scorch L")}
                                                             };

            IDictionary<ChargeSize, Item> t2BeamHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                 {
                                                                     {ChargeSize.Small, service.CreateItem("Gleam S")},
                                                                     {ChargeSize.Medium, service.CreateItem("Gleam M")},
                                                                     {ChargeSize.Large, service.CreateItem("Gleam L")}
                                                                 };

            IDictionary<ChargeSize, Item> t2BeamRangeAmmo = new Dictionary<ChargeSize, Item>
                                                            {
                                                                {ChargeSize.Small, service.CreateItem("Aurora S")},
                                                                {ChargeSize.Medium, service.CreateItem("Aurora M")},
                                                                {ChargeSize.Large, service.CreateItem("Aurora L")}
                                                            };

            IDictionary<ChargeSize, Item> t2ArtilleryHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                      {
                                                                          {ChargeSize.Small, service.CreateItem("Quake S")},
                                                                          {ChargeSize.Medium, service.CreateItem("Quake M")},
                                                                          {ChargeSize.Large, service.CreateItem("Quake L")}
                                                                      };

            IDictionary<ChargeSize, Item> t2ArtilleryRangeAmmo = new Dictionary<ChargeSize, Item>
                                                                 {
                                                                     {ChargeSize.Small, service.CreateItem("Tremor S")},
                                                                     {ChargeSize.Medium, service.CreateItem("Tremor M")},
                                                                     {ChargeSize.Large, service.CreateItem("Tremor L")}
                                                                 };

            IDictionary<ChargeSize, Item> t2AutocannonHighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                                       {
                                                                           {ChargeSize.Small, service.CreateItem("Hail S")},
                                                                           {ChargeSize.Medium, service.CreateItem("Hail M")},
                                                                           {ChargeSize.Large, service.CreateItem("Hail L")}
                                                                       };

            IDictionary<ChargeSize, Item> t2AutocannonRangeAmmo = new Dictionary<ChargeSize, Item>
                                                                  {
                                                                      {ChargeSize.Small, service.CreateItem("Barrage S")},
                                                                      {ChargeSize.Medium, service.CreateItem("Barrage M")},
                                                                      {ChargeSize.Large, service.CreateItem("Barrage L")}
                                                                  };

            _t2Ammo = new Dictionary<int, T2>
                      {
                          {
                              372, new T2
                                   {
                                       HighDamageAmmo = t2AutocannonHighDamageAmmo,
                                       LongRangeAmmo = t2AutocannonRangeAmmo
                                   }
                          },
                          {
                              373, new T2
                                   {
                                       HighDamageAmmo = t2RailgunHighDamageAmmo,
                                       LongRangeAmmo = t2RailgunRangeAmmo
                                   }
                          },
                          {
                              374, new T2
                                   {
                                       HighDamageAmmo = t2BeamHighDamageAmmo,
                                       LongRangeAmmo = t2BeamRangeAmmo
                                   }
                          },
                          {
                              375, new T2
                                   {
                                       HighDamageAmmo = t2PulseHighDamageAmmo,
                                       LongRangeAmmo = t2PulseRangeAmmo
                                   }
                          },
                          {
                              376, new T2
                                   {
                                       HighDamageAmmo = t2ArtilleryHighDamageAmmo,
                                       LongRangeAmmo = t2ArtilleryRangeAmmo
                                   }
                          },
                          {
                              377, new T2
                                   {
                                       HighDamageAmmo = t2BlasterHighDamageAmmo,
                                       LongRangeAmmo = t2BlasterRangeAmmo
                                   }
                          },
                          {
                              653, new T2
                                   {
                                       HighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                        {
                                                            {ChargeSize.NoSize, service.CreateItem("Inferno Fury Light Missile")},
                                                        },
                                       LongRangeAmmo = new Dictionary<ChargeSize, Item>
                                                       {
                                                           {ChargeSize.NoSize, service.CreateItem("Inferno Precision Light Missile")},
                                                       }
                                   }
                          },
                          {
                              648, new T2
                                   {
                                       HighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                        {
                                                            {ChargeSize.NoSize, service.CreateItem("Inferno Rage Rocket")},
                                                        },
                                       LongRangeAmmo = new Dictionary<ChargeSize, Item>
                                                       {
                                                           {ChargeSize.NoSize, service.CreateItem("Inferno Javelin Rocket")},
                                                       }
                                   }
                          },
                          {
                              655, new T2
                                   {
                                       HighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                        {
                                                            {ChargeSize.NoSize, service.CreateItem("Inferno Fury Heavy Missile")},
                                                        },
                                       LongRangeAmmo = new Dictionary<ChargeSize, Item>
                                                       {
                                                           {ChargeSize.NoSize, service.CreateItem("Inferno Precision Heavy Missile")},
                                                       }
                                   }
                          },
                          {
                              654, new T2
                                   {
                                       HighDamageAmmo = new Dictionary<ChargeSize, Item>
                                                        {
                                                            {ChargeSize.NoSize, service.CreateItem("Inferno Rage Heavy Assault Missile")},
                                                        },
                                       LongRangeAmmo = new Dictionary<ChargeSize, Item>
                                                       {
                                                           {ChargeSize.NoSize, service.CreateItem("Inferno Javelin Heavy Assault Missile")},
                                                       }
                                   }
                          }
                      };
        }