private void ManageSpecialFactions(int index, bool volcanic, ref FIDS fids, ref FIDS requiredfids)
 {
     if (base.Context.Configuration.Empires[index].Name == "AffinityBrokenLords")
     {
         fids.Food = 0;
         return;
     }
     if (base.Context.Configuration.Empires[index].Name == "AffinityReplicants")
     {
         fids.Science = 0;
         return;
     }
     if (volcanic && base.Context.Configuration.Empires[index].Name == "AffinityNecrophages")
     {
         fids.Food         = 0;
         requiredfids.Food = 0;
     }
 }
 public override void Execute(object context)
 {
     base.Execute(context);
     for (int i = 0; i < base.Context.EmpiresCount; i++)
     {
         Diagnostics.Log("ELCP====================================================================================");
         Diagnostics.Log(string.Format("ELCP: Empire {2} {0}, spawn {1}", base.Context.Configuration.Empires[i].Name, base.Context.SpawnPointsDefault[i], i));
         short  key    = base.Context.SpawnRegions[i];
         Region region = base.Context.Regions[key];
         HexPos center = base.Context.SpawnPointsDefault[i];
         Dictionary <string, HashSet <HexPos> > dictionary = new Dictionary <string, HashSet <HexPos> >();
         DiskPicker <HexPos> diskPicker = new DiskPicker <HexPos>(new GridBasedGraph(base.Context.Grid, region.Hexes))
         {
             Center = center,
             Radius = 2
         };
         diskPicker.Execute();
         FIDS fids = default(FIDS);
         foreach (HexPos hex in diskPicker.DiskNodes)
         {
             fids += base.Context.GetTerrainFIDS(hex);
             fids += base.Context.GetAnomalyFIDS(hex);
         }
         FIDS fids2 = default(FIDS);
         if (base.Context.Settings.FactionFIDS.ContainsKey(base.Context.Configuration.Empires[i].Name))
         {
             fids2 = base.Context.Settings.FactionFIDS[base.Context.Configuration.Empires[i].Name];
         }
         else if (base.Context.Settings.FactionFIDS.ContainsKey("Default"))
         {
             fids2 = base.Context.Settings.FactionFIDS["Default"];
         }
         this.ManageSpecialFactions(i, region.Biome.IsVolcanic, ref fids, ref fids2);
         Diagnostics.Log(string.Format("ELCP: base FIDS at location {0}, minus min FIDS of {1} = {2}", fids, fids2, fids - fids2));
         int totalValue = fids2.GetTotalValue();
         fids -= fids2;
         bool flag = false;
         foreach (HexPos hexPos in diskPicker.DiskNodes)
         {
             if (!flag)
             {
                 string text = base.Context.AnomalyMap[hexPos.Row, hexPos.Column];
                 if (text != null && base.Context.Settings.AnomalyFIDS.ContainsKey(text))
                 {
                     flag = true;
                 }
             }
             if (base.Context.POIValidityMap[hexPos.Row, hexPos.Column] == WorldGeneratorContext.POIValidity.Free || base.Context.POIValidityMap[hexPos.Row, hexPos.Column] == WorldGeneratorContext.POIValidity.Excluded)
             {
                 string name = base.Context.GetTerrain(hexPos).Name;
                 if (base.Context.Settings.AnomalyWeightsPerTerrain.ContainsKey(name))
                 {
                     foreach (string text2 in base.Context.Settings.AnomalyWeightsPerTerrain[name].Keys)
                     {
                         if (!base.Context.Settings.UniqueAnomaliesQuantities.ContainsKey(text2) && base.Context.Settings.AnomalyFIDS.ContainsKey(text2) && (!base.Context.HasRiver[hexPos.Row, hexPos.Column] || !base.Context.Settings.NoRiverHexAnomalies.Contains(text2)))
                         {
                             if (!dictionary.ContainsKey(text2))
                             {
                                 dictionary.Add(text2, new HashSet <HexPos>());
                             }
                             dictionary[text2].Add(hexPos);
                         }
                     }
                 }
             }
         }
         if (!flag && !fids.HasAnyNegative)
         {
             Diagnostics.Log(string.Format("ELCP: !!! no Anomaly around, spawning at least one !!!", Array.Empty <object>()));
             while (!fids.HasAnyNegative)
             {
                 fids.Minus(1);
                 this.ManageSpecialFactions(i, region.Biome.IsVolcanic, ref fids, ref fids2);
             }
         }
         bool flag2 = base.Context.Settings.GlobalAnomalyMultiplier > 0;
         while (fids.HasAnyNegative && flag2)
         {
             Diagnostics.Log(string.Format("ELCP: starting improvement pass at {0}", fids));
             if (fids.GetTotalValue() - fids.Negativity > totalValue && flag)
             {
                 Diagnostics.Log("ELCP: --- Aborting due to too high FISD ---");
                 break;
             }
             string text3 = null;
             int    num   = fids.Negativity;
             foreach (string text4 in dictionary.Keys)
             {
                 if (dictionary[text4].Count > 0)
                 {
                     int negativity = (fids + base.Context.Settings.AnomalyFIDS[text4]).Negativity;
                     if (num > negativity)
                     {
                         text3 = text4;
                         num   = negativity;
                     }
                 }
             }
             if (text3 != null)
             {
                 HexPos hexPos2 = dictionary[text3].ToList <HexPos>().ElementAt(0);
                 if (!base.Context.Anomalies.ContainsKey(text3))
                 {
                     base.Context.Anomalies.Add(text3, new List <HexPos>());
                 }
                 Diagnostics.Log(string.Format("ELCP: adding {0} to {1}", text3, hexPos2));
                 base.Context.Anomalies[text3].Add(hexPos2);
                 base.Context.AnomalyMap[hexPos2.Row, hexPos2.Column]     = text3;
                 base.Context.POIValidityMap[hexPos2.Row, hexPos2.Column] = WorldGeneratorContext.POIValidity.Impossible;
                 fids += base.Context.Settings.AnomalyFIDS[text3];
                 this.ManageSpecialFactions(i, region.Biome.IsVolcanic, ref fids, ref fids2);
                 flag = true;
                 Diagnostics.Log(string.Format("ELCP: fisd is now {0}, negative {1}", fids, fids.HasAnyNegative));
                 using (Dictionary <string, HashSet <HexPos> > .KeyCollection.Enumerator enumerator4 = dictionary.Keys.GetEnumerator())
                 {
                     while (enumerator4.MoveNext())
                     {
                         string key2 = enumerator4.Current;
                         if (dictionary[key2].Contains(hexPos2))
                         {
                             dictionary[key2].Remove(hexPos2);
                         }
                     }
                     continue;
                 }
             }
             flag2 = false;
             base.Trace("Unable to improve spawn");
         }
         Diagnostics.Log("ELCP====================================================================================");
     }
 }