예제 #1
0
        public void Init(VltClassRecord classRecord, TableEndBlock teb, BinaryReader br)
        {
            var vc = new VltClass();

            vc.Init(classRecord, teb, br);
            Classes.Add(vc.Hash, vc);
        }
예제 #2
0
        private VltBlockContainer ReadBlock(BinaryReader reader)
        {
            if (reader.BaseStream.Position == reader.BaseStream.Length)
            {
                return(null);
            }

            var block = new VltBlock
            {
                Position    = reader.BaseStream.Position,
                Type        = (VltMarker)reader.ReadInt32(),
                BlockLength = reader.ReadInt32(),
            };

            if (!block.IsBlank())
            {
                var vltType = block.Type;

                VltBlockContainer bc;

                switch (vltType)
                {
                case VltMarker.VltMagic:
                    bc = new HeaderBlock();
                    break;

                case VltMarker.TableStart:
                    bc = new TableStartBlock();
                    break;

                case VltMarker.TableEnd:
                    bc = new TableEndBlock();
                    break;

                default:
                    bc = new PlaceholderBlock();
                    break;
                }

                bc.Block = block;
                bc.Read(reader);
                block.SeekToNextBlock(reader.BaseStream);

                return(bc);
            }

            return(null);
        }
예제 #3
0
        public void Init(VltRootRecord rootRecord, TableEndBlock teb, BinaryReader br)
        {
            var position = teb.InfoDictionary[rootRecord.Position].Address2;

            br.BaseStream.Seek(position, SeekOrigin.Begin);

            _managedClasses = new Dictionary <uint, ManagedClass>(rootRecord.NumEntries);

            for (var i = 0; i < rootRecord.NumEntries; ++i)
            {
                var mc = new ManagedClass
                {
                    Value   = BinaryUtil.ReadNullTerminatedString(br),
                    Unknown = rootRecord.Hashes[i]
                };

                mc.Hash = JenkinsHash.getHash32(mc.Value);

                _managedClasses.Add(mc.Hash, mc);
            }
        }
예제 #4
0
            public void Init(VltRowRecord rowRecord, TableEndBlock block, BinaryReader vltReader,
                             BinaryReader binReader)
            {
                var info = new VltInfo(_vltClass.ClassRecord.NumFields);

                DebugUtil.EnsureCondition(
                    block.InfoDictionary.ContainsKey(rowRecord.Position),
                    () => "Uh oh.");

                var basePosition = block.InfoDictionary[rowRecord.Position].Address2;

                info.BlockContainer = block;
                info.Class          = _vltClass;
                info.RowRecord      = rowRecord;

                for (var i = 0; i < _vltClass.ClassRecord.NumFields; ++i)
                {
                    var          field = _vltClass.Fields[i];
                    BinaryReader br;

                    if (!field.IsOptional())
                    {
                        br = binReader;
                        br.BaseStream.Seek(basePosition + field.Offset, SeekOrigin.Begin);
                    }
                    else
                    {
                        br = null;

                        foreach (var row in rowRecord.Rows)
                        {
                            if (row.Hash == field.Hash)
                            {
                                if (row.IsInVlt())
                                {
                                    br = vltReader;
                                    br.BaseStream.Seek(row.Position, SeekOrigin.Begin);
                                }
                                else
                                {
                                    br = binReader;
                                    br.BaseStream.Seek(block.InfoDictionary[row.Position].Address2,
                                                       SeekOrigin.Begin);
                                }
                            }
                        }

                        if (br == null)
                        {
                            continue;
                        }
                    }

                    var type = VltTypeMap.Instance.GetTypeForKey(field.TypeHash);

                    if (type == null)
                    {
                        type = typeof(RawType);
                    }

                    VltType vltType;

                    if (field.IsArray())
                    {
                        vltType = new ArrayType(field, type);
                    }
                    else
                    {
                        vltType      = VltType.Create(type);
                        vltType.Size = field.Length;

                        if (vltType is RawType rt)
                        {
                            rt.Length = field.Length;
                        }
                    }

                    vltType.Address  = (uint)br.BaseStream.Position;
                    vltType.IsVlt    = br == vltReader;
                    vltType.TypeHash = field.TypeHash;
                    vltType.Hash     = field.Hash;
                    vltType.Info     = info;
                    vltType.Read(br);

                    if (vltType is ArrayType va)
                    {
                        Console.WriteLine($"Class: 0x{_vltClass.Hash:X8} | Field: 0x{field.Hash:X8} | Array of {va.Type} (original: 0x{field.TypeHash:X8}) with {va.Entries}/{va.MaxEntries} entries");

                        foreach (var av in va.Types)
                        {
                            Console.WriteLine($"\tValue: {av}");
                        }
                    }
                    else
                    {
                        if (!(vltType is RawType))
                        {
                            Console.WriteLine(
                                $"Class: 0x{_vltClass.Hash:X8} | Field: 0x{field.Hash:X8} | {vltType.GetType()} -> {vltType}");
                        }
                    }

                    info.Set(i, vltType);
                }

                _infoList.Add(info);
            }