The Modding of Isaac - Console Edition
In theory, all of my findings, research and tools here should work on ALL consoles. Specifically because these findings are based off of my initial research back in 2018 (The Binding of Isaac Mod Conversion Kit) when I had basic mods working on the Vita and 3DS. The games have not really changed much since then, besides getting more content.
On the PS5 build, the packed animation file is:
Some records are only reference-sheet records. Some records are linked to a following real actor block. Some records use a grouped animation container layout instead of the plain layout.
The simplest reliable starting point is:
That gives you
After the main asset path, three compact tables can usually be recovered.
Gives you: layer id, sheet id, layer name.
This table is only the event-name lookup. The actual event firing data appears later inside some animation chunks.
For many actors, the animation tail contains normal packed animation blocks.
Meaning of
The 63-byte header after
Proven from the shipped data:
Each grouped child starts with:
After that, the grouped child uses:
PPSA03311-app0/resources/animations.bWhat The File Contains
animations.b is a long sequence of actor groups placed back-to-back. Each actor group usually contains:- A main asset path like
Bosses/Classic/Boss_004_Monstro.png - A layer table
- A null table
- An event-name table
- One or more packed animation blocks
Some records are only reference-sheet records. Some records are linked to a following real actor block. Some records use a grouped animation container layout instead of the plain layout.
The simplest reliable starting point is:
Code:
1. Scan the file for path-like strings ending in .png or .pcx
2. Treat each path hit as the start of an actor group
3. Treat the next path hit as the end of that group
That gives you
assetOffset and groupEndOffset. From there you can parse one actor group at a time.The Three Structured Tables
After the main asset path, three compact tables can usually be recovered.
1. Layer Table
Code:
u32 count
-- repeated per entry --
u32 layer_id
u32 sheet_id
u16 name_len
char name[name_len]
2. Null Table
Code:
u32 count
-- repeated per entry --
u32 null_id
u16 name_len
char name[name_len]
3. Event Table
Same compact layout as the Null Table:
Code:
u32 count
-- repeated per entry --
u32 event_id
u16 name_len
char name[name_len]
Normal Animation Block Layout
For many actors, the animation tail contains normal packed animation blocks.
Code:
u16 name_len
char animation_name[name_len]
u32 frame_num
u32 flags
[63 bytes] root default frame block
u32 layer_count
... repeated layer animation entries
u32 null_count
... repeated null animation entries
Meaning of flags
256= one-shot animation257= looping animation
63-Byte Root Default Frame Block
The 63-byte header after
frame_num and flags is not junk — it is real root/default animation data.
Code:
u32 frameNumEcho
u32 flagsRaw
u8 reservedFlag0
f32 xPosition
f32 yPosition
f32 xScale
f32 yScale
u32 durationEcho
u8 rootVisible
f32 redTint
f32 greenTint
f32 blueTint
f32 alphaTint
f32 redOffset
f32 greenOffset
f32 blueOffset
f32 rotation
u8 rootInterpolated
Proven from the shipped data:
frameNumEchomatches the animation frame countdurationEchoalso matches the frame countreservedFlag0was observed as0across the scanned corpusrootInterpolatedcan be set
Layer And Null Frame Layouts
Layer Frame
Code:
f32 xCrop
f32 yCrop
f32 width
f32 height
f32 xPosition
f32 yPosition
f32 xScale
f32 yScale
f32 xPivot
f32 yPivot
u32 delay
u8 visible
f32 redTint
f32 greenTint
f32 blueTint
f32 alphaTint
f32 redOffset
f32 greenOffset
f32 blueOffset
f32 rotation
u8 interpolated
Null Frame
Code:
f32 xPosition
f32 yPosition
f32 xScale
f32 yScale
u32 delay
u8 visible
f32 redTint
f32 greenTint
f32 blueTint
f32 alphaTint
f32 redOffset
f32 greenOffset
f32 blueOffset
f32 rotation
u8 interpolated
Grouped Child Layout
Each grouped child starts with:
Code:
u16 name_len
char child_animation_name[name_len]
u32 frame_num
u32 flags
[63 bytes] root default frame block
After that, the grouped child uses:
- A run of 54-byte root keyframes
- Normal counted layer animation sections
- Optional counted null animation sections
- Optional compact event tables
- Sometimes a small footer on the final child
A compiled release is available (tested in terminal):
Download v3.0 from GitHub Releases
Download v3.0 from GitHub Releases
Last edited by TheStonedModder,







