public static float GetComsumptionDivider(Building data, ushort buildingID) { Citizen.BehaviourData behaviourData = default; int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.GetWorkBehaviour((CommonBuildingAI)data.Info.m_buildingAI, buildingID, ref data, ref behaviourData, ref aliveWorkerCount, ref totalWorkerCount); float comsumptionDivider = aliveWorkerCount / 8f; if (comsumptionDivider < 1f) { comsumptionDivider = 1f; } if (data.Info.m_class.m_service == ItemClass.Service.Industrial) { RealCityIndustrialBuildingAI.InitDelegate(); var incomingTransferReason = RealCityIndustrialBuildingAI.GetIncomingTransferReason((IndustrialBuildingAI)data.Info.m_buildingAI, buildingID); //petrol related if (incomingTransferReason == TransferManager.TransferReason.Petrol) { //*2 / 4 comsumptionDivider /= 2f; } else if (incomingTransferReason == TransferManager.TransferReason.Coal) { //*1.67 / 4 comsumptionDivider /= 2.4f; } else if (incomingTransferReason == TransferManager.TransferReason.Lumber) { //*1.33 / 4 comsumptionDivider /= 3f; } else if (incomingTransferReason == TransferManager.TransferReason.Food) { comsumptionDivider /= 4f; } } return(comsumptionDivider); }
public static float CaculateEmployeeOutcome(ushort buildingID, Building building) { float allSalary = 0; Citizen.BehaviourData behaviour = default(Citizen.BehaviourData); int aliveWorkerCount = 0; int totalWorkerCount = 0; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((PlayerBuildingAI)building.Info.m_buildingAI, buildingID, ref building, ref behaviour, ref aliveWorkerCount, ref totalWorkerCount); int budget = Singleton <EconomyManager> .instance.GetBudget(building.Info.m_class); int education0Salary = Math.Max((int)((budget * MainDataStore.govermentEducation0SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.5f)); int education1Salary = Math.Max((int)((budget * MainDataStore.govermentEducation1SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.55f)); int education2Salary = Math.Max((int)((budget * MainDataStore.govermentEducation2SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.65f)); int education3Salary = Math.Max((int)((budget * MainDataStore.govermentEducation3SalaryFixed) / 100), (int)(MainDataStore.govermentSalary * 0.8f)); allSalary += behaviour.m_educated0Count * education0Salary; allSalary += behaviour.m_educated1Count * education1Salary; allSalary += behaviour.m_educated2Count * education2Salary; allSalary += behaviour.m_educated3Count * education3Salary; int allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, building, true, false); if (totalWorkerCount > allWorkCount) { allWorkCount = RealCityResidentAI.TotalWorkCount(buildingID, building, true, true); } if ((aliveWorkerCount == 0) && (allWorkCount != 0)) { allSalary = education3Salary * allWorkCount; } float outsideWorkerRatio = (totalWorkerCount != 0) ? (allWorkCount / totalWorkerCount) : 1; return(allSalary * outsideWorkerRatio / 16f); }
public static int ProcessCitizenSalary(uint citizenId, bool checkOnly) { int salary = 0; if (citizenId != 0u) { Citizen.Flags citizenFlag = Singleton <CitizenManager> .instance.m_citizens.m_buffer[citizenId].m_flags; if ((citizenFlag & Citizen.Flags.Student) != Citizen.Flags.None) { return(salary); } ushort workBuilding = Singleton <CitizenManager> .instance.m_citizens.m_buffer[citizenId].m_workBuilding; if (workBuilding != 0u) { Building buildingData = Singleton <BuildingManager> .instance.m_buildings.m_buffer[workBuilding]; if (!IsGoverment(workBuilding)) { salary = BuildingData.buildingWorkCount[workBuilding]; if (!checkOnly) { if (buildingData.Info.m_class.m_service != ItemClass.Service.Office) { BuildingData.buildingMoney[workBuilding] -= salary; } } } else { //Goverment int aliveWorkCount = 0; int totalWorkCount = 0; Citizen.BehaviourData behaviour = default; RealCityCommonBuildingAI.InitDelegate(); RealCityCommonBuildingAI.GetWorkBehaviour((CommonBuildingAI)buildingData.Info.m_buildingAI, workBuilding, ref buildingData, ref behaviour, ref aliveWorkCount, ref totalWorkCount); int salaryMax = 0; switch (Singleton <CitizenManager> .instance.m_citizens.m_buffer[citizenId].EducationLevel) { case Citizen.Education.Uneducated: salaryMax = (int)(MainDataStore.govermentSalary * 0.5); salary = MainDataStore.govermentEducation0SalaryFixed; break; case Citizen.Education.OneSchool: salaryMax = (int)(MainDataStore.govermentSalary * 0.55); salary = MainDataStore.govermentEducation1SalaryFixed; break; case Citizen.Education.TwoSchools: salaryMax = (int)(MainDataStore.govermentSalary * 0.65); salary = MainDataStore.govermentEducation2SalaryFixed; break; case Citizen.Education.ThreeSchools: salaryMax = (int)(MainDataStore.govermentSalary * 0.8); salary = MainDataStore.govermentEducation3SalaryFixed; break; } int allWorkCount = 0; //Update to see if there is building workplace change. //If a building have 10 workers and have 100 workplacecount, we assume that the other 90 vitual workers are from outside //Which will give addition cost allWorkCount = TotalWorkCount(workBuilding, buildingData, false, false); if (totalWorkCount > allWorkCount) { Singleton <CitizenManager> .instance.m_citizens.m_buffer[citizenId].SetWorkplace(citizenId, 0, 0u); } float vitualWorkersRatio = (totalWorkCount != 0) ? (allWorkCount / (float)totalWorkCount) : 1f; //Budget offset for Salary int budget = Singleton <EconomyManager> .instance.GetBudget(buildingData.Info.m_class); salary = (int)(salary * budget / 100f); salary = Math.Max(salary, salaryMax); #if Debug DebugLog.LogToFileOnly("DebugInfo: LandPrice offset for Salary is " + landPriceOffset.ToString()); #endif salary = UniqueFacultyAI.IncreaseByBonus(UniqueFacultyAI.FacultyBonus.Science, salary); if (!checkOnly) { var m_class = Singleton <BuildingManager> .instance.m_buildings.m_buffer[workBuilding].Info.m_class; Singleton <EconomyManager> .instance.FetchResource((EconomyManager.Resource) 16, (int)(salary * vitualWorkersRatio), m_class); MainDataStore.outsideTouristMoney += (salary * (vitualWorkersRatio - 1f) * MainDataStore.outsideTouristSalaryProfitRatio); } } } } return(salary); } //public