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); }
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); }