예제 #1
0
        public string ResolveParamType(C2AceParam param)
        {
            switch (param.Script)
            {
            case "AddNumberParam": return("number");

            case "AddStringParam": return("string");

            case "AddAnyTypeParam": return("any");

            case "AddCmpParam": return("cmp");

            case "AddComboParam": return("combo");

            case "AddObjectParam": return("object");

            case "AddLayerParam": return("layer");

            case "AddLayoutParam": return("layout");

            case "AddKeybParam": return("keyb");

            case "AddAnimationParam": return("animation");

            case "AddAudioFileParam": return(string.Empty);    //todo: figure out what equivalent is in c3

            case "AddVariadicParams": return(string.Empty);    //todo: figure out what to dof or varadic params

            case "AddFunctionNameParam": throw new Exception("AddFunctionNameParam not supported by C3SDK");

            default: return(string.Empty);
            }
        }
예제 #2
0
        public C2Addon TraverseJavascriptTree(dynamic p)
        {
            // get addon type
            var config = p.body[0];

            if (config.type == "FunctionDeclaration")
            {
                switch (config.id.name.ToString())
                {
                case "GetPluginSettings":
                    c2addon.Type = "Plugin";
                    break;

                case "GetBehaviorSettings":
                    c2addon.Type = "Behavior";
                    break;

                case "Effect":
                    c2addon.Type = "Effect";
                    break;

                default:
                    c2addon.Type = "Unknown";
                    break;
                }

                //get properties
                var props = config.body.body[0].argument.properties;
                foreach (dynamic prop in props)
                {
                    var key = prop.key.value.ToString();
                    //var value = prop.value.value.ToString();
                    var value = TryGet(
                        () => throw new Exception(),
                        () => prop.value.value.ToString(),
                        () => prop.value.name.ToString(),
                        () =>
                    {
                        if (prop.value.type.ToString() == "BinaryExpression")
                        {
                            return(GetBinaryExpression(prop.value.left, prop.value.right));
                        }
                        throw new RuntimeBinderException();
                    });

                    c2addon.Properties.Add(key, value);
                }
            }

            //get actions
            var body         = p.body;
            var ace          = new C2Ace();
            var comboOptions = new List <string>();

            foreach (var value in body)
            {
                //check for value to be of type expression statement
                if (value.type == "ExpressionStatement")
                {
                    var expression = value.expression;

                    string caller = TryGet(
                        () => string.Empty,
                        () => expression.callee.name.ToString()
                        );

                    if (caller == "ACESDone")
                    {
                        continue;
                    }
                    else if (caller == "AddCondition" || caller == "AddAction")
                    {
                        var args = expression.arguments;

                        var index = 0;
                        foreach (var arg in args)
                        {
                            switch (index)
                            {
                            case 0:

                                ace.Id = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 1:
                                ace.Flags = TryGet(
                                    () => throw new Exception(),
                                    () => arg.value.ToString(),
                                    () => arg.name.ToString(),
                                    () =>
                                {
                                    if (arg.type.ToString() == "BinaryExpression")
                                    {
                                        return(GetBinaryExpression(arg.left, arg.right));
                                    }
                                    throw new RuntimeBinderException();
                                });
                                break;

                            case 2:
                                ace.ListName = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 3:
                                ace.Category = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 4:
                                ace.DisplayString = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 5:
                                ace.Description = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 6:
                                ace.ScriptName = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;
                            }
                            index++;
                        }

                        switch (caller)
                        {
                        case "AddCondition":
                            c2addon.Conditions.Add(ace);
                            break;

                        case "AddAction":
                            c2addon.Actions.Add(ace);
                            break;

                        default:
                            LogManager.AddImportLogMessage($"Unknown function beign called => {caller}");
                            break;
                        }

                        ace = new C2Ace();
                    }
                    else if (caller == "AddExpression")
                    {
                        var args = expression.arguments;

                        var index = 0;
                        foreach (var arg in args)
                        {
                            switch (index)
                            {
                            case 0:
                                ace.Id = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 1:
                                ace.Flags = TryGet(
                                    () => throw new Exception(),
                                    () => arg.value.ToString(),
                                    () => arg.name.ToString(),
                                    () =>
                                {
                                    if (arg.type.ToString() == "BinaryExpression")
                                    {
                                        return(GetBinaryExpression(arg.left, arg.right));
                                    }
                                    throw new RuntimeBinderException();
                                });
                                break;

                            case 2:
                                ace.ListName = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 3:
                                ace.Category = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 4:
                                ace.ScriptName = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;

                            case 5:
                                ace.Description = TryGet(
                                    () => string.Empty,
                                    () => arg.value.ToString());
                                break;
                            }
                            index++;
                        }

                        switch (caller)
                        {
                        case "AddExpression":
                            c2addon.Expressions.Add(ace);
                            break;

                        default:
                            LogManager.AddImportLogMessage($"Unknown function beign called => {caller}");
                            break;
                        }

                        ace = new C2Ace();
                    }
                    else
                    {
                        var paramOptions = TryGet(
                            () => string.Empty,
                            () => value.expression.callee.name.ToString());
                        var param = new C2AceParam {
                            Script = paramOptions
                        };

                        //todo: if script is not one of the param functions => resolve function;

                        if (paramOptions == "AddComboParamOption")
                        {
                            comboOptions.Add(value.expression.arguments[0].value.ToString());
                        }

                        param.ComboItems = comboOptions;
                        comboOptions     = new List <string>();

                        var args = value.expression.arguments;
                        if (args != null)
                        {
                            var index = 0;
                            foreach (var arg in args)
                            {
                                switch (index)
                                {
                                case 0:
                                    param.Text = TryGet(
                                        () => string.Empty,
                                        () => arg.value.ToString());
                                    break;

                                case 1:
                                    param.Description = TryGet(
                                        () => string.Empty,
                                        () => arg.value.ToString());
                                    break;

                                case 2:     //check else
                                    param.DefaultValue = TryGet(
                                        () => string.Empty,
                                        () => arg.value.ToString());
                                    break;
                                }
                                index++;
                            }
                            ace.Params.Add(param);
                        }
                    }
                }
                else if (value.type == "VariableDeclaration")
                {
                    var declaration = value.declarations[0];
                    if (declaration.id.name.ToString() == "property_list")
                    {
                        if (declaration.init.type == "ArrayExpression")
                        {
                            var arrElements = declaration.init.elements;

                            //not property array
                            if (arrElements == null)
                            {
                                continue;
                            }

                            foreach (var element in arrElements)
                            {
                                var args = element.arguments;
                                var prop = new C2Property();

                                var index = 0;
                                foreach (var arg in args)
                                {
                                    switch (index)
                                    {
                                    case 0:

                                        prop.Type = TryGet(
                                            () => string.Empty,
                                            () => arg.name.ToString());
                                        break;

                                    case 1:
                                        prop.Name = TryGet(
                                            () => throw new Exception(),
                                            () => arg.value.ToString());
                                        break;

                                    case 2:
                                        prop.Value = TryGet(
                                            () => string.Empty,
                                            () => arg.value.ToString());
                                        break;

                                    case 3:
                                        prop.Description = TryGet(
                                            () => string.Empty,
                                            () => arg.value.ToString());
                                        break;

                                    case 4:
                                        prop.Params = TryGet(
                                            () => string.Empty,
                                            () => arg.value.ToString());
                                        break;

                                    case 5:
                                        prop.Readonly = TryGet(
                                            () => string.Empty,
                                            () => arg.value.ToString());
                                        break;
                                    }
                                    index++;
                                }

                                c2addon.PluginProperties.Add(prop);
                            }
                        }
                    }
                }
            }

            return(c2addon);
        }
예제 #3
0
        public C2Addon Parse(string json)
        {
            var     c2addon = new C2Addon();
            dynamic data    = JObject.Parse(json);

            //settings
            var settings = data["settings"];

            foreach (JProperty prop in settings)
            {
                //handle array
                if (prop.Name == "flags")
                {
                    var sb = new StringBuilder();
                    foreach (var val in prop.Value)
                    {
                        sb.Append($" {val} ");
                    }
                    c2addon.Properties.Add(prop.Name, sb.ToString());
                    continue;
                }

                c2addon.Properties.Add(prop.Name, prop.Value.ToString());
            }

            //properties
            var props = data["properties"];

            foreach (var p in props)
            {
                var property = new C2Property();

                property.Type        = p["flags"].ToString();
                property.Name        = p["key"].ToString();
                property.Value       = p["initial_str"]?.ToString() ?? string.Empty;
                property.Description = p["description"].ToString();
                var flags = p["params"];
                var fList = new List <string>();
                foreach (var flag in flags)
                {
                    fList.Add(flag);
                }
                property.Params   = string.Join("|", fList);
                property.Readonly = p["read_only"] != null ? p["read_only"].ToString().ToLower() : "false";
            }

            //actions
            var actions = data["actions"];

            c2addon.Actions = new List <C2Ace>();
            foreach (JObject act in actions)
            {
                var ace = new C2Ace
                {
                    Id            = act["id"].ToString(),
                    ListName      = act["list_name"].ToString(),
                    Category      = act["category"].ToString(),
                    DisplayString = act["display_string"].ToString(),
                    Description   = act["description"].ToString(),
                    ScriptName    = act["script_name"].ToString()
                };

                //get flags
                var sb = new StringBuilder();
                foreach (var val in act["flags"])
                {
                    sb.Append($" {val} ");
                }
                ace.Flags = sb.ToString();

                //params
                foreach (var param in act["params"])
                {
                    var aceParam = new C2AceParam
                    {
                        Text         = param["name"]?.ToString(),
                        Description  = param["description"]?.ToString(),
                        DefaultValue = param["initial"]?.ToString(),
                        Script       = param["caller"]?.ToString()
                    };

                    if (param["caller"]?.ToString() == "AddComboParam")
                    {
                        aceParam.ComboItems = new List <string>();
                        foreach (var val in param["options"])
                        {
                            aceParam.ComboItems.Add(val["text"].ToString());
                        }
                    }

                    ace.Params.Add(aceParam);
                    c2addon.Actions.Add(ace);
                }
            }

            //conditions
            var conditions = data["conditions"];

            c2addon.Conditions = new List <C2Ace>();
            foreach (JObject cnd in conditions)
            {
                var ace = new C2Ace
                {
                    Id            = cnd["id"].ToString(),
                    ListName      = cnd["list_name"].ToString(),
                    Category      = cnd["category"].ToString(),
                    DisplayString = cnd["display_string"].ToString(),
                    Description   = cnd["description"].ToString(),
                    ScriptName    = cnd["script_name"].ToString()
                };

                //get flags
                var sb = new StringBuilder();
                foreach (var val in cnd["flags"])
                {
                    sb.Append($" {val} ");
                }
                ace.Flags = sb.ToString();

                //params
                foreach (var param in cnd["params"])
                {
                    var aceParam = new C2AceParam
                    {
                        Text         = param["name"]?.ToString(),
                        Description  = param["description"]?.ToString(),
                        DefaultValue = param["initial"]?.ToString(),
                        Script       = param["caller"]?.ToString()
                    };

                    if (param["caller"]?.ToString() == "AddComboParam")
                    {
                        aceParam.ComboItems = new List <string>();
                        foreach (var val in param["options"])
                        {
                            aceParam.ComboItems.Add(val["text"].ToString());
                        }
                    }

                    ace.Params.Add(aceParam);
                }
                c2addon.Conditions.Add(ace);
            }

            //expressions
            var expressions = data["expressions"];

            c2addon.Expressions = new List <C2Ace>();
            foreach (JObject exp in expressions)
            {
                var ace = new C2Ace
                {
                    Id          = exp["id"].ToString(),
                    ListName    = exp["list_name"].ToString(),
                    Category    = exp["category"].ToString(),
                    Description = exp["description"].ToString(),
                    ScriptName  = exp["expression_name"].ToString(),
                };

                //get flags
                var sb = new StringBuilder();
                foreach (var val in exp["flags"])
                {
                    sb.Append($" {val} ");
                }
                ace.Flags = sb.ToString();

                //params
                foreach (var param in exp["params"])
                {
                    var aceParam = new C2AceParam
                    {
                        Text         = param["name"]?.ToString(),
                        Description  = param["description"]?.ToString(),
                        DefaultValue = param["initial"]?.ToString(),
                        Script       = param["caller"]?.ToString()
                    };

                    if (param["caller"]?.ToString() == "AddComboParam")
                    {
                        aceParam.ComboItems = new List <string>();
                        foreach (var val in param["options"])
                        {
                            aceParam.ComboItems.Add(val["text"].ToString());
                        }
                    }

                    ace.Params.Add(aceParam);
                }

                c2addon.Expressions.Add(ace);
            }

            return(c2addon);
        }