示例#1
0
        private static IEnumerable <Segment> GetSegments_(
            IShardedMemory romMemory,
            uint segmentOffset,
            int nameOffset)
        {
            var segments = new List <Segment>();

            bool bothZero;

            do
            {
                var startAddress = (int)IoUtil.ReadUInt32(romMemory, segmentOffset);
                var endAddress   = (int)IoUtil.ReadUInt32(romMemory, segmentOffset + 4);

                bothZero = startAddress == 0 && endAddress == 0;
                if (!bothZero)
                {
                    var fileNameBytes = new List <byte>();
                    while (romMemory[nameOffset] == 0)
                    {
                        nameOffset++;
                    }
                    while (romMemory[nameOffset] != 0)
                    {
                        fileNameBytes.Add(romMemory[nameOffset++]);
                    }
                    var fileName =
                        System.Text.Encoding.UTF8.GetString(
                            fileNameBytes.ToArray(),
                            0,
                            fileNameBytes.Count);

                    segments.Add(new Segment(fileName,
                                             romMemory.Shard(
                                                 startAddress,
                                                 endAddress - startAddress)));

                    segmentOffset += 16;
                }
            } while (!bothZero);

            return(segments);
        }
示例#2
0
 public ZMap(IShardedMemory region) : base(region)
 {
 }
示例#3
0
 public ZSc(IShardedMemory region) : base(region)
 {
 }
示例#4
0
 public ZCodeFiles(IShardedMemory region) : base(region)
 {
 }
示例#5
0
 public ZObj(IShardedMemory region) : base(region)
 {
 }
示例#6
0
 protected BZFile(IShardedMemory region)
 {
     this.Region = region;
 }
示例#7
0
 public ZOtherData(IShardedMemory region) : base(region)
 {
 }
示例#8
0
 public ZObjectSet(IShardedMemory region) : base(region)
 {
 }
示例#9
0
 public Segment(string filename, IShardedMemory region)
 {
     this.FileName = filename;
     this.Region   = region;
 }
示例#10
0
        public static ZFiles GetFiles(
            IShardedMemory romMemory,
            uint segmentOffset,
            int nameOffset)
        {
            var segments = ZFiles.GetSegments_(romMemory, segmentOffset, nameOffset);

            var objects   = new List <ZObj>();
            var actorCode = new List <ZCodeFiles>();
            var scenes    = new LinkedList <ZSc>();
            var others    = new List <ZOtherData>();

            foreach (var segment in segments)
            {
                var fileName       = segment.FileName;
                var betterFileName = BetterFileNames.Get(fileName);
                var region         = segment.Region;

                IZFile file;
                if (fileName.StartsWith("object_"))
                {
                    region.ShardType = ShardedMemoryType.OBJECT;
                    var obj = new ZObj(region);
                    file = obj;

                    objects.Add(obj);
                }
                else if (fileName.StartsWith("ovl_"))
                {
                    region.ShardType = ShardedMemoryType.CODE;
                    var ovl = new ZCodeFiles(region);
                    file = ovl;

                    actorCode.Add(ovl);
                }
                else if (fileName.EndsWith("_scene"))
                {
                    region.ShardType = ShardedMemoryType.SCENE;
                    var scene = new ZSc(region);
                    file = scene;

                    scenes.AddLast(scene);
                }
                else if (fileName.Contains("_room"))
                {
                    var scene = scenes.Last.Value;

                    region.ShardType = ShardedMemoryType.MAP;
                    var map = new ZMap(region)
                    {
                        Scene = scene
                    };
                    file = map;

                    var mapCount = scene.Maps?.Length ?? 0;
                    Array.Resize(ref scene.Maps, mapCount + 1);
                    scene.Maps[mapCount] = map;
                }
                else
                {
                    region.ShardType = ShardedMemoryType.OTHER_DATA;
                    var other = new ZOtherData(region);
                    file = other;

                    others.Add(other);
                }

                file.FileName       = fileName;
                file.BetterFileName = betterFileName;
            }

            return(new ZFiles(objects, actorCode, scenes.ToArray(), others));
        }