private void LookForTradePartner(Civilization civ, string resource, string planetID) { PlanetData needyPlanet = HelperFunctions.DataRetrivalFunctions.GetPlanet(planetID); SortedList sortedPlanetDistList = new SortedList(); // create the sorted list foreach (PlanetData pData in needyPlanet.System.Province.PlanetList) { if (pData.ID != planetID && pData.IsInhabited) { float dist = HelperFunctions.Formulas.MeasureDistanceBetweenSystems(needyPlanet.System, pData.System); while (sortedPlanetDistList.ContainsKey(dist)) { dist += .001f; } sortedPlanetDistList.Add(dist, pData); } } // now check for general ability to create agreement (distance, starbase, support level of viceroy) foreach (DictionaryEntry de in sortedPlanetDistList) { PlanetData exportPlanet = (PlanetData)de.Value; // cast? if (exportPlanet.IsTradeAgreementValid(needyPlanet, resource)) // check for food agreement (is there enough food to send?) { TradeAgreement newTrade = new TradeAgreement(); newTrade.ExportPlanetID = exportPlanet.ID; newTrade.Status = TradeAgreement.eAgreementStatus.Active; newTrade.ImportPlanetID = needyPlanet.ID; switch (resource) { case "food": { if (exportPlanet.FoodExportAvailable >= Math.Abs(needyPlanet.FoodDifference)) { newTrade.FoodSent = Math.Abs(needyPlanet.FoodDifference); } else if (exportPlanet.FoodExportAvailable > 0) { newTrade.FoodSent = exportPlanet.FoodExportAvailable; } else { newTrade.FoodSent = 0; // no food avail, error check } if (newTrade.FoodSent >= exportPlanet.StarbaseCapacityRemaining) { newTrade.FoodSent = exportPlanet.StarbaseCapacityRemaining; } break; } case "energy": { if (exportPlanet.EnergyExportAvailable >= Math.Abs(needyPlanet.EnergyDifference)) { newTrade.EnergySent = Math.Abs(needyPlanet.EnergyDifference); } else if (exportPlanet.EnergyExportAvailable > 0) { newTrade.EnergySent = exportPlanet.EnergyExportAvailable; } else { newTrade.EnergySent = 0; } if (newTrade.EnergySent >= exportPlanet.StarbaseCapacityRemaining) { newTrade.EnergySent = exportPlanet.StarbaseCapacityRemaining; } break; } case "alpha": { if (exportPlanet.AlphaExportAvailable >= Math.Abs(needyPlanet.AlphaPreProductionDifference)) { newTrade.AlphaSent = Math.Abs(needyPlanet.AlphaPreProductionDifference); } else if (exportPlanet.AlphaExportAvailable > 0) { newTrade.AlphaSent = exportPlanet.AlphaExportAvailable; } else { newTrade.AlphaSent = 0; } if (newTrade.AlphaSent >= exportPlanet.StarbaseCapacityRemaining) { newTrade.AlphaSent = exportPlanet.StarbaseCapacityRemaining; } break; } case "heavy": { if (exportPlanet.HeavyExportAvailable >= Math.Abs(needyPlanet.HeavyPreProductionDifference)) { newTrade.HeavySent = Math.Abs(needyPlanet.HeavyPreProductionDifference); } else if (exportPlanet.HeavyExportAvailable > 0) { newTrade.HeavySent = exportPlanet.HeavyExportAvailable; } else { newTrade.HeavySent = 0; } if (newTrade.HeavySent >= exportPlanet.StarbaseCapacityRemaining) { newTrade.HeavySent = exportPlanet.StarbaseCapacityRemaining; } break; } case "rare": { if (exportPlanet.RareExportAvailable >= Math.Abs(needyPlanet.RarePreProductionDifference)) { newTrade.RareSent = Math.Abs(needyPlanet.RarePreProductionDifference); } else if (exportPlanet.RareExportAvailable > 0) { newTrade.RareSent = exportPlanet.RareExportAvailable; } else { newTrade.RareSent = 0; } //starbase capacity check if (newTrade.RareSent >= exportPlanet.StarbaseCapacityRemaining) { newTrade.RareSent = exportPlanet.StarbaseCapacityRemaining; } break; } default: break; } if (newTrade.TotalSent >= 0.01) // minimum threshold amount for trades, also check for capacity of the trade { Debug.Log("Trade of " + newTrade.TotalSent.ToString("N2") + " " + resource + " to " + newTrade.ImportPlanet.Name + " from " + newTrade.ExportPlanet.Name + " over " + newTrade.Distance.ToString("N1") + " LY for $" + newTrade.Cost.ToString("N2") + " with a " + newTrade.CostModifier.ToString("N1") + " modifier."); gDataRef.ActiveTradeAgreements.Add(newTrade); // add the new agreement } // update the trade info for each planet UpdatePlanetTradeInfo(needyPlanet); UpdatePlanetTradeInfo(exportPlanet); } } }