Ejemplo n.º 1
0
 public void AddPassage(Passage passage)
 {
     if (_passageContentMacroStack.Count != 0)
     {
         Logger.LogWarning("A macro isn´t closed before passage " + passage.Name + " begins");
     }
     _passageContentMacroStack.Clear();
     _lastPassageContent = null;
     _currentPassage = passage;
     _currentFormat = new PassageContentFormat();
     _tree.AddPassage(passage);
 }
Ejemplo n.º 2
0
        private List<ZInstruction> ConvertMacros(PassageContent content, ref int currentLink, List<Tuple<string, Assign>> links, string currentPassage)
        {
            List<ZInstruction> instructions = new List<ZInstruction>();

            PassageMacroSet setMacro = content as PassageMacroSet;
            PassageMacroBranch branchMacro = content as PassageMacroBranch;
            PassageMacroPrint printMacro = content as PassageMacroPrint;
            PassageMacroDisplay displayMacro = content as PassageMacroDisplay;

            if (setMacro != null)
            {
                instructions.AddRange(ConvertAssignExpression((Assign)setMacro.Expression, currentPassage));
            }

            else if (printMacro != null)
            {
                if (printMacro.Expression is StringValue)
                    instructions.AddRange(StringToInstructions(((StringValue)(printMacro.Expression)).Value.Replace('\"', ' ').Trim()));
                else
                {
                    instructions.AddRange(ConvertValueExpression(printMacro.Expression, currentPassage));
                    instructions.Add(new PrintNum(new ZStackVariable()));
                }
            }

            else if (displayMacro != null)
            {
                instructions.AddRange(ConvertPassageContent(_passages.Single(passage =>
                    passage.Name == ((StringValue)(displayMacro.Expression)).Value.Replace('\"', ' ').Trim()).PassageContentList, ref currentLink, links, currentPassage));
            }

            else if (branchMacro != null)
            {
                Guid endIfGuid = Guid.NewGuid();
                string endIf = "endIf_" + endIfGuid;

                //if
                PassageMacroIf ifMacro = (PassageMacroIf)branchMacro.BranchNodeList.First();
                Guid ifGuid = Guid.NewGuid();
                string ifTrue = "if_True_" + ifGuid;
                string ifFalse = "if_False_" + ifGuid;

                instructions.AddRange(ConvertBranchExpression(ifMacro.Expression, ifTrue, ifFalse, currentPassage));

                // if expression is true
                instructions.Add(new Nop() { Label = new ZLabel(ifTrue) });
                foreach (var instruction in ConvertPassageContent(ifMacro.PassageContentList, ref currentLink, links, currentPassage))
                {
                    instructions.Add(instruction);
                }
                instructions.Add(new Jump(new ZJumpLabel(endIf)));

                // if expression is false
                instructions.Add(new Nop() { Label = new ZLabel(ifFalse) });

                //else if
                foreach (PassageMacroElseIf elseIfMacro in branchMacro.BranchNodeList.OfType<PassageMacroElseIf>())
                {
                    Guid elseIfGuid = Guid.NewGuid();
                    string elseIfTrue = "elseIf_True_" + elseIfGuid;
                    string elseIfFalse = "elseIf_False_" + elseIfGuid;

                    instructions.AddRange(ConvertBranchExpression(elseIfMacro.Expression, elseIfTrue, elseIfFalse, currentPassage));

                    // if expression is true
                    instructions.Add(new Nop() { Label = new ZLabel(elseIfTrue) });
                    foreach (var instruction in ConvertPassageContent(elseIfMacro.PassageContentList, ref currentLink, links, currentPassage))
                    {
                        instructions.Add(instruction);
                    }
                    instructions.Add(new Jump(new ZJumpLabel(endIf)));

                    // if expression is false
                    instructions.Add(new Nop() { Label = new ZLabel(elseIfFalse) });
                }

                //else
                PassageMacroElse elseMacro = branchMacro.BranchNodeList.Last() as PassageMacroElse;

                if (elseMacro != null)
                {
                    foreach (var instruction in ConvertPassageContent(elseMacro.PassageContentList, ref currentLink, links, currentPassage))
                    {
                        instructions.Add(instruction);
                    }
                }

                //endif
                instructions.Add(new Nop() { Label = new ZLabel(endIf) });
            }

            else
            {
                throw new NotSupportedException("This macro is not supported yet: " + content.GetType().Name);
            }

            return instructions;
        }
Ejemplo n.º 3
0
        public void AddPassageContent(PassageContent passageContent)
        {
            // set format
            passageContent.ContentFormat = _currentFormat;
            _currentFormat = _currentFormat.Copy();

            PassageContent lastContent = _lastPassageContent;

            // merge text content together
            if (lastContent != null &&
                lastContent.Type == PassageContent.ContentType.TextContent &&
                passageContent.Type == PassageContent.ContentType.TextContent &&
                CurrentFormat.euquals(lastContent.ContentFormat))
            {
                lastContent.PassageText.MergePassageText(passageContent.PassageText);
                passageContent = lastContent;
            }
            else if (MacroStackCount == 0)
            {
                _currentPassage.AddPassageContent(passageContent);
            }
            else if (lastContent.Type == PassageContent.ContentType.MacroContent &&
                    lastContent.PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro)
            {
                PassageMacro macro = _passageContentMacroStack.Last().PassageMacro;
                PassageMacroBranch branch = macro.PassageMacroBranch;

                branch.AddBranch(passageContent.PassageBranch);

                _passageContentMacroStack.Add(passageContent);
            }
            // stack: macro branch if - input: else ifelse
            else if (_passageContentMacroStack[_passageContentMacroStack.Count - 2].Type == PassageContent.ContentType.MacroContent &&
                    _passageContentMacroStack[_passageContentMacroStack.Count - 2].PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro &&
                    _passageContentMacroStack.Last().Type == PassageContent.ContentType.BranchContent &&
                    _passageContentMacroStack.Last().PassageBranch.BranchType != PassageMacroBranchNode.MacroBranchType.Else &&
                    passageContent.Type == PassageContent.ContentType.BranchContent &&
                    passageContent.PassageBranch.BranchType != PassageMacroBranchNode.MacroBranchType.If)
            {
                FinishBranchStatement();
                PassageMacroBranch branch = _passageContentMacroStack.Last().PassageMacro.PassageMacroBranch;

                branch.AddBranch(passageContent.PassageBranch);

                _passageContentMacroStack.Add(passageContent);

            }
            else if (_passageContentMacroStack.Last().Type == PassageContent.ContentType.BranchContent)
            {
                PassageMacroBranchNode branchNode = _passageContentMacroStack.Last().PassageBranch;
                branchNode.AddPassageContent(passageContent);
            }
            else
            {
                throw new Exception("unknown case");
            }

            // put on stack if macro branch
            if (passageContent.Type == PassageContent.ContentType.MacroContent &&
                passageContent.PassageMacro.MacroType == PassageMacro.PassageMarcroType.BranchMacro)
            {
                _passageContentMacroStack.Add(passageContent);
            }

            _lastPassageContent = passageContent;
        }
Ejemplo n.º 4
0
        private void FinishBranchStatement()
        {
            _passageContentMacroStack.RemoveAt(_passageContentMacroStack.Count - 1);

            if (_passageContentMacroStack.Count == 0)
            {
                _lastPassageContent = _currentPassage.PassageContentList.Last();
                _currentFormat = _lastPassageContent.ContentFormat.Copy();
            }
            else
            {
                _lastPassageContent = _passageContentMacroStack.Last();
                _currentFormat = _lastPassageContent.ContentFormat.Copy();
            }
        }