The modding of Isaac - Console Edition

TheStonedModder

Well-Known Member
Member
Joined
Dec 25, 2022
Messages
2,613
Reaction score
3,704
Trophies
2
Age
29
XP
8,023
Country
United States

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.


YExYWMc.gif





On the PS5 build, the packed animation file is: PPSA03311-app0/resources/animations.b

What 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]
Gives you: layer id, sheet id, layer name.

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]
This table is only the event-name lookup. The actual event firing data appears later inside some animation chunks.




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 animation
  • 257 = looping animation
The low bit behaves like the loop flag.




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:
  • frameNumEcho matches the animation frame count
  • durationEcho also matches the frame count
  • reservedFlag0 was observed as 0 across the scanned corpus
  • rootInterpolated can 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
 
Last edited by TheStonedModder,
  • Like
Reactions: pleasekillmeomg
Happy to see this, I will definitely be experimenting on my Switch. Great work.
Post automatically merged:

Looks exciting! Great work. I’ll definitely be experimenting on my switch.
 
  • Like
Reactions: TheStonedModder
Is antibirth & other gameplay mods able to be installed with this?
Antibirth is a decomp that will never be playable anywhere else

This supports all mods afterbirth or prior. Anything newer has to be remade since the console ports do not support the Lua modding api (at least not that I could see) so we are stuck with the original pc mod style that is direct file replacement
 
  • Like
Reactions: pleasekillmeomg
Sorry, I'm really confused about how to use this software. Whenever I try to open the folder extracted by NSGame Manager, it keeps saying 'Cache Build Failed.‘
Should I be opening the .mod file directly instead? But the problem is, there's no animations.b file inside the .mod file.
 
Sorry, I'm really confused about how to use this software. Whenever I try to open the folder extracted by NSGame Manager, it keeps saying 'Cache Build Failed.‘
Should I be opening the .mod file directly instead? But the problem is, there's no animations.b file inside the .mod file.
You have to select your resources folder that is from the game extraction
Next update will be more clear and also include performance improvements
 

Site & Scene News

Popular threads in this forum