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(); } } }
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); } } } }
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; } }