private void ExecutePopulationBuyout()
    {
        if (!DepartmentOfTheInterior.CanBuyoutPopulation(this.aiEntityCity.City))
        {
            return;
        }
        List <EvaluableMessage_PopulationBuyout> list = new List <EvaluableMessage_PopulationBuyout>(this.aiEntityCity.Blackboard.GetMessages <EvaluableMessage_PopulationBuyout>(BlackboardLayerID.City, (EvaluableMessage_PopulationBuyout message) => message.CityGuid == this.aiEntityCity.City.GUID));

        if (list.Count == 0)
        {
            return;
        }
        if (list.Count > 1)
        {
            AILayer.LogWarning("There should not be several PopulationBuyout EvaluableMessages for the same city ({0})", new object[]
            {
                this.aiEntityCity.City
            });
        }
        EvaluableMessage_PopulationBuyout evaluableMessage_PopulationBuyout = list[0];

        Diagnostics.Log("ELCP {0}/{1} ExecutePopulationBuyout {2}", new object[]
        {
            this.Empire,
            this.aiEntityCity.City,
            evaluableMessage_PopulationBuyout.EvaluationState
        });
        if (evaluableMessage_PopulationBuyout.EvaluationState == EvaluableMessage.EvaluableMessageState.Validate)
        {
            AIScheduler.Services.GetService <ISynchronousJobRepositoryAIHelper>().RegisterSynchronousJob(new SynchronousJob(this.SynchronousJob_BuyoutPopulation));
        }
    }
    private void BuyOutPopulation_TicketRaised(object sender, TicketRaisedEventArgs e)
    {
        List <EvaluableMessage_PopulationBuyout> list = new List <EvaluableMessage_PopulationBuyout>(this.aiEntityCity.Blackboard.GetMessages <EvaluableMessage_PopulationBuyout>(BlackboardLayerID.City, (EvaluableMessage_PopulationBuyout message) => message.CityGuid == this.aiEntityCity.City.GUID));

        if (list.Count == 0)
        {
            return;
        }
        if (list.Count > 1)
        {
            AILayer.LogWarning("There should not be several PopulationBuyout EvaluableMessages for the same city");
        }
        EvaluableMessage_PopulationBuyout evaluableMessage_PopulationBuyout = list[0];

        if (e.Result == PostOrderResponse.Processed)
        {
            evaluableMessage_PopulationBuyout.SetObtained();
        }
        else
        {
            evaluableMessage_PopulationBuyout.SetFailedToObtain();
        }
    }
    private void GeneratePopulationBuyoutMessage()
    {
        if (!DepartmentOfTheInterior.CanBuyoutPopulation(this.aiEntityCity.City))
        {
            return;
        }
        this.GeneratePopulationBuyoutMessage_ELCPGlobalPopulationInfo();
        List <EvaluableMessage_PopulationBuyout> list = new List <EvaluableMessage_PopulationBuyout>(this.aiEntityCity.Blackboard.GetMessages <EvaluableMessage_PopulationBuyout>(BlackboardLayerID.City, (EvaluableMessage_PopulationBuyout message) => message.CityGuid == this.aiEntityCity.City.GUID && message.EvaluationState != EvaluableMessage.EvaluableMessageState.Obtained && message.EvaluationState != EvaluableMessage.EvaluableMessageState.Cancel));
        EvaluableMessage_PopulationBuyout        evaluableMessage_PopulationBuyout;

        if (list.Count == 0)
        {
            evaluableMessage_PopulationBuyout = new EvaluableMessage_PopulationBuyout(this.aiEntityCity.City.GUID, 1, AILayer_AccountManager.EconomyAccountName);
            this.aiEntityCity.Blackboard.AddMessage(evaluableMessage_PopulationBuyout);
        }
        else
        {
            evaluableMessage_PopulationBuyout = list[0];
        }
        float num = 0f;

        for (int i = 0; i < AILayer_Population.GainPerPopulation.Length; i++)
        {
            num += this.aiEntityCity.City.GetPropertyValue(AILayer_Population.GainPerPopulation[i]);
        }
        float num2          = num / AILayer_Population.GlobalPopulationInfos[this.Empire.Index].bestGainPerPop * 0.5f;
        float propertyValue = this.aiEntityCity.City.GetPropertyValue(SimulationProperties.Population);

        if (propertyValue == AILayer_Population.GlobalPopulationInfos[this.Empire.Index].lowestPopulation)
        {
            num2 = AILayer.Boost(num2, 0.2f);
        }
        float populationBuyOutCost = DepartmentOfTheTreasury.GetPopulationBuyOutCost(this.aiEntityCity.City);
        float num3;

        if (!this.departmentOfTheTreasury.TryGetResourceStockValue(base.AIEntity.Empire.SimulationObject, DepartmentOfTheTreasury.Resources.EmpireMoney, out num3, false))
        {
            num3 = 1f;
        }
        float num4 = (num3 - populationBuyOutCost) / num3 / 0.8f;

        if (this.departmentOfForeignAffairs.IsInWarWithSomeone())
        {
            num4 -= 0.05f;
        }
        num2 = AILayer.Boost(num2, num4);
        ConstructionQueue constructionQueue = this.departmentOfIndustry.GetConstructionQueue(this.aiEntityCity.City);

        if (propertyValue > 1f)
        {
            for (int j = constructionQueue.Length - 1; j >= 0; j--)
            {
                if (constructionQueue.PeekAt(j).ConstructibleElementName.ToString().Contains("Settler"))
                {
                    num2 = AILayer.Boost(num2, -1f);
                    break;
                }
            }
        }
        Diagnostics.Log("ELCP {0}/{1} GeneratePopulationBuyoutMessage score: {2}, cost: {3}", new object[]
        {
            this.Empire,
            this.aiEntityCity.City.LocalizedName,
            num2,
            populationBuyOutCost
        });
        evaluableMessage_PopulationBuyout.Refresh(1f, num2, populationBuyOutCost, int.MaxValue);
    }