示例#1
0
        static private void ValidateRule(RSRuleData inRule, RSValidationState ioState, RSValidationContext inContext)
        {
            if (inRule == null)
            {
                ioState.Error("Null rule");
                return;
            }

            ioState.PushContext("Trigger");
            RSTriggerInfo triggerInfo = ValidateTriggerId(inRule.TriggerId, RSValidationFlags.None, ioState, inContext);

            inContext = inContext.WithTrigger(triggerInfo);
            ioState.PopContext();

            if (inRule.Conditions != null && inRule.Conditions.Length > 0)
            {
                for (int i = 0; i < inRule.Conditions.Length; ++i)
                {
                    ioState.PushContext("Condition {0}", i);
                    ValidateCondition(inRule.Conditions[i], ioState, inContext);
                    ioState.PopContext();
                }
            }

            if (inRule.Actions != null && inRule.Actions.Length > 0)
            {
                for (int i = 0; i < inRule.Actions.Length; ++i)
                {
                    ioState.PushContext("Action {0}", i);
                    ValidateAction(inRule.Actions[i], ioState, inContext);
                    ioState.PopContext();
                }
            }
        }
 internal RSValidationContext(RSLibrary inLibrary, IRSEntityMgr inManager, IRSEntity inEntity, RSTriggerInfo inTrigger, RSParameterInfo inParameterInfo)
 {
     Library   = inLibrary;
     Manager   = inManager;
     Entity    = inEntity;
     Trigger   = inTrigger;
     Parameter = inParameterInfo;
 }
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            switch (Mode)
            {
            case ResolvableValueMode.Value:
                return(Value.GetPreviewString(inTriggerContext, inLibrary));

            case ResolvableValueMode.Argument:
                return(string.Format("Arg({0})", inTriggerContext?.ParameterType?.Name ?? "TriggerArg"));

            case ResolvableValueMode.Query:
            {
                using (PooledStringBuilder psb = PooledStringBuilder.Alloc())
                {
                    var sb = psb.Builder;

                    sb.Append(Query.GetPreviewStringAsQuery(inTriggerContext, inLibrary));

                    if (QueryArguments != null && QueryArguments.Length > 0)
                    {
                        sb.Append("(");

                        RSQueryInfo queryInfo = inLibrary.GetQuery(Query.Id);
                        for (int i = 0; i < QueryArguments.Length; ++i)
                        {
                            if (i > 0)
                            {
                                sb.Append("; ");
                            }

                            if (queryInfo != null && i < queryInfo.Parameters.Length)
                            {
                                sb.Append(queryInfo.Parameters[i].Name);
                            }
                            else
                            {
                                sb.Append(i);
                            }

                            sb.Append(": ");

                            sb.Append(QueryArguments[i].GetPreviewString(inTriggerContext, inLibrary));
                        }

                        sb.Append(")");
                    }

                    return(sb.ToString());
                }
            }

            case ResolvableValueMode.Register:
                return(string.Format("Register({0})", Register));

            default:
                return("[No Value]");
            }
        }
示例#4
0
        static private RSTriggerInfo ValidateTriggerId(RSTriggerId inTriggerId, RSValidationFlags inFlags, RSValidationState ioState, RSValidationContext inContext)
        {
            RSTypeInfo restrictTriggerType = inContext.Parameter?.TriggerParameterType;

            if (inTriggerId == RSTriggerId.Null)
            {
                if (restrictTriggerType != null)
                {
                    ioState.Error("Null trigger id provided - require trigger with parameter type {0}", restrictTriggerType);
                }
                else
                {
                    ioState.Warn("Null trigger provided");
                }
                return(null);
            }
            else
            {
                RSTriggerInfo triggerInfo = inContext.Library.GetTrigger(inTriggerId);
                if (triggerInfo == null)
                {
                    ioState.Error("Trigger {0} does not exist", inTriggerId);
                }
                else
                {
                    if (restrictTriggerType != null)
                    {
                        if (restrictTriggerType == RSBuiltInTypes.Void)
                        {
                            if (triggerInfo.ParameterType != null)
                            {
                                ioState.Error("Trigger with no parameter required, but trigger {0} with parameter {1} provided", triggerInfo.Name, triggerInfo.ParameterType.Type);
                            }
                        }
                        else
                        {
                            if (triggerInfo.ParameterType == null)
                            {
                                ioState.Error("Trigger with parameter {0} required, but trigger {1} with no parameter provided", restrictTriggerType, triggerInfo.Name);
                            }
                            else if (!restrictTriggerType.CanConvert(triggerInfo.ParameterType.Type))
                            {
                                ioState.Error("Trigger with parameter {0} required, but trigger {1} with incompatible parameter {2} provided", restrictTriggerType, triggerInfo.Name, triggerInfo.ParameterType.Type);
                            }
                        }
                    }
                }
                return(triggerInfo);
            }
        }
示例#5
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            string preview = GetBasePreviewString(inTriggerContext, inLibrary);

            if (!string.IsNullOrEmpty(m_LinkSearch))
            {
                preview += "." + m_LinkSearch;
                if (m_UseFirstLink)
                {
                    preview += "[0]";
                }
            }
            return(preview);
        }
示例#6
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            using (PooledStringBuilder psb = PooledStringBuilder.Alloc())
            {
                var sb = psb.Builder;

                if (!Enabled)
                {
                    sb.Append("[Disabled] ");
                }

                sb.Append(Action.GetPreviewStringAsAction(inTriggerContext, inLibrary));

                if (Arguments != null && Arguments.Length > 0)
                {
                    sb.Append("(");

                    RSActionInfo actionInfo = inLibrary.GetAction(Action.Id);
                    for (int i = 0; i < Arguments.Length; ++i)
                    {
                        if (i > 0)
                        {
                            sb.Append("; ");
                        }

                        if (actionInfo != null && i < actionInfo.Parameters.Length)
                        {
                            sb.Append(actionInfo.Parameters[i].Name);
                        }
                        else
                        {
                            sb.Append(i);
                        }

                        sb.Append(": ");

                        sb.Append(Arguments[i].GetPreviewString(inTriggerContext, inLibrary));
                    }

                    sb.Append(")");
                }

                return(sb.ToString());
            }
        }
示例#7
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            switch (m_Mode)
            {
            case ResolvableValueMode.Value:
                return(m_Value.GetPreviewString(inTriggerContext, inLibrary));

            case ResolvableValueMode.Argument:
                return(string.Format("Arg({0})", inTriggerContext?.ParameterType?.Name ?? "TriggerArg"));

            case ResolvableValueMode.Query:
                return(m_Query.GetPreviewStringAsQuery(inTriggerContext, inLibrary));

            case ResolvableValueMode.Register:
                return(string.Format("Register({0})", m_Register));

            default:
                return("[No Value]");
            }
        }
        public RSTypeInfo TypeInfo(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            switch (Mode)
            {
            case ResolvableValueMode.Value:
                return(RSInterop.RSTypeFor(Value, inLibrary.TypeAssembly));

            case ResolvableValueMode.Query:
                return(inLibrary.GetQuery(Query.Id)?.ReturnType);

            case ResolvableValueMode.Argument:
                return(inTriggerContext?.ParameterType?.Type);

            case ResolvableValueMode.Register:
                return(RSBuiltInTypes.Any);

            default:
                throw new InvalidOperationException("Unknown ResolvableValueMode " + Mode);
            }
        }
示例#9
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            using (PooledStringBuilder psb = PooledStringBuilder.Alloc())
            {
                var sb = psb.Builder;

                if (!Enabled)
                {
                    sb.Append("[Disabled] ");
                }

                if (!string.IsNullOrEmpty(Name))
                {
                    sb.Append(Name).Append(" :: ");
                }

                sb.Append(TriggerId.ToString(inLibrary));

                return(sb.ToString());
            }
        }
示例#10
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            using (PooledStringBuilder psb = PooledStringBuilder.Alloc())
            {
                var sb = psb.Builder;

                if (!Enabled)
                {
                    sb.Append("[Disabled] ");
                }

                sb.Append(Query.GetPreviewString(inTriggerContext, inLibrary));

                sb.Append(" ").Append(Operator.Symbol());

                if (Operator.IsBinary())
                {
                    sb.Append(" ").Append(Target.GetPreviewString(inTriggerContext, inLibrary));
                }

                return(sb.ToString());
            }
        }
示例#11
0
        /// <summary>
        /// Renders editor for rule info. Does not include conditions or actions.
        /// </summary>
        static public void RuleData(UndoTarget inUndo, RSRuleData ioRule, RSRuleTableData ioTable, RSValidationFlags inFlags, RSValidationContext inContext)
        {
            string preview = ioRule.GetPreviewString(null, inContext.Library);

            GUILayout.Label(preview, RSGUIStyles.RuleHeaderStyle);

            EditorGUILayout.Space();

            string newName = EditorGUILayout.TextField(Content.RuleNameLabel, ioRule.Name);

            if (newName != ioRule.Name)
            {
                inUndo.MarkDirty("Changed Rule Name");
                ioRule.Name = newName;
            }

            RSTriggerId newTriggerId;

            if (inFlags.Has(RSValidationFlags.FilterSelection) && inContext.Entity != null)
            {
                newTriggerId = LibraryGUILayout.TriggerSelector(Content.RuleTriggerLabel, ioRule.TriggerId, inContext.Entity, inContext.Library);
            }
            else
            {
                newTriggerId = LibraryGUILayout.TriggerSelector(Content.RuleTriggerLabel, ioRule.TriggerId, inContext.Library);
            }

            if (newTriggerId != ioRule.TriggerId)
            {
                inUndo.MarkDirty("Changed Rule Trigger", true);
                ioRule.TriggerId = newTriggerId;

                TableUtils.UpdateUniqueRuleTriggers(ioTable);
            }

            if (newTriggerId != RSTriggerId.Null)
            {
                RSTriggerInfo info = inContext.Library.GetTrigger(newTriggerId);
                if (info != null && info.ParameterType != null)
                {
                    using (new EditorGUI.IndentLevelScope())
                    {
                        EditorGUILayout.LabelField(Content.RuleParameterLabel, EditorGUIUtility.TrTextContent(info.ParameterType.ToStringWithoutDefault(), info.ParameterType.Tooltip));
                    }
                }
            }

            EditorGUILayout.Space();

            // Enabled
            bool bEnabled = EditorGUILayout.Toggle(Content.RuleEnabledLabel, ioRule.Enabled);

            if (bEnabled != ioRule.Enabled)
            {
                inUndo.MarkDirty("Changed Rule Enabled");
                ioRule.Enabled = bEnabled;
            }

            bool bOnlyOnce = EditorGUILayout.Toggle(Content.RuleOnlyOnceLabel, ioRule.OnlyOnce);

            if (bOnlyOnce != ioRule.OnlyOnce)
            {
                inUndo.MarkDirty("Changed Rule OnlyOnce");
                ioRule.OnlyOnce = bOnlyOnce;
            }

            bool bDontInterrupt = EditorGUILayout.Toggle(Content.RuleDontInterruptLabel, ioRule.DontInterrupt);

            if (bDontInterrupt != ioRule.DontInterrupt)
            {
                inUndo.MarkDirty("Changed Rule DontInterrupt");
                ioRule.DontInterrupt = bDontInterrupt;
            }

            EditorGUILayout.Space();

            string newGroup = EditorGUILayout.TextField(Content.RuleGroupLabel, ioRule.RoutineGroup);

            if (newGroup != ioRule.RoutineGroup)
            {
                inUndo.MarkDirty("Changed Rule Group");
                ioRule.RoutineGroup = newGroup;
            }
        }
示例#12
0
        public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            switch (m_Type)
            {
            case InnerType.String:
                return(string.Format("\"{0}\"", m_StringValue));

            case InnerType.Color:
                return(ColorValue.ToString());

            case InnerType.Bool:
                return(BoolValue ? "true" : "false");

            case InnerType.Float:
                return(FloatValue.ToString());

            case InnerType.Int32:
                return(IntValue.ToString());

            case InnerType.Null:
                return("null");

            case InnerType.Vector2:
                return(AsVector2.ToString());

            case InnerType.Vector3:
                return(AsVector3.ToString());

            case InnerType.Vector4:
                return(AsVector4.ToString());

            case InnerType.EntityScope:
                return(EntityValue.GetPreviewString(inTriggerContext, inLibrary));

            case InnerType.GroupId:
                return(GroupIdValue.ToString(inLibrary));

            case InnerType.TriggerId:
                return(TriggerIdValue.ToString(inLibrary));

            case InnerType.Enum:
            {
                Type enumType = Type.GetType(m_StringValue);
                if (enumType == null)
                {
                    Debug.LogErrorFormat("Enum type {0} no longer exists", m_StringValue);
                    return(m_IntValue.ToString());
                }

                try
                {
                    return(Enum.ToObject(enumType, m_IntValue).ToString());
                }
                catch (Exception e)
                {
                    Debug.LogException(e);
                    Debug.LogErrorFormat("Enum {0} cannot be represented as type {1}", m_IntValue, enumType);
                    return(m_IntValue.ToString());
                }
            }

            case InnerType.Invalid:
                return("INVALID");

            default:
                ThrowInvalidCastException(m_Type, typeof(string));
                return(null);
            }
        }
示例#13
0
        public string GetPreviewStringAsQuery(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            string queryId = inLibrary.GetQuery(m_Id)?.Name ?? "null";

            return(string.Format("{0}:{1}", m_Scope.GetPreviewString(inTriggerContext, inLibrary), queryId));
        }
示例#14
0
        public string GetPreviewStringAsAction(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            string actionId = inLibrary.GetAction(m_Id)?.Name ?? "null";

            return(string.Format("{0}:{1}", m_Scope.GetPreviewString(inTriggerContext, inLibrary), actionId));
        }
示例#15
0
 string IRSPreviewable.GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
 {
     return(GetPreviewStringAsQuery(inTriggerContext, inLibrary));
 }
示例#16
0
        private string GetBasePreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary)
        {
            switch (m_Type)
            {
            case EntityScopeType.Null:
                return("Null");

            case EntityScopeType.Self:
                return("Self");

            case EntityScopeType.Argument:
                return("Arg(" + (inTriggerContext?.ParameterType?.Name ?? "TriggerArg") + ")");

            case EntityScopeType.Global:
                return("Global");

            case EntityScopeType.ObjectById:
                return(string.Format("Entity(Id: {0})", m_Id));

            case EntityScopeType.ObjectInRegister:
                return(string.Format("Register({0})", RegisterArg));

            case EntityScopeType.ObjectsWithName:
            {
                if (m_UseFirst)
                {
                    return(string.Format("Entity(Name: {0})", m_Search));
                }
                return(string.Format("Entities(Name: {0})", m_Search));
            }

            case EntityScopeType.ObjectsWithPrefab:
            {
                if (m_UseFirst)
                {
                    return(string.Format("Entity(Prefab: {0})", m_Search));
                }
                return(string.Format("Entities(Prefab: {0})", m_Search));
            }

            case EntityScopeType.ObjectsWithGroup:
            {
                using (PooledStringBuilder psb = PooledStringBuilder.Alloc())
                {
                    var sb = psb.Builder;

                    if (m_UseFirst)
                    {
                        sb.Append("Entity");
                    }
                    else
                    {
                        sb.Append("Entities");
                    }

                    sb.Append("(Group: ");
                    if (m_Id == 0)
                    {
                        sb.Append("No Group");
                    }
                    else
                    {
                        var groupInfo = inLibrary?.GetGroup(m_Id);
                        if (groupInfo == null)
                        {
                            sb.Append(m_Id);
                        }
                        else
                        {
                            sb.Append(groupInfo.Name);
                        }
                    }

                    sb.Append(")");
                    return(sb.ToString());
                }
            }

            case EntityScopeType.Invalid:
                return("Invalid");

            default:
                return("Unknown");
            }
        }
示例#17
0
 public RSValidationContext WithTrigger(RSTriggerInfo inTrigger)
 {
     return(new RSValidationContext(Library, Manager, Entity, inTrigger, Parameter));
 }