// 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); }
// 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); }
// 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)); }
// 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); } }
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; } }