public Command ParseCommand(XmlNode node)
        {
            if (node == null)
            {
                return(null);
            }
            Command cmd = null;
            int     src, dest, A, B, val;

            switch (node.Name.ToLower())
            {
            case "getglobalvar":
                src  = GetAttribute(node, "src");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.GetGlobalVar(src, dest);
                break;

            case "putglobalvar":
                src  = GetAttribute(node, "src");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.PutGlobalVar(src, dest);
                break;

            case "setglobalflag":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.SetGlobalFlag(src);
                break;

            case "unsetglobalflag":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.UnsetGlobalFlag(src);
                break;

            case "setlocalflag":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.SetLocalFlag(src);
                break;

            case "unsetlocalflag":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.UnsetLocalFlag(src);
                break;

            case "setvar":
                src  = GetAttribute(node, "src");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.SetVar(src, dest);
                break;

            case "setval":
                val  = GetAttribute(node, "val");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.SetVal(val, dest);
                break;

            case "addvar":
                A    = GetAttribute(node, "A");
                B    = GetAttribute(node, "B");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.AddVar(A, B, dest);
                break;

            case "minusvar":
                A    = GetAttribute(node, "A");
                B    = GetAttribute(node, "B");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.MinusVar(A, B, dest);
                break;

            case "multvar":
                A    = GetAttribute(node, "A");
                B    = GetAttribute(node, "B");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.MultVar(A, B, dest);
                break;

            case "divvar":
                A    = GetAttribute(node, "A");
                B    = GetAttribute(node, "B");
                dest = GetAttribute(node, "dest");
                cmd  = PrimusScriptBuilder.DivVar(A, B, dest);
                break;

            case "conditionblock":
                cmd = ParseConditionBlock(node);
                break;

            case "return":
                cmd = PrimusScriptBuilder.Return();
                break;

            case "resumeonlocalflagset":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.ResumeOnFlagSet(src);
                break;

            case "resumeonglobalflagset":
                src = GetAttribute(node, "flag");
                cmd = PrimusScriptBuilder.ResumeOnGlobalFlagSet(src);
                break;

            default:
                cmd = ParseExtendedCommand(node);
                break;
            }

            if (cmd != null)
            {
                cmd.SetNext(ParseCommand(node.NextSibling));
            }

            return(cmd);
        }
        public Condition ParseCondition(XmlNode node)
        {
            if (node == null)
            {
                return(null);
            }
            Condition cdn = null;
            int       src, dest, val;
            Condition cA, cB;
            XmlNode   A, B;

            switch (node.Name.ToLower())
            {
            case "and":
                A = node.FirstChild;
                if (A != null)
                {
                    B = A.NextSibling;
                    if (B != null)
                    {
                        cA  = ParseCondition(A);
                        cB  = ParseCondition(B);
                        cdn = PrimusScriptBuilder.AND(cA, cB);
                    }
                }
                break;

            case "or":
                A = node.FirstChild;
                if (A != null)
                {
                    B = A.NextSibling;
                    if (B != null)
                    {
                        cA  = ParseCondition(A);
                        cB  = ParseCondition(B);
                        cdn = PrimusScriptBuilder.OR(cA, cB);
                    }
                }
                break;

            case "not":
                A = node.FirstChild;
                if (A != null)
                {
                    cA  = ParseCondition(A);
                    cdn = PrimusScriptBuilder.NOT(cA);
                }
                break;

            case "greaterval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.GreaterVal(src, val);
                break;

            case "globalgreaterval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.GlobalGreaterVal(src, val);
                break;

            case "greatervar":
                src  = GetAttribute(node, "A");
                dest = GetAttribute(node, "B");
                cdn  = PrimusScriptBuilder.GreaterVar(src, dest);
                break;

            case "lessval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.LessVal(src, val);
                break;

            case "globallessval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.GlobalLessVal(src, val);
                break;

            case "lessvar":
                src  = GetAttribute(node, "A");
                dest = GetAttribute(node, "B");
                cdn  = PrimusScriptBuilder.LessVar(src, dest);
                break;

            case "equalsvar":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "B");
                cdn = PrimusScriptBuilder.EqualsVar(src, val);
                break;

            case "equalsval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.EqualsVal(src, val);
                break;

            case "globalequalsval":
                src = GetAttribute(node, "A");
                val = GetAttribute(node, "val");
                cdn = PrimusScriptBuilder.GlobalEqualsVal(src, val);
                break;

            case "localflagset":
                src = GetAttribute(node, "flag");
                cdn = PrimusScriptBuilder.FlagSetLocal(src);
                break;

            case "globalflagset":
                src = GetAttribute(node, "flag");
                cdn = PrimusScriptBuilder.FlagSetLocal(src);
                break;

            default:
                cdn = ParseExtendedCondition(node);
                break;
            }

            return(cdn);
        }