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);
        }
Ejemplo n.º 3
0
        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