private IResponseFormatter HandleDistrict(HttpListenerRequest request) { var districtIDs = GetDistrictsFromRequest(request); DistrictInfo globalDistrictInfo = null; List <DistrictInfo> districtInfoList = new List <DistrictInfo>(); var buildings = GetBuildingBreakdownByDistrict(); var vehicles = GetVehicleBreakdownByDistrict(); foreach (var districtID in districtIDs) { var districtInfo = DistrictInfo.GetDistrictInfo(districtID); if (districtID == 0) { districtInfo.TotalBuildingCount = buildings.Sum(obj => obj.Value); districtInfo.TotalVehicleCount = vehicles.Sum(obj => obj.Value); globalDistrictInfo = districtInfo; } else { districtInfo.TotalBuildingCount = buildings.Where(obj => obj.Key == districtID).Sum(obj => obj.Value); districtInfo.TotalVehicleCount = vehicles.Where(obj => obj.Key == districtID).Sum(obj => obj.Value); districtInfoList.Add(districtInfo); } } var simulationManager = Singleton <SimulationManager> .instance; var cityInfo = new CityInfo { Name = simulationManager.m_metaData.m_CityName, Time = simulationManager.m_currentGameTime.Date, GlobalDistrict = globalDistrictInfo, Districts = districtInfoList.ToArray(), }; return(JsonResponse(cityInfo)); }
public static DistrictInfo GetDistrictInfo(int districtID) { var districtManager = Singleton <DistrictManager> .instance; var district = GetDistrict(districtID); if (!district.IsValid()) { return(null); } String districtName = String.Empty; if (districtID == 0) { // The district with ID 0 is always the global district. // It receives an auto-generated name by default, but the game always displays the city name instead. districtName = "City"; } else { districtName = districtManager.GetDistrictName(districtID); } var pollution = Math.Round((district.m_groundData.m_finalPollution / (Double)byte.MaxValue), 2); #region data model familly to game service/zone type list & dictionary // // warning these strings match object field names in game models and should not be changed // see specified class to understand // in DistrictPrivateData List <string> ServiceZoneTypes = new List <string> { "Residential", "Commercial", "Industrial", "Office", "Player" }; List <string> NoPlayerZoneTypes = new List <string> { "Residential", "Commercial", "Industrial", "Office" }; List <string> JobServiceZoneTypes = new List <string> { "Commercial", "Industrial", "Office", "Player" }; List <string> ImportExportTypes = new List <string> { "Agricultural", "Forestry", "Goods", "Oil", "Ore" }; // in DistrictProductionData Dictionary <string, string> ProductionsTypes = new Dictionary <string, string> { { "Electricity", "ElectricityCapacity" }, { "Water", "WaterCapacity" }, { "Sewage", "SewageCapacity" }, { "GarbageA", "GarbageCapacity" }, { "GarbageC", "GarbageAmount" }, { "Incineration", "IncinerationCapacity" }, { "Cremate", "CremateCapacity" }, { "DeadA", "DeadAmount" }, { "DeadC", "DeadCapacity" }, { "Heal", "HealCapacity" }, { "LowEducation", "Education1Capacity" }, { "MediumEducation", "Education2Capacity" }, { "HighEducation", "Education3Capacity" }, }; // in DistrictConsumptionData // NOTE : consumptions are stored in each kind of service, cool we can create consumption distributions pie Dictionary <string, string> ConsumptionsTypes = new Dictionary <string, string> { { "Dead", "DeadCount" }, { "Sick", "SickCount" }, { "Electricity", "ElectricityConsumption" }, { "Water", "WaterConsumption" }, { "Sewage", "SewageAccumulation" }, { "Garbage", "GarbageAccumulation" }, { "Income", "IncomeAccumulation" }, { "WaterPollution", "WaterPollution" }, { "Building", "BuildingCount" }, { "GarbagePiles", "GarbagePiles" }, { "ImportAmount", "ImportAmount" }, }; Dictionary <string, string> PrivateDataTypes = new Dictionary <string, string> { { "Abandoned", "AbandonedCount" }, { "BuildingArea", "BuildingArea" }, //{"BuildingCount","BuildingCount"}, same data as in DistrictConsumptionData { "Burned", "BurnedCount" }, { "EmptyCount", "EmptyCount" }, //{"Happiness","Happiness"}, do in diffferent way to be easyly able to display hapiness by type //{"CrimeRate","CrimeRate"}, //{"Health","Health"}, /* to re add if a day I understand usage * {"Level","Level"}, * {"Level1","Level1"}, * {"Level2","Level2"}, * {"Level3","Level3"}, * {"Level4","Level4"}, * {"Level5","Level5"},*/ }; // in DistrictEducationData Dictionary <string, string> EducatedLevels = new Dictionary <string, string> { { "No", "educated0" }, { "Low", "educated1" }, { "Medium", "educated2" }, { "High", "educated3" } }; Dictionary <string, string> EducatedDataTypes = new Dictionary <string, string> { { "Total", "Count" }, { "EligibleWorkers", "EligibleWorkers" }, { "Homeless", "Homeless" }, { "Unemployed", "Unemployed" }, }; // in DistrictAgeData Dictionary <string, string> GraduationTypes = new Dictionary <string, string> { { "LowEducation", "education1" }, { "MediumEducation", "education2" }, { "HighEducation", "education3" }, }; Dictionary <string, string> StudentTypes = new Dictionary <string, string> { { "LowStudent", "student1" }, { "MediumStudent", "student2" }, { "HighStudent", "student3" }, }; Dictionary <string, string> BirthDeathTypes = new Dictionary <string, string> { { "Births", "birth" }, { "Deaths", "death" } }; Dictionary <string, string> PopulationType = new Dictionary <string, string> { { "Childs", "child" }, { "Teens", "teen" }, { "Youngs", "young" }, { "Adults", "adult" }, { "Seniors", "senior" }, }; #endregion var model = new DistrictInfo { DistrictID = districtID, DistrictName = districtName, #region service data generation Population = new DistrictServiceData { Categories = new List <ServiceData>(PopulationType.Keys.Select(x => district.GetAgeServiceData(PopulationType[x], x))), }, Happiness = new DistrictServiceData { Categories = new List <ServiceData>(NoPlayerZoneTypes.Select(y => district.GetPrivateServiceData(y, "Happiness"))) }, Crime = new DistrictServiceData { Categories = new List <ServiceData>(NoPlayerZoneTypes.Select(y => district.GetPrivateServiceData(y, "CrimeRate"))) }, Health = new DistrictServiceData { Categories = new List <ServiceData>(NoPlayerZoneTypes.Select(y => district.GetPrivateServiceData(y, "Health"))) }, // warning double lambda, but pretty magical effect Privates = new Dictionary <string, DistrictServiceData>( PrivateDataTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData>(ServiceZoneTypes.Select(y => district.GetPrivateServiceData(y, PrivateDataTypes[x]))) } ) ), Households = new DistrictDoubleServiceData { Categories = new List <DoubleServiceData> { district.GetCountAndAliveServiceData("residential"), }, }, Jobs = new DistrictDoubleServiceData { Categories = new List <DoubleServiceData>(JobServiceZoneTypes.Select(x => district.GetCountAndAliveServiceData(x))) }, ImportExport = new Dictionary <string, DistrictServiceData> { { "Import", new DistrictServiceData { Categories = new List <ServiceData>(ImportExportTypes.Select(x => district.GetImportExportServiceData("import", x))) } }, { "Export", new DistrictServiceData { Categories = new List <ServiceData>(ImportExportTypes.Select(x => district.GetImportExportServiceData("export", x))) } }, }, Productions = new Dictionary <string, DistrictServiceData>( ProductionsTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData> { district.GetProductionServiceData(x, ProductionsTypes[x]) } } ) ), // warning double lambda, but pretty magical effect Consumptions = new Dictionary <string, DistrictServiceData>( ConsumptionsTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData>(ServiceZoneTypes.Select(y => district.GetConsumptionServiceData(y, ConsumptionsTypes[x]))) } ) ), // warning double lambda, but pretty magical effect Educated = new Dictionary <string, DistrictServiceData>( EducatedDataTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData>(EducatedLevels.Keys.Select(y => district.GetEducatedServiceData(EducatedLevels[y], EducatedDataTypes[x], y))) } ) ), BirthDeath = new DistrictServiceData { Categories = new List <ServiceData>(BirthDeathTypes.Keys.Select(x => district.GetAgeServiceData(BirthDeathTypes[x], x))), }, Graduations = new Dictionary <string, DistrictServiceData>( GraduationTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData> { district.GetAgeServiceData(GraduationTypes[x]) } } ) ), Students = new Dictionary <string, DistrictServiceData>( StudentTypes.Keys.ToDictionary(x => x, x => new DistrictServiceData { Categories = new List <ServiceData> { district.GetAgeServiceData(StudentTypes[x]) } } ) ), #endregion AverageLandValue = district.GetLandValue(), Pollution = pollution, WeeklyTouristVisits = (int)district.m_tourist1Data.m_averageCount + (int)district.m_tourist2Data.m_averageCount + (int)district.m_tourist3Data.m_averageCount, Policies = GetPolicies().ToArray(), }; if (districtID != 0) { CityInfoRequestHandler.LogMessages("Building vehicles for", districtID.ToString()); model.Vehicles = new VehiclesInfo(districtID); } else { CityInfoRequestHandler.LogMessages("Building vehicles for city"); model.Vehicles = new VehiclesInfo(); } return(model); }