예제 #1
0
        // Update the budget based on service type and whether or not it's night time
        private void updateBudget(ItemClass.Service service, bool night)
        {
            ServiceObject s         = getServiceObject(service, night);
            int           newBudget = getNewBudget(s);

            Singleton <EconomyManager> .instance.SetBudget(service, ItemClass.SubService.None, newBudget, night);
        }
        // Calculate the budget error based on consumption, capacity, and padding offset.
        private double getError(ServiceObject s)
        {
            double normalizer = ((double)(s.m_consumption)) / 100.0;

            if (normalizer == 0)
            {
                return(0);
            }
            double error = (((double)s.m_consumption * (1.0 + s.m_padding)) - ((double)(s.m_capacity))) / normalizer;

            if (error < 0.0)
            {
                error = -error * error;
            }
            else
            {
                error = error * error;
            }
            error /= 2.0;

            if (error < -BUDGET_RATE_LIMIT)
            {
                error = -BUDGET_RATE_LIMIT;
            }
            else if (error > BUDGET_RATE_LIMIT)
            {
                error = BUDGET_RATE_LIMIT;
            }
            return(error);
        }
예제 #3
0
        // Create and fetch the current ServiceObject based on the service type and whether or not it's night
        private ServiceObject getServiceObject(ItemClass.Service service, bool night)
        {
            ServiceObject s = new ServiceObject();

            s.m_service = service;
            s.m_night   = night;
            setServiceOptions(s);
            s.m_capacity    = getCapacity(s);
            s.m_consumption = getConsumption(s);
            s.m_padding     = getPadding(service);
            s.m_budget      = Singleton <EconomyManager> .instance.GetBudget(service, ItemClass.SubService.None, night);

            return(s);
        }
예제 #4
0
        // Calculate the new budget based on the service object, and return it's integer value.
        private int getNewBudget(ServiceObject s)
        {
            double l_error       = getError(s);
            double l_response    = selectController(s.m_service, s.m_night).response(l_error);
            float  raw_newBudget = (float)(l_response + s.m_budget);
            float  newBudget     = Mathf.Clamp(raw_newBudget, 50, 150);

            string msg = string.Format("GD: Service {0} updated budget from {1} to {2} with error {3} and response {4}",
                                       s.m_service, s.m_budget, newBudget, l_error, l_response);

            msg += string.Format("\t{0}/{1}.", s.m_consumption, s.m_capacity);
            msg += string.Format("\tRaw Budget: {0}", raw_newBudget);
            Logger.output(msg);

            return(Mathf.RoundToInt(newBudget));
        }
        // Calculate the new budget based on the service object, and return it's integer value.
        private int getNewBudget(ServiceObject s)
        {
            float newBudget = (float)(selectController(s.m_service, s.m_night).response(getError(s)) + s.m_budget);

            newBudget = Mathf.Clamp(newBudget, 50, 150);

            string msg = string.Format("Service {0} updated budget from ", s.m_service);

            msg += string.Format("{0} to ", s.m_budget);
            msg += string.Format("{0}.", newBudget);
            msg += string.Format("\t{0} / ", s.m_consumption);
            msg += string.Format("\t{0}.", s.m_capacity);
            Logger.output(msg);

            return(Mathf.RoundToInt(newBudget));
        }
예제 #6
0
 // Get the consumption based on service, with a check for water capacity vs sewage capacity
 private int getConsumption(ServiceObject s)
 {
     if (s.m_service == ItemClass.Service.Water)
     {
         if (s.m_waterBudgetOption == ServiceObject.WaterBudgetOption.Water)
         {
             return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetWaterConsumption());
         }
         else
         {
             return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetSewageAccumulation());
         }
     }
     else if (s.m_service == ItemClass.Service.Electricity)
     {
         return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetElectricityConsumption());
     }
     else if (s.m_service == ItemClass.Service.Education)
     {
         if (s.m_educationBudgetOption == ServiceObject.EducationBudgetOption.Elementary)
         {
             return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation1Need());
         }
         else if (s.m_educationBudgetOption == ServiceObject.EducationBudgetOption.HighSchool)
         {
             return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation2Need());
         }
         else
         {
             return(Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation3Need());
         }
     }
     else
     {
         return(0);
     }
 }
예제 #7
0
        private void setServiceOptions(ServiceObject s)
        {
            // TODO Make robust against s.m_service=null
            if (s.m_service == ItemClass.Service.Water)
            {
                int sewage = Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetSewageCapacity() - Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetSewageAccumulation();
                int water  = Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetWaterCapacity() - Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetWaterConsumption();
                if (water < sewage)
                {
                    s.m_waterBudgetOption = ServiceObject.WaterBudgetOption.Water;
                }
                else
                {
                    s.m_waterBudgetOption = ServiceObject.WaterBudgetOption.Sewage;
                }
            }
            else if (s.m_service == ItemClass.Service.Education)
            {
                int elementary = Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation1Capacity();
                int highschool = Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation2Capacity();
                int university = Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation3Capacity();

                if (elementary == 0)
                {
                    elementary = int.MaxValue;
                }
                else
                {
                    elementary -= Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation1Need();
                }

                if (highschool == 0)
                {
                    highschool = int.MaxValue;
                }
                else
                {
                    highschool -= Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation2Need();
                }

                if (university == 0)
                {
                    university = int.MaxValue;
                }
                else
                {
                    university -= Singleton <DistrictManager> .instance.m_districts.m_buffer[0].GetEducation3Need();
                }

                int minValue = elementary;
                ServiceObject.EducationBudgetOption selectedOption = ServiceObject.EducationBudgetOption.Elementary;

                if (minValue > highschool)
                {
                    minValue       = highschool;
                    selectedOption = ServiceObject.EducationBudgetOption.HighSchool;
                }
                if (minValue > university)
                {
                    minValue       = university;
                    selectedOption = ServiceObject.EducationBudgetOption.University;
                }

                s.m_educationBudgetOption = selectedOption;
            }
        }