Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        private ScriptObject ParseResult(ScriptObject parent, ScriptParsedSegment parsableResult, ScriptContext context)
        {
            if (ScriptNamespace != null && context == ScriptContext.Activities)
            {
            }

            return(ScriptObjectFactory.Instance.CreateScriptObject(context, parsableResult, parent, ScriptNamespace));
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
 public LocalizedString(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg)
 {
 }
 public FormulaScriptValue(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg)
 {
 }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 public ScriptObject ParseUnknown(ScriptObject parent, ScriptParsedSegment segment, ScriptContext context)
 {
     return(ParseResult(parent, segment, context));
 }
Beispiel #10
0
 public StaticScriptValue(ScriptObject parent, ScriptParsedSegment seg) : base(parent, seg)
 {
 }