Skip to content

Instantly share code, notes, and snippets.

@ogarvey
Created March 12, 2024 15:25
Show Gist options
  • Save ogarvey/4b13bd31efe85c045298a559707fac4f to your computer and use it in GitHub Desktop.
Save ogarvey/4b13bd31efe85c045298a559707fac4f to your computer and use it in GitHub Desktop.
Small c# script to extract all sprites from Mutant Rampage - BodySlam (CD-i) -- Requires OGCDiLib
var mainDataFile = @"C:\Dev\Projects\Gaming\CD-i\Disc Images\Extracted\BODYSLAM\data.rtr";
var mainCdiFile = new CdiFile(mainDataFile);
var dataSectors = mainCdiFile.Sectors.Where(x => x.SubMode.IsData).OrderBy(x => x.Channel)
.ThenBy(x => x.SectorIndex).Select(x => x.GetSectorData()).ToList();
var mainData = dataSectors.SelectMany(x => x).ToArray();
File.WriteAllBytes(@"C:\Dev\Projects\Gaming\CD-i\Disc Images\Extracted\BODYSLAM\Output\mainData.bin", mainData);
var offsets = FileHelpers.FindSequenceOffsets(mainData, [0x43, 0x50, 0x4c, 0x32]);
var paletteData = File.ReadAllBytes(@"C:\Dev\Projects\Gaming\CD-i\Disc Images\Extracted\BODYSLAM\Output\Palettes\data.rtr_1_0_1302.bin");
var palette = ReadClutBankPalettes(paletteData, 2);
var files = Directory.GetFiles(@"C:\Dev\Projects\Gaming\CD-i\Disc Images\Extracted\BODYSLAM\Output\Clut4 Data\sprites", "*.bin");
foreach (var (offset, oIndex) in offsets.WithIndex()) {
var chunkLength = BitConverter.ToUInt32(mainData.Skip((int)offset + 4).Take(4).Reverse().ToArray(), 0);
chunkLength += BitConverter.ToUInt32(mainData.Skip((int)offset + 8).Take(4).Reverse().ToArray(), 0);
var data = mainData.Skip((int)offset).Take((int)chunkLength).ToArray();
var dataLength = BitConverter.ToInt32(data.Skip(0x4).Take(4).Reverse().ToArray(), 0);
var dataStart = BitConverter.ToInt32(data.Skip(0x8).Take(4).Reverse().ToArray(), 0);
var offsetsStart = 0x10;
var spriteOffsets = new List<int>() { 0 };
for (int i = 0; i < 0x164; i += 4)
{
var spriteOffset = BitConverter.ToInt32(data.Skip(offsetsStart + i).Take(4).Reverse().ToArray(), 0);
spriteOffsets.Add(spriteOffset);
}
var spriteChunks = new List<byte[]>();
data = data.Skip(dataStart).ToArray();
foreach (var (sOffset, index) in spriteOffsets.WithIndex())
{
var bytesToTake = index == spriteOffsets.Count - 1 ? dataLength - sOffset : spriteOffsets[index + 1] - sOffset;
var chunk = data.Skip(sOffset).Take(bytesToTake).ToArray();
if (chunk.Length == 0 || chunk.Length < 8) continue;
var output = CompiledSpriteHelper.DecodeCompiledSprite(chunk).Skip(chunk.Length + 0x20).ToArray();
var image = GenerateClutImage(palette, output, 464, 240, true);
var outputName = Path.Combine(@"C:\Dev\Projects\Gaming\CD-i\Disc Images\Extracted\BODYSLAM\Output\Clut4 Data\sprites\output\Clut7", $"{oIndex}_sprite_{index}.png");
image.Save(outputName, ImageFormat.Png);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment