diff --git a/TombLib/TombLib/LevelData/Compilers/TombEngine/FloorData.cs b/TombLib/TombLib/LevelData/Compilers/TombEngine/FloorData.cs index 6c01ed07b..02e6b899a 100644 --- a/TombLib/TombLib/LevelData/Compilers/TombEngine/FloorData.cs +++ b/TombLib/TombLib/LevelData/Compilers/TombEngine/FloorData.cs @@ -255,6 +255,7 @@ private List BuildTriggers(Room room, Sector sector, VectorInt2 pos) case TriggerTargetType.PlayAudio: case TriggerTargetType.FlipEffect: case TriggerTargetType.Secret: + case TriggerTargetType.VolumeObject: trigger2 = (ushort)(GetTriggerParameter(trigger.Target, trigger, _fdFunctionMask) | func); result.Add(trigger2); break; @@ -347,6 +348,14 @@ private ushort GetTriggerParameter(ITriggerParameter parameter, TriggerInstance index = _sinkTable[(SinkInstance)parameter]; else if (parameter is FlybyCameraInstance) index = _flybyTable[(FlybyCameraInstance)parameter]; + else if (parameter is VolumeInstance volume) + { + if (!_volumeTable.TryGetValue(volume, out index)) + { + _progressReporter.ReportWarn("Trigger '" + triggerDiagnostic + "' referring to illegal volume '" + volume + "'."); + index = 0; + } + } else if (parameter is StaticInstance) { StaticInstance @object = (StaticInstance)parameter; diff --git a/TombLib/TombLib/LevelData/Compilers/TombEngine/LevelCompilerTombEngine.cs b/TombLib/TombLib/LevelData/Compilers/TombEngine/LevelCompilerTombEngine.cs index 7953a7e47..0ddb215e4 100644 --- a/TombLib/TombLib/LevelData/Compilers/TombEngine/LevelCompilerTombEngine.cs +++ b/TombLib/TombLib/LevelData/Compilers/TombEngine/LevelCompilerTombEngine.cs @@ -53,6 +53,7 @@ public sealed partial class LevelCompilerTombEngine : LevelCompiler private Dictionary _soundSourcesTable; private Dictionary _flybyTable; private Dictionary _staticsTable; + private Dictionary _volumeTable; // Collected game limits private Dictionary _limits; @@ -203,10 +204,12 @@ private void BuildCamerasAndSinks() int sinkID = 0; int camID = 0; int flybyID = 0; + int volumeID = 0; _cameraTable = new Dictionary(new ReferenceEqualityComparer()); _sinkTable = new Dictionary(new ReferenceEqualityComparer()); _flybyTable = new Dictionary(new ReferenceEqualityComparer()); + _volumeTable = new Dictionary(new ReferenceEqualityComparer()); foreach (var room in _level.ExistingRooms) { @@ -216,6 +219,8 @@ private void BuildCamerasAndSinks() _flybyTable.Add(obj, flybyID++); foreach (var obj in room.Objects.OfType()) _sinkTable.Add(obj, sinkID++); + foreach (var obj in room.Objects.OfType()) + _volumeTable.Add(obj, volumeID++); } } diff --git a/TombLib/TombLib/LevelData/Instances/TriggerInstance.cs b/TombLib/TombLib/LevelData/Instances/TriggerInstance.cs index 5f33d0e5e..edec915e8 100644 --- a/TombLib/TombLib/LevelData/Instances/TriggerInstance.cs +++ b/TombLib/TombLib/LevelData/Instances/TriggerInstance.cs @@ -45,7 +45,8 @@ public enum TriggerTargetType : ushort FmvNg = 14, TimerfieldNg = 15, VolumeEvent = 16, - GlobalEvent = 17 + GlobalEvent = 17, + VolumeObject = 18 } public interface ITriggerParameter : IEquatable diff --git a/TombLib/TombLib/NG/NgParameterInfo.cs b/TombLib/TombLib/NG/NgParameterInfo.cs index 56a35ef99..13751a6c9 100644 --- a/TombLib/TombLib/NG/NgParameterInfo.cs +++ b/TombLib/TombLib/NG/NgParameterInfo.cs @@ -82,6 +82,7 @@ public static IEnumerable GetTargetTypeRange(LevelSettings le { yield return TriggerTargetType.VolumeEvent; yield return TriggerTargetType.GlobalEvent; + yield return TriggerTargetType.VolumeObject; } } } @@ -177,6 +178,12 @@ public static NgParameterRange GetTargetRange(LevelSettings levelSettings, Trigg else return new NgParameterRange(NgParameterKind.AnyNumber); + case TriggerTargetType.VolumeObject: + if (levelSettings.GameVersion == TRVersion.Game.TombEngine) + return new NgParameterRange(NgParameterKind.VolumesInLevel); + else + return new NgParameterRange(NgParameterKind.AnyNumber); + default: return new NgParameterRange(NgParameterKind.AnyNumber); } diff --git a/TombLib/TombLib/NG/NgParameterRange.cs b/TombLib/TombLib/NG/NgParameterRange.cs index a68d9039c..1d8d921a8 100644 --- a/TombLib/TombLib/NG/NgParameterRange.cs +++ b/TombLib/TombLib/NG/NgParameterRange.cs @@ -36,7 +36,8 @@ public enum NgParameterKind VolumeEventTypes, GlobalEventSets, GlobalEventTypes, - PluginEnumeration + PluginEnumeration, + VolumesInLevel } public struct NgLinearParameter @@ -146,6 +147,7 @@ public bool IsObject case NgParameterKind.CamerasInLevel: case NgParameterKind.SinksInLevel: case NgParameterKind.FlybyCamerasInLevel: + case NgParameterKind.VolumesInLevel: return true; case NgParameterKind.Choice: foreach (var choice in Choices) @@ -207,6 +209,8 @@ public bool ParameterMatches(ITriggerParameter parameter, bool nullResult) return parameter is SinkInstance; case NgParameterKind.FlybyCamerasInLevel: return parameter is FlybyCameraInstance; + case NgParameterKind.VolumesInLevel: + return parameter is VolumeInstance; case NgParameterKind.Rooms255: return parameter is Room; case NgParameterKind.VolumeEventSets: @@ -295,6 +299,9 @@ public IEnumerable BuildList(Level level) case NgParameterKind.FlybyCamerasInLevel: return level.ExistingRooms.SelectMany(room => room.Objects).OfType(); + case NgParameterKind.VolumesInLevel: + return level.ExistingRooms.SelectMany(room => room.Objects).OfType(); + case NgParameterKind.Rooms255: return level.ExistingRooms;