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); }
public ZMap(IShardedMemory region) : base(region) { }
public ZSc(IShardedMemory region) : base(region) { }
public ZCodeFiles(IShardedMemory region) : base(region) { }
public ZObj(IShardedMemory region) : base(region) { }
protected BZFile(IShardedMemory region) { this.Region = region; }
public ZOtherData(IShardedMemory region) : base(region) { }
public ZObjectSet(IShardedMemory region) : base(region) { }
public Segment(string filename, IShardedMemory region) { this.FileName = filename; this.Region = region; }
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)); }