graphics are found in 2d/Animations/ objects will have at least 2 .XNB files, one suffixed with "Texture" .XNB textures can be ripped using the "XNB" quickBMS script, the XNB Mod Toolkit, xnbcli... there's options! https://steamcommunity.com/sharedfiles/filedetails/?id=1709011717 https://github.com/LeonBlade/xnbcli the sprite sheets are disorganised though, similar to GameMaker's sprite sheets or OBMs from Metal Slug Attack, so you'll want to open the other (non-texture) .XNB file in a hex editor to help put the animation frames in order the other .XNB file stores the data for the sprite sheets, how the game reads them and their animations (extracting these files with XNB Mod Toolkit will remove all useful data from them, so you'll want to open them untouched) animation data starts at hex address 4ED animation header is 17 bytes (usually?) and has the animation name (Die, Walkup, Walkside, etc) End of name string is marked by 00, then the next byte denotes how many animation frames it has then 33 bytes (21hex) are dedicated to each animation frame start of an animation frame is marked by an "Á", "Á" or equivalent symbol (hex C0 or C1) (HxD's "View > Data inspector" makes this easier) set bytes per row to 33, delete anim header the "05" column will be the left side of sprite canvas, use that to find it in raw rip column 00 is start of frame data, hurf column 05 is x-position, left of frame column 09 is y-position, top of frame column 0D is frame width column 11 is frame height (if the texture sheet is wider than 255 pixels, then you'll need to grab a 2-byte value for x and y-position) (in my crusty method this entails copying 06 first before 05, same with 0A before 09) TRYING TO STREAMLINE THIS!! organising the sheets by hand takes over 5 minutes and is boring as piss ideally you'd be able to cook up a script in Python or something that could parse those animation headings and export everything automatically ... but i'm technically incompetent, so my method was like so: stripping the data from an XNB (so animation frame headings fit neatly in the 33-byte columns) and using MacroRecorder to grab the data and paste it into a text doc with commas (column 06+05, 0A+09, 0D, 11) and then running that data through Excel to convert it to decimal, and add the width/height data to the X and Y coordinates and THEN running the sheet and coordinates through a Python script to crop them all into individual images ... is less hassle by comparison, but it could be more efficient! (i used Bing AI to cook up the python script, i'm sorry) from PIL import Image def crop_images(image_path, coords_file): # Open the image file img = Image.open(image_path) # Open the coordinates file with open(coords_file, 'r') as f: lines = f.readlines() for i, line in enumerate(lines): # Parse the coordinates x1, y1, x2, y2 = map(int, line.strip().split(',')) # Crop the image cropped_img = img.crop((x1, y1, x2, y2)) # Save the cropped image cropped_img.save(f'cropped_{i}.png') # Call the function with the path to your image and coordinates file crop_images('[TEXTURE FILENAME].png', 'coords.txt')