December 30, 20241 yr Outlands is a private Ultima Online server, going strong since 2018. They have this custom format for their client which I could not figure out on my own and I'm here to ask for help. These are the QuickBMS scripts I'm currently working with: ComType deflate_noerror Get TEMPNAME basename Math OFFSET = 8 For A = 0 Goto OFFSET Get MISC1 Long Get MISC2 Long If MISC2 = 0 Break Endif Goto 0x0c 0 SEEK_CUR Get ZSIZE Long SavePos OFFSET String FILENAME P "%TEMPNAME%_%A%" CLog FILENAME OFFSET ZSIZE 0x10000000 Math OFFSET + ZSIZE Next A and ComType deflate_noerror Get TEMPNAME basename Debug 0 Math OFFSET = 4 For A = 0 Goto OFFSET //4 bytes Get ENTRY_ID Long Get OFFSET Long Get MAXANIMS Long Goto 0x10 0 SEEK_CUR Get MAXFRAMES Long Get ZSIZE Long SavePos OFFSET String FILENAME P "%TEMPNAME%_%A%" CLog FILENAME OFFSET ZSIZE 0x10000000 MATH OFFSET + ZSIZE Next A First one used to work with gumps.uoo but never worked with anim.uoo, so the second one was my attempt to figure it out (and failing miserably 😄) Can anyone more experienced help me figure this one out? Thanks everyone very much. Here are the samples, I included all .uoo files + a 20mb cut from anim.uoo (a big 1gb file). Also included a few stock Ultima Online files, they are usually MULs or UOPs and the UO file format docs. (since it is the same game, they cant go very far) Google Drive - Sample Files UO File Format Docs
February 8, 20251 yr On 12/29/2024 at 5:57 PM, quickstep said: Outlands is a private Ultima Online server, going strong since 2018. They have this custom format for their client which I could not figure out on my own and I'm here to ask for help. These are the QuickBMS scripts I'm currently working with: ComType deflate_noerror Get TEMPNAME basename Math OFFSET = 8 For A = 0 Goto OFFSET Get MISC1 Long Get MISC2 Long If MISC2 = 0 Break Endif Goto 0x0c 0 SEEK_CUR Get ZSIZE Long SavePos OFFSET String FILENAME P "%TEMPNAME%_%A%" CLog FILENAME OFFSET ZSIZE 0x10000000 Math OFFSET + ZSIZE Next A and ComType deflate_noerror Get TEMPNAME basename Debug 0 Math OFFSET = 4 For A = 0 Goto OFFSET //4 bytes Get ENTRY_ID Long Get OFFSET Long Get MAXANIMS Long Goto 0x10 0 SEEK_CUR Get MAXFRAMES Long Get ZSIZE Long SavePos OFFSET String FILENAME P "%TEMPNAME%_%A%" CLog FILENAME OFFSET ZSIZE 0x10000000 MATH OFFSET + ZSIZE Next A First one used to work with gumps.uoo but never worked with anim.uoo, so the second one was my attempt to figure it out (and failing miserably 😄) Can anyone more experienced help me figure this one out? Thanks everyone very much. Here are the samples, I included all .uoo files + a 20mb cut from anim.uoo (a big 1gb file). Also included a few stock Ultima Online files, they are usually MULs or UOPs and the UO file format docs. (since it is the same game, they cant go very far) Google Drive - Sample Files UO File Format Docs Did this too one work for the art.uoo too?
June 8Jun 8 Localization For all the files you sent, there are only 2 formats that I could see. They all contain either images, or animations (image sequences). +-------------------------------+ | Ultima Online: Outlands *.uoo | +-------------------------------+ // texmaps.uoo , art.uoo , gumps.uoo , landtiles.uoo Files // Uses Deflate Compression // HEADER 4 - Unknown (109,171,127,30) 4 - Unknown (1) // DETAILS AND FILE DATA // for each file 4 - File ID? 4 - File Length (not including these 2 fields, but including all the fields after this one) 2 - Image Width 2 - Image Height 2 - Unknown (often null) 2 - Unknown (often null) 2 - Unknown (sometimes Image Width) 2 - Unknown (sometimes Image Height) 4 - File Length (File Data only) X - File Data (Deflate Compression) when decompressed { width*height*2 - Image Data (RGB555) } // FOOTER 16 - null +-------------------------------+ | Ultima Online: Outlands *.uoo | +-------------------------------+ // anim.uoo File // Uses Deflate Compression // HEADER 4 - Unknown (109,171,127,30) 4 - Unknown (1) // DETAILS AND FILE DATA // for each folder 4 - Folder ID? 4 - File Length (not including these 2 fields, but including all the fields after this one) 4 - Number of Groups in this Folder? 4 - null // for each group 4 - Group ID? 4 - Number of Files in this Group // for each file in this group 4 - File ID? 4 - Number of Frames in the Animation 4 - File Length X - File Data (Deflate Compression) when decompressed { // for each frame 2 - X Offset 2 - Y Offset 2 - Frame Width 2 - Frame Height 4 - Number of Pixels (Frame Length = numPixels*2) width*height*2 - Image Data (RGB555) } For the Animations, the "Folder" looks to be the object/creature number, the "Group" seems to be the direction, and the "File" seems to be the animation number. I wasn't able to quite figure out how to apply the Y Offset to each frame - as in, depending on the individual animation, what looked perfect for 1 animation looked very "jumpy" for another animation. Edited June 8Jun 8 by wattostudios
Create an account or sign in to comment