public static Teams ReadRom(string filePath, BlitzGame gameSystem) { Teams teams = new Teams(); BlitzGame gameSystemClone = Clone.DeepClone <BlitzGame>(gameSystem); for (int x = 0; x < gameSystem.GameTeamCount; x++) { using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { //Get Team Name byte thisByte = 01; List <Byte> listOfBytes = new List <byte>(); fs.Position = gameSystemClone.TeamNameOffsetStart + x * gameSystemClone.TeamOffsetIncrement; while (true) { thisByte = byte.Parse(fs.ReadByte().ToString()); if (thisByte == 00) { break; } listOfBytes.Add(thisByte); } Team team = new Team(); team.TeamName = System.Text.Encoding.ASCII.GetString(listOfBytes.ToArray()); teams.Add(team); } } return(teams); }
private List <BlitzGameFile> ParseBlitzFileList(string romLocation, BlitzGame gameInfo) { List <BlitzGameFile> midwayDecFileList = new List <BlitzGameFile>(); using (var fs = new FileStream(romLocation, FileMode.Open, FileAccess.ReadWrite)) { int fileTableEntrySize = gameInfo.maxFileNameLenght + gameInfo.filePositionLength + gameInfo.decompressedLenght + gameInfo.compressedLenght; int fileCount = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 12, 4).ToArray()); long currentOffset = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 8, 4).ToArray()) + gameInfo.FileSystemOffset; for (int x = 0; x < fileCount; x++) { int readLocation = 0; // read file table entry List <Byte> fileTableEntry = BitsHelper.ReadBytesFromFileStream(fs, currentOffset, fileTableEntrySize); //Get File Name string fileName = System.Text.Encoding.ASCII.GetString(fileTableEntry.ToArray(), readLocation, gameInfo.maxFileNameLenght).Replace("\0", ""); /// Get decompressed file size readLocation += gameInfo.maxFileNameLenght; byte[] decompressedSizeBytes = fileTableEntry.GetRange(readLocation, gameInfo.decompressedLenght).ToArray(); Array.Reverse(decompressedSizeBytes); int decompressedSize = BitConverter.ToInt32(decompressedSizeBytes, 0); //File Position readLocation += gameInfo.decompressedLenght; byte[] filePositionBytes = fileTableEntry.GetRange(readLocation, gameInfo.filePositionLength).ToArray(); Array.Reverse(filePositionBytes); long filePosition = BitConverter.ToInt32(filePositionBytes, 0) + gameInfo.FileSystemOffset; /// Get decompressed file size readLocation += gameInfo.filePositionLength; byte[] compressedSizeBytes = fileTableEntry.GetRange(readLocation, gameInfo.compressedLenght).ToArray(); Array.Reverse(compressedSizeBytes); int compressedSize = BitConverter.ToInt32(compressedSizeBytes, 0); midwayDecFileList.Add(new BlitzGameFile() { fileName = fileName, decompressedSize = decompressedSize, fileOffset = filePosition, compressedSize = compressedSize, fileTableEntryStart = currentOffset } ); currentOffset += fileTableEntrySize; } } return(midwayDecFileList); }
public static void ReadTeamFiles(string filePath, BlitzGame gameSystem, ref Teams blitzTeams, List <BlitzGameFile> files) { using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { for (int y = 0; y < gameSystem.GameTeamCount; y++) { int fileIndex = 0; blitzTeams[y].TeamFiles = new List <BlitzGameFile>(); // Load Uniform for (int x = 0; x < gameSystem.TeamUniformLength; x++) { fs.Position = gameSystem.TeamUniformOffset + (gameSystem.TeamOffsetIncrement * y) + fileIndex; long fileTableLocation; long.TryParse(ByteArrayToString(new byte[] { (byte)fs.ReadByte(), (byte)fs.ReadByte() }), System.Globalization.NumberStyles.HexNumber, null, out fileTableLocation); fileTableLocation -= 1; blitzTeams[y].TeamFiles.Add(Clone.DeepClone(files[(int)fileTableLocation])); blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].fileDescription = gameSystem.UniformFileNameList[x]; blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].teamReferenceOffset = fs.Position - 2; fileIndex += 2; } // Load Menu items fileIndex = 0; for (int x = 0; x < gameSystem.TeamMenuLength; x++) { fs.Position = gameSystem.TeamMenuOffset + (gameSystem.TeamOffsetIncrement * y) + fileIndex; long fileTableLocation; long.TryParse(ByteArrayToString(new byte[] { (byte)fs.ReadByte(), (byte)fs.ReadByte() }), System.Globalization.NumberStyles.HexNumber, null, out fileTableLocation); fileTableLocation -= 1; blitzTeams[y].TeamFiles.Add(Clone.DeepClone(files[(int)fileTableLocation])); blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].fileDescription = gameSystem.MenuSelectFileNameList[x]; blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].teamReferenceOffset = fs.Position - 2; fileIndex += 2; } // Load in game team items (endzone, ect...) fileIndex = 0; for (int x = 0; x < gameSystem.TeamInGameLength; x++) { fs.Position = gameSystem.TeamInGameOffset + (gameSystem.TeamOffsetIncrement * y) + fileIndex; long fileTableLocation; long.TryParse(ByteArrayToString(new byte[] { (byte)fs.ReadByte(), (byte)fs.ReadByte() }), System.Globalization.NumberStyles.HexNumber, null, out fileTableLocation); fileTableLocation -= 1; blitzTeams[y].TeamFiles.Add(Clone.DeepClone(files[(int)fileTableLocation])); blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].fileDescription = gameSystem.InGameFileNameList[x]; blitzTeams[y].TeamFiles[blitzTeams[y].TeamFiles.Count - 1].teamReferenceOffset = fs.Position - 2; fileIndex += 2; } } } }
private void LoadRom(string romLocation) { gameInfo = BlitzGame.GetBlitz2000Zoinkity(); tbTeamCount.Text = gameInfo.GameTeamCount.ToString(); this.romLocation = romLocation; BlitzTeams = RomEditor.ReadRom(romLocation, gameInfo); gameFiles = ParseBlitzFileList(romLocation, gameInfo); filesSortedByOffset = Clone.DeepClone(gameFiles).OrderBy(x => x.fileOffset).ToList(); lbGameFiles.ItemsSource = gameFiles; RomEditor.ReadTeamFiles(romLocation, gameInfo, ref blitzTeams, gameFiles); lbGameFiles.DisplayMemberPath = "fileName"; NotifiyPropertyChanged("BlitzTeams"); }