Example #1
0
 private static ushort GetValue(Level level, ITriggerParameter parameter)
 {
     if (parameter == null)
     {
         return(0);
     }
     else if (parameter is TriggerParameterUshort)
     {
         return(((TriggerParameterUshort)parameter).Key);
     }
     else if (parameter is IHasScriptID)
     {
         uint?Id = ((IHasScriptID)parameter).ScriptId;
         if (Id == null)
         {
             throw new ExceptionScriptIdMissing();
         }
         return(checked ((ushort)Id));
     }
     else if (parameter is Room)
     {
         return((ushort)level.Rooms.ReferenceIndexOf(parameter));
     }
     else
     {
         throw new Exception("Trigger parameter of invalid type!");
     }
 }
Example #2
0
        private void UpdateEvents(ref ITriggerParameter oldValue, ITriggerParameter newValue)
        {
            if (oldValue == newValue)
            {
                return;
            }

            if (newValue is ObjectInstance)
            {
                ((ObjectInstance)newValue).DeletedEvent += ObjectParameterDeletedEvent;
            }
            if (newValue is Room)
            {
                ((Room)newValue).DeletedEvent += RoomParameterDeletedEvent;
            }

            if (newValue is ObjectInstance)
            {
                ((ObjectInstance)newValue).DeletedEvent -= ObjectParameterDeletedEvent;
            }
            if (newValue is Room)
            {
                ((Room)newValue).DeletedEvent -= RoomParameterDeletedEvent;
            }

            oldValue = newValue;
        }
Example #3
0
 private void View(ITriggerParameter value)
 {
     value = GetObjectPointer();
     if (value is ObjectInstance)
     {
         ViewObject?.Invoke((ObjectInstance)value);
     }
     if (value is Room)
     {
         ViewRoom?.Invoke((Room)value);
     }
 }
Example #4
0
        public bool ParameterMatches(ITriggerParameter parameter, bool nullResult)
        {
            if (parameter == null)
            {
                return(nullResult || Kind == NgParameterKind.Empty);
            }

            switch (Kind)
            {
            case NgParameterKind.Empty:
                return(parameter == null);

            case NgParameterKind.Choice:
                foreach (NgParameterRange choice in Choices)
                {
                    if (choice.ParameterMatches(parameter, false))
                    {
                        return(true);
                    }
                }
                return(false);

            case NgParameterKind.MoveablesInLevel:
                return(parameter is MoveableInstance);

            case NgParameterKind.StaticsInLevel:
                return(parameter is StaticInstance);

            case NgParameterKind.CamerasInLevel:
                return(parameter is CameraInstance);

            case NgParameterKind.SinksInLevel:
                return(parameter is SinkInstance);

            case NgParameterKind.FlybyCamerasInLevel:
                return(parameter is FlybyCameraInstance);

            case NgParameterKind.Rooms255:
                return(parameter is Room);

            default:
                if (IsNumber)
                {
                    return(parameter is TriggerParameterUshort);
                }
                else
                {
                    return(false);
                }
            }
        }
Example #5
0
 public override void TransformRoomReferences(Func <Room, Room> transformRoom)
 {
     if (_target is Room)
     {
         _target = transformRoom((Room)_target);
     }
     if (_timer is Room)
     {
         _timer = transformRoom((Room)_timer);
     }
     if (_extra is Room)
     {
         _extra = transformRoom((Room)_extra);
     }
 }
Example #6
0
 private void ParameterDeletedEvent(ITriggerParameter parameter)
 {
     if (_target == parameter)
     {
         _target = null;
     }
     if (_timer == parameter)
     {
         _timer = null;
     }
     if (_extra == parameter)
     {
         _extra = null;
     }
 }
Example #7
0
 public bool IsPointingTo(ITriggerParameter value)
 {
     if (Target != null && Target.Equals(value))
     {
         return(true);
     }
     if (Timer != null && Timer.Equals(value))
     {
         return(true);
     }
     if (Extra != null && Extra.Equals(value))
     {
         return(true);
     }
     return(false);
 }
Example #8
0
 bool IEquatable <ITriggerParameter> .Equals(ITriggerParameter other) => this == other;
Example #9
0
        public static NgParameterRange GetExtraRange(LevelSettings levelSettings, TriggerType triggerType, TriggerTargetType targetType, ITriggerParameter target, ITriggerParameter timer)
        {
            switch (triggerType)
            {
            case TriggerType.ConditionNg:
                if (!(timer is TriggerParameterUshort))
                {
                    return(new NgParameterRange(NgParameterKind.Empty));
                }
                NgTriggerSubtype conditionSubtriggerType = NgCatalog.ConditionTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)timer).Key);
                return(conditionSubtriggerType?.Extra ?? new NgParameterRange(NgParameterKind.Empty));

            default:
                switch (targetType)
                {
                case TriggerTargetType.FlipEffect:
                    if (!(target is TriggerParameterUshort))
                    {
                        return(new NgParameterRange(NgParameterKind.Empty));
                    }
                    NgTriggerSubtype flipEffectSubtriggerType = NgCatalog.FlipEffectTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)target).Key);
                    return(flipEffectSubtriggerType?.Extra ?? new NgParameterRange(NgParameterKind.Empty));

                case TriggerTargetType.ActionNg:
                    if (!(timer is TriggerParameterUshort))
                    {
                        return(new NgParameterRange(NgParameterKind.Empty));
                    }
                    NgTriggerSubtype actionSubtriggerType = NgCatalog.ActionTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)timer).Key);
                    return(actionSubtriggerType?.Extra ?? new NgParameterRange(NgParameterKind.Empty));

                default:
                    return(new NgParameterRange(NgParameterKind.Empty));
                }
            }
        }
Example #10
0
        public static NgParameterRange GetTimerRange(LevelSettings levelSettings, TriggerType triggerType, TriggerTargetType targetType, ITriggerParameter target)
        {
            switch (triggerType)
            {
            case TriggerType.ConditionNg:
                return(new NgParameterRange(NgCatalog.ConditionTrigger.MainList.DicSelect(e => (TriggerParameterUshort)e.Value)));

            default:
                switch (targetType)
                {
                case TriggerTargetType.FlipEffect:
                    if (!(target is TriggerParameterUshort))
                    {
                        return(new NgParameterRange(NgParameterKind.Empty));
                    }
                    NgTriggerSubtype flipEffectSubtriggerType = NgCatalog.FlipEffectTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)target).Key);
                    return(flipEffectSubtriggerType?.Timer ?? new NgParameterRange(NgParameterKind.Empty));

                case TriggerTargetType.ActionNg:
                    return(new NgParameterRange(NgCatalog.ActionTrigger.MainList.DicSelect(e => (TriggerParameterUshort)e.Value)));

                case TriggerTargetType.TimerfieldNg:
                    return(new NgParameterRange(NgParameterKind.Empty));

                default:
                    return(new NgParameterRange(NgParameterKind.AnyNumber));
                }
            }
        }
Example #11
0
        public static NgParameterRange GetTargetRange(LevelSettings levelSettings, TriggerType triggerType, TriggerTargetType targetType, ITriggerParameter timer)
        {
            switch (triggerType)
            {
            case TriggerType.ConditionNg:
                if (!(timer is TriggerParameterUshort))
                {
                    return(new NgParameterRange(NgParameterKind.Empty));
                }
                NgTriggerSubtype conditionSubtriggerType = NgCatalog.ConditionTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)timer).Key);
                return(conditionSubtriggerType?.Target ?? new NgParameterRange(NgParameterKind.Empty));

            default:
                switch (targetType)
                {
                case TriggerTargetType.Object:
                    return(new NgParameterRange(NgParameterKind.MoveablesInLevel));

                case TriggerTargetType.Camera:
                    return(new NgParameterRange(NgParameterKind.CamerasInLevel));

                case TriggerTargetType.Sink:
                    return(new NgParameterRange(NgParameterKind.SinksInLevel));

                case TriggerTargetType.Target:
                    // Actually it is possible to not only target Target objects, but all movables.
                    // This is also useful: It makes sense to target egg a trap or an enemy.
                    return(new NgParameterRange(NgParameterKind.MoveablesInLevel));

                case TriggerTargetType.FlyByCamera:
                    return(new NgParameterRange(NgParameterKind.FlybyCamerasInLevel));

                case TriggerTargetType.FlipEffect:
                    if (levelSettings.GameVersion == TRVersion.Game.TRNG)
                    {
                        return(new NgParameterRange(NgCatalog.FlipEffectTrigger.MainList.DicSelect(e => (TriggerParameterUshort)e.Value)));
                    }
                    else if (levelSettings.GameVersion == TRVersion.Game.TR4)
                    {
                        return(new NgParameterRange(NgCatalog.FlipEffectTrigger.MainList
                                                    .DicWhere(entry => entry.Value.Name.Contains("OldFlip"))
                                                    .DicSelect(e => (TriggerParameterUshort)e.Value)));
                    }
                    else
                    {
                        return(new NgParameterRange(NgParameterKind.AnyNumber));
                    }

                case TriggerTargetType.ActionNg:
                    if (!(timer is TriggerParameterUshort))
                    {
                        return(new NgParameterRange(NgParameterKind.Empty));
                    }
                    NgTriggerSubtype actionSubtriggerType = NgCatalog.ActionTrigger.MainList.TryGetOrDefault(((TriggerParameterUshort)timer).Key);
                    return(actionSubtriggerType?.Target ?? new NgParameterRange(NgParameterKind.Empty));

                case TriggerTargetType.TimerfieldNg:
                    return(NgCatalog.TimerFieldTrigger);

                default:
                    return(new NgParameterRange(NgParameterKind.AnyNumber));
                }
            }
        }
Example #12
0
 bool IEquatable <ITriggerParameter> .Equals(ITriggerParameter other) => Equals(other);