From 0db038f47bc5aab71182a88741cbf99322f24254 Mon Sep 17 00:00:00 2001 From: lahm86 <33758420+lahm86@users.noreply.github.com> Date: Sun, 12 Dec 2021 14:35:00 +0000 Subject: [PATCH] #245 TR3 Start Positions Start positions for TR3 implemented. This differs slightly from TR2 as we move any triggers that are below Lara to her new position. Some levels only have a handful of locations because of the trigger types nearby. This also updates the EM move trigger function with some defences such as checking the base and target sectors aren't the same. --- .../Types/Triggers/EMMoveTriggerFunction.cs | 27 +- TRRandomizerCore/Editors/TR3RandoEditor.cs | 20 +- .../TR3/TR3StartPositionRandomizer.cs | 114 +- .../TR3/Locations/start_positions.json | 1152 +++++++++++++++++ TRRandomizerCore/TRRandomizerController.cs | 3 +- 5 files changed, 1297 insertions(+), 19 deletions(-) create mode 100644 TRRandomizerCore/Resources/TR3/Locations/start_positions.json diff --git a/TREnvironmentEditor/Model/Types/Triggers/EMMoveTriggerFunction.cs b/TREnvironmentEditor/Model/Types/Triggers/EMMoveTriggerFunction.cs index f1a301453..09a8de86d 100644 --- a/TREnvironmentEditor/Model/Types/Triggers/EMMoveTriggerFunction.cs +++ b/TREnvironmentEditor/Model/Types/Triggers/EMMoveTriggerFunction.cs @@ -42,23 +42,26 @@ public override void ApplyToLevel(TR3Level level) private bool MoveTriggers(TRRoomSector baseSector, TRRoomSector newSector, FDControl control) { - if (baseSector.FDIndex != 0) + if (baseSector != newSector && baseSector.FDIndex != 0) { - if (newSector.FDIndex == 0) + List triggers = control.Entries[baseSector.FDIndex].FindAll(e => e is FDTriggerEntry); + if (triggers.Count > 0) { - control.CreateFloorData(newSector); - } + if (newSector.FDIndex == 0) + { + control.CreateFloorData(newSector); + } - List triggers = control.Entries[baseSector.FDIndex].FindAll(e => e is FDTriggerEntry); - control.Entries[newSector.FDIndex].AddRange(triggers); + control.Entries[newSector.FDIndex].AddRange(triggers); - control.Entries[baseSector.FDIndex].RemoveAll(e => triggers.Contains(e)); - if (control.Entries[baseSector.FDIndex].Count == 0) - { - control.RemoveFloorData(baseSector); - } + control.Entries[baseSector.FDIndex].RemoveAll(e => triggers.Contains(e)); + if (control.Entries[baseSector.FDIndex].Count == 0) + { + control.RemoveFloorData(baseSector); + } - return true; + return true; + } } return false; diff --git a/TRRandomizerCore/Editors/TR3RandoEditor.cs b/TRRandomizerCore/Editors/TR3RandoEditor.cs index 752e077e0..f88b86f81 100644 --- a/TRRandomizerCore/Editors/TR3RandoEditor.cs +++ b/TRRandomizerCore/Editors/TR3RandoEditor.cs @@ -84,6 +84,11 @@ protected override int GetSaveTarget(int numLevels) target += numLevels * 3; } + if (Settings.RandomizeStartPosition) + { + target += numLevels; + } + // Environment randomizer always runs target += numLevels; @@ -193,6 +198,19 @@ protected override void SaveImpl(AbstractTRScriptEditor scriptEditor, TRSaveMoni }.Randomize(Settings.EnemySeed); } + if (!monitor.IsCancelled && Settings.RandomizeStartPosition) + { + monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing start positions"); + new TR3StartPositionRandomizer + { + ScriptEditor = tr23ScriptEditor, + Levels = levels, + BasePath = wipDirectory, + SaveMonitor = monitor, + Settings = Settings + }.Randomize(Settings.StartPositionSeed); + } + if (!monitor.IsCancelled) { monitor.FireSaveStateBeginning(TRSaveCategory.Custom, /*Settings.RandomizeEnvironment ? "Randomizing environment" : */"Applying default environment packs"); @@ -276,7 +294,7 @@ protected override void SaveImpl(AbstractTRScriptEditor scriptEditor, TRSaveMoni TextureMonitor = textureMonitor }.Randomize(Settings.TextureSeed); } - else if (Settings.RandomizeNightMode) + else if (Settings.RandomizeNightMode && !Settings.RandomizeVfx) { monitor.FireSaveStateBeginning(TRSaveCategory.Custom, "Randomizing night mode textures"); new TR3TextureRandomizer diff --git a/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs b/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs index 88a38d2e1..cf0ee9711 100644 --- a/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs +++ b/TRRandomizerCore/Randomizers/TR3/TR3StartPositionRandomizer.cs @@ -1,16 +1,120 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; +using TREnvironmentEditor.Helpers; +using TREnvironmentEditor.Model.Types; +using TRGE.Core; +using TRLevelReader.Model; +using TRLevelReader.Model.Enums; +using TRRandomizerCore.Helpers; +using TRRandomizerCore.Levels; namespace TRRandomizerCore.Randomizers { public class TR3StartPositionRandomizer : BaseTR3Randomizer { + private static readonly short _rotation = -8192; + private Dictionary> _startLocations; + public override void Randomize(int seed) { - throw new NotImplementedException(); + _generator = new Random(seed); + _startLocations = JsonConvert.DeserializeObject>>(ReadResource(@"TR3\Locations\start_positions.json")); + + foreach (TR3ScriptedLevel lvl in Levels) + { + LoadLevelInstance(lvl); + + RandomizeStartPosition(_levelInstance); + + SaveLevelInstance(); + + if (!TriggerProgress()) + { + break; + } + } + } + + private void RandomizeStartPosition(TR3CombinedLevel level) + { + List entities = level.Data.Entities.ToList(); + TR2Entity lara = entities.Find(e => e.TypeID == (short)TR3Entities.Lara); + + // If we haven't defined anything for a level, Lara will just be rotated. This is most likely where there are + // triggers just after Lara's starting spot, so we just skip them here. + if (!Settings.RotateStartPositionOnly && _startLocations.ContainsKey(level.Name)) + { + List locations = _startLocations[level.Name]; + if (Settings.DevelopmentMode) + { + foreach (Location loc in locations) + { + entities.Add(new TR2Entity + { + TypeID = (short)TR3Entities.Lara, + X = loc.X, + Y = loc.Y, + Z = loc.Z, + Room = (short)loc.Room, + Angle = lara.Angle, + Intensity1 = -1, + Intensity2 = -1, + Flags = 0 + }); + } + } + else + { + Location location; + do + { + location = locations[_generator.Next(0, locations.Count)]; + } + while (!location.Validated); + + // If there are any triggers below Lara, move them + new EMMoveTriggerFunction + { + BaseLocation = new EMLocation + { + X = lara.X, + Y = lara.Y, + Z = lara.Z, + Room = lara.Room + }, + NewLocation = new EMLocation + { + X = location.X, + Y = location.Y, + Z = location.Z, + Room = (short)location.Room + } + }.ApplyToLevel(level.Data); + + lara.X = location.X; + lara.Y = location.Y; + lara.Z = location.Z; + lara.Room = (short)location.Room; + lara.Angle = (short)(_generator.Next(0, 8) * _rotation); + } + } + else + { + short currentAngle = lara.Angle; + do + { + lara.Angle = (short)(_generator.Next(0, 8) * _rotation); + } + while (lara.Angle == currentAngle); + } + + if (Settings.DevelopmentMode) + { + level.Data.Entities = entities.ToArray(); + level.Data.NumEntities = (uint)entities.Count; + } } } -} +} \ No newline at end of file diff --git a/TRRandomizerCore/Resources/TR3/Locations/start_positions.json b/TRRandomizerCore/Resources/TR3/Locations/start_positions.json new file mode 100644 index 000000000..2ca1f494c --- /dev/null +++ b/TRRandomizerCore/Resources/TR3/Locations/start_positions.json @@ -0,0 +1,1152 @@ +{ + "JUNGLE.TR2": [ + { + "X": 27136, + "Y": -256, + "Z": 28160, + "Room": 4 + }, + { + "X": 26112, + "Y": -256, + "Z": 28160, + "Room": 4 + }, + { + "X": 25088, + "Y": -256, + "Z": 28160, + "Room": 4 + }, + { + "X": 23040, + "Y": -2816, + "Z": 28160, + "Room": 4 + }, + { + "X": 28967, + "Y": -403, + "Z": 27954, + "Room": 4 + }, + { + "X": 30014, + "Y": -952, + "Z": 28386, + "Room": 4 + }, + { + "X": 31232, + "Y": -1152, + "Z": 28160, + "Room": 4 + }, + { + "X": 32437, + "Y": -1931, + "Z": 28512, + "Room": 4 + }, + { + "X": 33267, + "Y": -2526, + "Z": 29208, + "Room": 4 + }, + { + "X": 28186, + "Y": -70, + "Z": 29043, + "Room": 4 + }, + { + "X": 27003, + "Y": -256, + "Z": 28942, + "Room": 4 + }, + { + "X": 26077, + "Y": -916, + "Z": 30576, + "Room": 4 + }, + { + "X": 24064, + "Y": 128, + "Z": 30208, + "Room": 4 + }, + { + "X": 24100, + "Y": 90, + "Z": 30810, + "Room": 4 + }, + { + "X": 25088, + "Y": 768, + "Z": 32256, + "Room": 4 + }, + { + "X": 24064, + "Y": 1024, + "Z": 32256, + "Room": 4 + }, + { + "X": 31413, + "Y": -512, + "Z": 30054, + "Room": 4 + }, + { + "X": 26112, + "Y": -256, + "Z": 29184, + "Room": 4 + }, + { + "X": 25291, + "Y": -256, + "Z": 28989, + "Room": 4 + }, + { + "X": 27341, + "Y": -64, + "Z": 30030, + "Room": 4 + }, + { + "X": 24258, + "Y": 61, + "Z": 29307, + "Room": 4 + } + ], + "TEMPLE.TR2": [ + { + "X": 93384, + "Y": -2265, + "Z": 28479, + "Room": 18 + }, + { + "X": 88576, + "Y": -1024, + "Z": 27136, + "Room": 18 + }, + { + "X": 87552, + "Y": -640, + "Z": 26112, + "Room": 18 + }, + { + "X": 93696, + "Y": -384, + "Z": 27136, + "Room": 18 + }, + { + "X": 93696, + "Y": -512, + "Z": 26112, + "Room": 18 + }, + { + "X": 92672, + "Y": -512, + "Z": 26112, + "Room": 18 + }, + { + "X": 92519, + "Y": -512, + "Z": 26903, + "Room": 18 + }, + { + "X": 90624, + "Y": -1152, + "Z": 27136, + "Room": 18 + } + ], + "QUADCHAS.TR2": [ + { + "X": 73216, + "Y": -5504, + "Z": 54784, + "Room": 0 + }, + { + "X": 80384, + "Y": 768, + "Z": 47616, + "Room": 31 + }, + { + "X": 82432, + "Y": -256, + "Z": 59904, + "Room": 1 + }, + { + "X": 79360, + "Y": -256, + "Z": 58880, + "Room": 1 + }, + { + "X": 78336, + "Y": -2048, + "Z": 55808, + "Room": 2 + }, + { + "X": 78336, + "Y": -2048, + "Z": 54784, + "Room": 2 + }, + { + "X": 78336, + "Y": -2048, + "Z": 53760, + "Room": 2 + }, + { + "X": 79360, + "Y": -1408, + "Z": 53760, + "Room": 1 + }, + { + "X": 79360, + "Y": -1408, + "Z": 54784, + "Room": 1 + }, + { + "X": 79360, + "Y": -1536, + "Z": 55808, + "Room": 1 + }, + { + "X": 79360, + "Y": -3200, + "Z": 56832, + "Room": 2 + }, + { + "X": 79360, + "Y": -1664, + "Z": 52736, + "Room": 1 + }, + { + "X": 80384, + "Y": -256, + "Z": 53760, + "Room": 1 + }, + { + "X": 80384, + "Y": -256, + "Z": 54784, + "Room": 1 + }, + { + "X": 81408, + "Y": -256, + "Z": 55808, + "Room": 1 + }, + { + "X": 80384, + "Y": -256, + "Z": 51712, + "Room": 1 + }, + { + "X": 84480, + "Y": -256, + "Z": 62976, + "Room": 7 + }, + { + "X": 88576, + "Y": -384, + "Z": 62976, + "Room": 7 + }, + { + "X": 81408, + "Y": -256, + "Z": 57856, + "Room": 1 + }, + { + "X": 85504, + "Y": -512, + "Z": 48640, + "Room": 10 + } + ], + "TONYBOSS.TR2": [ + { + "X": 5632, + "Y": -15360, + "Z": 44544, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 44544, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 45568, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 46592, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 47616, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 48640, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 49664, + "Room": 3 + }, + { + "X": 4608, + "Y": -15360, + "Z": 50688, + "Room": 3 + }, + { + "X": 5632, + "Y": -15360, + "Z": 50688, + "Room": 3 + }, + { + "X": 6656, + "Y": -15360, + "Z": 50688, + "Room": 3 + }, + { + "X": 7680, + "Y": -15360, + "Z": 50688, + "Room": 3 + }, + { + "X": 8704, + "Y": -15360, + "Z": 50688, + "Room": 3 + }, + { + "X": 9728, + "Y": -15360, + "Z": 48640, + "Room": 9 + }, + { + "X": 11776, + "Y": -15360, + "Z": 49664, + "Room": 9 + } + ], + "SHORE.TR2": [ + { + "X": 20723, + "Y": 0, + "Z": 9504, + "Room": 24 + }, + { + "X": 19772, + "Y": 0, + "Z": 6877, + "Room": 24 + }, + { + "X": 18944, + "Y": -256, + "Z": 4608, + "Room": 24 + }, + { + "X": 17920, + "Y": -128, + "Z": 4608, + "Room": 24 + }, + { + "X": 22207, + "Y": -169, + "Z": 4760, + "Room": 24 + }, + { + "X": 21268, + "Y": -256, + "Z": 5772, + "Room": 24 + }, + { + "X": 21974, + "Y": -2348, + "Z": 10716, + "Room": 24 + }, + { + "X": 20992, + "Y": -640, + "Z": 15872, + "Room": 4 + } + ], + "CRASH.TR2": [ + { + "X": 12800, + "Y": -5376, + "Z": 76288, + "Room": 86 + }, + { + "X": 12800, + "Y": -5376, + "Z": 75264, + "Room": 86 + }, + { + "X": 12800, + "Y": -5376, + "Z": 74240, + "Room": 86 + }, + { + "X": 12800, + "Y": -5376, + "Z": 73216, + "Room": 86 + }, + { + "X": 11776, + "Y": -5376, + "Z": 73216, + "Room": 90 + }, + { + "X": 11776, + "Y": -5376, + "Z": 76288, + "Room": 91 + }, + { + "X": 10752, + "Y": -5376, + "Z": 76288, + "Room": 91 + }, + { + "X": 10752, + "Y": -5376, + "Z": 75264, + "Room": 90 + }, + { + "X": 11776, + "Y": -5376, + "Z": 75264, + "Room": 90 + }, + { + "X": 10752, + "Y": -5376, + "Z": 74240, + "Room": 90 + } + ], + "RAPIDS.TR2": [ + { + "X": 75264, + "Y": -26112, + "Z": 54784, + "Room": 50 + }, + { + "X": 74240, + "Y": -26112, + "Z": 54784, + "Room": 50 + }, + { + "X": 73216, + "Y": -26112, + "Z": 54784, + "Room": 50 + }, + { + "X": 72192, + "Y": -25984, + "Z": 55808, + "Room": 50 + }, + { + "X": 74240, + "Y": -25984, + "Z": 55808, + "Room": 50 + }, + { + "X": 75264, + "Y": -25984, + "Z": 55808, + "Room": 50 + }, + { + "X": 76288, + "Y": -25984, + "Z": 55808, + "Room": 50 + }, + { + "X": 77312, + "Y": -25984, + "Z": 55808, + "Room": 50 + }, + { + "X": 77312, + "Y": -26112, + "Z": 54784, + "Room": 50 + }, + { + "X": 77312, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 76288, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 75264, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 74240, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 73216, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 72192, + "Y": -25856, + "Z": 56832, + "Room": 50 + }, + { + "X": 77308, + "Y": -28669, + "Z": 58365, + "Room": 53 + } + ], + "TRIBOSS.TR2": [ + { + "X": 45568, + "Y": -10496, + "Z": 61952, + "Room": 0 + }, + { + "X": 46592, + "Y": -10112, + "Z": 61952, + "Room": 0 + }, + { + "X": 47616, + "Y": -10496, + "Z": 61952, + "Room": 0 + }, + { + "X": 45568, + "Y": -9728, + "Z": 60928, + "Room": 0 + }, + { + "X": 47616, + "Y": -9728, + "Z": 60928, + "Room": 0 + } + ], + "ROOFS.TR2": [ + { + "X": 38400, + "Y": -21504, + "Z": 45568, + "Room": 25 + }, + { + "X": 38400, + "Y": -21504, + "Z": 44544, + "Room": 25 + }, + { + "X": 38400, + "Y": -21504, + "Z": 43520, + "Room": 25 + }, + { + "X": 38400, + "Y": -21504, + "Z": 42496, + "Room": 25 + }, + { + "X": 38400, + "Y": -21504, + "Z": 41472, + "Room": 25 + }, + { + "X": 39424, + "Y": -21504, + "Z": 41472, + "Room": 25 + }, + { + "X": 40448, + "Y": -21504, + "Z": 41472, + "Room": 52 + }, + { + "X": 42496, + "Y": -21504, + "Z": 41472, + "Room": 52 + }, + { + "X": 33280, + "Y": -24704, + "Z": 41472, + "Room": 25 + }, + { + "X": 34378, + "Y": -23293, + "Z": 41460, + "Room": 25 + }, + { + "X": 35283, + "Y": -23293, + "Z": 41463, + "Room": 25 + } + ], + "SEWER.TR2": [ + { + "X": 71168, + "Y": -12160, + "Z": 98816, + "Room": 157 + } + ], + "TOWER.TR2": [ + { + "X": 80384, + "Y": -17920, + "Z": 40448, + "Room": 36 + }, + { + "X": 81408, + "Y": -17920, + "Z": 40448, + "Room": 36 + }, + { + "X": 82432, + "Y": -17920, + "Z": 40448, + "Room": 36 + }, + { + "X": 81408, + "Y": -17920, + "Z": 41472, + "Room": 36 + }, + { + "X": 83456, + "Y": -17920, + "Z": 40448, + "Room": 36 + }, + { + "X": 83456, + "Y": -17920, + "Z": 39424, + "Room": 36 + }, + { + "X": 82432, + "Y": -17920, + "Z": 39424, + "Room": 36 + }, + { + "X": 82432, + "Y": -17920, + "Z": 38400, + "Room": 36 + }, + { + "X": 83456, + "Y": -17920, + "Z": 38400, + "Room": 36 + }, + { + "X": 82432, + "Y": -17920, + "Z": 37376, + "Room": 36 + }, + { + "X": 81408, + "Y": -17920, + "Z": 37376, + "Room": 36 + }, + { + "X": 80384, + "Y": -17920, + "Z": 37376, + "Room": 36 + }, + { + "X": 84480, + "Y": -18432, + "Z": 37376, + "Room": 36 + } + ], + "OFFICE.TR2": [ + { + "X": 48640, + "Y": 0, + "Z": 50688, + "Room": 4 + }, + { + "X": 51712, + "Y": 0, + "Z": 47616, + "Room": 1 + }, + { + "X": 48640, + "Y": 0, + "Z": 53760, + "Room": 4 + } + ], + "NEVADA.TR2": [ + { + "X": 23040, + "Y": -2176, + "Z": 4608, + "Room": 0 + }, + { + "X": 24107, + "Y": -3499, + "Z": 3156, + "Room": 0 + }, + { + "X": 22048, + "Y": -3539, + "Z": 3131, + "Room": 0 + }, + { + "X": 20786, + "Y": -3867, + "Z": 3424, + "Room": 0 + } + ], + "COMPOUND.TR2": [ + { + "X": 15851, + "Y": 0, + "Z": 23171, + "Room": 2 + }, + { + "X": 16896, + "Y": 0, + "Z": 23040, + "Room": 2 + }, + { + "X": 16048, + "Y": 0, + "Z": 24031, + "Room": 2 + }, + { + "X": 15872, + "Y": 0, + "Z": 25088, + "Room": 2 + }, + { + "X": 16896, + "Y": 0, + "Z": 25088, + "Room": 2 + }, + { + "X": 17920, + "Y": 0, + "Z": 25088, + "Room": 2 + }, + { + "X": 17920, + "Y": -256, + "Z": 24064, + "Room": 2 + }, + { + "X": 17920, + "Y": -256, + "Z": 23040, + "Room": 2 + } + ], + "AREA51.TR2": [ + { + "X": 65024, + "Y": 3072, + "Z": 52736, + "Room": 31 + }, + { + "X": 65024, + "Y": 3072, + "Z": 53760, + "Room": 31 + }, + { + "X": 65024, + "Y": 3072, + "Z": 54784, + "Room": 31 + }, + { + "X": 64000, + "Y": 3072, + "Z": 54784, + "Room": 31 + }, + { + "X": 64000, + "Y": 3072, + "Z": 55808, + "Room": 11 + }, + { + "X": 65024, + "Y": 3072, + "Z": 55808, + "Room": 11 + }, + { + "X": 66048, + "Y": 3072, + "Z": 55808, + "Room": 11 + }, + { + "X": 66048, + "Y": 2304, + "Z": 56832, + "Room": 11 + }, + { + "X": 65024, + "Y": 3072, + "Z": 56832, + "Room": 11 + }, + { + "X": 64000, + "Y": 3072, + "Z": 56832, + "Room": 11 + }, + { + "X": 61952, + "Y": 2048, + "Z": 56832, + "Room": 11 + }, + { + "X": 62976, + "Y": 2048, + "Z": 56832, + "Room": 11 + }, + { + "X": 62976, + "Y": 2048, + "Z": 55808, + "Room": 11 + } + ], + "ANTARC.TR2": [ + { + "X": 32256, + "Y": -3712, + "Z": 3584, + "Room": 12 + }, + { + "X": 33280, + "Y": -3968, + "Z": 4608, + "Room": 12 + }, + { + "X": 33280, + "Y": -4864, + "Z": 5632, + "Room": 12 + }, + { + "X": 32269, + "Y": -3840, + "Z": 5995, + "Room": 12 + }, + { + "X": 34587, + "Y": -3840, + "Z": 6378, + "Room": 12 + }, + { + "X": 33490, + "Y": -3773, + "Z": 6409, + "Room": 12 + }, + { + "X": 31480, + "Y": -3393, + "Z": 8434, + "Room": 12 + }, + { + "X": 31424, + "Y": -3240, + "Z": 9885, + "Room": 12 + }, + { + "X": 41472, + "Y": -6400, + "Z": 19968, + "Room": 19 + } + ], + "MINES.TR2": [ + { + "X": 59904, + "Y": 1024, + "Z": 25088, + "Room": 40 + } + ], + "CITY.TR2": [ + { + "X": 96768, + "Y": 0, + "Z": 68096, + "Room": 9 + }, + { + "X": 96768, + "Y": 0, + "Z": 69120, + "Room": 9 + }, + { + "X": 96768, + "Y": 0, + "Z": 70144, + "Room": 9 + }, + { + "X": 97792, + "Y": 0, + "Z": 70144, + "Room": 9 + }, + { + "X": 97792, + "Y": 0, + "Z": 69120, + "Room": 9 + }, + { + "X": 97792, + "Y": 0, + "Z": 68096, + "Room": 9 + }, + { + "X": 98816, + "Y": 0, + "Z": 68096, + "Room": 9 + }, + { + "X": 98816, + "Y": 0, + "Z": 70144, + "Room": 9 + }, + { + "X": 99840, + "Y": 0, + "Z": 70144, + "Room": 9 + }, + { + "X": 99840, + "Y": 0, + "Z": 69120, + "Room": 9 + }, + { + "X": 99840, + "Y": 0, + "Z": 68096, + "Room": 9 + }, + { + "X": 100864, + "Y": -256, + "Z": 69120, + "Room": 9 + } + ], + "CHAMBER.TR2": [ + { + "X": 61952, + "Y": -512, + "Z": 61952, + "Room": 5 + }, + { + "X": 61952, + "Y": -512, + "Z": 64000, + "Room": 5 + }, + { + "X": 62976, + "Y": -512, + "Z": 62976, + "Room": 5 + }, + { + "X": 61952, + "Y": -512, + "Z": 62976, + "Room": 5 + } + ], + "STPAUL.TR2": [ + { + "X": 57856, + "Y": -17536, + "Z": 55808, + "Room": 40 + }, + { + "X": 56832, + "Y": -16768, + "Z": 55808, + "Room": 40 + }, + { + "X": 55808, + "Y": -16000, + "Z": 55808, + "Room": 40 + }, + { + "X": 54784, + "Y": -15232, + "Z": 55808, + "Room": 40 + } + ] +} \ No newline at end of file diff --git a/TRRandomizerCore/TRRandomizerController.cs b/TRRandomizerCore/TRRandomizerController.cs index 1c55f0034..6fef9cc4b 100644 --- a/TRRandomizerCore/TRRandomizerController.cs +++ b/TRRandomizerCore/TRRandomizerController.cs @@ -26,7 +26,8 @@ public class TRRandomizerController { TRRandomizerType.LevelSequence, TRRandomizerType.Unarmed, TRRandomizerType.Ammoless, TRRandomizerType.Audio, TRRandomizerType.Outfit, TRRandomizerType.Secret, TRRandomizerType.GlobeDisplay, TRRandomizerType.RewardRooms, TRRandomizerType.SFX, TRRandomizerType.Item, - TRRandomizerType.NightMode, TRRandomizerType.SecretReward, TRRandomizerType.Text, TRRandomizerType.Enemy, TRRandomizerType.Texture + TRRandomizerType.NightMode, TRRandomizerType.SecretReward, TRRandomizerType.Text, TRRandomizerType.Enemy, TRRandomizerType.Texture, + TRRandomizerType.StartPosition } };