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 int CaculateFamilySalary(uint homeid) { int totalSalary = 0; uint citizenID = Singleton <CitizenManager> .instance.m_units.m_buffer[homeid].m_citizen0; if (citizenID != 0) { totalSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = Singleton <CitizenManager> .instance.m_units.m_buffer[homeid].m_citizen1; if (citizenID != 0) { totalSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = Singleton <CitizenManager> .instance.m_units.m_buffer[homeid].m_citizen2; if (citizenID != 0) { totalSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = Singleton <CitizenManager> .instance.m_units.m_buffer[homeid].m_citizen3; if (citizenID != 0) { totalSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = Singleton <CitizenManager> .instance.m_units.m_buffer[homeid].m_citizen4; if (citizenID != 0) { totalSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } return(totalSalary); }
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 override void OnSaveData() { if (Loader.CurrentLoadMode == LoadMode.LoadGame || Loader.CurrentLoadMode == LoadMode.NewGame) { DebugLog.LogToFileOnly("StartSave"); //1 var saveData = new byte[2448]; RealCityEconomyManager.Save(ref saveData); _serializableData.SaveData("RealCity RealCityEconomyManager", saveData); //2 saveData = new byte[131]; MainDataStore.Save(ref saveData); _serializableData.SaveData("RealCity MainDataStore", saveData); //3 saveData = new byte[48]; RealCityResidentAI.Save(ref saveData); _serializableData.SaveData("RealCity RealCityResidentAI", saveData); //4 saveData = new byte[60]; RealCityPrivateBuildingAI.Save(ref saveData); _serializableData.SaveData("RealCity RealCityPrivateBuildingAI", saveData); //5 saveData = new byte[4194304]; CitizenData.Save(ref saveData); _serializableData.SaveData("RealCity CitizenData", saveData); //6 saveData = new byte[58]; Politics.Save(ref saveData); _serializableData.SaveData("RealCity Politics", saveData); //7 saveData = new byte[1536]; TransportLineData.Save(ref saveData); _serializableData.SaveData("RealCity TransportLineData", saveData); //8 saveData = new byte[442368]; BuildingData.Save(ref saveData); _serializableData.SaveData("RealCity BuildingData", saveData); //9 saveData = new byte[196608]; VehicleData.Save(ref saveData); _serializableData.SaveData("RealCity VehicleData", saveData); //10 saveData = new byte[3145728]; CitizenUnitData.Save(ref saveData); _serializableData.SaveData("RealCity CitizenUnitData", saveData); } }
public override void OnLoadData() { Loader.InitData(); DebugLog.LogToFileOnly("StartLoad"); //1 var saveData = _serializableData.LoadData("RealCity RealCityEconomyManager"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity RealCityEconomyManager, please check"); } else { RealCityEconomyManager.Load(ref saveData); } //2 saveData = _serializableData.LoadData("RealCity MainDataStore"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity MainDataStore, please check"); } else { MainDataStore.Load(ref saveData); } //3 saveData = _serializableData.LoadData("RealCity RealCityResidentAI"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity RealCityResidentAI, please check"); } else { RealCityResidentAI.Load(ref saveData); } //4 saveData = _serializableData.LoadData("RealCity RealCityPrivateBuildingAI"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity RealCityPrivateBuildingAI, please check"); } else { RealCityPrivateBuildingAI.Load(ref saveData); } //5 saveData = _serializableData.LoadData("RealCity CitizenData"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity CitizenData, please check"); } else { CitizenData.Load(ref saveData); } //6 saveData = _serializableData.LoadData("RealCity Politics"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity Politics, please check"); } else { Politics.Load(ref saveData); } //7 saveData = _serializableData.LoadData("RealCity TransportLineData"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity TransportLineData, please check"); } else { TransportLineData.Load(ref saveData); } //8 saveData = _serializableData.LoadData("RealCity BuildingData"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity BuildingData, please check"); } else { BuildingData.Load(ref saveData); } //9 saveData = _serializableData.LoadData("RealCity VehicleData"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity VehicleData, please check"); } else { VehicleData.Load(ref saveData); } //10 saveData = _serializableData.LoadData("RealCity CitizenUnitData"); if (saveData == null) { DebugLog.LogToFileOnly("no RealCity CitizenUnitData, please check"); } else { CitizenUnitData.Load(ref saveData); } }
/// <summary> /// 以行业计算对政党的兴趣度 /// </summary> /// <param name="workplaceId"></param> /// <returns></returns> private ushort GetFromSubService(ushort workplaceId) { //默认市民是没有工作的 int choiceIndex = 0; //自定义行业:在政府工作 if (RealCityResidentAI.IsGoverment(workplaceId)) { choiceIndex = 1; } else { ItemClass workplaceItemClass = Singleton <BuildingManager> .instance .m_buildings.m_buffer[workplaceId].Info.m_class; //其他游戏内置行业 switch (workplaceItemClass.m_subService) { case ItemClass.SubService.CommercialLow: case ItemClass.SubService.CommercialHigh: if (workplaceItemClass.m_level == ItemClass.Level.Level1) { choiceIndex = 2; } else if (workplaceItemClass.m_level == ItemClass.Level.Level2) { choiceIndex = 3; } else if (workplaceItemClass.m_level == ItemClass.Level.Level3) { choiceIndex = 4; } break; case ItemClass.SubService.CommercialTourist: case ItemClass.SubService.CommercialLeisure: choiceIndex = 5; break; case ItemClass.SubService.CommercialEco: choiceIndex = 6; break; case ItemClass.SubService.IndustrialGeneric: if (workplaceItemClass.m_level == ItemClass.Level.Level1) { choiceIndex = 7; } else if (workplaceItemClass.m_level == ItemClass.Level.Level2) { choiceIndex = 8; } else if (workplaceItemClass.m_level == ItemClass.Level.Level3) { choiceIndex = 9; } break; case ItemClass.SubService.IndustrialFarming: case ItemClass.SubService.IndustrialForestry: case ItemClass.SubService.IndustrialOil: case ItemClass.SubService.IndustrialOre: choiceIndex = 10; break; case ItemClass.SubService.OfficeGeneric: if (workplaceItemClass.m_level == ItemClass.Level.Level1) { choiceIndex = 11; } else if (workplaceItemClass.m_level == ItemClass.Level.Level2) { choiceIndex = 12; } else if (workplaceItemClass.m_level == ItemClass.Level.Level3) { choiceIndex = 13; } break; case ItemClass.SubService.OfficeHightech: choiceIndex = 14; break; } } return(this.partyInterestData.SubService[choiceIndex]); }
public static void GetVoteChance(uint citizenID, Citizen citizen, uint homeID) { if ((int)Citizen.GetAgeGroup(citizen.m_age) >= 2) { if (Politics.parliamentCount == 1) { Politics.cPartyChance = 0; Politics.gPartyChance = 0; Politics.sPartyChance = 0; Politics.lPartyChance = 0; Politics.nPartyChance = 0; Politics.cPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 0] << 1); Politics.gPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 1] << 1); Politics.sPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 2] << 1); Politics.lPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 3] << 1); Politics.nPartyChance += (ushort)(Politics.education[(int)citizen.EducationLevel, 4] << 1); int idex = 14; if (RealCityResidentAI.IsGoverment(citizen.m_workBuilding)) { idex = 0; } switch (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_subService) { case ItemClass.SubService.CommercialLow: case ItemClass.SubService.CommercialHigh: if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1) { idex = 1; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2) { idex = 2; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3) { idex = 3; } break; case ItemClass.SubService.CommercialTourist: case ItemClass.SubService.CommercialLeisure: idex = 4; break; case ItemClass.SubService.CommercialEco: idex = 5; break; case ItemClass.SubService.IndustrialGeneric: if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1) { idex = 6; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2) { idex = 7; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3) { idex = 8; } break; case ItemClass.SubService.IndustrialFarming: case ItemClass.SubService.IndustrialForestry: case ItemClass.SubService.IndustrialOil: case ItemClass.SubService.IndustrialOre: idex = 9; break; case ItemClass.SubService.OfficeGeneric: if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level1) { idex = 10; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level2) { idex = 11; } else if (Singleton <BuildingManager> .instance.m_buildings.m_buffer[citizen.m_workBuilding].Info.m_class.m_level == ItemClass.Level.Level3) { idex = 12; } break; case ItemClass.SubService.OfficeHightech: idex = 13; break; } if (idex < 0 || idex > 14) { DebugLog.LogToFileOnly($"Error: GetVoteChance workplace idex {idex}"); } Politics.cPartyChance += (ushort)(Politics.workplace[idex, 0] << 1); Politics.gPartyChance += (ushort)(Politics.workplace[idex, 1] << 1); Politics.sPartyChance += (ushort)(Politics.workplace[idex, 2] << 1); Politics.lPartyChance += (ushort)(Politics.workplace[idex, 3] << 1); Politics.nPartyChance += (ushort)(Politics.workplace[idex, 4] << 1); if (CitizenUnitData.familyMoney[homeID] < 5000) { idex = 0; } else if (CitizenUnitData.familyMoney[homeID] >= 20000) { idex = 2; } else { idex = 1; } if (idex < 0 || idex > 3) { DebugLog.LogToFileOnly($"Error: GetVoteChance Invaid money idex = {idex}"); } Politics.cPartyChance += (ushort)(Politics.money[idex, 0] << 1); Politics.gPartyChance += (ushort)(Politics.money[idex, 1] << 1); Politics.sPartyChance += (ushort)(Politics.money[idex, 2] << 1); Politics.lPartyChance += (ushort)(Politics.money[idex, 3] << 1); Politics.nPartyChance += (ushort)(Politics.money[idex, 4] << 1); int temp = 0; temp = (int)Citizen.GetAgeGroup(citizen.m_age) - 2; if (temp < 0) { DebugLog.LogToFileOnly($"Error: GetVoteChance temp = {temp} < 0, GetAgeGroup = {Citizen.GetAgeGroup(citizen.m_age)}"); } Politics.cPartyChance += Politics.age[temp, 0]; Politics.gPartyChance += Politics.age[temp, 1]; Politics.sPartyChance += Politics.age[temp, 2]; Politics.lPartyChance += Politics.age[temp, 3]; Politics.nPartyChance += Politics.age[temp, 4]; temp = (int)Citizen.GetGender(citizenID); Politics.cPartyChance += Politics.gender[temp, 0]; Politics.gPartyChance += Politics.gender[temp, 1]; Politics.sPartyChance += Politics.gender[temp, 2]; Politics.lPartyChance += Politics.gender[temp, 3]; Politics.nPartyChance += Politics.gender[temp, 4]; if (RealCityEconomyExtension.partyTrend == 0) { Politics.cPartyChance += RealCityEconomyExtension.partyTrendStrength; } else if (RealCityEconomyExtension.partyTrend == 1) { Politics.gPartyChance += RealCityEconomyExtension.partyTrendStrength; } else if (RealCityEconomyExtension.partyTrend == 2) { Politics.sPartyChance += RealCityEconomyExtension.partyTrendStrength; } else if (RealCityEconomyExtension.partyTrend == 3) { Politics.lPartyChance += RealCityEconomyExtension.partyTrendStrength; } else if (RealCityEconomyExtension.partyTrend == 4) { Politics.nPartyChance += RealCityEconomyExtension.partyTrendStrength; } else { DebugLog.LogToFileOnly($"Error: GetVoteChance Invalid partyTrend = {RealCityEconomyExtension.partyTrend}"); } GetVoteTickets(); } } }
public static void ProcessFamily(uint homeID, ref CitizenUnit data) { if (RealCityResidentAI.preCitizenId > homeID) { //DebugLog.LogToFileOnly("Another period started"); MainDataStore.familyCount = RealCityResidentAI.familyCount; MainDataStore.citizenCount = RealCityResidentAI.citizenCount; MainDataStore.level2HighWealth = RealCityResidentAI.level2HighWealth; MainDataStore.level3HighWealth = RealCityResidentAI.level3HighWealth; MainDataStore.level1HighWealth = RealCityResidentAI.level1HighWealth; if (RealCityResidentAI.familyCount != 0) { MainDataStore.citizenSalaryPerFamily = ((RealCityResidentAI.citizenSalaryCount / RealCityResidentAI.familyCount)); MainDataStore.citizenExpensePerFamily = ((RealCityResidentAI.citizenExpenseCount / RealCityResidentAI.familyCount)); } MainDataStore.citizenExpense = RealCityResidentAI.citizenExpenseCount; MainDataStore.citizenSalaryTaxTotal = RealCityResidentAI.citizenSalaryTaxTotal; MainDataStore.citizenSalaryTotal = RealCityResidentAI.citizenSalaryCount; if (MainDataStore.familyCount < MainDataStore.familyWeightStableHigh) { MainDataStore.familyWeightStableHigh = (uint)MainDataStore.familyCount; } else { MainDataStore.familyWeightStableHigh = RealCityResidentAI.familyWeightStableHigh; } if (MainDataStore.familyCount < MainDataStore.familyWeightStableLow) { MainDataStore.familyWeightStableLow = (uint)MainDataStore.familyCount; } else { MainDataStore.familyWeightStableLow = RealCityResidentAI.familyWeightStableLow; } RealCityPrivateBuildingAI.profitBuildingMoneyFinal = RealCityPrivateBuildingAI.profitBuildingMoney; RealCityResidentAI.level3HighWealth = 0; RealCityResidentAI.level2HighWealth = 0; RealCityResidentAI.level1HighWealth = 0; RealCityResidentAI.familyCount = 0; RealCityResidentAI.citizenCount = 0; RealCityResidentAI.citizenSalaryCount = 0; RealCityResidentAI.citizenExpenseCount = 0; RealCityResidentAI.citizenSalaryTaxTotal = 0; RealCityResidentAI.tempCitizenSalaryTaxTotal = 0f; RealCityResidentAI.familyWeightStableHigh = 0; RealCityResidentAI.familyWeightStableLow = 0; RealCityPrivateBuildingAI.profitBuildingMoney = 0; } RealCityResidentAI.preCitizenId = homeID; RealCityResidentAI.familyCount++; if (homeID > 524288) { DebugLog.LogToFileOnly("Error: citizen ID greater than 524288"); } //DebugLog.LogToFileOnly($"ProcessCitizen pre family {homeID} moneny {CitizenUnitData.familyMoney[homeID]}"); //ProcessCitizen pre, gather all citizenMoney to familyMoney ProcessCitizen(homeID, ref data, true); //DebugLog.LogToFileOnly($"ProcessCitizen post family {homeID} moneny {CitizenUnitData.familyMoney[homeID]}"); //1.We calculate citizen income int familySalaryCurrent = 0; familySalaryCurrent += RealCityResidentAI.ProcessCitizenSalary(data.m_citizen0, false); familySalaryCurrent += RealCityResidentAI.ProcessCitizenSalary(data.m_citizen1, false); familySalaryCurrent += RealCityResidentAI.ProcessCitizenSalary(data.m_citizen2, false); familySalaryCurrent += RealCityResidentAI.ProcessCitizenSalary(data.m_citizen3, false); familySalaryCurrent += RealCityResidentAI.ProcessCitizenSalary(data.m_citizen4, false); RealCityResidentAI.citizenSalaryCount = RealCityResidentAI.citizenSalaryCount + familySalaryCurrent; if (familySalaryCurrent < 0) { DebugLog.LogToFileOnly("familySalaryCurrent< 0 in ResidentAI"); familySalaryCurrent = 0; } //2.We calculate salary tax float tax = (float)(Politics.residentTax << 1) * familySalaryCurrent / 100f; RealCityResidentAI.tempCitizenSalaryTaxTotal = RealCityResidentAI.tempCitizenSalaryTaxTotal + (int)tax; RealCityResidentAI.citizenSalaryTaxTotal = (int)RealCityResidentAI.tempCitizenSalaryTaxTotal; ProcessCitizenIncomeTax(homeID, tax); //3. We calculate expense int educationFee = 0; int hospitalFee = 0; int expenseRate = 0; CitizenManager instance = Singleton <CitizenManager> .instance; int tempEducationFee; int tempHospitalFee; if (data.m_citizen4 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen4)].Dead) { GetExpenseRate(data.m_citizen4, out expenseRate, out tempEducationFee, out tempHospitalFee); educationFee += tempEducationFee; hospitalFee += tempHospitalFee; } if (data.m_citizen3 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen3)].Dead) { GetExpenseRate(data.m_citizen3, out expenseRate, out tempEducationFee, out tempHospitalFee); educationFee += tempEducationFee; hospitalFee += tempHospitalFee; } if (data.m_citizen2 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen2)].Dead) { GetExpenseRate(data.m_citizen2, out expenseRate, out tempEducationFee, out tempHospitalFee); educationFee += tempEducationFee; hospitalFee += tempHospitalFee; } if (data.m_citizen1 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen1)].Dead) { GetExpenseRate(data.m_citizen1, out expenseRate, out tempEducationFee, out tempHospitalFee); educationFee += tempEducationFee; hospitalFee += tempHospitalFee; } if (data.m_citizen0 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen0)].Dead) { GetExpenseRate(data.m_citizen0, out expenseRate, out tempEducationFee, out tempHospitalFee); educationFee += tempEducationFee; hospitalFee += tempHospitalFee; } ProcessCitizenHouseRent(homeID, expenseRate); //campus DLC added. expenseRate = UniqueFacultyAI.IncreaseByBonus(UniqueFacultyAI.FacultyBonus.Economics, expenseRate); RealCityResidentAI.citizenExpenseCount += (educationFee + expenseRate + hospitalFee); //4. income - expense float incomeMinusExpense = familySalaryCurrent - tax - educationFee - expenseRate; CitizenUnitData.familyMoney[homeID] += incomeMinusExpense; //5. Limit familyMoney if (CitizenUnitData.familyMoney[homeID] > 100000000f) { CitizenUnitData.familyMoney[homeID] = 100000000f; } if (CitizenUnitData.familyMoney[homeID] < -100000000f) { CitizenUnitData.familyMoney[homeID] = -100000000f; } //6. Caculate minimumLivingAllowance and benefitOffset if (CitizenUnitData.familyMoney[homeID] < (-(Politics.benefitOffset * MainDataStore.govermentSalary) / 100f)) { int num = (int)(-CitizenUnitData.familyMoney[homeID]); CitizenUnitData.familyMoney[homeID] += num; MainDataStore.minimumLivingAllowance += num; Singleton <EconomyManager> .instance.FetchResource((EconomyManager.Resource) 17, num, ItemClass.Service.Residential, ItemClass.SubService.None, ItemClass.Level.Level1); } else { if (Politics.benefitOffset > 0) { CitizenUnitData.familyMoney[homeID] += ((Politics.benefitOffset * MainDataStore.govermentSalary) / 100f); MainDataStore.minimumLivingAllowance += (int)((Politics.benefitOffset * MainDataStore.govermentSalary) / 100f); Singleton <EconomyManager> .instance.FetchResource((EconomyManager.Resource) 17, (int)((Politics.benefitOffset * MainDataStore.govermentSalary) / 100f), ItemClass.Service.Residential, ItemClass.SubService.None, ItemClass.Level.Level1); } } var canBuyGoodMoney = MainDataStore.maxGoodPurchase * RealCityIndustryBuildingAI.GetResourcePrice(TransferManager.TransferReason.Shopping); var familySalaryCurrentTmp = (familySalaryCurrent > canBuyGoodMoney) ? canBuyGoodMoney : familySalaryCurrent; //7. Process citizen status if ((CitizenUnitData.familyMoney[homeID] / (canBuyGoodMoney + 1000f - familySalaryCurrentTmp)) >= 30) { RealCityResidentAI.level3HighWealth++; } else if ((CitizenUnitData.familyMoney[homeID] / (canBuyGoodMoney + 1000f - familySalaryCurrentTmp)) >= 20) { RealCityResidentAI.level2HighWealth++; } else if ((CitizenUnitData.familyMoney[homeID] / (canBuyGoodMoney + 1000f - familySalaryCurrentTmp)) >= 10) { RealCityResidentAI.level1HighWealth++; } //8 reduce goods float reducedGoods; if (CitizenUnitData.familyMoney[homeID] < canBuyGoodMoney) { reducedGoods = CitizenUnitData.familyGoods[homeID] / 100f; } else { reducedGoods = CitizenUnitData.familyGoods[homeID] / 50f; } CitizenUnitData.familyGoods[homeID] = (ushort)COMath.Clamp((int)(CitizenUnitData.familyGoods[homeID] - reducedGoods), 0, 60000); data.m_goods = (ushort)(CitizenUnitData.familyGoods[homeID] / 10f); //9 Buy good from outside and try move family if (data.m_goods == 0) { if ((CitizenUnitData.familyMoney[homeID] > canBuyGoodMoney) && (familySalaryCurrent > 1)) { uint citizenID = 0u; int familySize = 0; if (data.m_citizen4 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen4)].Dead) { familySize++; citizenID = data.m_citizen4; instance.m_citizens.m_buffer[citizenID].m_flags &= ~Citizen.Flags.NeedGoods; } if (data.m_citizen3 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen3)].Dead) { familySize++; citizenID = data.m_citizen3; instance.m_citizens.m_buffer[citizenID].m_flags &= ~Citizen.Flags.NeedGoods; } if (data.m_citizen2 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen2)].Dead) { familySize++; citizenID = data.m_citizen2; instance.m_citizens.m_buffer[citizenID].m_flags &= ~Citizen.Flags.NeedGoods; } if (data.m_citizen1 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen1)].Dead) { familySize++; citizenID = data.m_citizen1; instance.m_citizens.m_buffer[citizenID].m_flags &= ~Citizen.Flags.NeedGoods; } if (data.m_citizen0 != 0u && !instance.m_citizens.m_buffer[(int)((UIntPtr)data.m_citizen0)].Dead) { familySize++; citizenID = data.m_citizen0; instance.m_citizens.m_buffer[citizenID].m_flags &= ~Citizen.Flags.NeedGoods; } Singleton <ResidentAI> .instance.TryMoveFamily(citizenID, ref instance.m_citizens.m_buffer[citizenID], familySize); CitizenUnitData.familyGoods[homeID] = 5000; data.m_goods = (ushort)(CitizenUnitData.familyGoods[homeID] / 10f); CitizenUnitData.familyMoney[homeID] -= canBuyGoodMoney; MainDataStore.outsideGovermentMoney += (canBuyGoodMoney * MainDataStore.outsideGovermentProfitRatio); MainDataStore.outsideTouristMoney += (canBuyGoodMoney * MainDataStore.outsideCompanyProfitRatio * MainDataStore.outsideTouristSalaryProfitRatio); } } //ProcessCitizen post, split all familyMoney to CitizenMoney ProcessCitizen(homeID, ref data, false); }
public static float CaculateEmployeeOutcome(Building building, out int totalWorkerCount) { totalWorkerCount = 0; float allSalary = 0; CitizenManager instance = Singleton <CitizenManager> .instance; uint num = building.m_citizenUnits; int num2 = 0; while (num != 0u) { if ((ushort)(instance.m_units.m_buffer[(int)((UIntPtr)num)].m_flags & CitizenUnit.Flags.Work) != 0) { var citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen0; if (citizenID != 0u) { totalWorkerCount++; allSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen1; if (citizenID != 0u) { totalWorkerCount++; allSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen2; if (citizenID != 0u) { totalWorkerCount++; allSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen3; if (citizenID != 0u) { totalWorkerCount++; allSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } citizenID = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_citizen4; if (citizenID != 0u) { totalWorkerCount++; allSalary += RealCityResidentAI.ProcessCitizenSalary(citizenID, true); } } num = instance.m_units.m_buffer[(int)((UIntPtr)num)].m_nextUnit; if (++num2 > 524288) { CODebugBase <LogChannel> .Error(LogChannel.Core, "Invalid list detected!\n" + Environment.StackTrace); break; } } if (totalWorkerCount == 0) { return(0); } else { return(allSalary / totalWorkerCount); } }