private void SaveParsable(BinaryWriter writer, ScriptParsedSegment parsableResults) { writer.Write(parsableResults.name); writer.Write(parsableResults.lineNumbers[0]); writer.Write(parsableResults.lineNumbers[parsableResults.lineNumbers.Count - 1]); writer.Write(parsableResults.isBlock); writer.Write(parsableResults.op != null); if (parsableResults.op != null) { writer.Write(parsableResults.op); } writer.Write((byte)parsableResults.value.Count); foreach (var s in parsableResults.value) { writer.Write(s); } writer.Write(parsableResults.children.Count); foreach (var parsableResultsChild in parsableResults.children) { SaveParsable(writer, parsableResultsChild); } }
private ScriptObject ParseResult(ScriptObject parent, ScriptParsedSegment parsableResult, ScriptContext context) { if (ScriptNamespace != null && context == ScriptContext.Activities) { } return(ScriptObjectFactory.Instance.CreateScriptObject(context, parsableResult, parent, ScriptNamespace)); }
public ScriptObject(ScriptObject parent, ScriptParsedSegment seg, SchemaNode schema = null) { if (seg == null) { return; } Op = seg.op; IsBlock = seg.isBlock; if (parent == null) { Core.Instance.DeferedPostInitializationListNext.Add(this); Core.Instance.DeferedInitializationList.Add(this); } Name = seg.name; Filename = seg.filename; LineStart = seg.lineNumbers.First(); LineEnd = seg.lineNumbers.Last(); Parent = parent; Library = Core.Instance.LoadingCK3Library; if (LineStart == ScriptObjectBehaviourManager.BreakpointLine && Topmost.Filename.ToRelativeFilename().Contains(ScriptObjectBehaviourManager.BreakpointFile)) { } lhsSchema = schema; foreach (var scriptParsedSegment in seg.children) { ScriptObject so = null; if (scriptParsedSegment.value.Count > 0) { so = ScriptValueParser.Instance.ParseScriptValue(this, scriptParsedSegment); } else { so = ScriptObjectFactory.Instance.CreateScriptObject(Context, scriptParsedSegment, this, Namespace); } Children.Add(so); OnPostInitializeChild(so); } }
private ScriptParsedSegment LoadParsable(BinaryReader reader, string filename) { var name = reader.ReadString(); var lineStart = reader.ReadInt32(); var lineEnd = reader.ReadInt32(); var isBlock = reader.ReadBoolean(); string op = null; if (reader.ReadBoolean()) { op = reader.ReadString(); } var valCount = reader.ReadByte(); var values = new List <string>(); for (var x = 0; x < valCount; x++) { values.Add(reader.ReadString()); } var numChildren = reader.ReadInt32(); var p = new ScriptParsedSegment(); p.filename = new RefFilename(filename.Replace(".bin", ".txt"), true); p.name = name; p.op = op; p.value = values; p.lineNumbers.Add(lineStart); p.lineNumbers.Add(lineEnd); p.isBlock = isBlock; for (var x = 0; x < numChildren; x++) { p.children.Add(LoadParsable(reader, filename)); } return(p); }
public LocalizedString(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg) { }
public FormulaScriptValue(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg) { }
public ScriptObject CreateScriptObject(ScriptContext context, ScriptParsedSegment segment, ScriptObject parent, string scriptNamespace) { if (context == ScriptContext.CharacterInteractions) { } ScriptObject obj = null; if (parent == null) { if (Core.Instance.LoadingCK3Library == Core.Instance.ModCK3Library) { if (segment.name == "abduct_outcome_roll_effect") { } ReferenceManager.Instance.ClearConnectionsFrom(segment.name); } } if (parent == null && segment.name.StartsWith("@")) { obj = ScriptValueParser.Instance.ParseScriptValue(parent, segment); InitializeObject(obj, context); obj.Namespace = scriptNamespace; if (string.IsNullOrEmpty(scriptNamespace)) { obj.Namespace = null; } return(obj); } switch (context) { case ScriptContext.None: obj = new ScriptObject(parent, segment); break; case ScriptContext.ScriptObjectValue: obj = ScriptValueParser.Instance.ParseScriptValue(parent, segment); break; case ScriptContext.Event: if (segment.name.StartsWith("scripted_trigger ")) { obj = new ScriptObject(parent, segment, SchemaManager.Instance.GetSchema("trigger")); } else { obj = new ScriptObject(parent, segment, SchemaManager.Instance.GetSchema("event")); } break; default: obj = new ScriptObject(parent, segment, SchemaManager.Instance.GetSchema(Core.Instance.BaseCK3Library.ContextData[context].Type)); break; } obj.Context = context; InitializeObject(obj, context); AddScriptScope("root", obj, obj.GetScopeType(), true, false); AddScriptScope("this", obj, obj.GetScopeType(), true, false); obj.Namespace = scriptNamespace; if (string.IsNullOrEmpty(scriptNamespace)) { obj.Namespace = null; } return(obj); }
public List <ScriptParsedSegment> ParseTokens(List <string> tokens, List <int> lineNumbers, RefFilename filename) { var parsables = new List <ScriptParsedSegment>(); var lineNumbersForObject = new List <int>(); var tokensForObject = new List <string>(); var token = 0; while (tokens.Count > 0) { if (tokens.Count == 1) { tokensForObject.Clear(); tokensForObject.AddRange(tokens); var lineNumChild = new List <int>(); lineNumChild.AddRange(lineNumbers); var parsable = new ScriptParsedSegment(); parsable.lineNumbers = lineNumChild; parsable.filename = filename; parsable.Parse(tokensForObject); parsables.Add(parsable); tokens.Clear(); // lineNumChild.Clear(); token += 1; continue; } if (tokens.Count == 2) { tokensForObject.Clear(); tokensForObject.Add(tokens[0]); var lineNumChild = new List <int>(); lineNumChild.Add(lineNumbers[0]); var parsable = new ScriptParsedSegment(); parsable.lineNumbers = lineNumChild; parsable.filename = filename; parsable.Parse(tokensForObject); parsables.Add(parsable); tokens.RemoveAt(0); // lineNumChild.Clear(); lineNumbers.RemoveAt(0); token += 1; continue; } var first = tokens[0]; var second = tokens[1]; var third = tokens[2]; var extraTokens = 0; if (first == "NOT" && lineNumbers[0] == 431) { } if (third == "hsv") { third = string.Join("", tokens.GetRange(2, tokens.Count - 2)); lineNumbers.RemoveRange(2, tokens.Count - 3); tokens.RemoveAt(2); tokens.Insert(2, third); tokens.RemoveRange(3, tokens.Count - 3); token += 3; } if (first == "scripted_trigger" || first == "scripted_effect") { first = first + " " + second; second = third; third = tokens[3]; tokens.RemoveAt(1); lineNumbers.RemoveAt(1); tokens[0] = first; } // could be a list... if (first == "{") { first = "listEntry"; second = "="; third = tokens[0]; tokens.Insert(0, "listEntry"); tokens.Insert(1, "="); lineNumbers.Insert(0, lineNumbers[0]); lineNumbers.Insert(1, lineNumbers[0]); } if (!(second == "=" || second == ">" || second == "<" || second == ">=" || second == "<=" || second == "!=" || second == "==") && second != "{") { tokensForObject.Clear(); tokensForObject.Add(tokens[0]); var lineNumChild = new List <int>(); lineNumChild.Add(lineNumbers[0]); var parsable = new ScriptParsedSegment(); parsable.lineNumbers = lineNumChild; parsable.filename = filename; parsable.Parse(tokensForObject); parsables.Add(parsable); tokens.RemoveAt(0); // lineNumChild.Clear(); lineNumbers.RemoveAt(0); token += 1; continue; } if (second == "=" || second == ">" || second == "<" || second == ">=" || second == "<=" || second == "!=" || second == "==") { } else { // something weird going on - insert an = sign { // whoopsie, missed =... tokens.Insert(1, "="); first = tokens[0]; second = tokens[1]; third = tokens[2]; lineNumbers.Insert(1, lineNumbers[0]); } } var isBlock = false; if (second == "=" || second == ">" || second == "<" || second == ">=" || second == "<=" || second == "!=" || second == "==") { if (third == "{") { // this is a complex bracketed object... find the equivelent closing one... var range = GetRangeOfClosedBracket(tokens, extraTokens); if (range == -1) { tokens.Add("}"); lineNumbers.Add(lineNumbers.Last() + 1); range = tokens.Count - 1; } isBlock = true; tokensForObject = tokens.GetRange(0, range + 1); lineNumbersForObject = lineNumbers.GetRange(0, range + 1); lineNumbers.RemoveRange(0, range + 1); tokens.RemoveRange(0, range + 1); } else if (third.StartsWith("@[")) { // weird inliney calculations in scriptvalues var index = tokens.IndexOf("]"); tokensForObject = tokens.GetRange(0, index + 1); lineNumbersForObject = lineNumbers.GetRange(0, index + 1); lineNumbers.RemoveRange(0, index + 1); tokens.RemoveRange(0, index + 1); token += index + 1; } else { var n = 3 + extraTokens; tokensForObject = tokens.GetRange(0, n); lineNumbersForObject = lineNumbers.GetRange(0, n); lineNumbers.RemoveRange(0, n); tokens.RemoveRange(0, n); token += n; } } { var parsable = new ScriptParsedSegment(); parsable.lineNumbers = lineNumbersForObject; parsable.filename = filename; parsable.isBlock = isBlock; if (parsable.lineNumbers[0] == 125 && filename.Equals("common/on_action/childhood_on_actions.txt")) { } parsable.Parse(tokensForObject); parsables.Add(parsable); } } return(parsables); }
public ScriptObject ParseUnknown(ScriptObject parent, ScriptParsedSegment segment, ScriptContext context) { return(ParseResult(parent, segment, context)); }
public StaticScriptValue(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg) { }