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 "";
 }