using NewHorizons.External.Modules.Audio; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; namespace NewHorizons.External.Modules.Volumes { [JsonObject] public class VolumeInfo : GeneralPointPropInfo { /// /// The radius of this volume. /// [DefaultValue(1f)] public float radius = 1f; } [JsonObject] public class AudioVolumeInfo : PriorityVolumeInfo { /// /// The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list. /// public string audio; [DefaultValue("random")] public ClipSelectionType clipSelection = ClipSelectionType.RANDOM; /// /// The audio track of this audio volume /// [DefaultValue("environment")] public AudioMixerTrackName track = AudioMixerTrackName.Environment; /// /// Whether to loop this audio while in this audio volume or just play it once /// [DefaultValue(true)] public bool loop = true; /// /// The loudness of the audio /// [Range(0f, 1f)] [DefaultValue(1f)] public float volume = 1f; /// /// How long it will take to fade this sound in and out when entering/exiting this volume. /// [DefaultValue(2f)] public float fadeSeconds = 2f; /// /// Play the sound instantly without any fading. /// public bool noFadeFromBeginning; /// /// Randomize what time the audio starts at. /// public bool randomizePlayhead; /// /// Pause the music when exiting the volume. /// public bool pauseOnFadeOut; } [JsonObject] public class NotificationVolumeInfo : VolumeInfo { /// /// What the notification will show for. /// [DefaultValue("all")] public NotificationTarget target = NotificationTarget.All; /// /// The notification that will play when you enter this volume. /// public NotificationInfo entryNotification; /// /// The notification that will play when you exit this volume. /// public NotificationInfo exitNotification; [JsonObject] public class NotificationInfo { /// /// The message that will be displayed. /// public string displayMessage; /// /// The duration this notification will be displayed. /// [DefaultValue(5f)] public float duration = 5f; } [JsonConverter(typeof(StringEnumConverter))] public enum NotificationTarget { [EnumMember(Value = @"all")] All = 0, [EnumMember(Value = @"ship")] Ship = 1, [EnumMember(Value = @"player")] Player = 2, } } [JsonObject] public class HazardVolumeInfo : VolumeInfo { /// /// The type of hazard for this volume. /// [DefaultValue("general")] public HazardType type = HazardType.GENERAL; /// /// The amount of damage you will take per second while inside this volume. /// [DefaultValue(10f)] public float damagePerSecond = 10f; /// /// The type of damage you will take when you first touch this volume. /// [DefaultValue("impact")] public InstantDamageType firstContactDamageType = InstantDamageType.Impact; /// /// The amount of damage you will take when you first touch this volume. /// public float firstContactDamage; [JsonConverter(typeof(StringEnumConverter))] public enum HazardType { [EnumMember(Value = @"none")] NONE = 0, [EnumMember(Value = @"general")] GENERAL = 1, [EnumMember(Value = @"ghostMatter")] DARKMATTER = 2, [EnumMember(Value = @"heat")] HEAT = 4, [EnumMember(Value = @"fire")] FIRE = 8, [EnumMember(Value = @"sandfall")] SANDFALL = 16, [EnumMember(Value = @"electricity")] ELECTRICITY = 32, [EnumMember(Value = @"rapids")] RAPIDS = 64, [EnumMember(Value = @"riverHeat")] RIVERHEAT = 128, } [JsonConverter(typeof(StringEnumConverter))] public enum InstantDamageType { [EnumMember(Value = @"impact")] Impact, [EnumMember(Value = @"puncture")] Puncture, [EnumMember(Value = @"electrical")] Electrical } } [JsonObject] public class VanishVolumeInfo : VolumeInfo { /// /// Whether the bodies will shrink when they enter this volume or just disappear instantly. /// [DefaultValue(true)] public bool shrinkBodies = true; /// /// Whether this volume only affects the player and ship. /// public bool onlyAffectsPlayerAndShip; } [JsonObject] public class DestructionVolumeInfo : VanishVolumeInfo { /// /// The type of death the player will have if they enter this volume. /// [DefaultValue("default")] public DeathType deathType = DeathType.Default; } [JsonObject] public class OxygenVolumeInfo : VolumeInfo { /// /// Does this volume contain trees? This will change the notification from "Oxygen tank refilled" to "Trees detected, oxygen tank refilled". /// public bool treeVolume; /// /// Whether to play the oxygen tank refill sound or just fill quietly. /// [DefaultValue(true)] public bool playRefillAudio = true; } [JsonObject] public class FluidVolumeInfo : PriorityVolumeInfo { /// /// Density of the fluid. The higher the density, the harder it is to go through this fluid. /// [DefaultValue(1.2f)] public float density = 1.2f; /// /// The type of fluid for this volume. /// public FluidType type; /// /// Should the player and rafts align to this fluid. /// [DefaultValue(true)] public bool alignmentFluid = true; /// /// Should the ship align to the fluid by rolling. /// public bool allowShipAutoroll; /// /// Disable this fluid volume immediately? /// public bool disableOnStart; [JsonConverter(typeof(StringEnumConverter))] public enum FluidType { [EnumMember(Value = @"none")] NONE = 0, [EnumMember(Value = @"air")] AIR, [EnumMember(Value = @"water")] WATER, [EnumMember(Value = @"cloud")] CLOUD, [EnumMember(Value = @"sand")] SAND, [EnumMember(Value = @"plasma")] PLASMA, [EnumMember(Value = @"fog")] FOG } } [JsonObject] public class ProbeModule { /// /// Add probe destruction volumes to this planet. These will delete your probe. /// public VolumeInfo[] destructionVolumes; /// /// Add probe safety volumes to this planet. These will stop the probe destruction volumes from working. /// public VolumeInfo[] safetyVolumes; } [JsonObject] public class VisorEffectModule { /// /// Add visor frost effect volumes to this planet. This is the ghost matter effect. /// public FrostEffectVolumeInfo[] frostEffectVolumes; /// /// Add visor rain effect volumes to this planet. You can see this on Giant's Deep. /// public RainEffectVolumeInfo[] rainEffectVolumes; [JsonObject] public class FrostEffectVolumeInfo : PriorityVolumeInfo { /// /// The rate at which the frost effect will get stronger /// [DefaultValue(0.5f)] public float frostRate = 0.5f; /// /// The maximum strength of frost this volume can give /// [Range(0f, 1f)] [DefaultValue(0.91f)] public float maxFrost = 0.91f; } [JsonObject] public class RainEffectVolumeInfo : PriorityVolumeInfo { /// /// The rate at which the rain droplet effect will happen /// [DefaultValue(0.1f)] public float dropletRate = 10f; /// /// The rate at which the rain streak effect will happen /// [DefaultValue(1f)] public float streakRate = 1f; } } [JsonObject] public class RulesetModule { /// /// Add anti travel music rulesets to this planet. /// public VolumeInfo[] antiTravelMusicRulesets; /// /// Add player impact rulesets to this planet. /// public PlayerImpactRulesetInfo[] playerImpactRulesets; /// /// Add probe rulesets to this planet. /// public ProbeRulesetInfo[] probeRulesets; /// /// Add thrust rulesets to this planet. /// public ThrustRulesetInfo[] thrustRulesets; [JsonObject] public class PlayerImpactRulesetInfo : VolumeInfo { /// /// Minimum player impact speed. Player will take the minimum amount of damage if they impact something at this speed. /// [DefaultValue(20f)] public float minImpactSpeed = 20f; /// /// Maximum player impact speed. Players will die if they impact something at this speed. /// [DefaultValue(40f)] public float maxImpactSpeed = 40f; } [JsonObject] public class ProbeRulesetInfo : VolumeInfo { /// /// Should this ruleset override the probe's speed? /// public bool overrideProbeSpeed; /// /// The speed of the probe while in this ruleset volume. /// public float probeSpeed; /// /// Should this ruleset override the range of probe's light? /// public bool overrideLanternRange; /// /// The range of probe's light while in this ruleset volume. /// public float lanternRange; /// /// Stop the probe from attaching to anything while in this ruleset volume. /// public bool ignoreAnchor; } [JsonObject] public class ThrustRulesetInfo : VolumeInfo { /// /// Limit how fast you can fly with your ship while in this ruleset volume. /// [DefaultValue(float.PositiveInfinity)] public float thrustLimit = float.PositiveInfinity; /// /// Nerf the jetpack booster. /// public bool nerfJetpackBooster; /// /// How long the jetpack booster will be nerfed. /// [DefaultValue(0.5f)] public float nerfDuration = 0.5f; } } [JsonObject] public class SpeedTrapVolumeInfo : VolumeInfo { /// /// The speed the volume will slow you down to when you enter it. /// [DefaultValue(10f)] public float speedLimit = 10f; /// /// How fast it will slow down the player to the speed limit. /// [DefaultValue(3f)] public float acceleration = 3f; } }