コード例 #1
0
        private static PropertyValue ReadValue(IPCCObject pcc, byte[] raw, int start, int type)
        {
            PropertyValue v = new PropertyValue();

            switch (pcc.GetName(type))
            {
            case "IntProperty":
            case "FloatProperty":
            case "ObjectProperty":
            case "StringRefProperty":
                v.IntValue = BitConverter.ToInt32(raw, start);
                v.len      = 4;
                break;

            case "NameProperty":
                v.IntValue = BitConverter.ToInt32(raw, start);
                var nameRef = new NameReference();
                nameRef.index = v.IntValue;
                nameRef.count = BitConverter.ToInt32(raw, start + 4);
                nameRef.Name  = pcc.getNameEntry(nameRef.index);
                if (nameRef.count > 0)
                {
                    nameRef.Name += "_" + (nameRef.count - 1);
                }
                v.NameValue = nameRef;
                v.len       = 8;
                break;

            case "BoolProperty":
                if (start < raw.Length)
                {
                    v.IntValue = raw[start];
                }
                v.len = 1;
                break;
            }
            return(v);
        }
コード例 #2
0
        public static List<Property> ReadProp(IPCCObject pcc, byte[] raw, int start)
        {
            Property p;
            PropertyValue v;
            int sname;
            List<Property> result = new List<Property>();
            int pos = start;
            if (raw.Length - pos < 8)
                return result;
            int name = (int)BitConverter.ToInt64(raw, pos);
            if (!pcc.isName(name))
                return result;

            int MEtype = Methods.GetMEType();
            string t = pcc.GetName(name);
            bool test = t == "None";
            if (MEtype == 3)
            {
                t = pcc.Names[name];
                test = pcc.Names[name] == "None";
            }
            else if (MEtype != 1 && MEtype != 2)
            {
                DebugOutput.PrintLn("Failed to get ME Game Type.");
                return new List<Property>();
            }

            if (test)
            {
                p = new Property();
                p.Name = t;
                p.TypeVal = Type.None;
                p.i = 0;
                p.offsetval = pos;
                p.Size = (MEtype == 3) ? 8 : 20;
                p.Value = new PropertyValue();
                p.raw = BitConverter.GetBytes((Int64)name);
                p.offend = pos + ((MEtype == 3) ? 8 : 20);
                result.Add(p);
                return result;
            }
            int type = (int)BitConverter.ToInt64(raw, pos + 8);
            int size = BitConverter.ToInt32(raw, pos + 16);
            int idx = BitConverter.ToInt32(raw, pos + 20); //Unused
            if (!pcc.isName(type) || size < 0 || size >= raw.Length)
                return result;
            string tp = (MEtype == 3) ? pcc.Names[type] : pcc.GetName(type);
            switch (tp)
            {
                case "BoolProperty":
                    p = new Property();
                    p.TypeVal = Type.BoolProperty;
                    p.Name = t;
                    p.Size = size;
                    v = new PropertyValue();
                    if (MEtype == 3)
                    {
                        p.offsetval = pos + 24;
                        pos += 25;
                        byte temp = raw[p.offsetval];
                        v.IntValue = (int)temp;
                        v.Boolereno = temp == 1;
                    }
                    else
                    {
                        p.i = 0;
                        v.IntValue = BitConverter.ToInt32(raw, pos + ((MEtype == 2) ? 24 : 16)); //Guess. I haven't seen a true boolproperty yet
                        pos += 28;
                    }
                    p.Value = v;
                    break;
                case "NameProperty":
                    p = new Property();
                    p.TypeVal = Type.NameProperty;
                    p.Name = t;
                    p.Size = size;
                    v = new PropertyValue();
                    if (MEtype == 3)
                    {
                        pos += 24;
                        v.IntValue = (int)BitConverter.ToInt64(raw, pos);
                        v.StringValue = pcc.Names[v.IntValue];
                        pos += size;
                    }
                    else
                    {
                        //pos += 32;
                        //int tempInt = BitConverter.ToInt32(raw, pos + 24);
                        p.i = 0;
                        v.StringValue = pcc.GetName(BitConverter.ToInt32(raw, pos + 24));
                        pos += 32;
                    }
                    p.Value = v;
                    break;
                case "IntProperty":
                    p = new Property();
                    p.TypeVal = Type.IntProperty;
                    v = new PropertyValue();
                    p.Name = t;
                    p.Size = size;
                    if (MEtype == 3)
                    {
                        pos += 24;
                        v.IntValue = (int)BitConverter.ToInt64(raw, pos);
                        pos += size;
                    }
                    else
                    {
                        v.IntValue = BitConverter.ToInt32(raw, pos + 24);
                        p.i = 0;
                        p.offsetval = pos + 24;
                        pos += 28;
                    }
                    p.Value = v;
                    break;
                case "DelegateProperty":
                    p = new Property();
                    p.Name = t;
                    p.TypeVal = Type.DelegateProperty;
                    p.i = 0;
                    p.offsetval = pos + 24;
                    v = new PropertyValue();
                    v.IntValue = BitConverter.ToInt32(raw, pos + 28);
                    v.len = size;
                    v.Array = new List<PropertyValue>();
                    if (MEtype != 3)
                        p.Size = size;
                    pos += 24;
                    for (int i = 0; i < size; i++)
                    {
                        PropertyValue v2 = new PropertyValue();
                        if (pos < raw.Length)
                            v2.IntValue = raw[pos];
                        v.Array.Add(v2);
                        pos++;
                    }
                    p.Value = v;
                    break;
                case "ArrayProperty":
                    int count = (int)BitConverter.ToInt64(raw, pos + 24);
                    p = new Property();
                    p.Name = t;
                    if (MEtype != 3)
                        p.Size = size;
                    p.TypeVal = Type.ArrayProperty;
                    p.i = 0;
                    p.offsetval = pos + 24;
                    v = new PropertyValue();
                    v.IntValue = type;
                    v.len = size - 4;
                    count = v.len;//TODO can be other objects too
                    v.Array = new List<PropertyValue>();
                    pos += 28;
                    for (int i = 0; i < count; i++)
                    {
                        PropertyValue v2 = new PropertyValue();
                        if (pos < raw.Length)
                            v2.IntValue = raw[pos];
                        v.Array.Add(v2);
                        pos++;
                    }
                    p.Value = v;
                    break;
                case "StrProperty":
                    if (MEtype == 2)
                        count = (int)BitConverter.ToInt32(raw, pos + 24);
                    else
                        count = (int)BitConverter.ToInt64(raw, pos + 24);
                    p = new Property();
                    p.Name = t;
                    if (MEtype != 3)
                        p.Size = size;
                    p.TypeVal = Type.StrProperty;
                    p.i = 0;
                    p.offsetval = pos + 24;
                    if (MEtype == 3)
                        count *= -1;
                    v = new PropertyValue();
                    v.IntValue = type;
                    v.len = count;
                    pos += 28;
                    string s = "";
                    for (int i = 0; i < ((MEtype == 3) ? count : count - 1); i++)
                    {
                        s += (char)raw[pos];
                        if (MEtype == 3)
                            pos += 2;
                        else
                            pos++;
                    }
                    if (MEtype != 3)
                        pos++;
                    v.StringValue = s;
                    p.Value = v;
                    break;
                case "StructProperty":
                    sname = (int)BitConverter.ToInt64(raw, pos + 24);
                    p = new Property();
                    p.Name = t;
                    p.Size = size;
                    p.TypeVal = Type.StructProperty;
                    p.i = 0;
                    p.offsetval = pos + 24;
                    v = new PropertyValue();
                    v.IntValue = sname;
                    v.len = size;
                    v.Array = new List<PropertyValue>();
                    if (MEtype == 3)
                        v.StringValue = pcc.Names[sname];
                    else if (MEtype == 3)
                        v.StringValue = pcc.GetName(sname);
                    pos += 32;
                    for (int i = 0; i < size; i += ((MEtype == 3) ? 1 : 4))
                    {
                        PropertyValue v2 = new PropertyValue();
                        //if (pos < raw.Length)
                        //    v2.IntValue = raw[pos];
                        //v.Array.Add(v2);
                        //pos++;
                        if (pos < raw.Length)
                            v2.IntValue = (MEtype == 3) ? raw[pos] : BitConverter.ToInt32(raw, pos);
                        v.Array.Add(v2);
                        pos += (MEtype == 3) ? 1 : 4;
                    }
                    p.Value = v;
                    break;
                case "ByteProperty":
                    if (MEtype == 3)
                        sname = (int)BitConverter.ToInt64(raw, pos + 24);
                    else
                        sname = BitConverter.ToInt32(raw, pos + 24);
                    p = new Property();
                    p.Name = t;
                    p.Size = size;
                    p.TypeVal = Type.ByteProperty;
                    p.i = 0;
                    p.offsetval = pos + 32;
                    v = new PropertyValue();
                    v.StringValue = (MEtype == 3) ? pcc.getNameEntry(sname) : pcc.GetName(sname);
                    v.len = size;
                    if (MEtype == 3)
                    {
                        pos += 32;
                        v.IntValue = BitConverter.ToInt32(raw, pos);
                        v.String2 = pcc.Names[v.IntValue];
                        pos += size;
                    }
                    else
                    {
                        v.IntValue = BitConverter.ToInt32(raw, pos + 28);
                        if (MEtype == 2)
                            v.String2 = pcc.GetName(v.IntValue);
                        pos += 32;
                    }

                    //v.IntValue = (int)BitConverter.ToInt64(raw, pos);
                    //pos += size;
                    p.Value = v;
                    break;
                case "FloatProperty":
                    if (MEtype == 1)
                        sname = (int)BitConverter.ToInt64(raw, pos + 24);
                    else if (MEtype == 2)
                        sname = BitConverter.ToInt32(raw, pos + 24);
                    p = new Property();
                    p.Name = t;
                    p.Size = size;
                    p.TypeVal = Type.FloatProperty;
                    p.i = 0;
                    p.offsetval = (MEtype != 3) ? pos + 24 : 24;
                    v = new PropertyValue();
                    v.FloatValue = BitConverter.ToSingle(raw, pos + 24);
                    v.len = size;
                    pos += 28;
                    p.Value = v;
                    break;
                default:
                    p = new Property();
                    p.Name = t;
                    p.TypeVal = getType(pcc, type);
                    p.i = 0;
                    if (MEtype != 3)
                        p.Size = size;
                    p.offsetval = pos + 24;
                    p.Value = ReadValue(pcc, raw, pos + 24, type);
                    pos += p.Value.len + 24;
                    break;
            }
            p.raw = new byte[pos - start];
            p.offend = pos;
            if (pos < raw.Length)
                for (int i = 0; i < pos - start; i++)
                    p.raw[i] = raw[start + i];
            result.Add(p);
            if (pos != start) result.AddRange(ReadProp(pcc, raw, pos));
            return result;
        }
コード例 #3
0
ファイル: Interpreter2.cs プロジェクト: Dybuk/ME3Explorer
        public TreeNode GenerateTree(TreeNode input, List <PropHeader> l)
        {
            TreeNode ret = input;

            foreach (PropHeader p in l)
            {
                int type = isType(pcc.getNameEntry(p.type));
                if (type != 7 && type != 0)
                {
                    ret.Nodes.Add(GenerateNode(p));
                }
                else
                {
                    if (type == 7)
                    {
                        TreeNode t     = GenerateNode(p);
                        int      count = BitConverter.ToInt32(memory, p.offset + 24);
                        readerpos = p.offset + 28;
                        int tmp = readerpos;
                        List <PropHeader> ll = ReadHeadersTillNone();
                        if (ll.Count != 0 && count > 0)
                        {
                            if (count == 1)
                            {
                                readerpos = tmp;
                                t         = GenerateTree(t, ll);
                            }
                            else
                            {
                                for (int i = 0; i < count; i++)
                                {
                                    readerpos = tmp;
                                    List <PropHeader> ll2 = ReadHeadersTillNone();
                                    tmp = readerpos;
                                    TreeNode n = new TreeNode(i.ToString());
                                    n = GenerateTree(n, ll2);
                                    t.Nodes.Add(n);
                                }
                            }
                            ret.Nodes.Add(t);
                        }
                        else
                        {
                            for (int i = 0; i < (p.size - 4) / 4; i++)
                            {
                                int    val = BitConverter.ToInt32(memory, p.offset + 28 + i * 4);
                                string s   = (p.offset + 28 + i * 4).ToString("X4") + " : " + val.ToString();
                                t.Nodes.Add(s);
                            }
                            ret.Nodes.Add(t);
                        }
                    }
                    if (type == 0)
                    {
                        TreeNode t    = GenerateNode(p);
                        int      name = BitConverter.ToInt32(memory, p.offset + 24);
                        readerpos = p.offset + 32;
                        List <PropHeader> ll = ReadHeadersTillNone();
                        if (ll.Count != 0)
                        {
                            t = GenerateTree(t, ll);
                            ret.Nodes.Add(t);
                        }
                        else
                        {
                            for (int i = 0; i < p.size / 4; i++)
                            {
                                int    val = BitConverter.ToInt32(memory, p.offset + 32 + i * 4);
                                string s   = (p.offset + 32 + i * 4).ToString("X4") + " : " + val.ToString();
                                t.Nodes.Add(s);
                            }
                            ret.Nodes.Add(t);
                        }
                    }
                }
            }
            return(ret);
        }
コード例 #4
0
        public static List <Property> ReadProp(IPCCObject pcc, byte[] raw, int start)
        {
            Property        p;
            PropertyValue   v;
            int             sname;
            List <Property> result = new List <Property>();
            int             pos    = start;

            if (raw.Length - pos < 8)
            {
                return(result);
            }
            int name = (int)BitConverter.ToInt64(raw, pos);

            if (!pcc.isName(name))
            {
                return(result);
            }

            int    MEtype = Methods.GetMEType();
            string t      = pcc.GetName(name);
            bool   test   = t == "None";

            if (MEtype == 3)
            {
                t    = pcc.Names[name];
                test = pcc.Names[name] == "None";
            }
            else if (MEtype != 1 && MEtype != 2)
            {
                DebugOutput.PrintLn("Failed to get ME Game Type.");
                return(new List <Property>());
            }

            if (test)
            {
                p           = new Property();
                p.Name      = t;
                p.TypeVal   = Type.None;
                p.i         = 0;
                p.offsetval = pos;
                p.Size      = (MEtype == 3) ? 8 : 20;
                p.Value     = new PropertyValue();
                p.raw       = BitConverter.GetBytes((Int64)name);
                p.offend    = pos + ((MEtype == 3) ? 8 : 20);
                result.Add(p);
                return(result);
            }
            int type = (int)BitConverter.ToInt64(raw, pos + 8);
            int size = BitConverter.ToInt32(raw, pos + 16);
            int idx  = BitConverter.ToInt32(raw, pos + 20); //Unused

            if (!pcc.isName(type) || size < 0 || size >= raw.Length)
            {
                return(result);
            }
            string tp = (MEtype == 3) ? pcc.Names[type] : pcc.GetName(type);

            switch (tp)
            {
            case "BoolProperty":
                p         = new Property();
                p.TypeVal = Type.BoolProperty;
                p.Name    = t;
                p.Size    = size;
                v         = new PropertyValue();
                if (MEtype == 3)
                {
                    p.offsetval = pos + 24;
                    pos        += 25;
                    byte temp = raw[p.offsetval];
                    v.IntValue  = (int)temp;
                    v.Boolereno = temp == 1;
                }
                else
                {
                    p.i        = 0;
                    v.IntValue = BitConverter.ToInt32(raw, pos + ((MEtype == 2) ? 24 : 16));     //Guess. I haven't seen a true boolproperty yet
                    pos       += 28;
                }
                p.Value = v;
                break;

            case "NameProperty":
                p         = new Property();
                p.TypeVal = Type.NameProperty;
                p.Name    = t;
                p.Size    = size;
                v         = new PropertyValue();
                if (MEtype == 3)
                {
                    pos          += 24;
                    v.IntValue    = BitConverter.ToInt32(raw, pos);
                    v.StringValue = pcc.GetName(v.IntValue);
                    // Heff: Temporary modification to handle name refs properly, until we can rewrite the whole property system accross all tools
                    var nameRef = new NameReference();
                    nameRef.index = v.IntValue;
                    nameRef.count = BitConverter.ToInt32(raw, pos + 4);
                    nameRef.Name  = pcc.getNameEntry(nameRef.index);
                    if (nameRef.count > 0)
                    {
                        nameRef.Name += "_" + (nameRef.count - 1);
                    }
                    v.NameValue = nameRef;
                    pos        += size;
                }
                else
                {
                    //pos += 32;
                    //int tempInt = BitConverter.ToInt32(raw, pos + 24);
                    p.i           = 0;
                    v.IntValue    = BitConverter.ToInt32(raw, pos + 24);
                    v.StringValue = pcc.GetName(v.IntValue);
                    // Heff: Temporary modification to handle name refs properly, until we can rewrite the whole property system accross all tools
                    var nameRef = new NameReference();
                    nameRef.index = v.IntValue;
                    nameRef.count = BitConverter.ToInt32(raw, pos + 4);
                    nameRef.Name  = pcc.getNameEntry(nameRef.index);
                    if (nameRef.count > 0)
                    {
                        nameRef.Name += "_" + (nameRef.count - 1);
                    }
                    v.NameValue = nameRef;
                    pos        += 32;
                }
                p.Value = v;
                break;

            case "IntProperty":
                p         = new Property();
                p.TypeVal = Type.IntProperty;
                v         = new PropertyValue();
                p.Name    = t;
                p.Size    = size;
                if (MEtype == 3)
                {
                    pos       += 24;
                    v.IntValue = (int)BitConverter.ToInt64(raw, pos);
                    pos       += size;
                }
                else
                {
                    v.IntValue  = BitConverter.ToInt32(raw, pos + 24);
                    p.i         = 0;
                    p.offsetval = pos + 24;
                    pos        += 28;
                }
                p.Value = v;
                break;

            case "DelegateProperty":
                p           = new Property();
                p.Name      = t;
                p.TypeVal   = Type.DelegateProperty;
                p.i         = 0;
                p.offsetval = pos + 24;
                v           = new PropertyValue();
                v.IntValue  = BitConverter.ToInt32(raw, pos + 28);
                v.len       = size;
                v.Array     = new List <PropertyValue>();
                if (MEtype != 3)
                {
                    p.Size = size;
                }
                pos += 24;
                for (int i = 0; i < size; i++)
                {
                    PropertyValue v2 = new PropertyValue();
                    if (pos < raw.Length)
                    {
                        v2.IntValue = raw[pos];
                    }
                    v.Array.Add(v2);
                    pos++;
                }
                p.Value = v;
                break;

            case "ArrayProperty":
                int count = (int)BitConverter.ToInt64(raw, pos + 24);
                p      = new Property();
                p.Name = t;
                if (MEtype != 3)
                {
                    p.Size = size;
                }
                p.TypeVal   = Type.ArrayProperty;
                p.i         = 0;
                p.offsetval = pos + 24;
                v           = new PropertyValue();
                v.IntValue  = type;
                v.len       = size - 4;
                count       = v.len;//TODO can be other objects too
                v.Array     = new List <PropertyValue>();
                pos        += 28;
                for (int i = 0; i < count; i++)
                {
                    PropertyValue v2 = new PropertyValue();
                    if (pos < raw.Length)
                    {
                        v2.IntValue = raw[pos];
                    }
                    v.Array.Add(v2);
                    pos++;
                }
                p.Value = v;
                break;

            case "StrProperty":
                if (MEtype == 2)
                {
                    count = (int)BitConverter.ToInt32(raw, pos + 24);
                }
                else
                {
                    count = (int)BitConverter.ToInt64(raw, pos + 24);
                }
                p      = new Property();
                p.Name = t;
                if (MEtype != 3)
                {
                    p.Size = size;
                }
                p.TypeVal   = Type.StrProperty;
                p.i         = 0;
                p.offsetval = pos + 24;
                if (MEtype == 3)
                {
                    count *= -1;
                }
                v          = new PropertyValue();
                v.IntValue = type;
                v.len      = count;
                pos       += 28;
                string s = "";
                for (int i = 0; i < ((MEtype == 3) ? count : count - 1); i++)
                {
                    s += (char)raw[pos];
                    if (MEtype == 3)
                    {
                        pos += 2;
                    }
                    else
                    {
                        pos++;
                    }
                }
                if (MEtype != 3)
                {
                    pos++;
                }
                v.StringValue = s;
                p.Value       = v;
                break;

            case "StructProperty":
                sname       = (int)BitConverter.ToInt64(raw, pos + 24);
                p           = new Property();
                p.Name      = t;
                p.Size      = size;
                p.TypeVal   = Type.StructProperty;
                p.i         = 0;
                p.offsetval = pos + 24;
                v           = new PropertyValue();
                v.IntValue  = sname;
                v.len       = size;
                v.Array     = new List <PropertyValue>();
                if (MEtype == 3)
                {
                    v.StringValue = pcc.Names[sname];
                }
                else if (MEtype == 3)
                {
                    v.StringValue = pcc.GetName(sname);
                }
                pos += 32;
                for (int i = 0; i < size; i += ((MEtype == 3) ? 1 : 4))
                {
                    PropertyValue v2 = new PropertyValue();
                    //if (pos < raw.Length)
                    //    v2.IntValue = raw[pos];
                    //v.Array.Add(v2);
                    //pos++;
                    if (pos < raw.Length)
                    {
                        v2.IntValue = (MEtype == 3) ? raw[pos] : BitConverter.ToInt32(raw, pos);
                    }
                    v.Array.Add(v2);
                    pos += (MEtype == 3) ? 1 : 4;
                }
                p.Value = v;
                break;

            case "ByteProperty":
                if (MEtype == 3)
                {
                    sname = (int)BitConverter.ToInt64(raw, pos + 24);
                }
                else
                {
                    sname = BitConverter.ToInt32(raw, pos + 24);
                }
                p             = new Property();
                p.Name        = t;
                p.Size        = size;
                p.TypeVal     = Type.ByteProperty;
                p.i           = 0;
                p.offsetval   = pos + 32;
                v             = new PropertyValue();
                v.StringValue = (MEtype == 3) ? pcc.getNameEntry(sname) : pcc.GetName(sname);
                v.len         = size;
                if (MEtype == 3)
                {
                    pos       += 32;
                    v.IntValue = BitConverter.ToInt32(raw, pos);
                    v.String2  = pcc.Names[v.IntValue];
                    // Heff: Temporary modification to handle name refs properly, until we can rewrite the whole property system accross all tools
                    // This is stupid for enum properties, but as the enum itself will probably never be a name with index it works..
                    var nameRef = new NameReference();
                    nameRef.index = v.IntValue;
                    nameRef.count = BitConverter.ToInt32(raw, pos + 4);
                    nameRef.Name  = pcc.getNameEntry(nameRef.index);
                    if (nameRef.count > 0)
                    {
                        nameRef.Name += "_" + (nameRef.count - 1);
                    }
                    v.NameValue = nameRef;
                    pos        += size;
                }
                else
                {
                    v.IntValue = BitConverter.ToInt32(raw, pos + 28);
                    if (MEtype == 2)
                    {
                        v.String2 = pcc.GetName(v.IntValue);
                    }
                    pos += 32;
                }

                //v.IntValue = (int)BitConverter.ToInt64(raw, pos);
                //pos += size;
                p.Value = v;
                break;

            case "FloatProperty":
                if (MEtype == 1)
                {
                    sname = (int)BitConverter.ToInt64(raw, pos + 24);
                }
                else if (MEtype == 2)
                {
                    sname = BitConverter.ToInt32(raw, pos + 24);
                }
                p            = new Property();
                p.Name       = t;
                p.Size       = size;
                p.TypeVal    = Type.FloatProperty;
                p.i          = 0;
                p.offsetval  = (MEtype != 3) ? pos + 24 : 24;
                v            = new PropertyValue();
                v.FloatValue = BitConverter.ToSingle(raw, pos + 24);
                v.len        = size;
                pos         += 28;
                p.Value      = v;
                break;

            default:
                p         = new Property();
                p.Name    = t;
                p.TypeVal = getType(pcc, type);
                p.i       = 0;
                if (MEtype != 3)
                {
                    p.Size = size;
                }
                p.offsetval = pos + 24;
                p.Value     = ReadValue(pcc, raw, pos + 24, type);
                pos        += p.Value.len + 24;
                break;
            }
            p.raw    = new byte[pos - start];
            p.offend = pos;
            if (pos < raw.Length)
            {
                for (int i = 0; i < pos - start; i++)
                {
                    p.raw[i] = raw[start + i];
                }
            }
            result.Add(p);
            if (pos != start)
            {
                result.AddRange(ReadProp(pcc, raw, pos));
            }
            return(result);
        }
コード例 #5
0
 private static PropertyValue ReadValue(IPCCObject pcc, byte[] raw, int start, int type)
 {
     PropertyValue v = new PropertyValue();
     switch (pcc.GetName(type))
     {
         case "IntProperty":
         case "FloatProperty":
         case "ObjectProperty":
         case "StringRefProperty":
             v.IntValue = BitConverter.ToInt32(raw, start);
             v.len = 4;
             break;
         case "NameProperty":
             v.IntValue = BitConverter.ToInt32(raw, start);
             var nameRef = new NameReference();
             nameRef.index = v.IntValue;
             nameRef.count = BitConverter.ToInt32(raw, start + 4);
             nameRef.Name = pcc.getNameEntry(nameRef.index);
             if (nameRef.count > 0)
                 nameRef.Name += "_" + (nameRef.count - 1);
             v.NameValue = nameRef;
             v.len = 8;
             break;
         case "BoolProperty":
             if (start < raw.Length)
                 v.IntValue = raw[start];
             v.len = 1;
             break;
     }
     return v;
 }