diff --git a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs index bd1f40e5..895ccd31 100644 --- a/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/CloudsBuilder.cs @@ -92,20 +92,29 @@ namespace NewHorizons.Builder.Atmosphere cloudsBottomGO.transform.localScale = Vector3.one * (atmo.Size * 0.9f); TessellatedSphereRenderer bottomTSR = cloudsBottomGO.AddComponent(); - bottomTSR.tessellationMeshGroup = GameObject.Find("CloudsBottomLayer_GD").GetComponent().tessellationMeshGroup; + bottomTSR.tessellationMeshGroup = GameObject.Find("CloudsBottomLayer_QM").GetComponent().tessellationMeshGroup; var bottomTSRMaterials = GameObject.Find("CloudsBottomLayer_QM").GetComponent().sharedMaterials; - var bottomTSRTempArray = new Material[bottomTSRMaterials.Length]; - - // It's a bit too green - var bottomColor = atmo.CloudTint.ToColor32(); - bottomColor.g = (byte)(bottomColor.g * 0.5f); - for (int i = 0; i < bottomTSRMaterials.Length; i++) + + // If they set a colour apply it to all the materials else keep the default QM one + if (atmo.CloudTint != null) { - bottomTSRTempArray[i] = new Material(bottomTSRMaterials[i]); - bottomTSRTempArray[i].SetColor("_Color", bottomColor); - bottomTSRTempArray[i].SetColor("_TintColor", bottomColor); + var bottomColor = atmo.CloudTint.ToColor32(); + + var bottomTSRTempArray = new Material[2]; + + bottomTSRTempArray[0] = new Material(bottomTSRMaterials[0]); + bottomTSRTempArray[0].SetColor("_Color", bottomColor); + bottomTSRTempArray[0].SetColor("_TintColor", bottomColor); + + bottomTSRTempArray[1] = new Material(bottomTSRMaterials[1]); + + bottomTSR.sharedMaterials = bottomTSRTempArray; } - bottomTSR.sharedMaterials = bottomTSRTempArray; + else + { + bottomTSR.sharedMaterials = bottomTSRMaterials; + } + bottomTSR.maxLOD = 6; bottomTSR.LODBias = 0; bottomTSR.LODRadius = 1f; diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index e07c8ef9..bd7123f6 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -135,6 +135,17 @@ namespace NewHorizons.Builder.Props Logger.LogError($"Couldn't update AnglerFish chase speed: {e.Message}"); } } + + // Fix slide reel + if(component is SlideCollectionContainer) + { + sector.OnOccupantEnterSector.AddListener((_) => (component as SlideCollectionContainer).LoadStreamingTextures()); + } + + if(component is OWItemSocket) + { + (component as OWItemSocket)._sector = sector; + } } prop.transform.position = position == null ? go.transform.position : go.transform.TransformPoint((Vector3)position); diff --git a/NewHorizons/Builder/Props/ProjectionBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs new file mode 100644 index 00000000..06a2064e --- /dev/null +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -0,0 +1,198 @@ +using NewHorizons.External; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using NewHorizons.Utility; +using OWML.ModHelper; +using OWML.Common; +using NewHorizons.Handlers; +using Logger = NewHorizons.Utility.Logger; + +namespace NewHorizons.Builder.Props +{ + public static class ProjectionBuilder + { + private static GameObject _slideReelPrefab; + private static GameObject _autoPrefab; + public static void Make(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) + { + if (info.type == "autoProjector") MakeAutoProjector(go, sector, info, mod); + else if (info.type == "slideReel") MakeSlideReel(go, sector, info, mod); + else Logger.LogError($"Invalid projection type {info.type}"); + } + + private static void MakeSlideReel(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) + { + if (_slideReelPrefab == null) + { + _slideReelPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Sector_SlideBurningRoom_Zone1/Interactables_SlideBurningRoom_Zone1/Prefab_IP_SecretAlcove/RotationPivot/SlideReelSocket/Prefab_IP_Reel_1_LibraryPath").gameObject.InstantiateInactive(); + _slideReelPrefab.name = "Prefab_IP_Reel"; + } + + var slideReelObj = _slideReelPrefab.InstantiateInactive(); + slideReelObj.name = $"Prefab_IP_Reel_{mod.ModHelper.Manifest.Name}"; + + var slideReel = slideReelObj.GetComponent(); + slideReel.SetSector(sector); + slideReel.SetVisible(true); + + var slideCollectionContainer = slideReelObj.GetRequiredComponent(); + + foreach(var renderer in slideReelObj.GetComponentsInChildren()) + { + renderer.enabled = true; + } + + slideReelObj.transform.parent = sector?.transform ?? go.transform; + slideReelObj.transform.localPosition = (Vector3)(info.position ?? Vector3.zero); + slideReelObj.transform.localRotation = Quaternion.Euler((Vector3)(info.rotation ?? Vector3.zero)); + + // Now we replace the slides + int slidesCount = info.slides.Length; + var slideCollection = new SlideCollection(slidesCount); + + // The base game ones only have 15 slides max + var textures = new Texture2D[slidesCount >= 15 ? 15 : slidesCount]; + + for(int i = 0; i < slidesCount; i++) + { + var slide = new Slide(); + var slideInfo = info.slides[i]; + + var texture = ImageUtilities.GetTexture(mod, slideInfo.imagePath); + slide.textureOverride = ImageUtilities.Invert(texture); + + // Track the first 15 to put on the slide reel object + if(i < 15) textures[i] = texture; + + AddModules(slideInfo, ref slide); + + slideCollection.slides[i] = slide; + } + + // Else when you put them down you can't pick them back up + slideReelObj.GetComponent()._physicsRemoved = false; + + slideCollectionContainer.slideCollection = slideCollection; + + // Idk why but it wants reveals to be comma delimited not a list + if (info.reveals != null) slideCollectionContainer._shipLogOnComplete = string.Join(",", info.reveals); + + OWAssetHandler.LoadObject(slideReelObj); + sector.OnOccupantEnterSector.AddListener((x) => OWAssetHandler.LoadObject(slideReelObj)); + + var slidesBack = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Back").GetComponent(); + var slidesFront = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Front").GetComponent(); + + // Now put together the textures into a 4x4 thing for the materials + var reelTexture = ImageUtilities.MakeReelTexture(textures); + slidesBack.material.mainTexture = reelTexture; + slidesBack.material.SetTexture("_EmissionMap", reelTexture); + slidesFront.material.mainTexture = reelTexture; + slidesFront.material.SetTexture("_EmissionMap", reelTexture); + + slideReelObj.SetActive(true); + } + + public static void MakeAutoProjector(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) + { + if (_autoPrefab == null) + { + _autoPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone4/Sector_BlightedShore/Sector_JammingControlRoom_Zone4/Interactables_JammingControlRoom_Zone4/AutoProjector_SignalJammer/Prefab_IP_AutoProjector_SignalJammer").gameObject.InstantiateInactive(); + _autoPrefab.name = "Prefab_IP_AutoProjector"; + } + + var projectorObj = _autoPrefab.InstantiateInactive(); + projectorObj.name = $"Prefab_IP_AutoProjector_{mod.ModHelper.Manifest.Name}"; + + var autoProjector = projectorObj.GetComponent(); + autoProjector._sector = sector; + + var slideCollectionContainer = autoProjector.GetRequiredComponent(); + + autoProjector.transform.parent = sector?.transform ?? go.transform; + autoProjector.transform.localPosition = (Vector3)(info.position ?? Vector3.zero); + autoProjector.transform.localRotation = Quaternion.Euler((Vector3)(info.rotation ?? Vector3.zero)); + + // Now we replace the slides + int slidesCount = info.slides.Length; + var slideCollection = new SlideCollection(slidesCount); + + for (int i = 0; i < slidesCount; i++) + { + var slide = new Slide(); + var slideInfo = info.slides[i]; + + var texture = ImageUtilities.GetTexture(mod, slideInfo.imagePath); + slide.textureOverride = ImageUtilities.Invert(texture); + + AddModules(slideInfo, ref slide); + + slideCollection.slides[i] = slide; + } + + slideCollectionContainer.slideCollection = slideCollection; + + OWAssetHandler.LoadObject(projectorObj); + sector.OnOccupantEnterSector.AddListener((x) => OWAssetHandler.LoadObject(projectorObj)); + + // Change the picture on the lens + var lens = projectorObj.transform.Find("Spotlight/Prop_IP_SingleSlideProjector/Projector_Lens").GetComponent(); + lens.materials[1].mainTexture = slideCollection.slides[0]._textureOverride; + lens.materials[1].SetTexture("_EmissionMap", slideCollection.slides[0]._textureOverride); + + projectorObj.SetActive(true); + } + + private static void AddModules(PropModule.SlideInfo slideInfo, ref Slide slide) + { + var modules = new List(); + if (!String.IsNullOrEmpty(slideInfo.beatAudio)) + { + var audioBeat = new SlideBeatAudioModule(); + audioBeat._audioType = (AudioType)Enum.Parse(typeof(AudioType), slideInfo.beatAudio); + audioBeat._delay = slideInfo.beatDelay; + modules.Add(audioBeat); + } + if (!String.IsNullOrEmpty(slideInfo.backdropAudio)) + { + var audioBackdrop = new SlideBackdropAudioModule(); + audioBackdrop._audioType = (AudioType)Enum.Parse(typeof(AudioType), slideInfo.backdropAudio); + audioBackdrop._fadeTime = slideInfo.backdropFadeTime; + modules.Add(audioBackdrop); + } + if (slideInfo.ambientLightIntensity > 0) + { + var ambientLight = new SlideAmbientLightModule(); + ambientLight._intensity = slideInfo.ambientLightIntensity; + ambientLight._range = slideInfo.ambientLightRange; + ambientLight._color = slideInfo.ambientLightColor.ToColor(); + ambientLight._spotIntensityMod = slideInfo.spotIntensityMod; + modules.Add(ambientLight); + } + if (slideInfo.playTimeDuration != 0) + { + var playTime = new SlidePlayTimeModule(); + playTime._duration = slideInfo.playTimeDuration; + modules.Add(playTime); + } + if (slideInfo.blackFrameDuration != 0) + { + var blackFrame = new SlideBlackFrameModule(); + blackFrame._duration = slideInfo.blackFrameDuration; + modules.Add(blackFrame); + } + if (!String.IsNullOrEmpty(slideInfo.reveal)) + { + var shipLogEntry = new SlideShipLogEntryModule(); + shipLogEntry._entryKey = slideInfo.reveal; + modules.Add(shipLogEntry); + } + + Slide.WriteModules(modules, ref slide._modulesList, ref slide._modulesData, ref slide.lengths); + } + } +} diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 979e97b0..69ba4ab4 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -83,6 +83,13 @@ namespace NewHorizons.Builder.Props foreach(var nomaiTextInfo in config.Props.NomaiText) { NomaiTextBuilder.Make(go, sector, nomaiTextInfo, mod); + } + } + if(config.Props.SlideShows != null) + { + foreach (var slideReelInfo in config.Props.SlideShows) + { + ProjectionBuilder.Make(go, sector, slideReelInfo, mod); } } } diff --git a/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs b/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs index 474ddb8e..33388e5b 100644 --- a/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs +++ b/NewHorizons/Builder/ShipLog/EntryLocationBuilder.cs @@ -20,7 +20,7 @@ namespace NewHorizons.Builder.ShipLog GameObject entryLocationGameObject = new GameObject("Entry Location (" + info.id + ")"); entryLocationGameObject.SetActive(false); entryLocationGameObject.transform.parent = sector?.transform ?? go.transform; - entryLocationGameObject.transform.localPosition = info.position; + entryLocationGameObject.transform.localPosition = info.position ?? Vector3.zero; ShipLogEntryLocation newLocation = entryLocationGameObject.AddComponent(); newLocation._entryID = info.id; newLocation._isWithinCloakField = info.cloaked; diff --git a/NewHorizons/Builder/ShipLog/RevealBuilder.cs b/NewHorizons/Builder/ShipLog/RevealBuilder.cs index ceadf652..93e579e4 100644 --- a/NewHorizons/Builder/ShipLog/RevealBuilder.cs +++ b/NewHorizons/Builder/ShipLog/RevealBuilder.cs @@ -49,7 +49,7 @@ namespace NewHorizons.Builder.ShipLog GameObject revealTriggerVolume = new GameObject("Reveal Volume (" + info.revealOn + ")"); revealTriggerVolume.SetActive(false); revealTriggerVolume.transform.parent = sector?.transform ?? go.transform; - revealTriggerVolume.transform.localPosition = info.position; + revealTriggerVolume.transform.localPosition = info.position ?? Vector3.zero; return revealTriggerVolume; } diff --git a/NewHorizons/External/PropModule.cs b/NewHorizons/External/PropModule.cs index 18cfd4c4..956273da 100644 --- a/NewHorizons/External/PropModule.cs +++ b/NewHorizons/External/PropModule.cs @@ -19,6 +19,7 @@ namespace NewHorizons.External public RevealInfo[] Reveal; public EntryLocationInfo[] EntryLocation; public NomaiTextInfo[] NomaiText; + public ProjectionInfo[] SlideShows; public class ScatterInfo { @@ -89,7 +90,7 @@ namespace NewHorizons.External { public string revealOn = "enter"; public string[] reveals; - public MVector3 position = new MVector3(0, 0, 0); + public MVector3 position; public float radius = 1f; public float maxDistance = -1f; // Snapshot & Observe Only public float maxAngle = 180f; // Observe Only @@ -101,10 +102,48 @@ namespace NewHorizons.External public bool cloaked; public MVector3 position; } + public class NomaiTextInfo { public MVector3 position; public string xmlFile; + } + + public class ProjectionInfo + { + public MVector3 position; + public MVector3 rotation; + public string[] reveals; + public SlideInfo[] slides; + public string type = "SlideReel"; + } + + public class SlideInfo + { + public string imagePath; + + // SlideBeatAudioModule + public string beatAudio; + public float beatDelay; + + // SlideBackdropAudioModule + public string backdropAudio; + public float backdropFadeTime; + + // SlideAmbientLightModule + public float ambientLightIntensity; + public float ambientLightRange; + public MColor ambientLightColor; + public float spotIntensityMod; + + // SlidePlayTimeModule + public float playTimeDuration; + + // SlideBlackFrameModule + public float blackFrameDuration; + + // SlideShipLogEntryModule + public string reveal; } } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 83d571f0..f5264ba8 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -227,31 +227,56 @@ namespace NewHorizons #region Load public void LoadConfigs(IModBehaviour mod) { - if (_firstLoad) + try { - MountedAddons.Add(mod); - } - var folder = mod.ModHelper.Manifest.ModFolderPath; - if(Directory.Exists(folder + "planets")) - { - foreach (var file in Directory.GetFiles(folder + @"planets\", "*.json", SearchOption.AllDirectories)) + if (_firstLoad) { - var relativeDirectory = file.Replace(folder, ""); - var body = LoadConfig(mod, relativeDirectory); + MountedAddons.Add(mod); + } + var folder = mod.ModHelper.Manifest.ModFolderPath; - if (body != null) + // Load systems first so that when we load bodies later we can check for missing ones + if (Directory.Exists(folder + @"systems\")) + { + foreach (var file in Directory.GetFiles(folder + @"systems\", "*.json", SearchOption.AllDirectories)) { - // Wanna track the spawn point of each system - if (body.Config.Spawn != null) SystemDict[body.Config.StarSystem].Spawn = body.Config.Spawn; + var name = Path.GetFileNameWithoutExtension(file); - // Add the new planet to the planet dictionary - BodyDict[body.Config.StarSystem].Add(body); + Logger.Log($"Loading system {name}"); + + var relativePath = file.Replace(folder, ""); + var starSystemConfig = mod.ModHelper.Storage.Load(relativePath); + + var system = new NewHorizonsSystem(name, starSystemConfig, mod); + SystemDict[name] = system; } } + if (Directory.Exists(folder + "planets")) + { + foreach (var file in Directory.GetFiles(folder + @"planets\", "*.json", SearchOption.AllDirectories)) + { + var relativeDirectory = file.Replace(folder, ""); + var body = LoadConfig(mod, relativeDirectory); + + if (body != null) + { + // Wanna track the spawn point of each system + if (body.Config.Spawn != null) SystemDict[body.Config.StarSystem].Spawn = body.Config.Spawn; + + // Add the new planet to the planet dictionary + if (!BodyDict.ContainsKey(body.Config.StarSystem)) BodyDict[body.Config.StarSystem] = new List(); + BodyDict[body.Config.StarSystem].Add(body); + } + } + } + if (Directory.Exists(folder + @"translations\")) + { + LoadTranslations(folder, mod); + } } - if(Directory.Exists(folder + @"translations\")) + catch(Exception ex) { - LoadTranslations(folder, mod); + Logger.LogError($"{ex.Message}, {ex.StackTrace}"); } } @@ -420,7 +445,15 @@ namespace NewHorizons public string[] GetInstalledAddons() { - return Main.MountedAddons.Select(x => x.ModHelper.Manifest.UniqueName).ToArray(); + try + { + return Main.MountedAddons.Select(x => x?.ModHelper?.Manifest?.UniqueName).ToArray(); + } + catch (Exception ex) + { + Logger.LogError($"Couldn't get installed addons {ex.Message}, {ex.StackTrace}"); + return new string[] { }; + } } } #endregion API diff --git a/NewHorizons/Utility/ImageUtilities.cs b/NewHorizons/Utility/ImageUtilities.cs index 2d39f06f..01f6f1ab 100644 --- a/NewHorizons/Utility/ImageUtilities.cs +++ b/NewHorizons/Utility/ImageUtilities.cs @@ -48,6 +48,94 @@ namespace NewHorizons.Utility _generatedTextures.Clear(); } + public static Texture2D Invert(Texture2D texture) + { + var pixels = texture.GetPixels(); + for (int i = 0; i < pixels.Length; i++) + { + var x = i % texture.width; + var y = (int)Mathf.Floor(i / texture.height); + + // Needs a black border + if(x == 0 || y == 0 || x == texture.width-1 || y == texture.height-1) + { + pixels[i].r = 1; + pixels[i].g = 1; + pixels[i].b = 1; + pixels[i].a = 1; + } + else + { + pixels[i].r = 1f - pixels[i].r; + pixels[i].g = 1f - pixels[i].g; + pixels[i].b = 1f - pixels[i].b; + } + } + + var newTexture = new Texture2D(texture.width, texture.height); + newTexture.name = texture.name + "Inverted"; + newTexture.SetPixels(pixels); + newTexture.Apply(); + + newTexture.wrapMode = TextureWrapMode.Clamp; + + _generatedTextures.Add(newTexture); + + return newTexture; + } + + public static Texture2D MakeReelTexture(Texture2D[] textures) + { + var size = 256; + + var texture = (new Texture2D(size * 4, size * 4, TextureFormat.ARGB32, false)); + texture.name = "SlideReelAtlas"; + + Color[] fillPixels = new Color[size * size * 4 * 4]; + for(int xIndex = 0; xIndex < 4; xIndex++) + { + for(int yIndex = 0; yIndex < 4; yIndex++) + { + int index = yIndex * 4 + xIndex; + var srcTexture = index < textures.Length ? textures[index] : null; + + for(int i = 0; i < size; i++) + { + for(int j = 0; j < size; j++) + { + var colour = Color.black; + + if(srcTexture) + { + var srcX = i * srcTexture.width / (float)size; + var srcY = j * srcTexture.height / (float)size; + if (srcX >= 0 && srcX < srcTexture.width && srcY >= 0 && srcY < srcTexture.height) + { + colour = srcTexture.GetPixel((int)srcX, (int)srcY); + } + } + + var x = xIndex * size + i; + // Want it to start from the first row from the bottom then go down then modulo around idk + // 5 because no pos mod idk + var y = ((5 - yIndex)%4) * size + j; + + var pixelIndex = x + y * (size * 4); + + if(pixelIndex < fillPixels.Length && pixelIndex >= 0) fillPixels[pixelIndex] = colour; + } + } + } + } + + texture.SetPixels(fillPixels); + texture.Apply(); + + _generatedTextures.Add(texture); + + return texture; + } + public static Texture2D MakeOutline(Texture2D texture, Color color, int thickness) { var outline = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false); @@ -162,7 +250,13 @@ namespace NewHorizons.Utility { for(int j = 0; j < tex.height; j++) { - fillPixels[i + j * tex.width] = src.GetPixel(i, j); + var x = i + (src.width - width) / 2; + var y = j + (src.height - height) / 2; + + var colour = Color.black; + if (x < src.width && y < src.height) colour = src.GetPixel(i, j); + + fillPixels[i + j * tex.width] = colour; } } tex.SetPixels(fillPixels); diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index 5eee3458..2839581d 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -3,7 +3,7 @@ "author": "xen, Bwc9876, & Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "0.11.0", + "version": "0.11.1", "owmlVersion": "2.1.0", "dependencies": [ "PacificEngine.OW_CommonResources" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.OuterWildsMMO", "Vesper.AutoResume" ], diff --git a/NewHorizons/schema.json b/NewHorizons/schema.json index 759b3db3..17593d84 100644 --- a/NewHorizons/schema.json +++ b/NewHorizons/schema.json @@ -794,6 +794,98 @@ } } } + }, + "slideShows": { + "type": "array", + "description": "For creating custom auto projectors or slide reels from the DLC", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "position": { + "$ref": "#/$defs/vector3", + "description": "The position of this object." + }, + "rotation": { + "$ref": "#/$defs/vector3", + "description": "The euler angle rotation of this object." + }, + "reveals": { + "type": "array", + "description": "The ship log entries revealed after finishing this slide reel.", + "items": { + "type": "string" + } + }, + "slides": { + "type": "array", + "description": "The list of slides for this object.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "imagePath": { + "type": "string", + "description": "The path to the image file for this slide." + }, + "beatAudio": { + "type": "string", + "description": "The name of the AudioClip for a one-shot sound when opening the slide." + }, + "beatDelay": { + "type": "number", + "description": "The time delay until the one-shot audio" + }, + "backdropAudio": { + "type": "string", + "description": "The name of the AudioClip that will continuously play while watching these slides" + }, + "backdropFadeTime": { + "type": "number", + "description": "The time to fade into the backdrop audio" + }, + "ambientLightIntensity": { + "type": "number", + "description": "Ambient light intensity when viewing this slide." + }, + "ambientLightRange": { + "type": "number", + "description": "Ambient light range when viewing this slide." + }, + "ambientLightColor": { + "$ref": "#/$defs/color", + "description": "Ambient light colour when viewing this slide." + }, + "spotIntensityMod": { + "type": "number", + "description": "Spotlight intensity modifier when viewing this slide." + }, + "playTimeDuration": { + "type": "number", + "description": "Play-time duration for auto-projector slides." + }, + "blackFrameDuration": { + "type": "number", + "description": "Before viewing this slide, there will be a black frame for this many seconds." + }, + "reveal": { + "type": "string", + "description": "Ship log entry revealed when viewing this slide." + } + } + } + }, + "type": { + "type": "string", + "description": "The type of object this is. Must be either SlideReel or AutoProjector", + "enum": [ + "slideReel", + "autoProjector" + ], + "default": "slideReel" + } + } + } } } }, diff --git a/README.md b/README.md index 33ff6fc0..2afeebe9 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Check the ship's log for how to use your warp drive to travel between star syste - Signalscope signals and custom frequencies - Surface scatter: rocks, trees, etc, using in-game models, or custom ones - Black hole / white hole pairs -- Custom dialogue and custom ship log entries for rumour mode and map mode +- Custom dialogue, slide-reel projections, and custom ship log entries for rumour mode and map mode - Funnels and variable surface height (can be made of sand/water/lava/star) ## Roadmap @@ -49,10 +49,9 @@ Check the ship's log for how to use your warp drive to travel between star syste - Better terrain and water LOD - Edit existing planet orbits (started) - Implement all planet features: - - Tornados + floating islands - - Let any star go supernova - - Pocket dimensions - - Timed position/velocity changes + - Tornados + - Supernovae + - Bramble dimensions - Implement custom Nomai scrolls - Implement custom translatable writing @@ -73,7 +72,8 @@ Main authors: New Horizons was made with help from: - [Nageld](https://github.com/Nageld): Set up xml reading for custom dialogue in v0.8.0 - [jtsalomo](https://github.com/jtsalomo): Implemented [OW_CommonResources](https://github.com/PacificEngine/OW_CommonResources) support introduced in v0.5.0 -- [Raicuparta](https://github.com/Raicuparta): Integrated the [New Horizons Template](https://github.com/xen-42/ow-new-horizons-config-template) into the Outer Wilds Mods website +- [Raicuparta](https://github.com/Raicuparta) +- [MegaPiggy](https://github.com/MegaPiggy) Translation credits: - Russian: GrayFix and Tlya diff --git a/docs/content/pages/audio_enum.md b/docs/content/pages/audio_enum.md new file mode 100644 index 00000000..dfd4863a --- /dev/null +++ b/docs/content/pages/audio_enum.md @@ -0,0 +1,760 @@ +Title: Audio Values +Description: Numbers for audio values for slide reels +Hide_In_Nav: True +Render_TOC: False + +# The List + +None = 0, +Menu_RebindKey = 1, +Menu_ResetDefaults = 2, +Menu_UpDown = 3, +Menu_LeftRight = 4, +Menu_ChangeTab = 5, +Menu_Pause = 6, +Menu_Unpause = 7, +Menu_SliderIncrement = 8, +ToolScopeEquip = 100, +ToolScopeUnequip = 101, +ToolScopeSwitchFreq = 104, +ToolScopeStatic = 105, +ToolScopeHideAndSeekSignal = 106, +ToolScopeZoomAdjust = 107, +ToolScopeIdentifySignal = 108, +ToolItemScrollPickUp = 200, +ToolItemScrollDrop = 201, +ToolItemScrollInsert = 202, +ToolItemScrollRemove = 203, +ToolItemWarpCorePickUp = 204, +ToolItemWarpCoreDrop = 205, +ToolItemWarpCoreInsert = 206, +ToolItemWarpCoreRemove = 207, +ToolItemSharedStonePickUp = 208, +ToolItemSharedStoneDrop = 209, +ToolItemSharedStoneInsert = 210, +ToolItemSharedStoneRemove = 211, +ToolRepairing_LP = 300, +ToolRepairComplete = 301, +ToolTranslatorEquip = 400, +ToolTranslatorUnequip = 401, +ToolTranslateText_LP = 402, +ToolFlashlightOn = 500, +ToolFlashlightOff = 501, +ToolFlashlightFlicker = 502, +ToolProbeEquip = 600, +ToolProbeUnequip = 601, +ToolProbeLaunch = 602, +ToolProbeLaunchUnderwater = 603, +ToolProbeTakePhoto = 604, +ToolProbeTakeReversePhoto = 605, +ToolProbeRetrieve = 606, +ToolProbeFlight_LP = 607, +ToolProbeAttach = 608, +ToolProbeChangeMode = 609, +ToolMarshmallowEquip = 700, +ToolMarshmallowReplace = 701, +ToolMarshmallowIgnite = 702, +ToolMarshmallowBlowOut = 703, +ToolMarshmallowEat = 704, +ToolMarshmallowEatBurnt = 705, +ToolMarshmallowToss = 706, +PlayerSuitWearSuit = 800, +PlayerSuitRemoveSuit = 801, +PlayerSuitWearHelmet = 802, +PlayerSuitRemoveHelmet = 803, +PlayerSuitOxygenRefill = 804, +PlayerSuitOxygenLeak_In = 805, +PlayerSuitOxygenLeak_LP = 806, +PlayerSuitOxygenLeak_Out = 807, +PlayerSuitLockOn = 808, +PlayerSuitLockOff = 809, +PlayerSuitWarning = 810, +PlayerSuitCriticalWarning = 811, +PlayerSuitJetpackThrustTranslational_LP = 812, +PlayerSuitJetpackThrustRotational = 813, +PlayerSuitJetpackBoost = 814, +PlayerSuitJetpackThrustRotationalUnderwater_LP = 816, +PlayerSuitJetpackThrustUnderwater_LP = 817, +PlayerSuitRainOnHelmet = 818, +PlayerSuitNotificationTextScroll_In = 820, +PlayerSuitNotificationTextScroll_LP = 821, +PlayerSuitHelmetCrack = 822, +PlayerSuitOxygenRefill_Short = 823, +PlayerSuitPatchPuncture = 824, +PlayerSuitJetpackOxygenPropellant_LP = 825, +PlayerBreathing_LP = 850, +PlayerBreathing_LowOxygen_LP = 851, +PlayerGasp_Light = 852, +PlayerGasp_Medium = 853, +PlayerGasp_Heavy = 854, +Asphyxiate_Start_Suit = 855, +Asphyxiate_Start_NoSuit = 856, +Asphyxiate_End_Suit = 857, +Asphyxiate_End_NoSuit = 858, +Drowning_Start = 859, +Drowing_End = 860, +PlayerGasp_StopSuffocating = 861, +PlayerGasp_StopSuffocating_Suit = 862, +EnterVolumeDamageHeat_LP = 900, +EnterVolumeDamageGhostfire_LP = 901, +EnterVolumeDamageLava_LP = 902, +EnterVolumeDamageFire_LP = 903, +HazardFirstContactDamage = 904, +ElectricShock = 905, +Splash_GhostMatter = 950, +Splash_Lava = 951, +Submerge_Player = 952, +Submerge_Ship = 953, +Splash_Water_Probe = 954, +Splash_Water_Player = 955, +Splash_Water_Ship = 956, +NonDiaMapActivation = 1000, +DialogueEnter = 1001, +DialogueAdvance = 1002, +DialogueExit = 1003, +NonDiaUIAffirmativeSFX = 1004, +NonDiaUINegativeSFX = 1005, +TapeRecorder_Start = 1006, +TapeRecorder_LP = 1007, +TapeRecorder_Stop = 1008, +PlayerTurbulence_LP = 1050, +ShipTurbulence_LP = 1051, +ShipRattle_LP = 1052, +ShipReentryBurn_LP = 1053, +PLACEHOLDER = 1100, +LandingGrass = 1102, +LandingDirt = 1103, +LandingStone = 1104, +LandingMetal = 1105, +LandingNomaiMetal = 1106, +LandingSand = 1107, +LandingIce = 1108, +LandingWater = 1109, +ImpactUnderwater = 1110, +ImpactLowSpeed = 1111, +ImpactMediumSpeed = 1112, +ImpactHighSpeed = 1113, +MovementFootstep = 1114, +MovementRunningStep = 1115, +MovementGrassFootstep = 1116, +MovementDirtFootstep = 1117, +MovementStoneFootstep = 1118, +MovementMetalFootstep = 1119, +MovementNomaiMetalFootstep = 1120, +MovementSandFootstep = 1121, +MovementIceFootstep = 1122, +MovementShallowWaterFootstep = 1123, +MovementJump = 1124, +MovementWoodCreakFootstep = 1134, +MovementWoodCreakLanding = 1135, +MovementWoodFootstep = 1136, +MovementWoodLanding = 1137, +MovementSnowFootstep = 1138, +MovementSnowLanding = 1139, +MovementIceLSiding = 1140, +MovementGlassFootsteps = 1141, +MovementGlassLanding = 1142, +MovementPassingBushes = 1143, +MovementLeavesFootsteps = 1144, +MovementLeavesLanding = 1145, +MovementGravelFootsteps = 1146, +MovementGravelLanding = 1147, +KnockOverCairn = 1150, +DefaultPropImpact = 1151, +NomaiShuttleImpact = 1152, +ModelShipImpact = 1153, +ShipCockpitScopeActivate = 1200, +ShipCockpitScopeDeactivate = 1201, +ShipCockpitScopeZoomIn = 1202, +ShipCockpitScopeZoomOut = 1203, +ShipCockpitScopeSwitchFreq = 1204, +ShipCockpitScopeScreenSlide_LP = 1205, +ShipCockpitScopeScreenKachunk = 1206, +ShipCockpitMasterAlarm_LP = 1207, +ShipCockpitAutopilotActivate = 1208, +ShipCockpitAutopilotDeactivate = 1209, +ShipCockpitBuckleUp = 1210, +ShipCockpitUnbuckle = 1211, +ShipCockpitConsoleReadout_In = 1212, +ShipCockpitConsoleReadout_LP = 1213, +ShipCockpitHeadlightsOn = 1214, +ShipCockpitHeadlightsOff = 1215, +ShipCockpitLandingCamActivate = 1216, +ShipCockpitLandingCamDeactivate = 1217, +ShipCockpitLandingCamStatic_LP = 1218, +ShipCockpitProbeCameraScreenRotation = 1219, +ShipCockpitProbeActivate = 1220, +ShipCockpitProbeDeactivate = 1221, +ShipCockpitProbeLaunch = 1222, +ShipCockpitProbeLaunchUnderwater = 1223, +ShipCockpitProbeTakePhoto = 1224, +ShipCockpitProbeRetrieve = 1225, +ShipCockpitLandingCamAmbient_LP = 1226, +ShipCockpitEject = 1227, +ShipCabinUseMedkit = 1300, +ShipCabinUseRefueller = 1301, +ShipCabinComputerActivate = 1302, +ShipCabinComputerAmbient_LP = 1303, +ShipHatchOpen = 1304, +ShipHatchClose = 1305, +ShipHullGroan = 1309, +ShipCabinAmbience = 1310, +ShipEatenGroan = 1311, +ShipLogBootUp = 1350, +ShipLogAmbience_LP = 1351, +ShipLogEnterDetectiveMode = 1355, +ShipLogEnterMapMode = 1356, +ShipLogNavigate_LP = 1357, +ShipLogSelectPlanet = 1360, +ShipLogDeselectPlanet = 1361, +ShipLogMoveBetweenPlanets = 1362, +ShipLogMoveBetweenEntries = 1363, +ShipLogRevealEntry = 1365, +ShipLogHighlightEntry = 1366, +ShipLogSelectEntry = 1367, +ShipLogDeselectEntry = 1368, +ShipLogTextReveal_LP = 1370, +ShipLogMarkLocation = 1390, +ShipLogUnmarkLocation = 1391, +ShipDamageExternalTankLeak_LP = 1400, +ShipDamageElectricSparking_LP = 1401, +ShipDamageCockpitGlassCrack = 1402, +ShipDamageShipExplosion = 1403, +ShipDamageSingleElectricSpark = 1404, +ShipDamageFuelLeak_LP = 1405, +ShipDamageOxygenLeak_LP = 1406, +ShipDamageElectricalFailure = 1407, +ShipImpact_NoDamage = 1420, +ShipImpact_LightDamage = 1421, +ShipImpact_MediumDamage = 1422, +ShipImpact_HeavyDamage = 1423, +Ship_LandingPad_Soft = 1424, +Ship_LandingPad_Hard = 1425, +ShipThrustIgnition = 1500, +ShipThrustRotational = 1501, +ShipThrustRotationalUnderwater = 1502, +ShipThrustTranslational_LP = 1503, +ShipThrustTranslationalUnderwater_LP = 1504, +ShipThrustAfterburn_LP = 1505, +NomaiHologram_LP = 1550, +NomaiHologramActivate = 1551, +NomaiHologramDeactivate = 1552, +NomaiRemoteCameraAmbient_LP = 1553, +NomaiRemoteCameraEntry = 1554, +NomaiRemoteCameraExit = 1555, +NomaiComputerAmbient = 1600, +NomaiComputerRingActivate = 1601, +NomaiComputerRingDeactivate = 1602, +NomaiOrbStartDrag = 1603, +NomaiOrbDragging_LP = 1604, +NomaiOrbRolling_LP = 1605, +NomaiOrbSlotActivated = 1606, +NomaiGravCrystalAmbient_LP = 1609, +NomaiGravCrystalFlickerAmbient_LP = 1610, +NomaiGravityCannonAmbient_LP = 1611, +NomaiGravityCannonActivate = 1612, +NomaiGravityCannonDeactivate = 1613, +NomaiTractorBeamActivate = 1614, +NomaiTractorBeamDeactivate = 1615, +NomaiTractorBeamAmbient_LP = 1616, +NomaiRecorderAmbient_LP = 1617, +NomaiEscapePodDistressSignal_LP = 1618, +NomaiTextReveal_LP = 1619, +NomaiDataStream_LP = 1620, +NomaiPowerOn = 1621, +NomaiPowerOff = 1622, +NomaiLightsOn = 1623, +NomaiLightsOff = 1624, +NomaiAirLockAirPourIn = 1625, +NomaiAirLockAirPourOut = 1626, +NomaiDoorAirLockOpen = 1627, +NomaiDoorStart = 1628, +NomaiDoorStop = 1629, +NomaiDoorSlide_LP = 1630, +NomaiDoorStartBig = 1631, +NomaiDoorStopBig = 1632, +NomaiDoorSlideBig_LP = 1633, +NomaiHeadStatueRotate_LP = 1634, +NomaiPedestalSlide_LP = 1635, +NomaiPedestalContact = 1636, +NomaiEscapePodHatch = 1645, +NomaiTimeLoopOpen = 1646, +NomaiTimeLoopClose = 1647, +NomaiVesselPowerUp = 1648, +NomaiPillarRaiseLower_LP = 1649, +NomaiPillarRotate = 1650, +NomaiAirlockSlide_LP = 1651, +NomaiAirlockWaterPourOut = 1652, +NomaiAirlockWaterPourIn = 1653, +HT_SurfaceAmbience_LP = 1700, +HT_CaveAmbientBig_LP = 1702, +HT_CaveAmbientSmall_LP = 1703, +HT_SandColumnEnd_LP = 1705, +HT_SandColumnStart_LP = 1706, +HT_SandfallSmallBottom_LP = 1707, +HT_SandRiver_LP = 1708, +HT_InsideSandfall_Suit_LP = 1709, +HT_InsideSandfall_Ship_LP = 1710, +TH_ModelShipCrash = 1800, +TH_SatelliteSnapshot = 1801, +TH_RetrieveModelShip = 1803, +TH_ZeroGTrainingAllRepaired = 1804, +TH_CanyonAmbienceDay_LP = 1807, +TH_CanyonAmbienceNight_LP = 1808, +TH_HiAltitudeAmbienceDay_LP = 1809, +TH_HiAltitudeAmbienceNight_LP = 1810, +TH_ZeroGCaveAmbient_LP = 1811, +TH_UnderwaterCurrent_LP = 1812, +TH_UnderwaterAmbience_LP = 1813, +TH_MuseumAmbience_LP = 1814, +TH_BridgeCreaking_LP = 1819, +TH_Campfire_LP = 1820, +TH_FlagFlapping_LP = 1821, +TH_GeyserEnd = 1822, +TH_Geyser_LP = 1823, +TH_GeyserStart = 1824, +TH_Insects_LP = 1825, +TH_LiftActivate = 1826, +TH_LiftArrives = 1827, +TH_Lift_LP = 1828, +TH_ProjectorActivate = 1829, +TH_ProjectorRun_LP = 1830, +TH_ProjectorStop = 1831, +TH_RiverWaterFlow_LP = 1832, +TH_Waterfall_LP = 1833, +TH_WaterWheel_LP = 1834, +TH_ModelRocketThrustRotational = 1835, +TH_ModelRocketThrustTranslational_LP = 1836, +TH_Campfire_Ignite = 1837, +TH_RockingChair = 1838, +TH_BanjoTuning = 1839, +TH_PickaxeImpact = 1840, +TH_WoodCarving = 1841, +TH_RadioSignal_LP = 1842, +BH_BreakawayFragment = 1900, +BH_VolcanicMoonSurface_LP = 1901, +BH_BreakawayPlatform = 1902, +BH_MeteorImpact = 1903, +BH_BlackHoleEmission = 1904, +BH_SurfaceAmbience_LP = 1905, +BH_SubsurfaceAmbience_LP = 1906, +WHS_StationActivation = 1907, +BH_ForgeMoving_LP = 1908, +BH_MeteorLaunch = 1909, +GD_OceanSurface_LP = 2000, +GD_UnderwaterAmbient_LP = 2002, +GD_CoreAmbient_LP = 2004, +GD_ElectricBarrier_LP = 2005, +GD_Tornado_LP = 2006, +GD_Lightning = 2007, +GD_RainAmbient_LP = 2008, +GD_IslandSplash = 2009, +GD_IslandFalling = 2010, +GD_IslandLiftedByTornado = 2011, +GD_WavesBeach_LP = 2012, +GD_WavesRock_LP = 2013, +GD_CaveAmbience_LP = 2014, +GD_UnderwaterCurrent_LP = 2015, +DBAnglerfishLurking_LP = 2100, +DBAnglerfishChasing_LP = 2101, +DBAnglerfishDetectDisturbance = 2102, +DBAnglerfishDetectTarget = 2103, +DBAnglerfishBite = 2104, +DBAnglerfishChomp = 2105, +DBAnglerfishOpeningMouth = 2106, +DB_Ambience_LP = 2107, +DB_VineImpact = 2108, +CometAmbience_LP = 2200, +CometIceMelting_LP = 2201, +SolanumStaffContact = 2210, +SolanumStomp = 2211, +SolanumCairnAssembly = 2212, +SolanumCairnSettle = 2213, +SolanumSymbolReveal = 2214, +SolanumEnterWriting = 2215, +SolanumExitWriting = 2216, +SolanumEnterIcon = 2217, +SolanumExitIcon = 2218, +SolanumEnterRaiseCairn = 2219, +SolanumExitRaiseCairn = 2220, +EyeAmbience_LP = 2250, +EyeLightning = 2251, +EyeVortex_LP = 2252, +VesselAmbience_LP = 2253, +EyeVortexEntry = 2254, +EyeVortexExit = 2255, +EyeGalaxyZoom = 2260, +EyeGalaxyBlowAway = 2261, +EyeBigGalaxyBurn = 2262, +EyeShuttleFlight = 2270, +EyeShuttleIntoLight = 2271, +EyeSmokeSpherePulse = 2280, +EyeSmokeSphereCollapse = 2281, +EyeCosmicInflation = 2282, +EyeBigBang = 2283, +EyeBigBangWall_LP = 2284, +EyeSmokeSphereEntry = 2285, +EyeSphereInflation = 2286, +TravelerEsker = 2300, +TravelerChert = 2301, +TravelerRiebeck = 2302, +TravelerGabbro = 2303, +TravelerFeldspar = 2304, +TravelerNomai = 2305, +TravelerEnd_All = 2306, +TravelerEnd_NoPiano = 2307, +SingularityCreate = 2400, +SingularityCollapse = 2401, +SingularityOnPlayerEnterExit = 2402, +SingularityOnObjectEnter = 2403, +SingularityOnObjectExit = 2404, +Singularity_BlackHole_LP = 2405, +Singularity_WhiteHole_LP = 2406, +VesselSingularityCreate = 2407, +VesselSingularityCollapse = 2408, +Sun_Ambience_LP = 2412, +Sun_Explosion = 2413, +Sun_SupernovaWall_LP = 2414, +Sun_Collapse = 2415, +QuantumAmbience_LP = 2424, +WhiteHoleAmbience_LP = 2425, +BlackHoleAmbience_LP = 2426, +TimelineEndEffect_Shadow = 2427, +TimelineEndEffect_Cracks = 2428, +TimelineEndEffect_Shatter = 2429, +FigBackerVideo = 2440, +CometPurr = 2441, +Death_Instant = 2450, +Death_Crushed = 2451, +Death_Energy = 2452, +Death_Digestion = 2453, +Death_TimeLoop = 2454, +Death_Self = 2455, +Death_BigBang = 2456, +Death_Lava = 2457, +Death_CrushedByElevator = 2458, +MemoryUplink_Start = 2460, +MemoryUplink_End = 2461, +MemoryUplink_LP = 2462, +MemoryUplink_Overlay_LP = 2463, +Flashback_End = 2465, +Flashback_Base_LP = 2466, +Flashback_Overlay_1_LP = 2467, +Flashback_Overlay_2_LP = 2468, +NomaiRuinsBaseTrack = 2500, +NomaiRuinsBaseScaryTrack = 2501, +NomaiRuinsOverlayTracks = 2502, +HT_City = 2503, +TH_Observatory = 2504, +TH_Village = 2505, +BH_Observatory = 2506, +GD_UnderwaterExploration = 2507, +QM_Ambient = 2508, +DB_Ambient = 2509, +TimeLoopDevice_Ambient = 2510, +EndOfTime = 2511, +EndOfTime_DBFinal = 2512, +EndOfTime_Final = 2513, +Travel_Theme = 2514, +SunStation = 2515, +SadNomaiTheme = 2516, +DB_VesselDiscovery = 2517, +EYE_ForestOfGalaxies = 2518, +EndOfTime_Final_LP = 2519, +EYE_QuantumFoamApproach = 2520, +EYE_EndOfGame = 2521, +MainMenuTheme = 2522, +FinalCredits = 2523, +PostCredits = 2524, +KazooTheme = 2525, +Raft_Impact_Light = 2550, +Raft_Impact_Medium = 2551, +Raft_Impact_Heavy = 2552, +Raft_Push = 2553, +Raft_Reel_Start = 2554, +Raft_Reel_Loop = 2555, +Raft_Reel_End = 2556, +Raft_Socket = 2557, +Raft_Release = 2558, +Raft_RunAground = 2559, +Raft_Move_Start = 2560, +Raft_Move_Loop = 2561, +Raft_Move_End = 2562, +Raft_Impact_Player = 2563, +Raft_DW_Turbo = 2564, +Door_SensorSliding_Loop = 2570, +Door_Loop = 2571, +Door_Loop_Creaking = 2572, +Door_OpenStart = 2573, +Door_OpenStop = 2574, +Door_CloseStart = 2575, +Door_CloseStop = 2576, +Door_Metal_OpenStart = 2577, +Door_Metal_OpenStop = 2578, +Door_Metal_CloseStart = 2579, +Door_Metal_CloseStop = 2580, +Door_Small_OpenStart = 2581, +Door_Small_OpenStop = 2582, +Door_Small_CloseStart = 2583, +Door_Small_CloseStop = 2584, +SecretPassage_Start = 2590, +SecretPassage_Loop = 2591, +SecretPassage_Stop = 2592, +Airlock_Open = 2593, +Airlock_Loop = 2594, +Airlock_Close = 2595, +Airlock_Pressurize = 2596, +Airlock_Depressurize = 2597, +AirRushingOut = 2598, +SlideReel_Pickup = 2600, +SlideReel_Drop = 2601, +SlideReel_Insert = 2602, +SlideReel_Remove = 2603, +Lantern_Pickup = 2604, +Lantern_Drop = 2605, +Lantern_Insert = 2606, +Lantern_Remove = 2607, +Lantern_ShortOut = 2608, +Artifact_Pickup = 2609, +Artifact_Drop = 2610, +Artifact_Light = 2611, +Artifact_Extinguish = 2612, +Artifact_Conceal = 2613, +Artifact_Unconceal = 2614, +Artifact_Focus = 2615, +Artifact_Unfocus = 2616, +Artifact_Crackling_Loop = 2617, +Artifact_Insert = 2618, +Artifact_Remove = 2619, +VisionTorch_ProjectionOn = 2620, +VisionTorch_ProjectionOff = 2621, +VisionTorch_EnterVision = 2622, +VisionTorch_ExitVision = 2623, +VisionTorch_NextSlide = 2624, +VisionTorch_Scanning_Loop = 2625, +VisionTorch_Crackling_Loop = 2626, +VisionTorch_Give = 2627, +VisionTorch_Take = 2628, +DamBreak_RW_Base = 2650, +DamBreak_DW_Base = 2651, +DamBreak_RW_Water = 2652, +DamCrack = 2653, +DamCrack_Loop = 2654, +WaterSpray_Small = 2660, +WaterSpray_Large = 2661, +Splash_Medium = 2662, +Splash_Large = 2663, +WoodDebris = 2670, +WoodImpact_Small = 2671, +WoodImpact_Large = 2672, +HouseCollapse_Zone3 = 2673, +GeneralDestruction = 2674, +HouseDestruction = 2675, +StiltDestruction = 2676, +Tower_RW_Tilt = 2680, +Tower_RW_Fall_1 = 2681, +Tower_RW_Fall_2 = 2682, +Tower_DW_Tilt = 2683, +Tower_DW_Fall_1 = 2684, +Tower_DW_Fall_2 = 2685, +Tower_RW_Splash = 2686, +SolarSail_RW_Start = 2690, +SolarSail_RW_End = 2691, +SolarSail_RW_Loop = 2692, +SolarSail_DW_Start = 2693, +SolarSail_DW_End = 2694, +SolarSail_DW_Loop = 2695, +StationFlicker_RW = 2696, +StationFlicker_DW = 2697, +StationShudder_RW = 2698, +StationShudder_DW = 2699, +River_DW_Base = 2700, +FloodWave_DW_Loop = 2701, +River_DW_Lake = 2703, +Candle_Light_Big = 2719, +Candle_Light_Small = 2720, +Candle_Extinguish = 2721, +DreamFire_Crackling_Loop = 2722, +DreamFire_Extinguish = 2723, +DreamFire_Explosion = 2724, +LodgeFire_Crackling_Loop = 2725, +ProjectorTotem_Pulse = 2729, +ProjectorTotem_Light = 2730, +ProjectorTotem_Extinguish = 2731, +ProjectorTotem_Blow = 2732, +GrappleTotem_Zoom = 2733, +GrappleTotem_RetroZoom = 2734, +Simulation_Enter = 2739, +Simulation_Exit = 2740, +IllusoryWall_Enter = 2741, +IllusoryWall_Exit = 2742, +LoadingZone_Enter = 2743, +LoadingZone_Exit = 2744, +LoadingZone_GlitchOut = 2745, +LoadingZone_Loop = 2746, +Glitch_Loop = 2747, +Sarcophagus_OpenFail = 2760, +Sarcophagus_Open = 2761, +Sarcophagus_SomethingIsComing = 2762, +Sarcophagus_TunnelAmbience = 2763, +Sarcophagus_LightsOnAmbience = 2764, +Ambience_DW_Base = 2775, +Ambience_DW_LightsOut = 2776, +Ambience_DW_Hotel = 2777, +Ambience_DW_Nature = 2778, +Ambience_DW_Forest = 2781, +Ambience_DW_Simulation = 2782, +Ambience_DW_Underground = 2784, +Ambience_DW_FireRoom = 2787, +PointSounds_DW_TreeCreak = 2790, +PointSounds_DW_Creature_1 = 2791, +PointSounds_DW_Creature_2 = 2792, +PointSounds_DW_Hotel_2 = 2795, +AlarmChime_RW = 2798, +AlarmChime_DW = 2799, +LightSensor_On = 2800, +LightSensor_Off = 2801, +LightSensor_Loop = 2802, +Projector_Prev = 2803, +Projector_Next = 2804, +Cloak_Entry = 2805, +Cloak_Exit = 2806, +GearRotate_Light = 2807, +GearRotate_Heavy = 2808, +GearRotate_Fail = 2809, +CodeTotem_Horizontal = 2810, +CodeTotem_Vertical = 2811, +CageElevator_Start = 2817, +CageElevator_Loop_Winch = 2818, +CageElevator_End = 2819, +CageElevator_Loop_Rattle = 2820, +Ambience_RW_Lab = 2873, +Ambience_RW_Tunnel = 2874, +Ambience_RW_FireRoom = 2875, +Ambience_RW_Base = 2876, +Ambience_RW_Cave = 2877, +Ambience_RW_Indoor = 2878, +River_RW_Base = 2879, +River_Underwater = 2880, +River_Reservoir = 2881, +River_Rapids = 2882, +River_Underwater_Rapids = 2883, +FloodWave_RW_Loop = 2884, +River_RW_Small = 2885, +River_RW_Stream = 2886, +PostCredit_RuinReveal = 2887, +PostCredit_LanternLight = 2889, +RaftTravel_River = 2890, +RaftTravel_Reservoir = 2891, +GhostSequence_ReducedFrights = 2895, +GhostSequence_Suspense = 2896, +GhostSequence_Dread = 2897, +GhostSequence_Fear = 2898, +GhostSequence_Fear_Slam = 2899, +EndOfTime_Dream = 2900, +StationDiscovery = 2901, +DreamFireRoom = 2902, +EyeTemple_Stinger = 2903, +EyeTemple_Basement = 2904, +SlideBurningRoom = 2905, +SubmergedStructure = 2906, +SecretLibrary = 2907, +DreamRuinsOverlayTracks = 2908, +DreamRuinsBaseTrack = 2909, +TravelerPrisoner = 2910, +TravelerEnd_All_Prisoner = 2911, +TravelerEnd_NoPiano_Prisoner = 2912, +Prisoner_Elevator = 2913, +Prisoner_Reveal = 2914, +Prisoner_Catharsis = 2915, +SecretPortrait = 2916, +SecretKorok = 2917, +PartyHouse_Traveler = 2920, +PartyHouse_Vocals = 2921, +PartyHouse_Drone = 2922, +PartyHouse_Bass = 2923, +Reel_Secret_Backdrop_A = 2924, +Reel_Secret_Backdrop_B = 2925, +Reel_Secret_Beat_Peephole_A = 2926, +Reel_Secret_Beat_Peephole_B = 2927, +Reel_Secret_Beat_Tower_A = 2928, +Reel_Secret_Beat_Tower_B = 2929, +Reel_Secret_Beat_Lantern = 2930, +Reel_Lab_Backdrop_Fail = 2933, +Reel_Lab_Backdrop_Success = 2934, +Reel_Lab_Backdrop_Testing = 2935, +Reel_Backdrop_Burnt = 2938, +Reel_1_Backdrop_A = 2940, +Reel_1_Beat_A = 2945, +Reel_1_Beat_B = 2946, +Reel_1_Beat_C = 2947, +Reel_2_Backdrop_A = 2950, +Reel_2_Backdrop_B = 2951, +Reel_2_Beat_A = 2955, +Reel_2_Beat_B = 2956, +Reel_2_Beat_C = 2957, +Reel_2_Beat_D = 2958, +Reel_3_Backdrop_A = 2960, +Reel_3_Backdrop_B = 2961, +Reel_3_Backdrop_C = 2962, +Reel_3_Beat_A = 2965, +Reel_3_Beat_B = 2966, +Reel_3_Beat_C = 2967, +Reel_3_Beat_D = 2968, +Reel_4_Backdrop_A = 2970, +Reel_4_Beat_A = 2975, +Reel_4_Beat_B = 2976, +Reel_4_Beat_C = 2977, +Reel_4_Beat_D = 2978, +Reel_5_Long = 2980, +Reel_5_Short = 2981, +Reel_Farewell = 2985, +Reel_Rule_Beat_DarkDiscovery = 2986, +Reel_Rule_Backdrop_Discovery = 2987, +Reel_Rule_Beat_Discovery = 2988, +Reel_Rule_Backdrop_Dream = 2989, +Reel_Rule_Backdrop_Normal = 2990, +Reel_Rule_Backdrop_Glitch = 2991, +Reel_LibraryPath_Backdrop = 2992, +Reel_Rule2a_Beat_A = 2993, +Reel_Seal_Backdrop = 2994, +Reel_Burning_Backdrop_A = 2995, +Reel_Burning_Backdrop_B = 2996, +Reel_Burning_Beat_A = 2997, +Reel_Burning_Beat_B = 2998, +Reel_Burning_Beat_C = 2999, +Ghost_DeathGroup = 3000, +Ghost_DeathSingle = 3001, +Ghost_Grab_Swish = 3002, +Ghost_Grab_Contact = 3003, +Ghost_BlowOut_Charge = 3004, +Ghost_BlowOut_Extinguish = 3005, +Ghost_NeckSnap = 3006, +Ghost_Identify_Curious = 3010, +Ghost_Identify_Irritated = 3011, +Ghost_Identify_Fail = 3012, +Ghost_Chase = 3013, +Ghost_Stalk = 3014, +Ghost_Hunt = 3015, +Ghost_HuntFail = 3016, +Ghost_Grab_Scream = 3017, +Ghost_Stalk_Fast = 3018, +Ghost_Grab_Shout = 3019, +Ghost_SomeoneIsInHereHowl = 3020, +Ghost_IntruderConfirmed = 3021, +Ghost_IntruderConfirmedResponse = 3022, +Ghost_CallForHelp = 3023, +Ghost_CallForHelpResponse = 3024, +Ghost_Laugh = 3025, +Ghost_Footstep_Wood = 3030, +Ghost_Footstep_Wood_Running = 3031, +Ghost_Footstep_Forest = 3032, +Ghost_Footstep_Forest_Running = 3033, +Ghost_Footstep_Gravel = 3034, +Ghost_Footstep_Wood_Stompy = 3035, +Prisoner_ReactToVision_Vocals = 3050, +Prisoner_RevealToStand_Vocals_1 = 3051, +Prisoner_RevealToStand_Vocals_2 = 3052, +Prisoner_PickUpArtifact = 3053, +Prisoner_PickUpTorch = 3054, +Prisoner_ClothFoley = 3055