Beispiel #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();
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
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);
                    }
                }
            }
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #9
0
        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);
            }
        }