using NewHorizons.Utility; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace NewHorizons.External.Modules { [JsonObject] public class VolumesModule { /// /// Add audio volumes to this planet. /// public AudioVolumeInfo[] audioVolumes; /// /// Add destruction volumes to this planet. /// public DestructionVolumeInfo[] destructionVolumes; /// /// Add fluid volumes to this planet. /// public FluidVolumeInfo[] fluidVolumes; /// /// Add hazard volumes to this planet. /// public HazardVolumeInfo[] hazardVolumes; /// /// Add interference volumes to this planet. /// public VolumeInfo[] interferenceVolumes; /// /// Add insulating volumes to this planet. These will stop electricty hazard volumes from affecting you (just like the jellyfish). /// public VolumeInfo[] insulatingVolumes; /// /// Add map restriction volumes to this planet. /// public VolumeInfo[] mapRestrictionVolumes; /// /// Add notification volumes to this planet. /// public NotificationVolumeInfo[] notificationVolumes; /// /// Add oxygen volumes to this planet. /// public OxygenVolumeInfo[] oxygenVolumes; /// /// Add probe-specific volumes to this planet. /// public ProbeModule probe; /// /// Add triggers that reveal parts of the ship log on this planet. /// public RevealVolumeInfo[] revealVolumes; /// /// Add reverb volumes to this planet. Great for echoes in caves. /// public VolumeInfo[] reverbVolumes; /// /// Add zero-gravity volumes to this planet. /// Good for surrounding planets which are using a static position to stop the player being pulled away. /// public PriorityVolumeInfo[] zeroGravityVolumes; /// /// Add visor effect volumes to this planet. /// public VisorEffectModule visorEffects; [JsonObject] public class VolumeInfo { /// /// The location of this volume. Optional (will default to 0,0,0). /// public MVector3 position; /// /// The radius of this volume. /// [DefaultValue(1f)] public float radius = 1f; /// /// The relative path from the planet to the parent of this object. Optional (will default to the root sector). /// public string parentPath; /// /// An optional rename of this volume. /// public string rename; } [JsonObject] public class PriorityVolumeInfo : VolumeInfo { /// /// The layer of this volume. /// [DefaultValue(0)] public int layer = 0; /// /// The priority for this volume's effects to be applied. /// Ex, a player in a gravity volume with priority 0, and zero-gravity volume with priority 1, will feel zero gravity. /// [DefaultValue(1)] public int priority = 1; } [JsonObject] public class RevealVolumeInfo : VolumeInfo { [JsonConverter(typeof(StringEnumConverter))] public enum RevealVolumeType { [EnumMember(Value = @"enter")] Enter = 0, [EnumMember(Value = @"observe")] Observe = 1, [EnumMember(Value = @"snapshot")] Snapshot = 2 } [JsonConverter(typeof(StringEnumConverter))] public enum EnterType { [EnumMember(Value = @"both")] Both = 0, [EnumMember(Value = @"player")] Player = 1, [EnumMember(Value = @"probe")] Probe = 2 } /// /// The max view angle (in degrees) the player can see the volume with to unlock the fact (`observe` only) /// [DefaultValue(180f)] public float maxAngle = 180f; // Observe Only /// /// The max distance the user can be away from the volume to reveal the fact (`snapshot` and `observe` only) /// [DefaultValue(-1f)] public float maxDistance = -1f; // Snapshot & Observe Only /// /// What needs to be done to the volume to unlock the facts /// [DefaultValue("enter")] public RevealVolumeType revealOn = RevealVolumeType.Enter; /// /// What can enter the volume to unlock the facts (`enter` only) /// [DefaultValue("both")] public EnterType revealFor = EnterType.Both; /// /// A list of facts to reveal /// public string[] reveals; /// /// An achievement to unlock. Optional. /// public string achievementID; } [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 } [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; [JsonConverter(typeof(StringEnumConverter))] public enum DeathType { [EnumMember(Value = @"default")] Default, [EnumMember(Value = @"impact")] Impact, [EnumMember(Value = @"asphyxiation")] Asphyxiation, [EnumMember(Value = @"energy")] Energy, [EnumMember(Value = @"supernova")] Supernova, [EnumMember(Value = @"digestion")] Digestion, [EnumMember(Value = @"bigBang")] BigBang, [EnumMember(Value = @"crushed")] Crushed, [EnumMember(Value = @"meditation")] Meditation, [EnumMember(Value = @"timeLoop")] TimeLoop, [EnumMember(Value = @"lava")] Lava, [EnumMember(Value = @"blackHole")] BlackHole, [EnumMember(Value = @"dream")] Dream, [EnumMember(Value = @"dreamExplosion")] DreamExplosion, [EnumMember(Value = @"crushedByElevator")] CrushedByElevator } } [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.1f)] public float frostRate = 0.1f; /// /// The maximum strength of frost this volume can give /// [Range(0f, 1f)] [DefaultValue(0.5f)] public float maxFrost = 0.5f; } [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; } } } [JsonConverter(typeof(StringEnumConverter))] public enum ClipSelectionType { [EnumMember(Value = @"random")] RANDOM, [EnumMember(Value = @"sequential")] SEQUENTIAL, [EnumMember(Value = @"manual")] MANUAL } [JsonConverter(typeof(StringEnumConverter))] public enum AudioMixerTrackName { [EnumMember(Value = @"undefined")] Undefined = 0, [EnumMember(Value = @"menu")] Menu = 1, [EnumMember(Value = @"music")] Music = 2, [EnumMember(Value = @"environment")] Environment = 4, [EnumMember(Value = @"environmentUnfiltered")] Environment_Unfiltered = 5, [EnumMember(Value = @"endTimesSfx")] EndTimes_SFX = 8, [EnumMember(Value = @"signal")] Signal = 16, [EnumMember(Value = @"death")] Death = 32, [EnumMember(Value = @"player")] Player = 64, [EnumMember(Value = @"playerExternal")] Player_External = 65, [EnumMember(Value = @"ship")] Ship = 128, [EnumMember(Value = @"map")] Map = 256, [EnumMember(Value = @"endTimesMusic")] EndTimes_Music = 512, [EnumMember(Value = @"muffleWhileRafting")] MuffleWhileRafting = 1024, [EnumMember(Value = @"muffleIndoors")] MuffleIndoors = 2048, [EnumMember(Value = @"slideReelMusic")] SlideReelMusic = 4096, } }