public string AnalyzeOffer(Offer ToUs, Offer FromUs, Empire them, Offer.Attitude attitude) { if (ToUs.Alliance) { if (!ToUs.IsBlank() || !FromUs.IsBlank()) { return "OFFER_ALLIANCE_TOO_COMPLICATED"; } if (this.empire.GetRelations()[them].Trust < 90f || this.empire.GetRelations()[them].TotalAnger >= 20f || this.empire.GetRelations()[them].TurnsKnown <= 100) { return "AI_ALLIANCE_REJECT"; } this.SetAlliance(true, them); return "AI_ALLIANCE_ACCEPT"; } if (ToUs.PeaceTreaty) { GSAI.PeaceAnswer answer = this.AnalyzePeaceOffer(ToUs, FromUs, them, attitude); if (!answer.peace) { return answer.answer; } this.AcceptOffer(ToUs, FromUs, this.empire, them); this.empire.GetRelations()[them].Treaty_Peace = true; this.empire.GetRelations()[them].PeaceTurnsRemaining = 100; them.GetRelations()[this.empire].Treaty_Peace = true; them.GetRelations()[this.empire].PeaceTurnsRemaining = 100; return answer.answer; } Empire us = this.empire; float TotalTrustRequiredFromUS = 0f; DTrait dt = us.data.DiplomaticPersonality; if (FromUs.TradeTreaty) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS + (float)dt.Trade; } if (FromUs.OpenBorders) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS + ((float)dt.NAPact + 7.5f); } if (FromUs.NAPact) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS + (float)dt.NAPact; int numWars = 0; foreach (KeyValuePair<Empire, Ship_Game.Gameplay.Relationship> Relationship in us.GetRelations()) { if (Relationship.Key.isFaction || !Relationship.Value.AtWar) { continue; } numWars++; } if (numWars > 0 && !us.GetRelations()[them].AtWar) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS - (float)dt.NAPact; } else if (us.GetRelations()[them].Threat >= 20f) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS - (float)dt.NAPact; } } foreach (string tech in FromUs.TechnologiesOffered) { TotalTrustRequiredFromUS = TotalTrustRequiredFromUS + ResourceManager.TechTree[tech].Cost / 50f; } float ValueFromUs = 0f; float ValueToUs = 0f; if (FromUs.OpenBorders) { ValueFromUs = ValueFromUs + 5f; } if (ToUs.OpenBorders) { ValueToUs = ValueToUs + 0.01f; } if (FromUs.NAPact) { ValueFromUs = ValueFromUs + 5f; } if (ToUs.NAPact) { ValueToUs = ValueToUs + 5f; } if (FromUs.TradeTreaty) { ValueFromUs = ValueFromUs + 5f; } if (ToUs.TradeTreaty) { ValueToUs = ValueToUs + 5f; if ((double)this.empire.EstimateIncomeAtTaxRate(0.5f) < 1) { ValueToUs = ValueToUs + 20f; } } foreach (string tech in FromUs.TechnologiesOffered) { ValueFromUs = ValueFromUs + (us.data.EconomicPersonality.Name == "Technologists" ? ResourceManager.TechTree[tech].Cost / 50f * 0.25f + ResourceManager.TechTree[tech].Cost / 50f : ResourceManager.TechTree[tech].Cost / 50f); } foreach (string artifactsOffered in FromUs.ArtifactsOffered) { ValueFromUs = ValueFromUs + 15f; } foreach (string str in ToUs.ArtifactsOffered) { ValueToUs = ValueToUs + 15f; } foreach (string tech in ToUs.TechnologiesOffered) { ValueToUs = ValueToUs + (us.data.EconomicPersonality.Name == "Technologists" ? ResourceManager.TechTree[tech].Cost / 50f * 0.25f + ResourceManager.TechTree[tech].Cost / 50f : ResourceManager.TechTree[tech].Cost / 50f); } if (us.GetPlanets().Count - FromUs.ColoniesOffered.Count + ToUs.ColoniesOffered.Count < 1) { us.GetRelations()[them].DamageRelationship(us, them, "Insulted", 25f, null); return "OfferResponse_Reject_Insulting"; } foreach (string planetName in FromUs.ColoniesOffered) { foreach (Planet p in us.GetPlanets()) { if (p.Name != planetName) { continue; } float value = p.Population / 1000f + p.FoodHere / 25f + p.ProductionHere / 25f + p.Fertility + p.MineralRichness + p.MaxPopulation / 1000f; foreach (Building b in p.BuildingList) { value = value + b.Cost / 25f; if (b.Name != "Capital City") { continue; } value = value + 100f; } float multiplier = 0f; foreach (Planet other in p.system.PlanetList) { if (other.Owner != p.Owner) { continue; } multiplier = multiplier + 1.25f; } value = value * multiplier; if (value < 15f) { value = 15f; } ValueFromUs = ValueFromUs + (us.data.EconomicPersonality.Name == "Expansionists" ? value + value : value + 0.5f * value); } } foreach (string planetName in ToUs.ColoniesOffered) { foreach (Planet p in them.GetPlanets()) { if (p.Name != planetName) { continue; } float value = p.Population / 1000f + p.FoodHere / 50f + p.ProductionHere / 50f + p.Fertility + p.MineralRichness + p.MaxPopulation / 2000f; foreach (Building b in p.BuildingList) { value = value + b.Cost / 50f; } int multiplier = 1; foreach (Planet other in p.system.PlanetList) { if (other.Owner != p.Owner) { continue; } multiplier++; } value = value * (float)multiplier; ValueToUs = ValueToUs + (us.data.EconomicPersonality.Name == "Expansionists" ? value * 0.5f + value : value); } } ValueToUs = ValueToUs + them.data.Traits.DiplomacyMod * ValueToUs; if (ValueFromUs == 0f && ValueToUs > 0f) { us.GetRelations()[them].ImproveRelations(ValueToUs, ValueToUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Gift"; } ValueToUs = ValueToUs - ValueToUs * us.GetRelations()[them].TotalAnger / 100f; float offerdifferential = ValueToUs / (ValueFromUs + 0.01f); string OfferQuality = ""; if (offerdifferential < 0.6f) { OfferQuality = "Insulting"; } else if (offerdifferential < 0.9f && offerdifferential >= 0.6f) { OfferQuality = "Poor"; } else if (offerdifferential >= 0.9f && offerdifferential < 1.1f) { OfferQuality = "Fair"; } else if ((double)offerdifferential >= 1.1 && (double)offerdifferential < 1.45) { OfferQuality = "Good"; } else if (offerdifferential >= 1.45f) { OfferQuality = "Great"; } if (ValueToUs == ValueFromUs) { OfferQuality = "Fair"; } switch (attitude) { case Offer.Attitude.Pleading: { if (TotalTrustRequiredFromUS > us.GetRelations()[them].Trust) { if (OfferQuality != "Great") { return "OfferResponse_InsufficientTrust"; } us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_AcceptGreatOffer_LowTrust"; } if (offerdifferential < 0.6f) { OfferQuality = "Insulting"; } else if (offerdifferential < 0.8f && offerdifferential > 0.65f) { OfferQuality = "Poor"; } else if (offerdifferential >= 0.8f && offerdifferential < 1.1f) { OfferQuality = "Fair"; } else if ((double)offerdifferential >= 1.1 && (double)offerdifferential < 1.45) { OfferQuality = "Good"; } else if (offerdifferential >= 1.45f) { OfferQuality = "Great"; } if (OfferQuality == "Poor") { return "OfferResponse_Reject_PoorOffer_EnoughTrust"; } if (OfferQuality == "Insulting") { us.GetRelations()[them].DamageRelationship(us, them, "Insulted", ValueFromUs - ValueToUs, null); return "OfferResponse_Reject_Insulting"; } if (OfferQuality == "Fair") { us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Fair_Pleading"; } if (OfferQuality == "Good") { us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Good"; } if (OfferQuality != "Great") { break; } us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Great"; } case Offer.Attitude.Respectful: { if (TotalTrustRequiredFromUS + us.GetRelations()[them].TrustUsed <= us.GetRelations()[them].Trust) { if (OfferQuality == "Poor") { return "OfferResponse_Reject_PoorOffer_EnoughTrust"; } if (OfferQuality == "Insulting") { us.GetRelations()[them].DamageRelationship(us, them, "Insulted", ValueFromUs - ValueToUs, null); return "OfferResponse_Reject_Insulting"; } if (OfferQuality == "Fair") { us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Fair"; } if (OfferQuality == "Good") { us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Good"; } if (OfferQuality != "Great") { break; } us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs - ValueFromUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_Accept_Great"; } else { if (OfferQuality == "Great") { us.GetRelations()[them].ImproveRelations(ValueToUs - ValueFromUs, ValueToUs); this.AcceptOffer(ToUs, FromUs, us, them); return "OfferResponse_AcceptGreatOffer_LowTrust"; } if (OfferQuality == "Poor") { return "OfferResponse_Reject_PoorOffer_LowTrust"; } if (OfferQuality == "Fair" || OfferQuality == "Good") { return "OfferResponse_InsufficientTrust"; } if (OfferQuality != "Insulting") { break; } us.GetRelations()[them].DamageRelationship(us, them, "Insulted", ValueFromUs - ValueToUs, null); return "OfferResponse_Reject_Insulting"; } } case Offer.Attitude.Threaten: { if (dt.Name == "Ruthless") { return "OfferResponse_InsufficientFear"; } us.GetRelations()[them].DamageRelationship(us, them, "Insulted", ValueFromUs - ValueToUs, null); if (OfferQuality == "Great") { this.AcceptThreat(ToUs, FromUs, us, them); return "OfferResponse_AcceptGreatOffer_LowTrust"; } if (offerdifferential < 0.95f) { OfferQuality = "Poor"; } else if (offerdifferential >= 0.95f) { OfferQuality = "Fair"; } if (us.GetRelations()[them].Threat <= ValueFromUs || us.GetRelations()[them].FearUsed + ValueFromUs >= us.GetRelations()[them].Threat) { return "OfferResponse_InsufficientFear"; } if (OfferQuality == "Poor") { this.AcceptThreat(ToUs, FromUs, us, them); return "OfferResponse_Accept_Bad_Threatening"; } if (OfferQuality != "Fair") { break; } this.AcceptThreat(ToUs, FromUs, us, them); return "OfferResponse_Accept_Fair_Threatening"; } } return ""; }