The objects were a fun bunch to figure out
The level is divided into 32x32 subtiles blocks (where a tile is 32x32 pixels, and a subtile is an 8x8 pixel part of a tile). For each of these blocks it stores a list of items that are positioned inside that block, plus their location inside that block. This way the game only has to check a handful of objects to see if they enter the playing field and "activate" them. A nice little optimization trick.
The collision data is stored for each subtile in each tile in the tileset (not the level map itself). I've only seen solid, secret, destructible and damaging types so far.