// Copied from ResidentialBuildingAI private static int GetResidentRequirement(ImmaterialResourceManager.Resource resource, ref Citizen citizen) { switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: return(Citizen.GetHealthCareRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.DeathCare: return(Citizen.GetDeathCareRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.PoliceDepartment: return(Citizen.GetPoliceDepartmentRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.FireDepartment: return(Citizen.GetFireDepartmentRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.Entertainment: return(Citizen.GetEntertainmentRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.PublicTransport: return(Citizen.GetTransportRequirement(Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age))); case ImmaterialResourceManager.Resource.PostService: return(Citizen.GetMailAccumulation(citizen.EducationLevel)); case ImmaterialResourceManager.Resource.EducationElementary: { Citizen.AgePhase agePhase3 = Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age); if (agePhase3 < Citizen.AgePhase.Teen0) { return(Citizen.GetEducationRequirement(agePhase3)); } return(0); } case ImmaterialResourceManager.Resource.EducationHighSchool: { Citizen.AgePhase agePhase2 = Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age); if (agePhase2 >= Citizen.AgePhase.Teen0 && agePhase2 < Citizen.AgePhase.Young0) { return(Citizen.GetEducationRequirement(agePhase2)); } return(0); } case ImmaterialResourceManager.Resource.EducationUniversity: { Citizen.AgePhase agePhase = Citizen.GetAgePhase(citizen.EducationLevel, citizen.Age); if (agePhase >= Citizen.AgePhase.Young0) { return(Citizen.GetEducationRequirement(agePhase)); } return(0); } default: return(100); } }
public override int GetResourceRate(ushort buildingID, ref Building data, ImmaterialResourceManager.Resource resource) { if (resource == ImmaterialResourceManager.Resource.NoisePollution) { return(this.m_noiseAccumulation); } return(base.GetResourceRate(buildingID, ref data, resource)); }
public void CheckLocalResource(ImmaterialResourceManager.Resource resource, Vector3 position, out int local) { int num = Mathf.Clamp((int)(position.x / 38.4f + HALFGRID), 0, GRID - 1); int num2 = Mathf.Clamp((int)(position.z / 38.4f + HALFGRID), 0, GRID - 1); int num3 = (int)((num2 * GRID + num) * 24 + resource); local = (int)m_localFinalResources[num3]; }
private void SetEffectChart(int position, ImmaterialResourceManager.Resource resource) { try { int resourceKey = (int)resource; float resourceEffect = _effectsOnZonedBuilding[resourceKey]; float resourceMaxEffect = _maxEffectsOnZonedBuilding[resourceKey]; float resourceEffectPercentage = resourceEffect / resourceMaxEffect; Color32 colorRed = new Color32(255, 0, 0, 128); Color32 colorYellow = new Color32(255, 255, 0, 128); Color32 colorGreen = new Color32(0, 255, 0, 128); Color32 color; if (resourceEffectPercentage > 0.66f) { color = IsEffectPositive(resource) ? colorGreen : colorRed; } else if (resourceEffectPercentage > 0.33f) { color = IsEffectPositive(resource) ? colorYellow : colorRed; } else { color = IsEffectPositive(resource) ? colorRed : colorRed; } _effectCharts[position].GetSlice(0).outterColor = color; _effectCharts[position].GetSlice(0).innerColor = color; _effectCharts[position].SetValues(resourceEffectPercentage, 1 - resourceEffectPercentage); _effectCharts[position].tooltip = GetEffectLongName(resource); _effectCharts[position].objectUserData = resource; _effectOverlays[position].text = $"{Math.Round(resourceEffectPercentage * 100f),1}%"; _effectOverlays[position].position = new Vector3(_effectCharts[position].width / 2f - _effectOverlays[position].width / 2f + 3f, _effectOverlays[position].height / 2f - 29.5f); if (ModConfig.Instance.ExtendedPanelChartHelp is "Icon") { _effectIcons[position].spriteName = GetEffectSprite(resource); _effectIcons[position].position = new Vector3(_effectCharts[position].width / 2f - _effectIcons[position].width / 2f, _effectIcons[position].height / 2f - 50f); } else { _effectLegends[position].text = GetEffectShortName(resource); _effectLegends[position].position = new Vector3(_effectCharts[position].width / 2f - _effectLegends[position].width / 2f, _effectLegends[position].height / 2f - 55f); } } catch (Exception e) { Debug.Log("[Show It!] ZonedBuildingExtenderPanel:SetEffectChart -> Exception: " + e.Message); } }
public int AddResource(ImmaterialResourceManager.Resource resource, int rate, Vector3 position, float radius) { //begin mod if (_buildingThemesPositionField != null) { if (resource == ImmaterialResourceManager.Resource.Abandonment) { _buildingThemesPositionField.SetValue(null, position); } } //end mod if (rate == 0) { return(0); } float num = Mathf.Max(0f, Mathf.Min(radius, 19.2f)); float num2 = Mathf.Max(38.4f, radius + 19.2f); int num3 = Mathf.Max((int)((position.x - radius) / 38.4f + HALFGRID), 2); int num4 = Mathf.Max((int)((position.z - radius) / 38.4f + HALFGRID), 2); int num5 = Mathf.Min((int)((position.x + radius) / 38.4f + HALFGRID), GRID - 3); int num6 = Mathf.Min((int)((position.z + radius) / 38.4f + HALFGRID), GRID - 3); for (int i = num4; i <= num6; i++) { float num7 = ((float)i - HALFGRID + 0.5f) * 38.4f - position.z; for (int j = num3; j <= num5; j++) { float num8 = ((float)j - HALFGRID + 0.5f) * 38.4f - position.x; float num9 = num7 * num7 + num8 * num8; if (num9 < num2 * num2) { int num10 = rate; if (num9 > num * num) { float num11 = Mathf.Clamp01((num2 - Mathf.Sqrt(num9)) / (num2 - num)); num10 = Mathf.RoundToInt((float)num10 * num11); } int num12 = (int)((i * GRID + j) * 24 + resource); AddResource(ImmaterialResourceManager.instance, ref m_localTempResources[num12], num10); } } } return(rate); }
// Detours public int AddResource(ImmaterialResourceManager.Resource resource, int rate, Vector3 positionArg, float radius) { if (Debugger.Enabled && debugCounter < 10) { debugCounter++; Debugger.Log("Building Themes: Detoured ImmaterialResource.AddResource was called."); } // Catch the position of the abandoned building if (resource == ImmaterialResourceManager.Resource.Abandonment) { BuildingThemesMod.position = positionArg; } // Call the original method RedirectionHelper.RevertRedirect(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_state); var result = Singleton <ImmaterialResourceManager> .instance.AddResource(resource, rate, positionArg, radius); RedirectionHelper.RedirectCalls(_ImmaterialResourceManager_AddResource_original, _ImmaterialResourceManager_AddResource_detour); return(result); }
public double GetServiceScore(int resourceRate, ImmaterialResourceManager.Resource resource, ItemClass.Zone zone, ref int maxLimit) { if (zone == ItemClass.Zone.ResidentialHigh || zone == ItemClass.Zone.ResidentialLow || zone == ItemClass.Zone.CommercialHigh || zone == ItemClass.Zone.CommercialLow) { switch (resource) { case ImmaterialResourceManager.Resource.NoisePollution: case ImmaterialResourceManager.Resource.CrimeRate: maxLimit = 100; return(ImmaterialResourceManager.CalculateResourceEffect(resourceRate, 10, 100, 0, 100)); case ImmaterialResourceManager.Resource.FireHazard: maxLimit = 100; return(ImmaterialResourceManager.CalculateResourceEffect(resourceRate, 50, 100, 10, 50)); case ImmaterialResourceManager.Resource.Abandonment: maxLimit = 50; return(ImmaterialResourceManager.CalculateResourceEffect(resourceRate, 15, 50, 100, 200)); } } maxLimit = 500; return(ImmaterialResourceManager.CalculateResourceEffect(resourceRate, 100, 500, 50, 100)); }
private static bool CanShowZonedResource(ImmaterialResourceManager.Resource res, ItemClass.Zone zone) => res == ImmaterialResourceManager.Resource.EducationElementary || res == ImmaterialResourceManager.Resource.EducationHighSchool || res == ImmaterialResourceManager.Resource.EducationUniversity || res == ImmaterialResourceManager.Resource.HealthCare || res == ImmaterialResourceManager.Resource.FireDepartment || res == ImmaterialResourceManager.Resource.PoliceDepartment || res == ImmaterialResourceManager.Resource.PublicTransport || res == ImmaterialResourceManager.Resource.DeathCare || res == ImmaterialResourceManager.Resource.Entertainment || res == ImmaterialResourceManager.Resource.CrimeRate || res == ImmaterialResourceManager.Resource.FireHazard || res == ImmaterialResourceManager.Resource.PostService || zone != ItemClass.Zone.ResidentialLow && zone != ItemClass.Zone.ResidentialHigh && res == ImmaterialResourceManager.Resource.CargoTransport || Singleton <LoadingManager> .instance.SupportsExpansion(Expansion.NaturalDisasters) && (res == ImmaterialResourceManager.Resource.DisasterCoverage || res == ImmaterialResourceManager.Resource.EarthquakeCoverage || res == ImmaterialResourceManager.Resource.FirewatchCoverage || res == ImmaterialResourceManager.Resource.RadioCoverage) || Singleton <LoadingManager> .instance.SupportsExpansion(Expansion.Parks) && (zone == ItemClass.Zone.ResidentialLow || zone == ItemClass.Zone.ResidentialHigh) && (res == ImmaterialResourceManager.Resource.Attractiveness || res == ImmaterialResourceManager.Resource.TourCoverage);
// Copied from ResidentialBuildingAI private static int GetAverageResidentRequirement(ushort buildingID, ref Building data, ImmaterialResourceManager.Resource resource) { CitizenManager instance = Singleton <CitizenManager> .instance; uint num = data.m_citizenUnits; int num2 = 0; int num3 = 0; int num4 = 0; while (num != 0) { uint nextUnit = instance.m_units.m_buffer[num].m_nextUnit; if ((instance.m_units.m_buffer[num].m_flags & CitizenUnit.Flags.Home) != 0) { int num5 = 0; int num6 = 0; for (int i = 0; i < 5; i++) { uint citizen = instance.m_units.m_buffer[num].GetCitizen(i); if (citizen != 0 && !instance.m_citizens.m_buffer[citizen].Dead) { num5 += GetResidentRequirement(resource, ref instance.m_citizens.m_buffer[citizen]); num6++; } } if (num6 == 0) { num3 += 100; num4++; } else { num3 += num5; num4 += num6; } } num = nextUnit; if (++num2 > 524288) { break; } } if (num4 != 0) { return((num3 + (num4 >> 1)) / num4); } return(0); }
public static int GetMaxEffect(ImmaterialResourceManager.Resource resource) { switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: return(100); case ImmaterialResourceManager.Resource.FireDepartment: case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: return(40); case ImmaterialResourceManager.Resource.DeathCare: return(20); case ImmaterialResourceManager.Resource.PublicTransport: return(40); case ImmaterialResourceManager.Resource.NoisePollution: return(100); case ImmaterialResourceManager.Resource.CrimeRate: return(100); case ImmaterialResourceManager.Resource.Health: case ImmaterialResourceManager.Resource.Wellbeing: return(50); case ImmaterialResourceManager.Resource.Density: return(0); case ImmaterialResourceManager.Resource.Entertainment: return(60); case ImmaterialResourceManager.Resource.LandValue: case ImmaterialResourceManager.Resource.Attractiveness: case ImmaterialResourceManager.Resource.Coverage: return(0); case ImmaterialResourceManager.Resource.FireHazard: return(50); case ImmaterialResourceManager.Resource.Abandonment: return(20); case ImmaterialResourceManager.Resource.CargoTransport: return(0); case ImmaterialResourceManager.Resource.RadioCoverage: return(25); case ImmaterialResourceManager.Resource.FirewatchCoverage: return(25); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return(0); case ImmaterialResourceManager.Resource.DisasterCoverage: return(25); case ImmaterialResourceManager.Resource.TourCoverage: return(0); case ImmaterialResourceManager.Resource.PostService: return(10); case ImmaterialResourceManager.Resource.None: return(0); default: return(0); } }
public override void GetImmaterialResourceRadius(ushort buildingID, ref Building data, out ImmaterialResourceManager.Resource resource1, out float radius1, out ImmaterialResourceManager.Resource resource2, out float radius2) { resource1 = ImmaterialResourceManager.Resource.None; radius1 = 0f; resource2 = ImmaterialResourceManager.Resource.None; radius2 = 0f; }
private void GetEffectInfoModes(ImmaterialResourceManager.Resource resource, out InfoManager.InfoMode infoMode, out InfoManager.SubInfoMode subInfoMode) { infoMode = InfoManager.InfoMode.LandValue; subInfoMode = InfoManager.SubInfoMode.Default; switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: infoMode = InfoManager.InfoMode.Health; subInfoMode = InfoManager.SubInfoMode.HealthCare; break; case ImmaterialResourceManager.Resource.FireDepartment: infoMode = InfoManager.InfoMode.FireSafety; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.PoliceDepartment: infoMode = InfoManager.InfoMode.CrimeRate; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.EducationElementary: infoMode = InfoManager.InfoMode.Education; subInfoMode = InfoManager.SubInfoMode.ElementarySchool; break; case ImmaterialResourceManager.Resource.EducationHighSchool: infoMode = InfoManager.InfoMode.Education; subInfoMode = InfoManager.SubInfoMode.HighSchool; break; case ImmaterialResourceManager.Resource.EducationUniversity: infoMode = InfoManager.InfoMode.Education; subInfoMode = InfoManager.SubInfoMode.University; break; case ImmaterialResourceManager.Resource.DeathCare: infoMode = InfoManager.InfoMode.Health; subInfoMode = InfoManager.SubInfoMode.DeathCare; break; case ImmaterialResourceManager.Resource.PublicTransport: infoMode = InfoManager.InfoMode.Transport; subInfoMode = InfoManager.SubInfoMode.NormalTransport; break; case ImmaterialResourceManager.Resource.NoisePollution: infoMode = InfoManager.InfoMode.NoisePollution; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.CrimeRate: infoMode = InfoManager.InfoMode.CrimeRate; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.Health: infoMode = InfoManager.InfoMode.Health; subInfoMode = InfoManager.SubInfoMode.HealthCare; break; case ImmaterialResourceManager.Resource.Wellbeing: infoMode = InfoManager.InfoMode.Happiness; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.Density: infoMode = InfoManager.InfoMode.Density; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.Entertainment: infoMode = InfoManager.InfoMode.Entertainment; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.LandValue: infoMode = InfoManager.InfoMode.LandValue; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.Attractiveness: infoMode = InfoManager.InfoMode.Tourism; subInfoMode = InfoManager.SubInfoMode.Attractiveness; break; case ImmaterialResourceManager.Resource.Coverage: infoMode = InfoManager.InfoMode.LandValue; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.FireHazard: infoMode = InfoManager.InfoMode.FireSafety; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.Abandonment: infoMode = InfoManager.InfoMode.Destruction; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.CargoTransport: infoMode = InfoManager.InfoMode.Connections; subInfoMode = InfoManager.SubInfoMode.Import; break; case ImmaterialResourceManager.Resource.RadioCoverage: infoMode = InfoManager.InfoMode.Radio; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.FirewatchCoverage: infoMode = InfoManager.InfoMode.FireSafety; subInfoMode = InfoManager.SubInfoMode.ForestFireHazard; break; case ImmaterialResourceManager.Resource.EarthquakeCoverage: infoMode = InfoManager.InfoMode.DisasterDetection; subInfoMode = InfoManager.SubInfoMode.EarthquakeDetection; break; case ImmaterialResourceManager.Resource.DisasterCoverage: infoMode = InfoManager.InfoMode.DisasterDetection; subInfoMode = InfoManager.SubInfoMode.DisasterDetection; break; case ImmaterialResourceManager.Resource.TourCoverage: infoMode = InfoManager.InfoMode.Tours; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.PostService: infoMode = InfoManager.InfoMode.Post; subInfoMode = InfoManager.SubInfoMode.Default; break; case ImmaterialResourceManager.Resource.None: infoMode = InfoManager.InfoMode.LandValue; subInfoMode = InfoManager.SubInfoMode.Default; break; default: infoMode = InfoManager.InfoMode.LandValue; subInfoMode = InfoManager.SubInfoMode.Default; break; } }
private string GetEffectSprite(ImmaterialResourceManager.Resource resource) { switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: return("ToolbarIconHealthcare"); case ImmaterialResourceManager.Resource.FireDepartment: return("ToolbarIconFireDepartment"); case ImmaterialResourceManager.Resource.PoliceDepartment: return("ToolbarIconPolice"); case ImmaterialResourceManager.Resource.EducationElementary: return("ToolbarIconEducation"); case ImmaterialResourceManager.Resource.EducationHighSchool: return("ToolbarIconEducation"); case ImmaterialResourceManager.Resource.EducationUniversity: return("ToolbarIconEducation"); case ImmaterialResourceManager.Resource.DeathCare: return("NotificationIconDead"); case ImmaterialResourceManager.Resource.PublicTransport: return("ToolbarIconPublicTransport"); case ImmaterialResourceManager.Resource.NoisePollution: return("InfoIconNoisePollution"); case ImmaterialResourceManager.Resource.CrimeRate: return("InfoIconCrime"); case ImmaterialResourceManager.Resource.Health: return("InfoIconHealth"); case ImmaterialResourceManager.Resource.Wellbeing: return("InfoIconHappiness"); case ImmaterialResourceManager.Resource.Density: return("InfoIconPopulation"); case ImmaterialResourceManager.Resource.Entertainment: return("InfoIconEntertainment"); case ImmaterialResourceManager.Resource.LandValue: return("InfoIconLandValue"); case ImmaterialResourceManager.Resource.Attractiveness: return("InfoIconLevel"); case ImmaterialResourceManager.Resource.Coverage: return("ToolbarIconZoomOutGlobe"); case ImmaterialResourceManager.Resource.FireHazard: return("IconPolicySmokeDetectors"); case ImmaterialResourceManager.Resource.Abandonment: return("InfoIconDestruction"); case ImmaterialResourceManager.Resource.CargoTransport: return("InfoIconOutsideConnections"); case ImmaterialResourceManager.Resource.RadioCoverage: return("InfoIconRadio"); case ImmaterialResourceManager.Resource.FirewatchCoverage: return("InfoIconForestFire"); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return("InfoIconEarthquake"); case ImmaterialResourceManager.Resource.DisasterCoverage: return("InfoIconDisasterDetection"); case ImmaterialResourceManager.Resource.TourCoverage: return("InfoIconTours"); case ImmaterialResourceManager.Resource.PostService: return("InfoIconPost"); case ImmaterialResourceManager.Resource.None: return("ToolbarIconHelp"); default: return("ToolbarIconHelp"); } }
public override void GetImmaterialResourceRadius(ushort buildingID, ref Building data, out ImmaterialResourceManager.Resource resource1, out float radius1, out ImmaterialResourceManager.Resource resource2, out float radius2) { if (this.m_noiseAccumulation != 0) { resource1 = ImmaterialResourceManager.Resource.NoisePollution; radius1 = this.m_noiseRadius; } else { resource1 = ImmaterialResourceManager.Resource.None; radius1 = 0f; } resource2 = ImmaterialResourceManager.Resource.None; radius2 = 0f; }
public double GetServiceScore(ImmaterialResourceManager.Resource resource, ItemClass.Zone zone, ushort[] array, int num, ref int rawValue, ref int maxLimit) { rawValue = array[num + (int)resource]; return(GetServiceScore(rawValue, resource, zone, ref maxLimit)); }
public static int CalculateResourceEffect(ushort buildingID, ref Building data, ImmaterialResourceManager.Resource resource) { int averageResidentRequirement; int value; switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: //Debug.Log("HealthCare: " + ((float)Citizen.GetHealthLevel(data.m_health) * 0.2f * 100)); //return (int)Math.Round((float)Citizen.GetHealthLevel(data.m_health) * 0.2f * 100); case ImmaterialResourceManager.Resource.FireDepartment: case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: averageResidentRequirement = GetAverageResidentRequirement(buildingID, ref data, resource); Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, averageResidentRequirement, 500, 20, 40)); case ImmaterialResourceManager.Resource.DeathCare: averageResidentRequirement = GetAverageResidentRequirement(buildingID, ref data, resource); Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, averageResidentRequirement, 500, 10, 20)); case ImmaterialResourceManager.Resource.PublicTransport: averageResidentRequirement = GetAverageResidentRequirement(buildingID, ref data, resource); Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, averageResidentRequirement, 500, 20, 40)); case ImmaterialResourceManager.Resource.NoisePollution: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 10, 100, 0, 100)); case ImmaterialResourceManager.Resource.CrimeRate: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 10, 100, 0, 100)); case ImmaterialResourceManager.Resource.Health: case ImmaterialResourceManager.Resource.Wellbeing: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 60, 100, 0, 50)); case ImmaterialResourceManager.Resource.Density: return(0); case ImmaterialResourceManager.Resource.Entertainment: averageResidentRequirement = GetAverageResidentRequirement(buildingID, ref data, resource); Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, averageResidentRequirement, 500, 30, 60)); case ImmaterialResourceManager.Resource.LandValue: case ImmaterialResourceManager.Resource.Attractiveness: case ImmaterialResourceManager.Resource.Coverage: return(0); case ImmaterialResourceManager.Resource.FireHazard: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 10, 50)); case ImmaterialResourceManager.Resource.Abandonment: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 15, 50, 10, 20)); case ImmaterialResourceManager.Resource.CargoTransport: return(0); case ImmaterialResourceManager.Resource.RadioCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 20, 25)); case ImmaterialResourceManager.Resource.FirewatchCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 1000, 0, 25)); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return(0); case ImmaterialResourceManager.Resource.DisasterCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 20, 25)); case ImmaterialResourceManager.Resource.TourCoverage: return(0); case ImmaterialResourceManager.Resource.PostService: averageResidentRequirement = GetAverageResidentRequirement(buildingID, ref data, resource); Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, averageResidentRequirement, 200, 5, 10)); case ImmaterialResourceManager.Resource.None: return(0); default: return(0); } }
public static int CalculateResourceEffect(ushort buildingID, ref Building data, ImmaterialResourceManager.Resource resource) { int value; switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: case ImmaterialResourceManager.Resource.FireDepartment: case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: case ImmaterialResourceManager.Resource.DeathCare: case ImmaterialResourceManager.Resource.PublicTransport: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 500, 50, 100)); case ImmaterialResourceManager.Resource.NoisePollution: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 10, 100, 0, 100)); case ImmaterialResourceManager.Resource.CrimeRate: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 10, 100, 0, 100)); case ImmaterialResourceManager.Resource.Health: case ImmaterialResourceManager.Resource.Wellbeing: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 60, 100, 0, 50)); case ImmaterialResourceManager.Resource.Density: return(0); case ImmaterialResourceManager.Resource.Entertainment: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 500, 50, 100)); case ImmaterialResourceManager.Resource.LandValue: case ImmaterialResourceManager.Resource.Attractiveness: case ImmaterialResourceManager.Resource.Coverage: return(0); case ImmaterialResourceManager.Resource.FireHazard: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 10, 50)); case ImmaterialResourceManager.Resource.Abandonment: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 15, 50, 10, 20)); case ImmaterialResourceManager.Resource.CargoTransport: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 500, 50, 100)); case ImmaterialResourceManager.Resource.RadioCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 20, 25)); case ImmaterialResourceManager.Resource.FirewatchCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 1000, 0, 25)); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return(0); case ImmaterialResourceManager.Resource.DisasterCoverage: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 50, 100, 20, 25)); case ImmaterialResourceManager.Resource.TourCoverage: return(0); case ImmaterialResourceManager.Resource.PostService: Singleton <ImmaterialResourceManager> .instance.CheckLocalResource(resource, data.m_position, out value); return(ImmaterialResourceManager.CalculateResourceEffect(value, 100, 500, 50, 100)); case ImmaterialResourceManager.Resource.None: return(0); default: return(0); } }
private static bool CanShowResource(ImmaterialResourceManager.Resource res) => res != ImmaterialResourceManager.Resource.Abandonment && res != ImmaterialResourceManager.Resource.Coverage && res != ImmaterialResourceManager.Resource.Density && res != ImmaterialResourceManager.Resource.NoisePollution;
public int AddObstructedResource(ImmaterialResourceManager.Resource resource, int rate, Vector3 position, float radius) { if (rate == 0) { return(0); } ushort[] finalHeights = Singleton <TerrainManager> .instance.FinalHeights; //begin mod for (int index = 0; index < GRID; ++index) { //end mod m_tempSectorSlopes[index] = -100f; m_tempSectorDistances[index] = 0.0f; } float num1 = radius * 0.5f; float num2 = Mathf.Max(38.4f, radius + 19.2f); int num3 = (int)resource; //begin mod int num4 = Mathf.Clamp((int)((double)position.x / 38.4000015258789 + HALFGRID), 2, GRID - 3); //end mod int num5 = num4; //begin mod int num6 = Mathf.Clamp((int)((double)position.z / 38.4000015258789 + HALFGRID), 2, GRID - 3); //end mod int num7 = num6; //begin mod float num8 = position.x - (float)(((double)num4 - HALFGRID + 0.5) * 38.4000015258789); float num9 = position.z - (float)(((double)num6 - HALFGRID + 0.5) * 38.4000015258789); //end mod if ((double)num8 > 9.60000038146973) { //begin mod num5 = Mathf.Min(num5 + 1, GRID - 3); } //end mod else if ((double)num8 < -9.60000038146973) { num4 = Mathf.Max(num4 - 1, 2); } if ((double)num9 > 9.60000038146973) { //begin mod num7 = Mathf.Min(num7 + 1, GRID - 3); } //end mod else if ((double)num9 < -9.60000038146973) { num6 = Mathf.Max(num6 - 1, 2); } int num10 = num6; int num11 = num7; int num12 = num10 + 1; int num13 = num11 - 1; int num14 = 0; bool flag; do { flag = false; float num15 = (float)(38.4000015258789 * (0.75 + (double)num14++)); float num16 = num15 * num15; for (int index1 = num10; index1 <= num11; ++index1) { int index2 = index1 > num6 ? index1 : num6 - index1 + num10; //begin mod float num17 = (float)(((double)index2 - HALFGRID + 0.5) * 38.4000015258789); //end mod float y = num17 - position.z; int num18 = Mathf.Clamp(Mathf.RoundToInt((float)((double)num17 / 16.0 + 540.0)), 0, 1080); int a1 = num4; int a2 = num5; if (index2 >= num12 && index2 <= num13) { a1 = Mathf.Min(a1, m_tempCircleMinX[index2] - 1); a2 = Mathf.Max(a2, m_tempCircleMaxX[index2] + 1); } for (int index3 = a1; index3 >= 2; a1 = index3--) { //begin mod float num19 = (float)(((double)index3 - HALFGRID + 0.5) * 38.4000015258789); //end mod float x = num19 - position.x; int num20 = Mathf.Clamp(Mathf.RoundToInt((float)((double)num19 / 16.0 + 540.0)), 0, 1080); float f1 = (float)((double)y * (double)y + (double)x * (double)x); if ((a1 == index3 || (double)f1 < (double)num16) && (double)f1 < (double)num2 * (double)num2) { float b1 = Mathf.Sqrt(f1); float num21 = (float)rate; float num22 = (1f / 64f * (float)finalHeights[num18 * 1081 + num20] - position.y) / Mathf.Max(1f, b1); float num23 = Mathf.Atan2(y, x) * 40.74366f; float num24 = Mathf.Min((float)(38.4000015258789 / (double)Mathf.Max(1f, b1) * 20.3718318939209), 64f); //TODO: 64: halfgrid/2 ?? int num25 = Mathf.RoundToInt(num23 - num24) & (int)byte.MaxValue; int num26 = Mathf.RoundToInt(num23 + num24) & (int)byte.MaxValue; float num27 = 0.0f; float b2 = 0.0f; int index4 = num25; while (true) { float num28 = m_tempSectorSlopes[index4]; float num29 = m_tempSectorDistances[index4]; float num30 = Mathf.Clamp(b1 - num29, 1f, 38.4f); num27 += (num28 - num22) * num30; b2 += num30; if ((double)num22 > (double)num28) { m_tempSectorSlopes[index4] = num22; m_tempSectorDistances[index4] = b1; } if (index4 != num26) { index4 = index4 + 1 & (int)byte.MaxValue; } else { break; } } float num31 = num27 / Mathf.Max(1f, b2); float f2 = num21 * (float)(1.5 / (double)Mathf.Max(1f, (float)((double)num31 * 20.0 + 2.625)) - 0.5); if ((double)f2 > 0.0) { if ((double)b1 > (double)num1) { f2 *= Mathf.Clamp01((float)(((double)num2 - (double)b1) / ((double)num2 - (double)num1))); } //begin mod this.AddResource(ref m_localTempResources[(index2 * GRID + index3) * 24 + num3], Mathf.RoundToInt(f2)); //end mod } flag = true; } if ((double)f1 >= (double)num16) { break; } } //begin mod for (int index3 = a2; index3 <= GRID - 3; a2 = index3++) { float num19 = (float)(((double)index3 - HALFGRID + 0.5) * 38.4000015258789); //end mod float x = num19 - position.x; int num20 = Mathf.Clamp(Mathf.RoundToInt((float)((double)num19 / 16.0 + 540.0)), 0, 1080); float f1 = (float)((double)y * (double)y + (double)x * (double)x); if ((a2 == index3 || (double)f1 < (double)num16) && (index3 != num4 && (double)f1 < (double)num2 * (double)num2)) { float b1 = Mathf.Sqrt(f1); float num21 = (float)rate; float num22 = (1f / 64f * (float)finalHeights[num18 * 1081 + num20] - position.y) / Mathf.Max(1f, b1); float num23 = Mathf.Atan2(y, x) * 40.74366f; float num24 = Mathf.Min((float)(38.4000015258789 / (double)Mathf.Max(1f, b1) * 20.3718318939209), 64f); //TODO: 64: halfgrid/2 ?? int num25 = Mathf.RoundToInt(num23 - num24) & (int)byte.MaxValue; int num26 = Mathf.RoundToInt(num23 + num24) & (int)byte.MaxValue; float num27 = 0.0f; float b2 = 0.0f; int index4 = num25; while (true) { float num28 = m_tempSectorSlopes[index4]; float num29 = m_tempSectorDistances[index4]; float num30 = Mathf.Clamp(b1 - num29, 1f, 38.4f); num27 += (num28 - num22) * num30; b2 += num30; if ((double)num22 > (double)num28) { m_tempSectorSlopes[index4] = num22; m_tempSectorDistances[index4] = b1; } if (index4 != num26) { index4 = index4 + 1 & (int)byte.MaxValue; } else { break; } } float num31 = num27 / Mathf.Max(1f, b2); float f2 = num21 * (float)(1.5 / (double)Mathf.Max(1f, (float)((double)num31 * 20.0 + 2.625)) - 0.5); if ((double)f2 > 0.0) { if ((double)b1 > (double)num1) { f2 *= Mathf.Clamp01((float)(((double)num2 - (double)b1) / ((double)num2 - (double)num1))); } //begin mod this.AddResource(ref m_localTempResources[(index2 * GRID + index3) * 24 + num3], Mathf.RoundToInt(f2)); //end mod } flag = true; } if ((double)f1 >= (double)num16) { break; } } m_tempCircleMinX[index2] = a1; m_tempCircleMaxX[index2] = a2; } num12 = num10; num13 = num11; if (num10 > 2) { --num10; } //begin mod if (num11 < GRID - 3) { //end mod ++num11; } }while (flag); return(rate); }
private bool IsEffectPositive(ImmaterialResourceManager.Resource resource) { switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: return(true); case ImmaterialResourceManager.Resource.FireDepartment: return(true); case ImmaterialResourceManager.Resource.PoliceDepartment: return(true); case ImmaterialResourceManager.Resource.EducationElementary: return(true); case ImmaterialResourceManager.Resource.EducationHighSchool: return(true); case ImmaterialResourceManager.Resource.EducationUniversity: return(true); case ImmaterialResourceManager.Resource.DeathCare: return(true); case ImmaterialResourceManager.Resource.PublicTransport: return(true); case ImmaterialResourceManager.Resource.NoisePollution: return(false); case ImmaterialResourceManager.Resource.CrimeRate: return(false); case ImmaterialResourceManager.Resource.Health: return(true); case ImmaterialResourceManager.Resource.Wellbeing: return(true); case ImmaterialResourceManager.Resource.Density: return(true); case ImmaterialResourceManager.Resource.Entertainment: return(true); case ImmaterialResourceManager.Resource.LandValue: return(true); case ImmaterialResourceManager.Resource.Attractiveness: return(true); case ImmaterialResourceManager.Resource.Coverage: return(true); case ImmaterialResourceManager.Resource.FireHazard: return(false); case ImmaterialResourceManager.Resource.Abandonment: return(false); case ImmaterialResourceManager.Resource.CargoTransport: return(true); case ImmaterialResourceManager.Resource.RadioCoverage: return(true); case ImmaterialResourceManager.Resource.FirewatchCoverage: return(true); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return(true); case ImmaterialResourceManager.Resource.DisasterCoverage: return(true); case ImmaterialResourceManager.Resource.TourCoverage: return(true); case ImmaterialResourceManager.Resource.PostService: return(true); case ImmaterialResourceManager.Resource.None: return(false); default: return(false); } }
private string GetEffectLongName(ImmaterialResourceManager.Resource resource) { switch (resource) { case ImmaterialResourceManager.Resource.HealthCare: return("Health Care"); case ImmaterialResourceManager.Resource.FireDepartment: return("Fire Department"); case ImmaterialResourceManager.Resource.PoliceDepartment: return("Police Department"); case ImmaterialResourceManager.Resource.EducationElementary: return("Elementary"); case ImmaterialResourceManager.Resource.EducationHighSchool: return("High School"); case ImmaterialResourceManager.Resource.EducationUniversity: return("University"); case ImmaterialResourceManager.Resource.DeathCare: return("Death Care"); case ImmaterialResourceManager.Resource.PublicTransport: return("Public Transport"); case ImmaterialResourceManager.Resource.NoisePollution: return("Noise Pollution"); case ImmaterialResourceManager.Resource.CrimeRate: return("Crime Rate"); case ImmaterialResourceManager.Resource.Health: return("Health"); case ImmaterialResourceManager.Resource.Wellbeing: return("Wellbeing"); case ImmaterialResourceManager.Resource.Density: return("Density"); case ImmaterialResourceManager.Resource.Entertainment: return("Entertainment"); case ImmaterialResourceManager.Resource.LandValue: return("Land Value"); case ImmaterialResourceManager.Resource.Attractiveness: return("Attractiveness"); case ImmaterialResourceManager.Resource.Coverage: return("Coverage"); case ImmaterialResourceManager.Resource.FireHazard: return("Fire Hazard"); case ImmaterialResourceManager.Resource.Abandonment: return("Abandonment"); case ImmaterialResourceManager.Resource.CargoTransport: return("Cargo Transport"); case ImmaterialResourceManager.Resource.RadioCoverage: return("Radio Coverage"); case ImmaterialResourceManager.Resource.FirewatchCoverage: return("Firewatch Coverage"); case ImmaterialResourceManager.Resource.EarthquakeCoverage: return("Earthquake Coverage"); case ImmaterialResourceManager.Resource.DisasterCoverage: return("Disaster Coverage"); case ImmaterialResourceManager.Resource.TourCoverage: return("Tour Coverage"); case ImmaterialResourceManager.Resource.PostService: return("Post Service"); case ImmaterialResourceManager.Resource.None: return("None"); default: return("Unknown"); } }
public double GetFactor(ItemClass.Zone zone, ImmaterialResourceManager.Resource resource) { if (zone == ItemClass.Zone.Industrial) { switch (resource) { case ImmaterialResourceManager.Resource.PublicTransport: return(0.3333); case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.HealthCare: case ImmaterialResourceManager.Resource.DeathCare: return(0.2); case ImmaterialResourceManager.Resource.FireDepartment: return(0.5); case ImmaterialResourceManager.Resource.Entertainment: case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: return(0.125); case ImmaterialResourceManager.Resource.CargoTransport: return(1); case ImmaterialResourceManager.Resource.NoisePollution: case ImmaterialResourceManager.Resource.Abandonment: return(-0.1429); } } else if (zone == ItemClass.Zone.Office) { switch (resource) { case ImmaterialResourceManager.Resource.PublicTransport: return(0.3333); case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.HealthCare: case ImmaterialResourceManager.Resource.DeathCare: case ImmaterialResourceManager.Resource.FireDepartment: return(0.2); case ImmaterialResourceManager.Resource.Entertainment: return(0.1667); case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: return(0.1429); case ImmaterialResourceManager.Resource.NoisePollution: return(-0.25); case ImmaterialResourceManager.Resource.Abandonment: return(-0.3333); } } else { switch (resource) { case ImmaterialResourceManager.Resource.EducationElementary: case ImmaterialResourceManager.Resource.EducationHighSchool: case ImmaterialResourceManager.Resource.EducationUniversity: case ImmaterialResourceManager.Resource.HealthCare: case ImmaterialResourceManager.Resource.FireDepartment: case ImmaterialResourceManager.Resource.PoliceDepartment: case ImmaterialResourceManager.Resource.PublicTransport: case ImmaterialResourceManager.Resource.DeathCare: case ImmaterialResourceManager.Resource.Entertainment: case ImmaterialResourceManager.Resource.CargoTransport: return(1); case ImmaterialResourceManager.Resource.NoisePollution: case ImmaterialResourceManager.Resource.CrimeRate: case ImmaterialResourceManager.Resource.FireHazard: case ImmaterialResourceManager.Resource.Abandonment: return(-1); } } return(0); }
public bool IsResourcePositive(ImmaterialResourceManager.Resource resource) => resource != ImmaterialResourceManager.Resource.Abandonment || resource != ImmaterialResourceManager.Resource.CrimeRate || resource != ImmaterialResourceManager.Resource.FireHazard || resource != ImmaterialResourceManager.Resource.NoisePollution;