private int ComputeGlobalNumberOfSites(PointOfInterestTemplate poiTemplate) { int num; if (!int.TryParse(poiTemplate.GetPropertyValue("NormalQuantity"), out num)) { num = 1; } else if (num == 0) { return(0); } num *= this.AbundanceFactor * this.MapSizeFactor * this.CompetitionFactor; num /= 1000000; base.Trace(string.Format("{1} : normal number of sites : {0}", num, poiTemplate.GetPropertyValue("ResourceName"))); if (base.Context.OceanicResourceCounts.ContainsKey(poiTemplate.GetPropertyValue("ResourceName"))) { int num2 = base.Context.OceanicResourceCounts[poiTemplate.GetPropertyValue("ResourceName")]; if (!base.Context.Settings.XephiStrategic) { base.Trace(string.Format("removing {0} sites already moved to oceans", num2)); num -= num2; } } if (num < 1) { num = 1; } return(num); }
private void PickResourceSite(PointOfInterestTemplate poiTemplate, List <PointOfInterestDefinition> createdPOIs, List <HexPos> availableSpots) { bool flag = false; int num = 20; string propertyValue = poiTemplate.GetPropertyValue("ResourceName"); do { num--; HexPos hexPos = availableSpots.First <HexPos>(); availableSpots.RemoveAt(0); Region region = base.Context.Regions[base.Context.RegionData[hexPos.Row, hexPos.Column]]; PointOfInterestDefinition pointOfInterestDefinition = this.MakeNewPOI(hexPos, poiTemplate, 1); this.Influence.AddSpot(hexPos); if (pointOfInterestDefinition != null) { createdPOIs.Add(pointOfInterestDefinition); Dictionary <int, int> dictionary = this.CreatedSites[propertyValue]; int landMassIndex = region.LandMassIndex; int num2 = dictionary[landMassIndex]; dictionary[landMassIndex] = num2 + 1; region.Resources.Add(pointOfInterestDefinition); flag = true; } }while (!flag && num > 0 && availableSpots.Count > 0); }
private void AssignLuxuryTypes(Dictionary <string, List <PointOfInterestTemplate> > availableLuxuries) { Random random = new Random(World.Seed); foreach (DepartmentOfScience.ConstructibleElement constructibleElement in this.technologyDatabase) { if (constructibleElement.TechnologyFlags == DepartmentOfScience.ConstructibleElement.TechnologyFlag.KaijuUnlock) { KaijuTechnologyDefinition kaijuTechnologyDefinition = constructibleElement as KaijuTechnologyDefinition; KaijuUnlockCost kaijuUnlockCost = kaijuTechnologyDefinition.KaijuUnlockCost; if (kaijuUnlockCost != null) { List <PointOfInterestTemplate> list = new List <PointOfInterestTemplate>(); list.AddRange(availableLuxuries[kaijuUnlockCost.LuxuryTier]); if (kaijuUnlockCost.LuxuryTier != "Tier3" && availableLuxuries[kaijuUnlockCost.LuxuryTier].Count <= 2) { list.AddRange((!(kaijuUnlockCost.LuxuryTier == "Tier1")) ? availableLuxuries["Tier1"] : availableLuxuries["Tier2"]); } PointOfInterestTemplate pointOfInterestTemplate = list[random.Next(list.Count)]; string empty = string.Empty; if (pointOfInterestTemplate.Properties.TryGetValue("ResourceName", out empty)) { kaijuTechnologyDefinition.SetKaijuUnlockCostResourceName(empty); } } } } }
private void ComputeTameCosts(global::Game game) { System.Random random = new System.Random(World.Seed); IDatabase <ArmyAction> database = Databases.GetDatabase <ArmyAction>(false); Diagnostics.Assert(database != null); Dictionary <string, List <PointOfInterestTemplate> > dictionary = KaijuTechsManager.ComputeLuxuryAbundance(game); for (int i = 0; i < database.Count <ArmyAction>(); i++) { ArmyAction armyAction = database.ElementAt(i); if (armyAction is IArmyActionWithKaijuTameCost) { KaijuTameCost tameCost = (armyAction as IArmyActionWithKaijuTameCost).TameCost; for (int j = 0; j < tameCost.CostDefinitions.Length; j++) { KaijuTameCost.CostDefinition costDefinition = tameCost.CostDefinitions[j]; List <PointOfInterestTemplate> list = new List <PointOfInterestTemplate>(); list.AddRange(dictionary[costDefinition.LuxuryTier]); PointOfInterestTemplate pointOfInterestTemplate = list[random.Next(list.Count)]; string empty = string.Empty; if (pointOfInterestTemplate.Properties.TryGetValue("ResourceName", out empty)) { costDefinition.SetResourceName(empty); } } } } }
public static int EstimatedGlobalNumberOfSites(WorldGeneratorContext context, WorldGeneratorSettings.AlgorithmParameters parameters, PointOfInterestTemplate poiTemplate) { int value = parameters.GetValue("MapSizeSensitivity"); int value2 = parameters.GetValue("EmpireCountSensitivity"); int strategicResourcesAbundancePercent = context.Settings.StrategicResourcesAbundancePercent; if (strategicResourcesAbundancePercent <= 0) { return(0); } int num = (from d in context.Districts.Values where d.Content == District.Contents.Land select d).Sum((District d) => d.Count) / 20; int num2 = (num - 100) * value / 100; num = 100 + num2; int num3 = context.EmpiresCount * 25; num2 = (num3 - 100) * value2 / 100; num3 = 100 + num2; int num4; if (!int.TryParse(poiTemplate.GetPropertyValue("NormalQuantity"), out num4)) { num4 = 1; } else if (num4 == 0) { return(0); } num4 *= strategicResourcesAbundancePercent * num * num3; num4 /= 1000000; if (context.OceanicResourceCounts != null && context.OceanicResourceCounts.ContainsKey(poiTemplate.GetPropertyValue("ResourceName"))) { int num5 = context.OceanicResourceCounts[poiTemplate.GetPropertyValue("ResourceName")]; num4 -= num5; } return(num4); }
public override void Execute(object context) { base.Silent = false; base.Execute(context); base.UsedTemplates = new List <PointOfInterestTemplate>(from poiTemplate in base.Context.Settings.POITemplates.Values where poiTemplate.GetPropertyValue("Type") == "ResourceDeposit" where poiTemplate.GetPropertyValue("ResourceType") == "Strategic" where poiTemplate.HasProperty("StrategicTier") where poiTemplate.HasProperty("NormalQuantity") where poiTemplate.HasProperty("ResourceName") select poiTemplate); new List <PointOfInterestTemplate>(from poiT in base.UsedTemplates where poiT.GetPropertyValue("StrategicTier") == "Tier1" select poiT); if (base.UsedTemplates.Count < 1) { base.Trace("No valid POI template found"); base.Trace("Algorithm bypassed"); return; } this.Influence = new InfluenceMap(base.Context.Grid); this.Sensitivity_MapSize = base.Parameters.GetValue("MapSizeSensitivity"); this.Sensitivity_EmpireCount = base.Parameters.GetValue("EmpireCountSensitivity"); this.AbundanceFactor = base.Context.Settings.StrategicResourcesAbundancePercent; if (this.AbundanceFactor <= 0) { return; } this.MapSizeFactor = (from d in base.Context.Districts.Values where d.Content == District.Contents.Land select d).Sum((District d) => d.Count) / 20; int num = (this.MapSizeFactor - 100) * this.Sensitivity_MapSize / 100; this.MapSizeFactor = 100 + num; this.CompetitionFactor = base.Context.EmpiresCount * 25; num = (this.CompetitionFactor - 100) * this.Sensitivity_EmpireCount / 100; this.CompetitionFactor = 100 + num; this.ProcessRules(); foreach (PointOfInterestTemplate pointOfInterestTemplate in base.UsedTemplates) { string propertyValue = pointOfInterestTemplate.GetPropertyValue("ResourceName"); List <PointOfInterestDefinition> list = new List <PointOfInterestDefinition>(); int num2 = this.ComputeGlobalNumberOfSites(pointOfInterestTemplate) + this.ExtraneousSiteCount[pointOfInterestTemplate.GetPropertyValue("ResourceName")]; int num3 = this.MinSites[propertyValue].Values.Sum(); if (num2 < num3) { num2 = num3; } base.Trace(string.Format("{0} : {1} sites", pointOfInterestTemplate.GetPropertyValue("ResourceName"), num2)); int i = 0; List <HexPos> list2 = new List <HexPos>(); while (i < num2) { list2.Clear(); HashSet <int> closedContinents = new HashSet <int>(); for (int j = 1; j <= base.Context.Settings.LandMasses; j++) { if (this.CreatedSites[propertyValue][j] >= this.MaxSites[propertyValue][j]) { closedContinents.Add(j); } } list2 = new List <HexPos>(from region in base.Context.Regions.Values where !closedContinents.Contains(region.LandMassIndex) && region.Resources.Count < this.Context.Settings.MaxResourcesPerRegion + region.Biome.BonusResourceLimit from district in region.Districts where district.Content == District.Contents.Land from hex in district where base.Context.POIValidityMap[hex.Row, hex.Column] == WorldGeneratorContext.POIValidity.Free orderby this.Influence.GetMinDistance(hex) descending select hex); if (this.MinSites[propertyValue].Values.Any((int q) => q > 0)) { int continent = 0; int num4 = 0; foreach (int num5 in this.MinSites[propertyValue].Keys) { if (num4 < this.MinSites[propertyValue][num5] - this.CreatedSites[propertyValue][num5]) { continent = num5; num4 = this.MinSites[propertyValue][num5] - this.CreatedSites[propertyValue][num5]; } } if (num4 > 0) { List <HexPos> list3 = new List <HexPos>(from region in base.Context.Regions.Values where region.LandMassIndex == continent && region.Resources.Count < this.Context.Settings.MaxResourcesPerRegion + region.Biome.BonusResourceLimit from district in region.Districts where district.Content == District.Contents.Land from hex in district where base.Context.POIValidityMap[hex.Row, hex.Column] == WorldGeneratorContext.POIValidity.Free orderby this.Influence.GetMinDistance(hex) descending select hex); if (list3.Count > 0) { list2 = list3; } } } if (list2.Count != 0) { this.PickResourceSite(pointOfInterestTemplate, list, list2); } i++; } foreach (PointOfInterestDefinition pointOfInterestDefinition in list) { base.Trace(string.Format("POI {0} in {1}", pointOfInterestDefinition.TemplateName, base.Context.GetDistrict(pointOfInterestDefinition.Position).MotherRegion.LandMassIndex)); } } if (base.Context.Configuration.IsDLCAvailable("SummerFlamesPack")) { List <PointOfInterestDefinition> list4 = new List <PointOfInterestDefinition>(); Region[] array = (from region in base.Context.Regions.Values where region.Biome.BonusResourceLimit != 0 && region.Resources.Count <= base.Context.Settings.MaxResourcesPerRegion + region.Biome.BonusResourceLimit select region).ToArray <Region>(); Random random = new Random(base.Context.Settings.Seed); int k = 0; while (k < array.Length) { base.Trace(string.Format("Adding bonus POI to {0}", array[k].Name)); List <HexPos> list5 = new List <HexPos>(from district in array[k].Districts where district.Content == District.Contents.Land from hex in district where base.Context.POIValidityMap[hex.Row, hex.Column] == WorldGeneratorContext.POIValidity.Free orderby this.Influence.GetMinDistance(hex) descending select hex); if (list5.Count <= 0 || random.NextDouble() >= (double)array[k].Biome.BonusResourceChance) { goto IL_909; } PointOfInterestTemplate poiTemplate3 = base.UsedTemplates[random.Next(base.UsedTemplates.Count)]; this.PickResourceSite(poiTemplate3, list4, list5); if (array[k].Resources.Count < base.Context.Settings.MaxResourcesPerRegion + array[k].Biome.BonusResourceLimit && list5.Count != 0) { goto IL_909; } IL_957: k++; continue; IL_909: if (list5.Count > 0 && random.NextDouble() < (double)array[k].Biome.BonusResourceChance) { PointOfInterestTemplate poiTemplate2 = base.UsedTemplates[random.Next(base.UsedTemplates.Count)]; this.PickResourceSite(poiTemplate2, list4, list5); goto IL_957; } goto IL_957; } foreach (PointOfInterestDefinition pointOfInterestDefinition2 in list4) { base.Trace(string.Format("Bonus POI {0} in {1}", pointOfInterestDefinition2.TemplateName, base.Context.GetDistrict(pointOfInterestDefinition2.Position).MotherRegion.Name)); } } base.Silent = true; }
private void Client_TurnBegin_RecalculateELCPTameResource() { if (this.ELCPTameCostCooldown < 1) { return; } int num = (this.gameService.Game as global::Game).Turn + 1; int num2 = num % this.ELCPTameCostCooldown; if (num2 != 0 && this.eLCPResourceName != StaticString.Empty) { return; } num -= num2; System.Random random = new System.Random(World.Seed + base.Empire.Index * base.Empire.Index * base.Empire.Index * base.Empire.Index * base.Empire.Index + num * num); int maxEraNumber = DepartmentOfScience.GetMaxEraNumber(); KaijuTameCost kaijuTameCost = KaijuCouncil.GetKaijuTameCost(); Dictionary <string, List <PointOfInterestTemplate> > dictionary = KaijuTechsManager.ComputeLuxuryAbundance(this.gameService.Game as global::Game); List <PointOfInterestTemplate> list = new List <PointOfInterestTemplate>(); List <string> list2 = new List <string>(); for (int i = 0; i < kaijuTameCost.CostDefinitions.Length; i++) { KaijuTameCost.CostDefinition costDefinition = kaijuTameCost.CostDefinitions[i]; if (!list2.Contains(costDefinition.LuxuryTier)) { string[] array = costDefinition.EraNumber.Split(new char[] { ',' }); bool flag = false; for (int j = 0; j < array.Length; j++) { int num3 = 0; if (int.TryParse(array[j], out num3) && num3 <= maxEraNumber) { flag = true; break; } } if (flag) { list.AddRange(dictionary[costDefinition.LuxuryTier]); list2.Add(costDefinition.LuxuryTier); } } } PointOfInterestTemplate pointOfInterestTemplate = list[random.Next(list.Count)]; string empty = string.Empty; if (pointOfInterestTemplate.Properties.TryGetValue("ResourceName", out empty)) { Diagnostics.Log("ELCP {0} Client_TurnBegin_RecalculateELCPTameResource rolled Resource {1} instead of {2}", new object[] { base.Empire.Index.ToString() + "/" + this.KaijuEmpire.KaijuFaction.LocalizedName, empty, kaijuTameCost.ResourceName }); this.eLCPResourceName = new StaticString(empty); } }
private void GetPointOfInterests() { this.customRandomizationGroups = new Dictionary <int, List <int> >(); this.randomAnomalyPositions = new List <HexPos>(); TerrainTransformation transform = base.Context.Settings.Transformations.Find((TerrainTransformation t) => t.Name == "Volcano"); bool flag = base.Context.Configuration.IsDLCAvailable("SummerFlamesPack"); bool flag2 = base.Context.Configuration.IsDLCAvailable("NavalPack"); for (int i = 0; i < base.Context.Grid.Columns; i++) { for (int j = 0; j < base.Context.Grid.Rows; j++) { if (this.tmxPointOfInterestLayer.Data[j, i] != 0) { HexPos hexPos = new HexPos(i, j); bool flag3 = false; string tileProperty = base.Context.Settings.TmxMap.GetTileProperty(this.tmxPointOfInterestLayer.Data[hexPos.Row, hexPos.Column], "Values"); string poiName; if (!string.IsNullOrEmpty(tileProperty)) { poiName = this.GetPointOfInterest_CustomRandomization(hexPos, tileProperty); } else { poiName = base.Context.Settings.TmxMap.GetTileProperty(this.tmxPointOfInterestLayer.Data[j, i], ImportTmxPointOfInterestLayer.poiTypeNameProperty); } if (string.IsNullOrEmpty(poiName)) { base.ReportTmx(string.Concat(new object[] { "?MissingPropertyTile&$Coordinate=", i, ",", j - base.Context.Grid.Rows + 1, "&$MissingProperty=", ImportTmxPointOfInterestLayer.poiTypeNameProperty })); } else { if (poiName.Contains("Facility")) { if (poiName == ImportTmxPointOfInterestLayer.randomFacilityName) { string[] array = (from template in base.Context.Settings.POITemplates.Values select template.Name into name where name.Contains("Facility") select name).ToArray <string>(); poiName = array[this.random.Next(array.Length)]; } bool flag4 = false; for (int k = 0; k < 6; k++) { HexPos hexPos2 = hexPos.Neighbour((HexPos.Direction)k); if (hexPos2.Row >= 0 && hexPos2.Row <= base.Context.Settings.Height && hexPos2.Column >= 0 && hexPos2.Column <= base.Context.Settings.Width && this.tmxPointOfInterestLayer.Data[hexPos2.Row, hexPos2.Column] != 0) { string tileProperty2 = base.Context.Settings.TmxMap.GetTileProperty(this.tmxPointOfInterestLayer.Data[hexPos2.Row, hexPos2.Column], ImportTmxPointOfInterestLayer.poiTypeNameProperty); if (!string.IsNullOrEmpty(tileProperty2) && tileProperty2.Contains("Citadel")) { if (flag4) { base.ReportTmx(string.Concat(new object[] { "?CitadelIncorrectPosition&$Coordinate=", hexPos2.Column, ",", hexPos2.Row - base.Context.Grid.Rows + 1 })); throw new TmxImportException(); } flag4 = true; } } } if (!flag4) { goto IL_9F7; } flag3 = true; } if (poiName.Contains("Citadel")) { if (poiName == ImportTmxPointOfInterestLayer.randomCitadelName) { string[] array2 = (from template in base.Context.Settings.POITemplates.Values select template.Name into name where name.Contains("Citadel") select name).ToArray <string>(); poiName = array2[this.random.Next(array2.Length)]; } flag3 = true; } flag3 |= poiName.Contains("NavalQuestLocation_SunkenRuin"); Terrain terrain = base.Context.GetTerrain(hexPos); if ((!flag3 && terrain.IsWaterTile) || terrain.Name.Contains("Waste")) { base.ReportTmx(string.Concat(new object[] { "?POIIncompatibleTerrain&$Coordinate=", hexPos.Column, ",", hexPos.Row - base.Context.Grid.Rows + 1 })); } else if (flag3 && !terrain.IsWaterTile) { base.ReportTmx(string.Concat(new object[] { "?POIIncompatibleTerrain&$Coordinate=", hexPos.Column, ",", hexPos.Row - base.Context.Grid.Rows + 1 })); } else if (poiName == "Ridge") { this.ridgesHexes.Add(hexPos); } else if (poiName == "Volcano") { this.ridgesHexes.Add(hexPos); if (flag) { base.Context.ApplyTransformation(transform, hexPos); } } else { if (poiName.Contains("Anomaly")) { if (poiName == ImportTmxPointOfInterestLayer.randomAnomalyName) { this.randomAnomalyPositions.Add(hexPos); } else if (base.Context.Anomalies.Keys.Contains(poiName)) { if (!base.Context.Anomalies[poiName].Contains(hexPos)) { base.Context.Anomalies[poiName].Add(hexPos); } } else { base.Context.Anomalies.Add(poiName, new List <HexPos>()); base.Context.Anomalies[poiName].Add(hexPos); } } if (poiName.Contains("Village")) { if (poiName == ImportTmxPointOfInterestLayer.randomMinorFactionVillage) { string[] array3 = (from template in base.Context.Settings.POITemplates.Values select template.Name into name where name.Contains("Village_") select name).ToArray <string>(); poiName = array3[this.random.Next(array3.Length)]; } short key = base.Context.RegionData[j, i]; Region region = base.Context.Regions[key]; if (region == null || poiName.Split(new char[] { '_' }).Count <string>() < 2) { goto IL_9F7; } Region region2 = region; int villages = region2.Villages; region2.Villages = villages + 1; if (string.IsNullOrEmpty(region.MinorFactionName)) { region.MinorFactionName = poiName.Split(new char[] { '_' })[1]; } else { poiName = "Village_" + region.MinorFactionName; } } if (poiName == ImportTmxPointOfInterestLayer.randomStrategicResourceDepositName) { string[] array4 = (from template in base.Context.Settings.POITemplates.Values select template.Name into name where name.Contains("ResourceDeposit_Strategic") select name).ToArray <string>(); poiName = array4[this.random.Next(array4.Length)]; } if (poiName == ImportTmxPointOfInterestLayer.randomLuxuryResourceDepositName) { string[] array5 = (from template in base.Context.Settings.POITemplates.Values select template.Name into name where name.Contains("ResourceDeposit_Luxury") select name).ToArray <string>(); poiName = array5[this.random.Next(array5.Length)]; } PointOfInterestTemplate pointOfInterestTemplate = base.Context.Settings.POITemplates.Values.FirstOrDefault((PointOfInterestTemplate template) => template.Name == poiName); if (!flag2 && (poiName.Contains("Facility") || poiName.Contains("Citadel") || poiName.Contains("NavalQuestLocation_SunkenRuin"))) { pointOfInterestTemplate = null; } if (pointOfInterestTemplate != null) { if (poiName.Contains("ResourceDeposit")) { short key2 = base.Context.RegionData[j, i]; Region region3 = base.Context.Regions[key2]; if (region3 != null) { region3.Resources.Add(new PointOfInterestDefinition { Position = new HexPos(i, j), TemplateName = pointOfInterestTemplate.Name }); } } base.Context.POIDefinitions.Add(new PointOfInterestDefinition { Position = new HexPos(i, j), TemplateName = pointOfInterestTemplate.Name }); } } } } IL_9F7 :; } } this.customRandomizationGroups.Clear(); }