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 { [JsonObject] public class PropModule { /// /// Place props in predefined positions on the planet /// public DetailInfo[] details; /// /// Add dialogue triggers to this planet /// public DialogueInfo[] dialogue; /// /// Add ship log entry locations on this planet /// public EntryLocationInfo[] entryLocation; /// /// Add Geysers to this planet /// public GeyserInfo[] geysers; /// /// Add translatable text to this planet /// public NomaiTextInfo[] nomaiText; /// /// Details which will be shown from 50km away. Meant to be lower resolution. /// public DetailInfo[] proxyDetails; /// /// Add rafts to this planet /// public RaftInfo[] rafts; /// /// Add triggers that reveal parts of the ship log on this planet /// public RevealInfo[] reveal; /// /// Scatter props around this planet's surface /// public ScatterInfo[] scatter; /// /// Add slideshows (from the DLC) to the planet /// public ProjectionInfo[] slideShows; /// /// Add tornadoes to this planet /// public TornadoInfo[] tornados; /// /// Add volcanoes to this planet /// public VolcanoInfo[] volcanoes; [JsonObject] public class ScatterInfo { /// /// Relative filepath to an asset-bundle" /// public string assetBundle; /// /// Number of props to scatter /// public int count; /// /// Offset this prop once it is placed /// public MVector3 offset; /// /// Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle /// public string path; /// /// Rotate this prop once it is placed /// public MVector3 rotation; /// /// Scale this prop once it is placed /// public float scale = 1f; /// /// The number used as entropy for scattering the props /// public int seed; } [JsonObject] public class DetailInfo { /// /// Do we override rotation and try to automatically align this object to stand upright on the body's surface? /// public bool alignToNormal; /// /// Relative filepath to an asset-bundle to load the prefab defined in `path` from/ /// public string assetBundle; /// /// [DEPRECATED] Path to the .mtl file to load a 3d model from /// public string mtlFilePath; /// /// [DEPRECATED] Path to the .obj file to load a 3d model from /// public string objFilePath; /// /// Either the path in the scene hierarchy of the item to copy or the path to the object in the supplied asset bundle /// public string path; /// /// Position of this prop relative to the body's center /// public MVector3 position; /// /// A list of children to remove from this detail /// public string[] removeChildren; /// /// Do we reset all the components on this object? Useful for certain props that have dialogue components attached to /// them. /// public bool removeComponents; /// /// Rotate this prop /// public MVector3 rotation; /// /// Scale the prop /// [DefaultValue(1f)] public float scale = 1f; } [JsonObject] public class RaftInfo { /// /// Position of the raft /// public MVector3 position; } [JsonObject] public class GeyserInfo { /// /// Position of the geyser /// public MVector3 position; } [JsonObject] public class TornadoInfo { public enum TornadoType { [EnumMember(Value = @"downwards")] Downwards = 0, [EnumMember(Value = @"upwards")] Upwards = 1, [EnumMember(Value = @"hurricane")] Hurricane = 2 } /// /// [DEPRECATED] Should this tornado shoot you down instead of up? /// public bool downwards; /// /// Alternative to setting the position. Will choose a random place at this elevation. /// public float elevation; /// /// The height of this tornado. /// [DefaultValue(30f)] public float height = 30f; /// /// Position of the tornado /// public MVector3 position; /// /// The colour of the tornado. /// public MColor tint; /// /// What type of cyclone should this be? Upwards and downwards are both tornados and will push in that direction. /// [JsonConverter(typeof(StringEnumConverter))] public TornadoType type = TornadoType.Downwards; /// /// Angular distance from the starting position that it will wander, in terms of the angle around the x-axis. /// [DefaultValue(45f)] public float wanderDegreesX = 45f; /// /// Angular distance from the starting position that it will wander, in terms of the angle around the z-axis. /// [DefaultValue(45f)] public float wanderDegreesZ = 45f; /// /// The rate at which the tornado will wander around the planet. Set to 0 for it to be stationary. Should be around /// 0.1. /// public float wanderRate; } [JsonObject] public class VolcanoInfo { /// /// The colour of the meteor's lava. /// public MColor lavaTint; /// /// Maximum time between meteor launches. /// public float maxInterval = 20f; /// /// Maximum random speed at which meteors are launched. /// public float maxLaunchSpeed = 150f; /// /// Minimum time between meteor launches. /// public float minInterval = 5f; /// /// Minimum random speed at which meteors are launched. /// public float minLaunchSpeed = 50f; /// /// Position of this volcano /// public MVector3 position; /// /// Scale of this volcano /// public float scale = 1; /// /// The colour of the meteor's stone. /// public MColor stoneTint; } [JsonObject] public class DialogueInfo { /// /// Prevents the dialogue from being created after a specific persistent condition is set. Useful for remote dialogue /// triggers that you want to have happen only once. /// public string blockAfterPersistentCondition; /// /// If a pathToAnimController is supplied, if you are within this distance the character will look at you. If it is set /// to 0, they will only look at you when spoken to. /// public float lookAtRadius; /// /// If this dialogue is meant for a character, this is the relative path from the planet to that character's /// CharacterAnimController or SolanumAnimController. /// public string pathToAnimController; /// /// When you enter into dialogue, you will look here. /// public MVector3 position; /// /// Radius of the spherical collision volume where you get the "talk to" prompt when looking at. If you use a /// remoteTriggerPosition, you can set this to 0 to make the dialogue only trigger remotely. /// public float radius = 1f; /// /// Allows you to trigger dialogue from a distance when you walk into an area. /// public MVector3 remoteTriggerPosition; /// /// The radius of the remote trigger volume. /// public float remoteTriggerRadius; /// /// Relative path to the xml file defining the dialogue. /// public string xmlFile; } [JsonObject] public class RevealInfo { public enum RevealVolumeType { [EnumMember(Value = @"enter")] Enter = 0, [EnumMember(Value = @"observe")] Observe = 1, [EnumMember(Value = @"snapshot")] Snapshot = 2 } /// /// The max view angle (in degrees) the player can see the volume with to unlock the fact (`observe` only) /// 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) /// public float maxDistance = -1f; // Snapshot & Observe Only /// /// The position to place this volume at /// public MVector3 position; /// /// The radius of this reveal volume /// public float radius = 1f; /// /// What needs to be done to the volume to unlock the facts /// [JsonConverter(typeof(StringEnumConverter))] public RevealVolumeType revealOn = RevealVolumeType.Enter; /// /// A list of facts to reveal /// public string[] reveals; } [JsonObject] public class EntryLocationInfo { /// /// Whether this location is cloaked /// public bool cloaked; /// /// ID of the entry this location relates to /// public string id; /// /// The position of this entry location /// public MVector3 position; } [JsonObject] public class NomaiTextInfo { public enum NomaiTextType { [EnumMember(Value = @"wall")] Wall = 0, [EnumMember(Value = @"scroll")] Scroll = 1, [EnumMember(Value = @"Computer")] Computer = 2, [EnumMember(Value = @"Cairn")] Cairn = 3, [EnumMember(Value = @"Recorder")] Recorder = 4 } /// /// Additional information about each arc in the text /// public NomaiTextArcInfo[] arcInfo; /// /// The normal vector for this object. Used for writing on walls and positioning computers. /// public MVector3 normal; /// /// Position of the root of this text /// public MVector3 position; /// /// The euler angle rotation of this object. Not required if setting the normal. Computers and cairns will orient /// themselves to the surface of the planet automatically. /// public MVector3 rotation; /// /// The random seed used to pick what the text arcs will look like. /// public int seed; // For randomizing arcs /// /// The type of object this is. /// [JsonConverter(typeof(StringEnumConverter))] public NomaiTextType type = NomaiTextType.Wall; /// /// The relative path to the xml file for this object. /// public string xmlFile; } [JsonObject] public class NomaiTextArcInfo { public enum NomaiTextArcType { [EnumMember(Value = @"adult")] Adult = 0, [EnumMember(Value = @"child")] Child = 1, [EnumMember(Value = @"stranger")] Stranger = 2 } /// /// The local position of this object on the wall. /// public MVector2 position; /// /// The type of text to display. /// public NomaiTextArcType type = NomaiTextArcType.Adult; /// /// The z euler angle for this arc. /// [Range(0f, 360f)] public float zRotation; } [JsonObject] public class ProjectionInfo { public enum SlideShowType { [EnumMember(Value = @"slideReel")] SlideReel = 0, [EnumMember(Value = @"autoProjector")] AutoProjector = 1 } /// /// The position of this slideshow. /// public MVector3 position; /// /// The ship log entries revealed after finishing this slide reel. /// public string[] reveals; /// /// The rotation of this slideshow. /// public MVector3 rotation; /// /// The list of slides for this object. /// public SlideInfo[] slides; /// /// The type of object this is. /// [JsonConverter(typeof(StringEnumConverter))] public SlideShowType type = SlideShowType.SlideReel; } [JsonObject] public class SlideInfo { /// /// Ambient light colour when viewing this slide. /// public MColor ambientLightColor; // SlideAmbientLightModule /// /// Ambient light intensity when viewing this slide. /// public float ambientLightIntensity; /// /// Ambient light range when viewing this slide. /// public float ambientLightRange; // SlideBackdropAudioModule /// /// The name of the AudioClip that will continuously play while watching these slides /// public string backdropAudio; /// /// The time to fade into the backdrop audio /// public float backdropFadeTime; // SlideBeatAudioModule /// /// The name of the AudioClip for a one-shot sound when opening the slide. /// public string beatAudio; /// /// The time delay until the one-shot audio /// public float beatDelay; // SlideBlackFrameModule /// /// Before viewing this slide, there will be a black frame for this many seconds. /// public float blackFrameDuration; /// /// The path to the image file for this slide. /// public string imagePath; // SlidePlayTimeModule /// /// Play-time duration for auto-projector slides. /// public float playTimeDuration; // SlideShipLogEntryModule /// /// Ship log entry revealed when viewing this slide /// public string reveal; /// /// Spotlight intensity modifier when viewing this slide. /// public float spotIntensityMod; } } }