I needed to take a step back, or rather, a step forward.
The goal in this is to be able to view the PSA data that is inside these files. I know its there, but I dont know how to parse the file. So, lets take a step forward and work backwards! Starting on Sandbag.
Now, Sandbag has many animations. In PSA, every subaction is linked to an animation. Heres how the flags of each subaction are stored.
Size 0x8
0x0 - Flags
0x4 - Offset to animation name string.
For educational purposes, I shorted the flags part, but heres the idea. We locate a animation string inside the file, then try to find this offset by searching for the offset of the string. So, heres what I did.

- Found the string “CaptureCut” at offset 0×1574 in Sandbags file.
- Searched for 0×1574 inside the file
- —-WTF, no results!
Now, if you’re following this, it may seem like I ran into a wall. However, these 3 steps won’t work on a raw PSA file either. The offsets in files are often relative to the end of the header. Theres two ways to solve this.
- Add 0×20 everytime you want to jump to an offset
- Delete the header from the file and use the offsets directly.
So, after doing this, the string is now at 0×1554. Lets do the steps again!
- Found the string “CaptureCut” at offset 0×1554 in Sandbags file.
- Searched for 0×1554 inside the file
- One result found.
Now, let me say a few things about this result that makes it interesting. First off, I decided to use the SECOND string for a reason. If the results are correct, the result should be the second subaction, meaning that there should be another subaction entry on either side of it. Heres a color coded picture showing what I mean.
In this picture, you can see that the 0×1554 is the second entry in a pattern that goes…
4bytes of something, then a string offset, repeat. Sound familiar? These are the raw subaction flags.
Now, we know where the beginning of the subaction flags are. In a PSA file, we would programmically find this position by jumping from…an offset somewhere else. Now that we know the place, we just gotta find what references the beginning of the flags. Lets search again!
- Found the beginning of the Subaction Flags at at offset 0×1790 in Sandbags file.
- Searched for 0×1790 inside the file(0×20 bytes of the header is gone from earlier still)
- One result found.
0×1BF8 is where this result is. At this point I had to stop and think. Where am I in relation to the header now?
Interestingly enough, 0×1BF8 is just 0×58 bytes from Header[1](0×1c50)
So, I did this whole process on another file…and ended up with the EXACT same result, ending up 0×58 bytes before Header[1] when manually finding the offset to the Subaction Flags.
Lets compare those 0×58 bytes in groups of 0×2C
First 0x2C:
SubFlags
00000C8C 00000008 00000CCC 00000008 00000000 00000E0C 00000E04 00000D4C 00000D6C 00000D8C 00000DB4 ItmSmartBomb
00001790 00000026 000018C0 0000000C 00000000 00001BB8 00001BB0 00001980 00001A18 00001AB0 00001B50 ItmSandbag
Second 0x2C:
00000DF4 00000000 00000000 00000000 00000000 00000001 00000000 00000E2C 00000000 00000E30 00000001 ItmSmartBomb
00001BA0 00001BD8 00000000 00001BE4 00000000 00000000 00000000 00001BEC 00000000 00001BF0 00000001 ItmSandbag
So yeah. Pretty good for just under two hours of work(Most of which was spent typing)