LoadChapterBallistae (really LoadChapterTraps) gets the pointer for trap data from your chapter events and loads it
GetCurrentChapterBallistae2 (should be GetHardModeTrapPointer) gets “Trap2” data if hard mode. If not, it returns 0.
LoadTrapData immediately exits if given a pointer of 0
In summary, these should really be called:
Trap (All difficulties)
Trap (Hard mode)
I tested this and it seems to be correct. Surprised I haven’t heard mention that Trap2 is hard mode traps. I’m sure someone knew but it simply wasn’t documented yet… or nobody uses traps lol.