コード例 #1
0
        public string[] GetDeclaration(bool console)
        {
            List <string> Working     = new List <string>();
            string        varlocation = "";
            string        datatype    = "";

            int i = 0;
            int j = -1;

            foreach (Var var in Vars)
            {
                switch (Listtype)
                {
                case ListType.Statics:
                    varlocation = (i >= scriptParamStart ? "ScriptParam_" : "Local_");
                    break;

                case ListType.Vars:
                    varlocation = "Var";
                    break;

                case ListType.Params:
                    throw new DecompilingException("Parameters have different declaration");
                }
                j++;
                if (!var.Is_Used)
                {
                    if (!Program.Shift_Variables)
                    {
                        i++;
                    }
                    continue;
                }
                if (Listtype == ListType.Vars && !var.Is_Called)
                {
                    if (!Program.Shift_Variables)
                    {
                        i++;
                    }
                    continue;
                }
                if (var.Immediatesize == 1)
                {
                    datatype = Types.gettype(var.DataType).vardec;
                }
                else if (var.Immediatesize == 3)
                {
                    datatype = "vector3 v";
                }
                else if (var.DataType == Stack.DataType.String)
                {
                    datatype = "char c";
                }
                else
                {
                    datatype = "struct<" + var.Immediatesize.ToString() + "> ";
                }
                string value = "";
                if (!var.Is_Array)
                {
                    if (Listtype == ListType.Statics)
                    {
                        if (var.Immediatesize == 1)
                        {
                            value = " = " + Utils.Represent(Vars[j].Value, var.DataType);
                        }
                        else if (var.DataType == Stack.DataType.String)
                        {
                            List <byte> data = new List <byte>();
                            for (int l = 0; l < var.Immediatesize; l++)
                            {
                                data.AddRange(BitConverter.GetBytes(Vars[j + l].Value));
                            }
                            int len = data.IndexOf(0);
                            data.RemoveRange(len, data.Count - len);
                            value = " = \"" + Encoding.ASCII.GetString(data.ToArray()) + "\"";
                        }
                        else if (var.Immediatesize == 3)
                        {
                            value += " = { " + Utils.Represent(Vars[j].Value, Stack.DataType.Float) + ", ";
                            value += Utils.Represent(Vars[j + 1].Value, Stack.DataType.Float) + ", ";
                            value += Utils.Represent(Vars[j + 2].Value, Stack.DataType.Float) + " }";
                        }
                        else if (var.Immediatesize > 1)
                        {
                            value += " = { " + Utils.Represent(Vars[j].Value, Stack.DataType.Int);
                            for (int l = 1; l < var.Immediatesize; l++)
                            {
                                value += ", " + Utils.Represent(Vars[j + l].Value, Stack.DataType.Int);
                            }
                            value += " } ";
                        }
                    }
                }
                else
                {
                    if (Listtype == ListType.Statics)
                    {
                        if (var.Immediatesize == 1)
                        {
                            value = " = { ";
                            for (int k = 0; k < var.Value; k++)
                            {
                                value += Utils.Represent(Vars[j + 1 + k].Value, var.DataType) + ", ";
                            }
                            if (value.Length > 2)
                            {
                                value = value.Remove(value.Length - 2);
                            }
                            value += " }";
                        }
                        else if (var.DataType == Stack.DataType.String)
                        {
                            value = " = { ";
                            for (int k = 0; k < var.Value; k++)
                            {
                                List <byte> data = new List <byte>();
                                for (int l = 0; l < var.Immediatesize; l++)
                                {
                                    if (console)
                                    {
                                        data.AddRange(BitConverter.GetBytes((int)Vars[j + 1 + var.Immediatesize * k + l].Value));
                                    }
                                    else
                                    {
                                        data.AddRange(BitConverter.GetBytes(Vars[j + 1 + var.Immediatesize * k + l].Value));
                                    }
                                }
                                value += "\"" + Encoding.ASCII.GetString(data.ToArray()) + "\", ";
                            }
                            if (value.Length > 2)
                            {
                                value = value.Remove(value.Length - 2);
                            }
                            value += " }";
                        }
                        else if (var.Immediatesize == 3)
                        {
                            value = " = {";
                            for (int k = 0; k < var.Value; k++)
                            {
                                value += "{ " + Utils.Represent(Vars[j + 1 + 3 * k].Value, Stack.DataType.Float) + ", ";
                                value += Utils.Represent(Vars[j + 2 + 3 * k].Value, Stack.DataType.Float) + ", ";
                                value += Utils.Represent(Vars[j + 3 + 3 * k].Value, Stack.DataType.Float) + " }, ";
                            }
                            if (value.Length > 2)
                            {
                                value = value.Remove(value.Length - 2);
                            }
                            value += " }";
                        }
                    }
                }
                string decl = datatype + varlocation + (Listtype == ListType.Statics && i >= scriptParamStart ? i - scriptParamStart : i).ToString();
                if (var.Is_Array)
                {
                    decl += "[" + var.Value.ToString() + "]";
                }
                if (var.DataType == Stack.DataType.String)
                {
                    decl += "[" + (var.Immediatesize * (console ? 4 : 8)).ToString() + "]";
                }
                Working.Add(decl + value + ";");
                i++;
            }
            return(Working.ToArray());
        }