using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;
using NewHorizons.Utility;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace NewHorizons.External.Modules
{
[JsonConverter(typeof(StringEnumConverter))]
public enum FluidType
{
[EnumMember(Value = @"none")] None = 0,
[EnumMember(Value = @"water")] Water = 1,
[EnumMember(Value = @"cloud")] Cloud = 2,
[EnumMember(Value = @"sand")] Sand = 3,
[EnumMember(Value = @"plasma")] Plasma = 4
}
[JsonConverter(typeof(StringEnumConverter))]
public enum CloudPrefabType
{
[EnumMember(Value = @"giantsDeep")] GiantsDeep = 0,
[EnumMember(Value = @"quantumMoon")] QuantumMoon = 1,
[EnumMember(Value = @"basic")] Basic = 2,
}
[JsonObject]
public class AtmosphereModule
{
///
/// Colour of atmospheric shader on the planet.
///
public MColor atmosphereTint;
///
/// How intense should the sun appear in the sky.
/// Also affects general atmosphere brightness.
/// Default value of 1 matches Timber Hearth.
/// If not set, this will be determined based off the distance to the sun.
///
[Range(0f, double.MaxValue)]
public float atmosphereSunIntensity;
///
/// Describes the clouds in the atmosphere
///
public CloudInfo clouds;
///
/// How dense the fog is, if you put fog.
///
[Range(0f, 1f)] public float fogDensity;
///
/// Radius of fog sphere, independent of the atmosphere. This has to be set for there to be fog.
///
[Range(0f, double.MaxValue)] public float fogSize;
///
/// Colour of fog on the planet, if you put fog.
///
public MColor fogTint;
///
/// Lets you survive on the planet without a suit.
///
public bool hasOxygen;
///
/// Does this planet have trees? This will change the "Oxygen tank refilled" to "Trees detected, oxygen tank refilled".
///
public bool hasTrees;
///
/// Does this planet have rain?
///
public bool hasRain;
///
/// Does this planet have snow?
///
public bool hasSnow;
///
/// Scale height of the atmosphere
///
public float size;
///
/// Whether we use an atmospheric shader on the planet. Doesn't affect clouds, fog, rain, snow, oxygen, etc. Purely
/// visual.
///
public bool useAtmosphereShader;
///
/// Whether this atmosphere will have flames appear when your ship goes a certain speed.
///
[DefaultValue(true)] public bool hasShockLayer = true;
///
/// Minimum speed that your ship can go in the atmosphere where flames will appear.
///
[DefaultValue(100f)] public float minShockSpeed = 100f;
///
/// Maximum speed that your ship can go in the atmosphere where flames will appear at their brightest.
///
[DefaultValue(300f)] public float maxShockSpeed = 300f;
[JsonObject]
public class CloudInfo
{
///
/// Should these clouds be based on Giant's Deep's banded clouds, or the Quantum Moon's non-banded clouds?
///
public CloudPrefabType cloudsPrefab;
///
/// Relative filepath to the cloud cap texture, if the planet has clouds.
///
public string capPath;
///
/// Fluid type for sounds/effects when colliding with this cloud.
///
[DefaultValue("cloud")] public FluidType fluidType = FluidType.Cloud;
///
/// Add lightning to this planet like on Giant's Deep.
///
public bool hasLightning;
///
/// Radius from the center to the inner layer of the clouds.
///
public float innerCloudRadius;
///
/// Colour gradient of the lightning, time is in seconds.
///
public MGradient[] lightningGradient;
///
/// Radius from the center to the outer layer of the clouds.
///
public float outerCloudRadius;
///
/// Relative filepath to the cloud ramp texture, if the planet has clouds. If you don't put anything here it will be
/// auto-generated.
///
public string rampPath;
///
/// Relative filepath to the cloud texture, if the planet has clouds.
///
public string texturePath;
///
/// Colour of the inner cloud layer.
///
public MColor tint;
///
/// If the top layer shouldn't have shadows. Set to true if you're making a brown dwarf for example.
///
public bool unlit;
///
/// How fast the clouds will rotate relative to the planet in degrees per second.
///
[DefaultValue(0f)] public float rotationSpeed = 0f;
#region Obsolete
///
/// Set to `false` in order to use Giant's Deep's shader. Set to `true` to just apply the cloud texture as is.
///
[Obsolete("useBasicCloudShader is deprecated, please use cloudsPrefab=\"basic\" instead")]
public bool useBasicCloudShader;
#endregion Obsolete
}
#region Obsolete
[Obsolete("CloudTint is deprecated, please use CloudInfo instead")]
public MColor cloudTint;
[Obsolete("CloudTint is deprecated, please use CloudInfo instead")]
public string cloud;
[Obsolete("CloudCap is deprecated, please use CloudInfo instead")]
public string cloudCap;
[Obsolete("CloudRamp is deprecated, please use CloudInfo instead")]
public string cloudRamp;
[Obsolete("FluidType is deprecated, please use CloudInfo instead")]
public FluidType fluidType;
[Obsolete("UseBasicCloudShader is deprecated, please use CloudInfo instead")]
public bool useBasicCloudShader;
[DefaultValue(true)] [Obsolete("ShadowsOnClouds is deprecated, please use CloudInfo instead")]
public bool shadowsOnClouds = true;
[Obsolete("HasAtmosphere is deprecated, please use UseAtmosphereShader instead")]
public bool hasAtmosphere;
#endregion Obsolete
}
}