Decompiled source of Climate v1.0.0

Climate/Climate.dll

Decompiled 4 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Climate")]
[assembly: AssemblyDescription("https://github.com/bryon82/SailwindClimate")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("raddude")]
[assembly: AssemblyProduct("Climate")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4a46e2fd-fb4e-4529-84b1-ed831d6b6116")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Climate;

[BepInPlugin("com.raddude.climate", "Climate", "1.0.0")]
public class Climate_Plugin : BaseUnityPlugin
{
	public const string PLUGIN_GUID = "com.raddude.climate";

	public const string PLUGIN_NAME = "Climate";

	public const string PLUGIN_VERSION = "1.0.0";

	private static ManualLogSource _logger;

	internal static Climate_Plugin Instance { get; private set; }

	internal static void LogDebug(string message)
	{
		_logger.LogDebug((object)message);
	}

	internal static void LogInfo(string message)
	{
		_logger.LogInfo((object)message);
	}

	internal static void LogWarning(string message)
	{
		_logger.LogWarning((object)message);
	}

	internal static void LogError(string message)
	{
		_logger.LogError((object)message);
	}

	private void Awake()
	{
		if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
		{
			Object.Destroy((Object)(object)((Component)this).gameObject);
			return;
		}
		Instance = this;
		_logger = ((BaseUnityPlugin)this).Logger;
		((MonoBehaviour)this).StartCoroutine(AssetLoader.LoadAssets());
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.raddude.climate");
		SceneManager.sceneLoaded += AddShopItems.SceneLoaded;
	}
}
internal class PressurePatches
{
	[HarmonyPatch(typeof(WeatherStorms), "GetNormalizedDistance")]
	private class GetNormalizedDistancePatch
	{
		public static void Postfix(float __result, WanderingStorm ___currentStorm, float ___currentStormRange)
		{
			if (GameState.playing)
			{
				PressureService.NormalizedDistanceToStorm = __result;
				float radius = ___currentStorm.GetRadius();
				if (PressureService.CurrentStormRadius != radius)
				{
					PressureService.CurrentStormRadius = radius;
				}
				if (PressureService.CurrentStormRange != ___currentStormRange)
				{
					PressureService.CurrentStormRange = ___currentStormRange;
				}
			}
		}
	}
}
internal class PrefabLoadingPatches
{
	[HarmonyPatch(typeof(PrefabsDirectory), "PopulateShipItems")]
	internal class PrefabDirectoryPatches
	{
		public static void Prefix(PrefabsDirectory __instance)
		{
			if (__instance.directory.Length <= 823)
			{
				Array.Resize(ref __instance.directory, 823);
			}
			__instance.directory[820] = Items.Barometer;
			__instance.directory[821] = Items.Thermometer;
			__instance.directory[822] = Items.Hygrometer;
		}
	}

	private const int NEW_PREFAB_DIR_SIZE = 823;
}
internal class AddShopItems
{
	internal static void SceneLoaded(Scene scene, LoadSceneMode _)
	{
		if (((Scene)(ref scene)).name == "island 1 A Gold Rock")
		{
			GoldRockCity();
		}
		if (((Scene)(ref scene)).name == "island 15 M (Fort)")
		{
			FortAestrin();
		}
		if (((Scene)(ref scene)).name == "island 9 E Dragon Cliffs")
		{
			DragonCliffs();
		}
	}

	internal static void GoldRockCity()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0110: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.Find("island 1 A (gold rock) scenery");
		if ((Object)(object)val == (Object)null)
		{
			Climate_Plugin.LogError("Gold Rock City scenery not found.");
			return;
		}
		MoveShopItem("shop item (221)", val.transform, new Vector3(1524.367f, 7.13f, -385.224f), (Vector3?)new Vector3(0f, 129.6f, 0f));
		MakeShopItem("shop item 320", val.transform, new Vector3(1525.5f, 7.006f, -385.2f), new Vector3(90f, 241f, 0f), Items.Barometer);
		MakeShopItem("shop item 321", val.transform, new Vector3(1526f, 7.006f, -386.05f), new Vector3(90f, 245f, 0f), Items.Thermometer);
		MakeShopItem("shop item 322", val.transform, new Vector3(1526.7f, 7.006f, -386.76f), new Vector3(90f, 237f, 0f), Items.Hygrometer);
	}

	internal static void FortAestrin()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.Find("island 15 M (Fort) scenery");
		if ((Object)(object)val == (Object)null)
		{
			Climate_Plugin.LogError("Fort Aestrin scenery not found.");
			return;
		}
		MakeShopItem("shop item (320)", val.transform, new Vector3(-74.816f, 2.7f, 44.2995f), new Vector3(0f, 180f, 0f), Items.Barometer);
		MakeShopItem("shop item (321)", val.transform, new Vector3(-75.316f, 2.7f, 44.2995f), new Vector3(0f, 180f, 0f), Items.Thermometer);
		MakeShopItem("shop item (322)", val.transform, new Vector3(-75.816f, 2.7f, 44.2995f), new Vector3(0f, 180f, 0f), Items.Hygrometer);
	}

	internal static void DragonCliffs()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0174: Unknown result type (might be due to invalid IL or missing references)
		//IL_0188: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0204: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = GameObject.Find("island 9 E (dragon cliffs) scenery");
		if ((Object)(object)val == (Object)null)
		{
			Climate_Plugin.LogError("Dragon Cliffs scenery not found.");
			return;
		}
		MoveShopItem("shop item spawner (101)", val.transform, new Vector3(-89.108f, 4.507f, -543.922f));
		MoveShopItem("shop item spawner (165)", val.transform, new Vector3(-88.906f, 4.5156f, -544.329f));
		MoveShopItem("shop item spawner (168)", val.transform, new Vector3(-90.455f, 4.489f, -542.922f));
		MoveShopItem("shop item spawner (60)", val.transform, new Vector3(-91.1984f, 4.453f, -542.0734f));
		MoveShopItem("shop item spawner (163)", val.transform, new Vector3(-91.05f, 4.513f, -542.25f));
		Transform val2 = val.GetComponentsInChildren<Transform>()?.FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name == "shop item spawner (71)"));
		if ((Object)(object)val2 != (Object)null)
		{
			((Component)val2).gameObject.SetActive(false);
		}
		MakeShopItem("shop item spawner (320)", val.transform, new Vector3(-89.268f, 4.477f, -544.36f), new Vector3(80f, 230f, 0f), Items.Barometer);
		MakeShopItem("shop item spawner (321)", val.transform, new Vector3(-90.7f, 4.455f, -542.58f), new Vector3(65f, 230f, 0f), Items.Thermometer);
		MakeShopItem("shop item spawner (322)", val.transform, new Vector3(-90.95f, 4.505f, -542.78f), new Vector3(70f, 230f, 0f), Items.Hygrometer);
	}

	private static void MakeShopItem(string name, Transform parent, Vector3 position, Vector3 rotation, GameObject go)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = new GameObject(name);
		val.transform.parent = parent;
		val.transform.localPosition = position;
		val.transform.localRotation = Quaternion.Euler(rotation);
		MeshFilter val2 = val.AddComponent<MeshFilter>();
		val2.mesh = go.GetComponent<MeshFilter>().mesh;
		val.AddComponent<MeshRenderer>();
		ShopItemSpawner val3 = val.AddComponent<ShopItemSpawner>();
		val3.itemPrefab = go;
	}

	private static void MoveShopItem(string name, Transform parent, Vector3 position, Vector3? rotation = null)
	{
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		Transform val = ((Component)parent).GetComponentsInChildren<Transform>()?.FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name == name));
		if ((Object)(object)val != (Object)null)
		{
			val.localPosition = position;
			if (rotation.HasValue)
			{
				val.localRotation = Quaternion.Euler(rotation.Value);
			}
		}
	}
}
public class ShipItemBarometer : ShipItem
{
	[SerializeField]
	private Transform needle;

	private float minAngle;

	private float maxAngle;

	private float smoothedAngle;

	private float smoothingK;

	public override void OnLoad()
	{
		needle = (from t in ((Component)this).gameObject.GetComponentsInChildren<Transform>(true)
			where ((Object)t).name == "Needle"
			select t).FirstOrDefault();
		minAngle = -118f;
		maxAngle = 240f;
		smoothingK = -6f;
	}

	public override void ExtraLateUpdate()
	{
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)needle == (Object)null))
		{
			float num = Mathf.Lerp(minAngle, maxAngle, PressureService.GetNormalizedPressure());
			smoothedAngle = Mathf.Lerp(smoothedAngle, num, 1f - Mathf.Exp(smoothingK * Time.deltaTime));
			needle.localRotation = Quaternion.Euler(smoothedAngle, -90f, 90f);
		}
	}
}
public class ShipItemHygrometer : ShipItem
{
	public Transform needle;

	private float minAngle;

	private float maxAngle;

	private float smoothingK;

	private float sampleInterval;

	private float humidity;

	private float smoothedAngle;

	private float sampleTimer;

	public override void OnLoad()
	{
		needle = (from t in ((Component)this).gameObject.GetComponentsInChildren<Transform>(true)
			where ((Object)t).name == "Needle"
			select t).FirstOrDefault();
		minAngle = -45f;
		maxAngle = 225f;
		smoothingK = -2f;
		sampleInterval = 1f;
		SampleHumidity();
	}

	public override void ExtraLateUpdate()
	{
		sampleTimer += Time.deltaTime;
		if (sampleTimer >= sampleInterval)
		{
			sampleTimer = 0f;
			SampleHumidity();
		}
		UpdateNeedle();
	}

	private void SampleHumidity()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		Vector3 globeCoords = FloatingOriginManager.instance.GetGlobeCoords(((Component)this).transform);
		humidity = HumidityService.GetRelativeHumidity(globeCoords, Sun.sun.localTime, GameState.day);
	}

	private void UpdateNeedle()
	{
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)needle == (Object)null))
		{
			float num = Mathf.Lerp(minAngle, maxAngle, humidity);
			smoothedAngle = Mathf.Lerp(smoothedAngle, num, 1f - Mathf.Exp(smoothingK * Time.deltaTime));
			needle.localRotation = Quaternion.Euler(smoothedAngle, -90f, 90f);
		}
	}
}
public class ShipItemThermometer : ShipItem
{
	private Transform needle;

	private float minAngle;

	private float maxAngle;

	private float smoothingK;

	private float sampleInterval;

	private float temperature;

	private float smoothedAngle;

	private float sampleTimer;

	public override void OnLoad()
	{
		needle = (from t in ((Component)this).gameObject.GetComponentsInChildren<Transform>(true)
			where ((Object)t).name == "Needle"
			select t).FirstOrDefault();
		minAngle = -45f;
		maxAngle = 225f;
		smoothingK = -2f;
		sampleInterval = 1f;
		SampleTemp();
	}

	public override void ExtraLateUpdate()
	{
		sampleTimer += Time.deltaTime;
		if (sampleTimer >= sampleInterval)
		{
			sampleTimer = 0f;
			SampleTemp();
		}
		UpdateNeedle();
	}

	private void SampleTemp()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		Vector3 globeCoords = FloatingOriginManager.instance.GetGlobeCoords(((Component)this).transform);
		temperature = TemperatureService.GetNormalizedTemperature(globeCoords, Sun.sun.localTime, GameState.day);
	}

	private void UpdateNeedle()
	{
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)needle == (Object)null))
		{
			float num = Mathf.Lerp(minAngle, maxAngle, temperature);
			smoothedAngle = Mathf.Lerp(smoothedAngle, num, 1f - Mathf.Exp(smoothingK * Time.deltaTime));
			needle.localRotation = Quaternion.Euler(smoothedAngle, -90f, 90f);
		}
	}
}
internal static class DewPointService
{
	private const float NoiseAmplitude = 3f;

	internal static float GetDewPoint(Vector3 coords, int day)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		ClimateProfile profile = ClimateZones.GetProfile(coords);
		float num = ClimateZones.GetSeasonalFactor(day) * profile.seasonalDewAmplitude;
		float num2 = (Mathf.PerlinNoise((float)day * 0.1f, profile.dewNoiseSeed) - 0.5f) * 2f * 3f;
		return profile.baseDew + num + num2;
	}
}
internal static class HumidityService
{
	internal static float GetRelativeHumidity(Vector3 coords, float time, int day)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		float temperature = TemperatureService.GetTemperature(coords, time, day);
		float dewPoint = DewPointService.GetDewPoint(coords, day);
		dewPoint = Mathf.Min(dewPoint, temperature);
		return Mathf.Clamp(MagnusRH(temperature, dewPoint), 0.05f, 1f);
	}

	private static float MagnusRH(float temp, float dew)
	{
		float num = Mathf.Exp(17.625f * dew / (243.04f + dew));
		float num2 = Mathf.Exp(17.625f * temp / (243.04f + temp));
		return num / num2;
	}
}
internal class PressureService
{
	internal static float CurrentStormRadius { get; set; }

	internal static float NormalizedDistanceToStorm { get; set; }

	internal static float CurrentStormRange { get; set; }

	internal static float GetPressure()
	{
		if (NormalizedDistanceToStorm >= 1f)
		{
			float num = Mathf.Clamp01((WeatherStorms.currentStormDistance - CurrentStormRadius - CurrentStormRange) / 12000f);
			return Mathf.Lerp(29.7f, 31.9f, num);
		}
		if (NormalizedDistanceToStorm <= 0f)
		{
			float num2 = Mathf.Clamp01(WeatherStorms.currentStormDistance / CurrentStormRadius);
			return Mathf.Lerp(26f, 27.65f, num2);
		}
		return Mathf.Lerp(27.65f, 29.7f, NormalizedDistanceToStorm);
	}

	internal static float GetNormalizedPressure()
	{
		float pressure = GetPressure();
		return Mathf.InverseLerp(26f, 31.9f, pressure);
	}

	internal static bool IsNearStorm()
	{
		return NormalizedDistanceToStorm < 0.68f;
	}
}
internal static class TemperatureService
{
	internal static float minTemp = -12.2222f;

	internal static float maxTemp = 46.1111f;

	private const float NoiseAmplitude = 3.8889f;

	private const float ReferenceLatitude = 31f;

	private const float ReferenceTemperature = 30f;

	private const float TempLatConversionFactor = 1.2f;

	internal static float GetTemperature(Vector3 coords, float time, int day)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		float num = 30f - (coords.z - 31f) * 1.2f;
		ClimateProfile profile = ClimateZones.GetProfile(coords);
		float num2 = ClimateZones.GetSeasonalFactor(day) * profile.seasonalTempAmplitude;
		float num3 = Mathf.Sin(time / 24f * (float)Math.PI * 2f - (float)Math.PI / 2f) * (profile.tempAmplitude / 2f);
		float num4 = (Mathf.PerlinNoise((float)day * 0.15f, profile.tempNoiseSeed) - 0.5f) * 2f * 3.8889f;
		float num5 = (PressureService.IsNearStorm() ? Mathf.Lerp(-5f, 0f, PressureService.GetNormalizedPressure()) : 0f);
		return num + num2 + num3 + num4 + num5;
	}

	internal static float GetNormalizedTemperature(Vector3 coords, float time, int day)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		float temperature = GetTemperature(coords, time, day);
		return Mathf.InverseLerp(minTemp, maxTemp, temperature);
	}
}
public class WeatherService
{
	public static float GetCurrentNormalizedPressure()
	{
		return PressureService.GetNormalizedPressure();
	}

	public static float GetCurrentPressureMb()
	{
		return ConvertInHgToMb(GetCurrentPressureInHg());
	}

	public static float GetCurrentPressureInHg()
	{
		return PressureService.GetPressure();
	}

	public static float GetNormalizedTemperature(Vector3 coords, float time, int day)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		ValidateTime(time);
		ValidateDay(day);
		return TemperatureService.GetNormalizedTemperature(coords, time, day);
	}

	public static float GetCurrentNormalizedTemperature(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return GetNormalizedTemperature(coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetTemperatureC(Vector3 coords, float time, int day)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		ValidateTime(time);
		ValidateDay(day);
		return TemperatureService.GetTemperature(coords, time, day);
	}

	public static float GetCurrentTemperatureC(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return GetTemperatureC(coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetTemperatureF(Vector3 coords, float time, int day)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertCtoF(GetTemperatureC(coords, time, day));
	}

	public static float GetCurrentTemperatureF(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertCtoF(GetCurrentTemperatureC(coords));
	}

	public static float GetWindChillC(float windSpeedKnots, Vector3 coords, float time, int day)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetWindChillF(windSpeedKnots, coords, time, day));
	}

	public static float GetCurrentWindChillC(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetCurrentWindChillF(coords));
	}

	public static float GetWindChillF(float windSpeedKnots, Vector3 coords, float time, int day)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		ValidateWindSpeed(windSpeedKnots);
		ValidateTime(time);
		ValidateDay(day);
		float temperatureF = GetTemperatureF(coords, time, day);
		float num = ConvertKnotsToMph(windSpeedKnots);
		if (temperatureF > 50f || num < 3f)
		{
			return temperatureF;
		}
		return GetWindChill(temperatureF, num);
	}

	public static float GetCurrentWindChillF(Vector3 coords)
	{
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		return GetWindChillF(((Vector3)(ref Wind.currentWind)).magnitude, coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetHeatIndexC(Vector3 coords, float time, int day)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetHeatIndexF(coords, time, day));
	}

	public static float GetCurrentHeatIndexC(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetCurrentHeatIndexF(coords));
	}

	public static float GetHeatIndexF(Vector3 coords, float time, int day)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		ValidateTime(time);
		ValidateDay(day);
		float temperatureF = GetTemperatureF(coords, time, day);
		float num = HumidityService.GetRelativeHumidity(coords, time, day) * 100f;
		if (temperatureF < 80f || num < 40f)
		{
			return temperatureF;
		}
		return GetHeatIndex(temperatureF, num);
	}

	public static float GetCurrentHeatIndexF(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return GetHeatIndexF(coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetApparentTemperatureC(float windSpeedKnots, Vector3 coords, float time, int day)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetApparentTemperatureF(windSpeedKnots, coords, time, day));
	}

	public static float GetCurrentApparentTemperatureC(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertFtoC(GetCurrentApparentTemperatureF(coords));
	}

	public static float GetApparentTemperatureF(float windSpeedKnots, Vector3 coords, float time, int day)
	{
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		ValidateWindSpeed(windSpeedKnots);
		ValidateTime(time);
		ValidateDay(day);
		float temperatureF = GetTemperatureF(coords, time, day);
		float num = GetRelativeHumidity(coords, time, day) * 100f;
		float num2 = ConvertKnotsToMph(windSpeedKnots);
		if (temperatureF <= 50f && num2 >= 3f)
		{
			return GetWindChill(temperatureF, num2);
		}
		if (temperatureF >= 80f && num >= 40f)
		{
			return GetHeatIndex(temperatureF, num);
		}
		return temperatureF;
	}

	public static float GetCurrentApparentTemperatureF(Vector3 coords)
	{
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		return GetApparentTemperatureF(((Vector3)(ref Wind.currentWind)).magnitude, coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetRelativeHumidity(Vector3 coords, float time, int day)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		ValidateTime(time);
		ValidateDay(day);
		return HumidityService.GetRelativeHumidity(coords, time, day);
	}

	public static float GetCurrentRelativeHumidity(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return HumidityService.GetRelativeHumidity(coords, Sun.sun.localTime, GameState.day);
	}

	public static float GetDewPointC(Vector3 coords, int day)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		ValidateDay(day);
		return DewPointService.GetDewPoint(coords, day);
	}

	public static float GetCurrentDewPointC(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return GetDewPointC(coords, GameState.day);
	}

	public static float GetDewPointF(Vector3 coords, int day)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertCtoF(GetDewPointC(coords, day));
	}

	public static float GetCurrentDewPointF(Vector3 coords)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		return ConvertCtoF(GetCurrentDewPointC(coords));
	}

	private static void ValidateTime(float time)
	{
		if (time < 0f || time > 24f)
		{
			throw new ArgumentOutOfRangeException("time", time, "Time must be between 0 and 24 hours (inclusive).");
		}
	}

	private static void ValidateDay(int day)
	{
		if (day < 0)
		{
			throw new ArgumentOutOfRangeException("day", day, "Day must be non-negative.");
		}
	}

	private static void ValidateWindSpeed(float windSpeedKnots)
	{
		if (windSpeedKnots < 0f)
		{
			throw new ArgumentOutOfRangeException("windSpeedKnots", windSpeedKnots, "Wind speed cannot be negative.");
		}
	}

	private static float GetWindChill(float tempF, float windSpeedMph)
	{
		return 35.74f + 0.6215f * tempF - 35.75f * Mathf.Pow(windSpeedMph, 0.16f) + 0.4275f * tempF * Mathf.Pow(windSpeedMph, 0.16f);
	}

	private static float GetHeatIndex(float tempF, float humidity)
	{
		return -42.379f + 2.0490153f * tempF + 10.143332f * humidity - 0.2247554f * tempF * humidity - 0.00683783f * tempF * tempF - 0.05481717f * humidity * humidity + 0.00122874f * tempF * tempF * humidity + 0.00085282f * tempF * humidity * humidity - 1.99E-06f * tempF * tempF * humidity * humidity;
	}

	private static float ConvertCtoF(float tempC)
	{
		return tempC * 9f / 5f + 32f;
	}

	private static float ConvertFtoC(float tempF)
	{
		return (tempF - 32f) * 5f / 9f;
	}

	private static float ConvertKnotsToMph(float knots)
	{
		return knots * 1.150779f;
	}

	private static float ConvertInHgToMb(float inHg)
	{
		return inHg * 33.8639f;
	}
}
internal class AssetLoader
{
	private static readonly List<string> assetPaths = new List<string>
	{
		Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)Climate_Plugin.Instance).Info.Location), "Assets"),
		Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)Climate_Plugin.Instance).Info.Location))
	};

	public static string FindAssetPath(string fileName)
	{
		foreach (string assetPath in assetPaths)
		{
			string text = Path.Combine(assetPath, fileName);
			if (File.Exists(text))
			{
				return text;
			}
		}
		return null;
	}

	internal static IEnumerator LoadAssets()
	{
		Climate_Plugin.LogDebug("Loading bundle");
		string bundlePath = FindAssetPath("meteorology_tools");
		if (string.IsNullOrEmpty(bundlePath))
		{
			Climate_Plugin.LogError("Asset bundle not found");
			yield break;
		}
		AssetBundleCreateRequest assetBundleRequest = AssetBundle.LoadFromFileAsync(bundlePath);
		yield return assetBundleRequest;
		AssetBundle assetBundle = assetBundleRequest.assetBundle;
		if ((Object)(object)assetBundle == (Object)null)
		{
			Climate_Plugin.LogError("Failed to load " + bundlePath);
		}
		AssetBundleRequest request = assetBundle.LoadAllAssetsAsync();
		yield return request;
		Object? obj = ((IEnumerable<Object>)request.allAssets).FirstOrDefault((Func<Object, bool>)((Object a) => a.name == "barometer"));
		Items.Barometer = (GameObject)(object)((obj is GameObject) ? obj : null);
		Object? obj2 = ((IEnumerable<Object>)request.allAssets).FirstOrDefault((Func<Object, bool>)((Object a) => a.name == "thermometer"));
		Items.Thermometer = (GameObject)(object)((obj2 is GameObject) ? obj2 : null);
		Object? obj3 = ((IEnumerable<Object>)request.allAssets).FirstOrDefault((Func<Object, bool>)((Object a) => a.name == "hygrometer"));
		Items.Hygrometer = (GameObject)(object)((obj3 is GameObject) ? obj3 : null);
		if ((Object)(object)Items.Barometer == (Object)null || (Object)(object)Items.Thermometer == (Object)null || (Object)(object)Items.Hygrometer == (Object)null)
		{
			Climate_Plugin.LogError("Failed to load all required assets from the bundle");
			yield break;
		}
		Climate_Plugin.LogInfo("Assets loaded");
		Items.Initialize();
	}
}
public readonly struct ClimateProfile
{
	public readonly float tempAmplitude;

	public readonly float baseDew;

	public readonly float seasonalTempAmplitude;

	public readonly float seasonalDewAmplitude;

	public readonly float tempNoiseSeed;

	public readonly float dewNoiseSeed;

	public ClimateProfile(float tempAmplitude, float baseDew, float seasonalTempAmplitude, float seasonalDewAmplitude)
	{
		this.tempAmplitude = tempAmplitude;
		this.baseDew = baseDew;
		this.seasonalTempAmplitude = seasonalTempAmplitude;
		this.seasonalDewAmplitude = seasonalDewAmplitude;
		tempNoiseSeed = seasonalTempAmplitude * 11.3f + tempAmplitude * 4.9f;
		dewNoiseSeed = seasonalDewAmplitude * 8.6f + baseDew * 3.4f;
	}
}
public static class ClimateZones
{
	public static readonly ClimateProfile AlAnkh = new ClimateProfile(16f, -2f, 6f, 2f);

	public static readonly ClimateProfile Emerald = new ClimateProfile(3f, 26f, 1.5f, 1f);

	public static readonly ClimateProfile Aestrin = new ClimateProfile(6f, 8f, 8f, 6f);

	private const float buffer = 1f;

	private const float AlAnkhLon = -0.18f;

	private const float AestrinLat = 36f;

	private const float DaysPerYear = 365f;

	private const int PeakDay = 172;

	public static ClimateProfile GetProfile(Vector3 coords)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		float z = coords.z;
		float x = coords.x;
		ClimateProfile climateProfile;
		if (!(x > -1.1800001f) || !(x < 0.82f))
		{
			climateProfile = ((!(x < -0.18f)) ? Emerald : AlAnkh);
		}
		else
		{
			float t = Mathf.InverseLerp(-1.1800001f, 0.82f, x);
			climateProfile = Lerp(AlAnkh, Emerald, t);
		}
		if (z > 35f && z < 37f)
		{
			float t2 = Mathf.InverseLerp(35f, 37f, z);
			return Lerp(climateProfile, Aestrin, t2);
		}
		return (z > 36f) ? Aestrin : climateProfile;
	}

	private static ClimateProfile Lerp(ClimateProfile a, ClimateProfile b, float t)
	{
		return new ClimateProfile(Mathf.Lerp(a.tempAmplitude, b.tempAmplitude, t), Mathf.Lerp(a.baseDew, b.baseDew, t), Mathf.Lerp(a.seasonalTempAmplitude, b.seasonalTempAmplitude, t), Mathf.Lerp(a.seasonalDewAmplitude, b.seasonalDewAmplitude, t));
	}

	internal static float GetSeasonalFactor(int day)
	{
		int num = day % 365;
		return Mathf.Cos((float)Math.PI * 2f * (float)(num - 172) / 365f);
	}
}
internal class Items
{
	public static GameObject Barometer { get; internal set; }

	public static GameObject Thermometer { get; internal set; }

	public static GameObject Hygrometer { get; internal set; }

	internal static void InitializeBarometer()
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		ShipItemBarometer shipItemBarometer = Barometer.AddComponent<ShipItemBarometer>();
		((PickupableItem)shipItemBarometer).holdDistance = 0.82f;
		((PickupableItem)shipItemBarometer).furniturePlaceHeight = 0.15f;
		((ShipItem)shipItemBarometer).mass = 1f;
		((ShipItem)shipItemBarometer).value = 600;
		((ShipItem)shipItemBarometer).name = "barometer";
		((ShipItem)shipItemBarometer).category = (TransactionCategory)3;
		((ShipItem)shipItemBarometer).inventoryScale = 1f;
		((ShipItem)shipItemBarometer).inventoryRotation = 180f;
		((ShipItem)shipItemBarometer).floaterHeight = 1.6f;
		((ShipItem)shipItemBarometer).wallAttachment = true;
	}

	internal static void InitializeThermometer()
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		ShipItemThermometer shipItemThermometer = Thermometer.AddComponent<ShipItemThermometer>();
		((PickupableItem)shipItemThermometer).holdDistance = 0.82f;
		((PickupableItem)shipItemThermometer).furniturePlaceHeight = 0.15f;
		((ShipItem)shipItemThermometer).mass = 1f;
		((ShipItem)shipItemThermometer).value = 600;
		((ShipItem)shipItemThermometer).name = "thermometer";
		((ShipItem)shipItemThermometer).category = (TransactionCategory)3;
		((ShipItem)shipItemThermometer).inventoryScale = 1f;
		((ShipItem)shipItemThermometer).inventoryRotation = 180f;
		((ShipItem)shipItemThermometer).floaterHeight = 1.6f;
		((ShipItem)shipItemThermometer).wallAttachment = true;
	}

	internal static void InitializeHygrometer()
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		ShipItemHygrometer shipItemHygrometer = Hygrometer.AddComponent<ShipItemHygrometer>();
		((PickupableItem)shipItemHygrometer).holdDistance = 0.82f;
		((PickupableItem)shipItemHygrometer).furniturePlaceHeight = 0.15f;
		((ShipItem)shipItemHygrometer).mass = 1f;
		((ShipItem)shipItemHygrometer).value = 600;
		((ShipItem)shipItemHygrometer).name = "hygrometer";
		((ShipItem)shipItemHygrometer).category = (TransactionCategory)3;
		((ShipItem)shipItemHygrometer).inventoryScale = 1f;
		((ShipItem)shipItemHygrometer).inventoryRotation = 180f;
		((ShipItem)shipItemHygrometer).floaterHeight = 1.6f;
		((ShipItem)shipItemHygrometer).wallAttachment = true;
	}

	internal static void Initialize()
	{
		InitializeBarometer();
		InitializeThermometer();
		InitializeHygrometer();
	}
}