示例#1
0
        private void RefreshDisplayData()
        {
            if (refeshOnce || (BuildingData.lastBuildingID != WorldInfoPanel.GetCurrentInstanceID().Building))
            {
                if (isVisible)
                {
                    BuildingData.lastBuildingID = WorldInfoPanel.GetCurrentInstanceID().Building;
                    Building buildingData           = Singleton <BuildingManager> .instance.m_buildings.m_buffer[BuildingData.lastBuildingID];
                    int      aliveWorkCount         = 0;
                    int      totalWorkCount         = 0;
                    Citizen.BehaviourData behaviour = default;
                    RealCityCommonBuildingAI.InitDelegate();
                    RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)buildingData.Info.m_buildingAI, BuildingData.lastBuildingID, ref buildingData, ref behaviour, ref aliveWorkCount, ref totalWorkCount);
                    int allWorkCount = RealCityResidentAI.TotalWorkCount(BuildingData.lastBuildingID, buildingData, true, false);
                    maintainFeeTips.text = Localization.Get("MAINTAIN_FEE_TIPS");
                    workerStatus.text    = Localization.Get("LOCAL_WORKERS_DIV_TOTAL_WORKERS") + totalWorkCount.ToString() + "/" + allWorkCount.ToString();

                    if (buildingData.Info.m_buildingAI is MarketAI)
                    {
                        fishAmount.text = Localization.Get("MATERIAL_BUFFER") + "/" + Localization.Get("PRODUCTION_BUFFER") + ":" + buildingData.m_customBuffer1.ToString() + "/" + buildingData.m_customBuffer2.ToString();
                        int aliveVisitCount = 0;
                        int totalVisitCount = 0;
                        RealCityMarketAI.InitDelegate();
                        RealCityMarketAI.GetVisitBehaviour((MarketAI)(buildingData.Info.m_buildingAI), BuildingData.lastBuildingID, ref buildingData, ref behaviour, ref aliveVisitCount, ref totalVisitCount);
                        var amount = buildingData.m_customBuffer2 / MainDataStore.maxGoodPurchase - totalVisitCount + aliveVisitCount;
                        fishVisitor.text = string.Format("FORDEBUG" + " [{0}/{1}/{2}]", aliveVisitCount, totalVisitCount, amount);
                    }
                    refeshOnce = false;
                }
                else
                {
                    Hide();
                }
            }
        }
示例#2
0
        public static void ProcessZeroWorker(ushort buildingID, ref Building data)
        {
            if (data.m_flags.IsFlagSet(Building.Flags.Completed))
            {
                int aliveWorkCount = 0;
                int totalWorkCount = 0;
                Citizen.BehaviourData behaviour = default;
                RealCityCommonBuildingAI.InitDelegate();
                RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)data.Info.m_buildingAI, buildingID, ref data, ref behaviour, ref aliveWorkCount, ref totalWorkCount);
                int allWorkCount;
                if (RealCityEconomyExtension.Can16timesUpdate(buildingID))
                {
                    allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, data, true, true);
                }
                else
                {
                    allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, data, true, false);
                }

                if (RealCityEconomyExtension.Can16timesUpdate(buildingID))
                {
                    if (totalWorkCount == 0 && allWorkCount != 0)
                    {
                        int budget = Singleton <EconomyManager> .instance.GetBudget(data.Info.m_class);

                        int   education3Salary = Math.Max((int)((budget * MainDataStore.govermentEducation3SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.8f));
                        float num1             = education3Salary * allWorkCount;
                        Singleton <EconomyManager> .instance.FetchResource((EconomyManager.Resource) 16, (int)num1, data.Info.m_class);

                        MainDataStore.outsideTouristMoney += (num1 * MainDataStore.outsideTouristSalaryProfitRatio);
                    }
                }
            }
        }
示例#3
0
        public int CaculateLandFee(Building building, ushort buildingID)
        {
            DistrictManager instance = Singleton <DistrictManager> .instance;
            byte            district = instance.GetDistrict(building.m_position);

            DistrictPolicies.Services     servicePolicies      = instance.m_districts.m_buffer[district].m_servicePolicies;
            DistrictPolicies.Taxation     taxationPolicies     = instance.m_districts.m_buffer[district].m_taxationPolicies;
            DistrictPolicies.CityPlanning cityPlanningPolicies = instance.m_districts.m_buffer[district].m_cityPlanningPolicies;

            GetLandRent(building, out int landFee);
            float taxRate;

            taxRate = Singleton <EconomyManager> .instance.GetTaxRate(building.Info.m_class, taxationPolicies);

            if (instance.IsPolicyLoaded(DistrictPolicies.Policies.ExtraInsulation))
            {
                if ((servicePolicies & DistrictPolicies.Services.ExtraInsulation) != DistrictPolicies.Services.None)
                {
                    taxRate = taxRate * 95 / 100;
                }
            }
            if ((servicePolicies & DistrictPolicies.Services.Recycling) != DistrictPolicies.Services.None)
            {
                taxRate = taxRate * 95 / 100;
            }

            if (((taxationPolicies & DistrictPolicies.Taxation.DontTaxLeisure) != DistrictPolicies.Taxation.None) && (building.Info.m_class.m_subService == ItemClass.SubService.CommercialLeisure))
            {
                landFee = 0;
            }

            if (BuildingData.buildingMoney[buildingID] > 0)
            {
                if ((building.Info.m_class.m_service == ItemClass.Service.Commercial) || (building.Info.m_class.m_service == ItemClass.Service.Industrial))
                {
                    if (BuildingData.buildingMoney[buildingID] > (taxRate * landFee / 100f))
                    {
                        return((int)(taxRate * landFee / 100f));
                    }
                    else
                    {
                        return(0);
                    }
                }
                else if (building.Info.m_class.m_service == ItemClass.Service.Office)
                {
                    Citizen.BehaviourData behaviourData = default;
                    int aliveWorkerCount = 0;
                    int totalWorkerCount = 0;
                    RealCityCommonBuildingAI.InitDelegate();
                    RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount);
                    return((int)(totalWorkerCount * taxRate / 10f));
                }
            }

            return(0);
        }
        public static void GetLandRentNoOffice(out int landRent, Building building, ushort buildingID)
        {
            ItemClass @class = building.Info.m_class;

            landRent = 0;
            Citizen.BehaviourData behaviourData = default;
            int aliveWorkerCount = 0;
            int totalWorkerCount = 0;

            ItemClass.SubService subService = @class.m_subService;
            RealCityCommonBuildingAI.InitDelegate();
            switch (subService)
            {
            case ItemClass.SubService.OfficeHightech:
                RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount);
                RealCityPrivateBuildingAI.allOfficeHighTechWorkCount += totalWorkerCount;
                break;

            case ItemClass.SubService.OfficeGeneric:
                RealCityCommonBuildingAI.GetWorkBehaviour((OfficeBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount);
                if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                {
                    RealCityPrivateBuildingAI.allOfficeLevel1WorkCount += totalWorkerCount;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                {
                    RealCityPrivateBuildingAI.allOfficeLevel2WorkCount += totalWorkerCount;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level3)
                {
                    RealCityPrivateBuildingAI.allOfficeLevel3WorkCount += totalWorkerCount;
                }
                break;

            case ItemClass.SubService.IndustrialFarming:
                landRent = MainDataStore.induFarm;
                break;

            case ItemClass.SubService.IndustrialForestry:
                landRent = MainDataStore.induForest;
                break;

            case ItemClass.SubService.IndustrialOil:
                landRent = MainDataStore.induOil;
                break;

            case ItemClass.SubService.IndustrialOre:
                landRent = MainDataStore.induOre;
                break;

            case ItemClass.SubService.IndustrialGeneric:
                if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                {
                    landRent = MainDataStore.induGenLevel1;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                {
                    landRent = MainDataStore.induGenLevel2;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level3)
                {
                    landRent = MainDataStore.induGenLevel3;
                }
                break;

            case ItemClass.SubService.CommercialHigh:
                if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                {
                    landRent = MainDataStore.commHighLevel1;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                {
                    landRent = MainDataStore.commHighLevel2;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level3)
                {
                    landRent = MainDataStore.commHighLevel3;
                }
                break;

            case ItemClass.SubService.CommercialLow:
                if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                {
                    landRent = MainDataStore.commLowLevel1;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                {
                    landRent = MainDataStore.commLowLevel2;
                }
                else if (building.Info.m_class.m_level == ItemClass.Level.Level3)
                {
                    landRent = MainDataStore.commLowLevel3;
                }
                break;

            case ItemClass.SubService.CommercialLeisure:
                landRent = MainDataStore.commLeisure;
                break;

            case ItemClass.SubService.CommercialTourist:
                landRent = MainDataStore.commTourist;
                break;

            case ItemClass.SubService.CommercialEco:
                landRent = MainDataStore.commEco;
                break;

            default: break;
            }
        }
        public static void CalculateBuildingMoneyAndSalary(Building building, ushort buildingID)
        {
            if (BuildingData.buildingMoney[buildingID] > MainDataStore.maxBuildingMoneyLimit)
            {
                BuildingData.buildingMoney[buildingID] = MainDataStore.maxBuildingMoneyLimit;
            }
            else if (BuildingData.buildingMoney[buildingID] < -MainDataStore.maxBuildingMoneyLimit)
            {
                BuildingData.buildingMoney[buildingID] = -MainDataStore.maxBuildingMoneyLimit;
            }


            if (building.Info.m_class.m_service == ItemClass.Service.Industrial || building.Info.m_class.m_service == ItemClass.Service.Commercial || building.Info.m_class.m_service == ItemClass.Service.Office)
            {
                Citizen.BehaviourData behaviourData = default;
                int aliveWorkerCount = 0;
                int totalWorkerCount = 0;
                RealCityCommonBuildingAI.InitDelegate();
                RealCityCommonBuildingAI.GetWorkBehaviour((CommonBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount);
                float bossTake       = 0;
                float investToOffice = 0;
                float profitShare    = 0;

                switch (building.Info.m_class.m_subService)
                {
                case ItemClass.SubService.OfficeGeneric:
                case ItemClass.SubService.OfficeHightech:
                    profitShare = 1f; break;

                case ItemClass.SubService.IndustrialFarming:
                case ItemClass.SubService.IndustrialForestry:
                    if (building.Info.m_buildingAI is IndustrialExtractorAI)
                    {
                        bossTake       = MainDataStore.bossRatioInduExtractor;
                        investToOffice = MainDataStore.investRatioInduExtractor;
                        profitShare    = MainDataStore.profitShareRatioInduExtractor;
                    }
                    else
                    {
                        bossTake       = MainDataStore.bossRatioInduOther;
                        investToOffice = MainDataStore.investRatioInduOther;
                        profitShare    = MainDataStore.profitShareRatioInduOther;
                    }
                    break;

                case ItemClass.SubService.IndustrialOil:
                case ItemClass.SubService.IndustrialOre:
                    bossTake       = MainDataStore.bossRatioInduOther;
                    investToOffice = MainDataStore.investRatioInduOther;
                    profitShare    = MainDataStore.profitShareRatioInduOther; break;

                case ItemClass.SubService.IndustrialGeneric:
                    if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                    {
                        bossTake       = MainDataStore.bossRatioInduLevel1;
                        investToOffice = MainDataStore.investRatioInduLevel1;
                        profitShare    = MainDataStore.profitShareRatioInduLevel1;
                    }
                    else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                    {
                        bossTake       = MainDataStore.bossRatioInduLevel2;
                        investToOffice = MainDataStore.investRatioInduLevel2;
                        profitShare    = MainDataStore.profitShareRatioInduLevel2;
                    }
                    else
                    {
                        bossTake       = MainDataStore.bossRatioInduLevel3;
                        investToOffice = MainDataStore.investRatioInduLevel3;
                        profitShare    = MainDataStore.profitShareRatioInduLevel3;
                    }
                    break;

                case ItemClass.SubService.CommercialHigh:
                case ItemClass.SubService.CommercialLow:
                    if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                    {
                        bossTake       = MainDataStore.bossRatioCommLevel1;
                        investToOffice = MainDataStore.investRatioCommLevel1;
                        profitShare    = MainDataStore.profitShareRatioCommLevel1;
                    }
                    else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                    {
                        bossTake       = MainDataStore.bossRatioCommLevel2;
                        investToOffice = MainDataStore.investRatioCommLevel2;
                        profitShare    = MainDataStore.profitShareRatioCommLevel2;
                    }
                    else
                    {
                        bossTake       = MainDataStore.bossRatioCommLevel3;
                        investToOffice = MainDataStore.investRatioCommLevel3;
                        profitShare    = MainDataStore.profitShareRatioCommLevel1;
                    }
                    break;

                case ItemClass.SubService.CommercialTourist:
                    bossTake       = MainDataStore.bossRatioCommTou;
                    investToOffice = MainDataStore.investRatioCommTou;
                    profitShare    = MainDataStore.profitShareRatioCommTou;
                    break;

                case ItemClass.SubService.CommercialLeisure:
                    bossTake       = MainDataStore.bossRatioCommOther;
                    investToOffice = MainDataStore.investRatioCommOther;
                    profitShare    = MainDataStore.profitShareRatioCommOther; break;

                case ItemClass.SubService.CommercialEco:
                    bossTake       = MainDataStore.bossRatioCommECO;
                    investToOffice = MainDataStore.investRatioCommECO;
                    profitShare    = MainDataStore.profitShareRatioCommECO; break;
                }
                // boss take and return to office
                if (BuildingData.buildingMoney[buildingID] > 0)
                {
                    //Reduce Boss fee
                    long investToOfficeFee = (long)(BuildingData.buildingMoney[buildingID] * investToOffice);
                    long bossTakeFee       = (long)(BuildingData.buildingMoney[buildingID] * bossTake);
                    if (building.Info.m_class.m_service == ItemClass.Service.Commercial)
                    {
                        //Commercial have help tourism
                        MainDataStore.outsideTouristMoney += ((bossTakeFee - investToOfficeFee) * MainDataStore.outsideCompanyProfitRatio * MainDataStore.outsideTouristSalaryProfitRatio);
                    }
                    RealCityPrivateBuildingAI.profitBuildingMoney += investToOfficeFee;
                    BuildingData.buildingMoney[buildingID]        -= bossTakeFee;
                }

                if (building.Info.m_class.m_service == ItemClass.Service.Office)
                {
                    float allOfficeWorker     = RealCityPrivateBuildingAI.allOfficeLevel1WorkCountFinal + RealCityPrivateBuildingAI.allOfficeLevel2WorkCountFinal + RealCityPrivateBuildingAI.allOfficeLevel3WorkCountFinal + RealCityPrivateBuildingAI.allOfficeHighTechWorkCountFinal;
                    float averageOfficeSalary = 0;
                    if (allOfficeWorker != 0)
                    {
                        averageOfficeSalary = (RealCityPrivateBuildingAI.profitBuildingMoneyFinal / allOfficeWorker);
                    }

                    if (building.Info.m_class.m_subService == ItemClass.SubService.OfficeGeneric)
                    {
                        if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                        {
                            BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.6f;
                        }
                        else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                        {
                            BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.8f;
                        }
                        else if (building.Info.m_class.m_level == ItemClass.Level.Level3)
                        {
                            BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 1f;
                        }
                    }
                    else if (building.Info.m_class.m_subService == ItemClass.SubService.OfficeHightech)
                    {
                        BuildingData.buildingMoney[buildingID] = averageOfficeSalary * totalWorkerCount * 0.75f;
                    }

                    ProcessLandFeeOffice(building, buildingID, totalWorkerCount);
                }

                //Calculate building salary
                int buildingAsset = (int)(BuildingData.buildingMoney[buildingID] + building.m_customBuffer1 * RealCityIndustryBuildingAI.GetResourcePrice(RealCityPrivateBuildingAI.GetIncomingProductionType(buildingID, building)));
                int salary        = 0;
                if ((buildingAsset > 0) && (totalWorkerCount != 0))
                {
                    salary = (int)(buildingAsset * profitShare / totalWorkerCount);
                    switch (building.Info.m_class.m_subService)
                    {
                    case ItemClass.SubService.IndustrialFarming:
                    case ItemClass.SubService.IndustrialForestry:
                    case ItemClass.SubService.IndustrialOil:
                    case ItemClass.SubService.IndustrialOre:
                        salary = Math.Min(salary, MainDataStore.salaryInduOtherMax); break;

                    case ItemClass.SubService.IndustrialGeneric:
                        if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                        {
                            salary = Math.Min(salary, MainDataStore.salaryInduLevel1Max);
                        }
                        else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                        {
                            salary = Math.Min(salary, MainDataStore.salaryInduLevel2Max);
                        }
                        else
                        {
                            salary = Math.Min(salary, MainDataStore.salaryInduLevel3Max);
                        }
                        break;

                    case ItemClass.SubService.CommercialHigh:
                    case ItemClass.SubService.CommercialLow:
                        if (building.Info.m_class.m_level == ItemClass.Level.Level1)
                        {
                            salary = Math.Min(salary, MainDataStore.salaryCommLevel1Max);
                        }
                        else if (building.Info.m_class.m_level == ItemClass.Level.Level2)
                        {
                            salary = Math.Min(salary, MainDataStore.salaryCommLevel2Max);
                        }
                        else
                        {
                            salary = Math.Min(salary, MainDataStore.salaryCommLevel3Max);
                        }
                        break;

                    case ItemClass.SubService.CommercialTourist:
                        salary = Math.Min(salary, MainDataStore.salaryCommTouMax); break;

                    case ItemClass.SubService.CommercialLeisure:
                        salary = Math.Min(salary, MainDataStore.salaryCommOtherMax); break;

                    case ItemClass.SubService.CommercialEco:
                        salary = Math.Min(salary, MainDataStore.salaryCommECOMax); break;
                    }
                }

                if (salary > 0)
                {
                    BuildingData.buildingWorkCount[buildingID] = salary;
                }
                else
                {
                    BuildingData.buildingWorkCount[buildingID] = 0;
                }
            }
            else
            {
                //resident building
                ItemClass                 @class             = building.Info.m_class;
                int                       incomeAccumulation = 0;
                DistrictManager           instance           = Singleton <DistrictManager> .instance;
                byte                      district           = instance.GetDistrict(building.m_position);
                DistrictPolicies.Taxation taxationPolicies   = instance.m_districts.m_buffer[district].m_taxationPolicies;
                if (@class.m_subService == ItemClass.SubService.ResidentialLow)
                {
                    switch (@class.m_level)
                    {
                    case ItemClass.Level.Level1:
                        incomeAccumulation = MainDataStore.residentLowLevel1Rent;
                        break;

                    case ItemClass.Level.Level2:
                        incomeAccumulation = MainDataStore.residentLowLevel2Rent;
                        break;

                    case ItemClass.Level.Level3:
                        incomeAccumulation = MainDataStore.residentLowLevel3Rent;
                        break;

                    case ItemClass.Level.Level4:
                        incomeAccumulation = MainDataStore.residentLowLevel4Rent;
                        break;

                    case ItemClass.Level.Level5:
                        incomeAccumulation = MainDataStore.residentLowLevel5Rent;
                        break;
                    }
                }
                else if (@class.m_subService == ItemClass.SubService.ResidentialLowEco)
                {
                    switch (@class.m_level)
                    {
                    case ItemClass.Level.Level1:
                        incomeAccumulation = MainDataStore.residentLowLevel1Rent;
                        break;

                    case ItemClass.Level.Level2:
                        incomeAccumulation = MainDataStore.residentLowLevel2Rent;
                        break;

                    case ItemClass.Level.Level3:
                        incomeAccumulation = MainDataStore.residentLowLevel3Rent;
                        break;

                    case ItemClass.Level.Level4:
                        incomeAccumulation = MainDataStore.residentLowLevel4Rent;
                        break;

                    case ItemClass.Level.Level5:
                        incomeAccumulation = MainDataStore.residentLowLevel5Rent;
                        break;
                    }
                }
                else if (@class.m_subService == ItemClass.SubService.ResidentialHigh)
                {
                    switch (@class.m_level)
                    {
                    case ItemClass.Level.Level1:
                        incomeAccumulation = MainDataStore.residentHighLevel1Rent;
                        break;

                    case ItemClass.Level.Level2:
                        incomeAccumulation = MainDataStore.residentHighLevel2Rent;
                        break;

                    case ItemClass.Level.Level3:
                        incomeAccumulation = MainDataStore.residentHighLevel3Rent;
                        break;

                    case ItemClass.Level.Level4:
                        incomeAccumulation = MainDataStore.residentHighLevel4Rent;
                        break;

                    case ItemClass.Level.Level5:
                        incomeAccumulation = MainDataStore.residentHighLevel5Rent;
                        break;
                    }
                }
                else
                {
                    switch (@class.m_level)
                    {
                    case ItemClass.Level.Level1:
                        incomeAccumulation = MainDataStore.residentHighLevel1Rent;
                        break;

                    case ItemClass.Level.Level2:
                        incomeAccumulation = MainDataStore.residentHighLevel2Rent;
                        break;

                    case ItemClass.Level.Level3:
                        incomeAccumulation = MainDataStore.residentHighLevel3Rent;
                        break;

                    case ItemClass.Level.Level4:
                        incomeAccumulation = MainDataStore.residentHighLevel4Rent;
                        break;

                    case ItemClass.Level.Level5:
                        incomeAccumulation = MainDataStore.residentHighLevel5Rent;
                        break;
                    }
                }
                int num2;
                num2 = Singleton <EconomyManager> .instance.GetTaxRate(@class, taxationPolicies);

                incomeAccumulation = (int)((num2 * incomeAccumulation) / 100f);
                BuildingData.buildingWorkCount[buildingID] = incomeAccumulation;
            }
        }