Пример #1
0
        public SchemaNode FindChild(ScriptObject obj, string name, bool allowScriptList, bool rhs, ScopeType scope,
                                    int index, List <SchemaNode> candidates)
        {
            string data = null;

            if (name.Contains(":"))
            {
                data = name.Split(':')[1];
                name = name.Split(':')[0];
            }

            var c = Children;

            if (allowScriptList && !IsNonScriptedListTag(name) &&
                (name.StartsWith("any_") || name.StartsWith("every_") || name.StartsWith("random_") ||
                 name.StartsWith("ordered_")))
            {
                var v = FindScriptList(obj, name, allowScriptList, rhs, scope, index, candidates);

                if (v != null)
                {
                    return(v);
                }
            }

            SchemaNode found = null;

            var list = c.Where(a => a.name == name && (!a.rightHandOnly || rhs)).ToList();

            if (list.Count > 0)
            {
                foreach (var schemaNode in list)
                {
                    var f = schemaNode;

                    if (f.requiresData)
                    {
                        if (data == null)
                        {
                            continue;
                        }

                        bool success;
                        var  scopeType = GetScopeChangeFromData(obj, f, name, data, rhs, scope, out success);
                        if (success)
                        {
                            var clone = new SchemaNode();
                            f.copyTo(clone);

                            if (rhs)
                            {
                                clone.inheritsIds.Add("trigger");
                                clone.inherits.Add(SchemaManager.Instance.GetSchema("trigger"));
                            }
                            else
                            {
                                clone.inherits.UnionWith(inherits);
                                clone.inheritsIds.UnionWith(inheritsIds);
                                if (obj.Parent.lhsSchema != null)
                                {
                                    clone.inherits.UnionWith(obj.Parent.lhsSchema.inherits);
                                    clone.inheritsIds.UnionWith(obj.Parent.lhsSchema.inheritsIds);
                                }
                            }

//                            clone.inherits = clone.inherits.Distinct().ToList();
                            clone.targetScope = scopeType;
                            found             = clone; //return clone;

                            clone.Serialize();

                            if (candidates != null)
                            {
                                candidates.Add(clone);
                            }
                        }

                        continue;
                    }

                    if (f.function == "event_target" && data == null)
                    {
                        var clone = new SchemaNode();
                        f.copyTo(clone);
                        clone.inherits.UnionWith(inherits);
                        //   clone.inherits = clone.inherits.Distinct().ToList();
                        clone.inheritsIds.UnionWith(inheritsIds);
                        if (f.targetScope == ScopeType.none)
                        {
                            clone.targetScope = scope;
                        }

                        if (found == null)
                        {
                            found = clone;
                        }
                        //    if (candidates != null)
                        //        candidates.Add(clone);
                        clone.Serialize();
                    }
                    else if (f.function == "script_list" && data == null)
                    {
                        if (f != null && rhs && f.TypeList.Contains("block"))
                        {
                            continue;
                        }

                        if (found == null)
                        {
                            found = f;
                        }
                        //     if (candidates != null)
                        //       candidates.Add(f);
                    }

                    // don't allow blocks on rhs
                    if (f != null && rhs && f.TypeList.Contains("block"))
                    {
                        continue;
                    }

                    if (obj.Children.Count > 0 && f.Children.Count == 0)
                    {
                        if (!HandleUnexpectedChildren(schemaNode, obj, name, rhs, index))
                        {
                            continue;
                        }
                    }

                    if (!obj.IsBlock && f.Children.Count > 0 && !f.TypeList.Contains("value"))
                    {
                        if (candidates != null)
                        {
                            candidates.Add(f);
                        }
                        continue;
                    }

                    if (found == null)
                    {
                        found = f;
                    }
                    if (candidates != null)
                    {
                        candidates.Add(f);
                    }
                }
            }

            if (found != null)
            {
                return(found);
            }

            if (rhs && obj.lhsSchema != null && obj.lhsSchema.TypeList.Contains("value"))
            {
                var sv = Core.Instance.Get(ScriptContext.ScriptedValues, name);
                if (sv != null)
                {
                    return new SchemaNode
                           {
                               typeList = "value", name = sv.Name, targetScope = ScopeType.value, function = "effect"
                           }
                }
                ;
            }

            /*  if(rhs && !inheritsIds.Contains("trigger") && id!="trigger")
             * {
             *    // we get to try a trigger...
             *    SchemaNode clone = new SchemaNode();
             *    copyTo(clone);
             *    clone.children.Clear();
             *    clone.inheritsIds.Add("trigger");
             *    clone.inherits.Add(SchemaManager.Instance.GetSchema("trigger"));
             *    return clone.FindChild(obj, name, allowScriptList, rhs, scope, index);
             * }*/

            var namesFrom = c.Where(a => a.namesFrom != null).ToList();

            if (namesFrom.Count > 0)
            {
                foreach (var schemaNode in namesFrom)
                {
                    if (schemaNode.namesFrom == "value")
                    {
                        int num;

                        if (int.TryParse(name, out num))
                        {
                            return(schemaNode);
                        }
                    }
                    else
                    {
                        var e = EnumManager.Instance.GetEnums(schemaNode.namesFrom);
                        if (e.Count > 0)
                        {
                            if (e.Contains(name))
                            {
                                obj.BehaviourData.lhsNamedFrom = schemaNode.namesFrom;
                                return(schemaNode);
                            }
                        }
                    }
                }
            }

            return(found);
        }
Пример #2
0
        public void LoadNode(XmlNode node, SchemaNode parent = null)
        {
            id = loadString(node, "id");

            name      = loadString(node, "name");
            typeList  = loadString(node, "type");
            namesFrom = loadString(node, "namesFrom");
            category  = loadString(node, "category");
            schema    = loadString(node, "schema");

            var scopes   = loadString(node, "scope");
            var inherits = loadString(node, "inherits");

            if (node.Name == "Localized")
            {
                typeList = "localized";
            }
            else if (node.Name == "Effect")
            {
                inherits = "effect";
                typeList = inherits;
            }
            else if (node.Name == "Trigger")
            {
                inherits = "trigger";
                typeList = inherits;
            }
            else if (node.Name == "ModifierStack")
            {
                inherits = "modifierStack";
                typeList = inherits;
            }
            else if (node.Name == "Bool")
            {
                typeList = "bool";
            }
            else if (node.Name == "Value")
            {
                typeList = "value";
            }
            else if (node.Name != "Child")
            {
                typeList = node.Name.ToLower();
            }

            if (name == null)
            {
                if (typeList == "effect_group")
                {
                }

                name = typeList;
            }

            if (typeList == null)
            {
                typeList = "none";
            }

            if (inherits != null)
            {
                var i = inherits.Split(',');

                foreach (var s in i)
                {
                    inheritsIds.Add(s.Trim());
                }
            }

            if (scopes != null)
            {
                var scps = scopes.Split(',');

                foreach (var scp in scps)
                {
                    ScopeType scopeEnum;
                    if (Enum.TryParse(scp, out scopeEnum))
                    {
                        this.scopes.Add(scopeEnum);
                    }
                }
            }
            else
            {
                this.scopes.Add(ScopeType.inheritparent);
            }


            var       targetScope = loadString(node, "targetScope");
            ScopeType tsv;

            Enum.TryParse(targetScope, out tsv);

            this.targetScope = tsv;

            function = loadString(node, "function");

            requiresData  = loadBool(node, "requiresData", false);
            globalLink    = loadBool(node, "globalLink", false);
            wildcard      = loadBool(node, "wildcard", false);
            allowScopes   = loadBool(node, "allowScopes", true);
            rightHandOnly = loadBool(node, "rightHandOnly", false);
            avoidRed      = loadBool(node, "avoidRed", false);

            if (typeList.Contains("value"))
            {
                inheritsIds.Add("value");
            }
            var c = node.FirstChild;

            while (c != null)
            {
                if (c is XmlComment)
                {
                    c = c.NextSibling;
                    continue;
                }

                var cn = new SchemaNode();
                cn.LoadNode(c, this);


                if (cn.function == "script_list")
                {
                    var any = new SchemaNode();
                    cn.copyTo(any);
                    any.name = "any_" + cn.name;
                    children.Add(any);

                    any.inheritsIds.Add("scriptlistTriggerInherits");
                    any.inheritsIds.Add("trigger");

                    var random = new SchemaNode();
                    cn.copyTo(random);
                    random.name = "random_" + cn.name;
                    children.Add(random);

                    random.inheritsIds.Add("scriptlistEffectInherits");
                    random.inheritsIds.Add("effect");

                    var every = new SchemaNode();
                    cn.copyTo(every);
                    every.name = "every_" + cn.name;
                    children.Add(every);

                    every.inheritsIds.Add("scriptlistEffectInherits");
                    every.inheritsIds.Add("effect");

                    var ordered = new SchemaNode();
                    cn.copyTo(ordered);
                    ordered.name = "ordered_" + cn.name;
                    children.Add(ordered);

                    ordered.inheritsIds.Add("scriptlistEffectInherits");
                    ordered.inheritsIds.Add("effect");
                }
                else
                {
                    children.Add(cn);
                }

                c = c.NextSibling;
            }


            if (children.Count > 0 && !children.Any(a => a.name == "scope"))
            {
                var cc = SchemaManager.Instance.GetSchema("rhscope").children;
                children.UnionWith(cc);
            }

            if (id != null)
            {
                SchemaManager.Instance.AddSchema(id, this);
            }

            if (node.Name == "Localized" && parent != null)
            {
                var clone = new SchemaNode();
                copyTo(clone);
                clone.inheritsIds.Add("localized");
                parent.children.Add(clone);
                clone.Serialize();
            }

            Serialize(false);
        }