private void InsertReplacementFile(byte[] replacementFile) { File.WriteAllBytes("temp.wms", replacementFile); byte[] compressedFileBytes = MiniLZO.MiniLZO.Compress(replacementFile); int compressedSize = compressedFileBytes.Length; if ((compressedSize & 1) != 0) { List <byte> tempList = compressedFileBytes.ToList(); tempList.Add(0x00); compressedFileBytes = tempList.ToArray(); } int differenceInSize; BlitzGameFile selectedGame = (BlitzGameFile)lbGameFiles.SelectedItem; int indexOfFileInSortedList = filesSortedByOffset.FindIndex(x => x.fileOffset == selectedGame.fileOffset); long currentTableOffset; int fileTableEntrySize = gameInfo.maxFileNameLenght + gameInfo.filePositionLength + gameInfo.decompressedLenght + gameInfo.compressedLenght; int fileCount; using (var fs = new FileStream(romLocation, FileMode.Open, FileAccess.ReadWrite)) { //Update tableOffsetLocation currentTableOffset = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 8, 4).ToArray());// +gameInfo.FileSystemOffset; differenceInSize = (int)(compressedFileBytes.Length - selectedGame.compressedSize); //helps prevent writing to off addresses TODO: rewrite this logic if ((differenceInSize & 1) != 0) { differenceInSize++; } long newTableOffset = currentTableOffset + differenceInSize; byte[] newTableOffsetBytes = BitConverter.GetBytes((Int32)newTableOffset); Array.Reverse(newTableOffsetBytes); BitsHelper.WritBytesToFileStream(newTableOffsetBytes, fs, gameInfo.FileSystemOffset + 8); fileCount = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 12, 4).ToArray()); } //move the files that are after this entry byte[] fullRom = File.ReadAllBytes(romLocation); byte[] fileTable = fullRom.ToList().GetRange((int)(currentTableOffset + gameInfo.FileSystemOffset), fileTableEntrySize * fileCount).ToArray(); int filesAfterStart = (int)filesSortedByOffset[indexOfFileInSortedList + 1].fileOffset; byte[] filesAfterNewFile = fullRom.ToList().GetRange(filesAfterStart, (int)(currentTableOffset + gameInfo.FileSystemOffset) - filesAfterStart - 1).ToArray(); RomEditor.ByteArrayToFile(romLocation, filesAfterNewFile, filesAfterStart + differenceInSize); //Write new file RomEditor.ByteArrayToFile(romLocation, compressedFileBytes, (int)selectedGame.fileOffset); filesSortedByOffset[indexOfFileInSortedList].compressedSize = compressedSize; filesSortedByOffset[indexOfFileInSortedList].decompressedSize = replacementFile.Length; // fix/write to file table RomEditor.ByteArrayToFile(romLocation, fileTable, (int)(currentTableOffset + gameInfo.FileSystemOffset) + differenceInSize); AdjustFileTable(indexOfFileInSortedList + 1, differenceInSize); WritewFileTableToRom(differenceInSize); LoadRom(romLocation); }
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"); }
private void btnReloadTeamFiles_Click(object sender, RoutedEventArgs e) { if (gameFiles != null) { int teamCount; if (int.TryParse(tbTeamCount.Text, out teamCount)) { gameInfo.GameTeamCount = teamCount; } Teams tempTeams = RomEditor.ReadRom(romLocation, gameInfo); RomEditor.ReadTeamFiles(romLocation, gameInfo, ref tempTeams, gameFiles); BlitzTeams = tempTeams; } }
private void btnSetTeamFileFromSelectedAllFile_Click(object sender, RoutedEventArgs e) { if (lbGameFiles.SelectedIndex > -1) { if (teamView.SelectedItem != null && teamView.SelectedItem.GetType() == typeof(BlitzGameFile)) { byte[] ba = BitConverter.GetBytes((Int16)(lbGameFiles.SelectedIndex + 1)).Reverse().ToArray(); RomEditor.ByteArrayToFile(romLocation, ba, (int)((BlitzGameFile)teamView.SelectedItem).teamReferenceOffset); } } else { MessageBox.Show("No File Selected"); } }
private void btnInsertNewFile_Click(object sender, RoutedEventArgs e) { OpenFileDialog openDialog = new OpenFileDialog(); Nullable <bool> result = openDialog.ShowDialog(); if (result == true) { byte[] replacementFile; if (openDialog.FileName.ToLower().Contains(".png") || openDialog.FileName.ToLower().Contains(".bmp")) { ImageCoder imageCoder = new ImageCoder(); imageCoder.Convert(new Bitmap(openDialog.FileName)); List <byte> convertedImage = new List <byte>(); convertedImage.AddRange(Blitz2000Header.CreateNFLBlitz2000Header(imageCoder.Width, imageCoder.Height, imageCoder.HasAlpha, (byte)imageCoder.n64ImageType)); convertedImage.AddRange(imageCoder.Data); if (imageCoder.Palette != null) { convertedImage.AddRange(imageCoder.Palette); } replacementFile = convertedImage.ToArray(); openDialog.FileName = openDialog.FileName.Split('.')[0] + ".wms"; File.WriteAllBytes(openDialog.FileName, convertedImage.ToArray()); } replacementFile = File.ReadAllBytes(openDialog.FileName); //byte[] compressedFileBytes = MiniLZO.MiniLZO.Compress(replacementFile); byte[] compressedFileBytes = MiniLZO.MiniLZO.CompressWithPrecomp2(openDialog.FileName); int compressedSize = compressedFileBytes.Length; if ((compressedSize & 1) != 0) { List <byte> tempList = compressedFileBytes.ToList(); tempList.Add(00); compressedFileBytes = tempList.ToArray(); } long currentTableOffset; int fileTableEntrySize = gameInfo.maxFileNameLenght + gameInfo.filePositionLength + gameInfo.decompressedLenght + gameInfo.compressedLenght; int fileCount; using (var fs = new FileStream(romLocation, FileMode.Open, FileAccess.ReadWrite)) { //Update tableOffsetLocation currentTableOffset = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 8, 4).ToArray()); long newTableOffset = currentTableOffset + compressedFileBytes.Length; byte[] newTableOffsetBytes = BitConverter.GetBytes((Int32)newTableOffset); Array.Reverse(newTableOffsetBytes); BitsHelper.WritBytesToFileStream(newTableOffsetBytes, fs, gameInfo.FileSystemOffset + 8); fileCount = BitsHelper.GetNumberFromBytes(BitsHelper.ReadBytesFromFileStream(fs, gameInfo.FileSystemOffset + 12, 4).ToArray()); byte[] newfileCountBytes = BitConverter.GetBytes((Int32)(fileCount + 1)); Array.Reverse(newfileCountBytes); BitsHelper.WritBytesToFileStream(newfileCountBytes, fs, gameInfo.FileSystemOffset + 12); } //move the files that are after this entry byte[] fullRom = File.ReadAllBytes(romLocation); byte[] fileTable = fullRom.ToList().GetRange((int)(currentTableOffset + gameInfo.FileSystemOffset), fileTableEntrySize * fileCount).ToArray(); //Write new file BlitzGameFile newGameFile = new BlitzGameFile() { fileName = "~" + openDialog.FileName.Split('\\').Last(), compressedSize = compressedSize, decompressedSize = replacementFile.Length, fileOffset = currentTableOffset, fileTableEntryStart = currentTableOffset + gameInfo.FileSystemOffset + compressedFileBytes.Length + (fileTableEntrySize * (fileCount)) }; RomEditor.ByteArrayToFile(romLocation, compressedFileBytes, (int)newGameFile.fileOffset); // fix/write to file table RomEditor.ByteArrayToFile(romLocation, fileTable, (int)(currentTableOffset + gameInfo.FileSystemOffset) + compressedFileBytes.Length); WriteNewFileTableToRom(newGameFile); LoadRom(romLocation); } }