====== Object Data ======
The object lookup table is at 0x000A1C90 in ROM as an array of 1582 ObjectEntry structs.
===== ObjectEntry struct =====
struct ObjectEntry
{
/*00*/ u16 objectId; // unique identifier
/*02*/ u16 unk02; // probably padding
/*04*/ u32 boObjectDefA; // bank-offset of ObjectDefA struct
/*08*/ u32 boObjectDefB; // bank-offset of ObjectDefB struct
};
[[yoshis_story:object_ids]]
===== ObjectDefA_00 struct =====
This structure defines the properties of an object.
struct ObjectDefA_00
{
/*00*/ u16 type; // structure type (0x0001)
u8 _pad02[2];
/*04*/ CodeInfo codeInfo;
/*18*/ u16 objectId; // unique identifier
/*1A*/ u16 unk1A;
/*1C*/ u32 tileDimensionsSize; // sizeof(TileDimensions)
/*20*/ u32 boTileDimensions; // bank-offset of TileDimensions struct
/*24*/ u32 tileDataInfoSize; // sizeof(BlockInfo)
/*28*/ u32 boTileDataInfo; // bank-offset of BlockInfo struct for the tiles' 8bit color-index data
/*2C*/ u32 tilePaletteInfoSize; // sizeof(BlockInfo)
/*30*/ u32 boTilePaletteInfo; /* bank-offset of BlockInfo struct for the tiles' palette data
palette data is a 0x200 byte array of rgba5551 (u16) colors */
/*34*/ u32 tileMapInfoSize; // sizeof(BlockInfo)
/*38*/ u32 boTileMapInfo; /* bank-offset of BlockInfo struct for the tile map
the tile map is a u16 array tile indeces */
/*3C*/ u32 unkData1InfoSize; // sizeof(BlockInfo)
/*40*/ u32 boUnkData1; // bank-offset of BlockInfo struct for ??
/*44*/ u32 unkData2InfoSize; // sizeof(BlockInfo)
/*48*/ u32 boUnkData2; // bank-offset of BlockInfo struct for ??
/*4C*/ u32 collisionMapInfoSize; // sizeof(BlockInfo)
/*50*/ u32 boCollisionMapInfo; /* bank-offset of BlockInfo struct for collision data
the collision map is a u16 array, parallel to the tile map array */
/*54*/ u8 unk54[16]; // unknown data
};
===== ObjectDefA_01 struct =====
This structure defines the properties of the Yoshi player object.
struct ObjectDefA_01 // only used for yoshi
{
/*0x00*/ u16 type; // structure type (0x0001)
/*0x04*/ u8 unk04;
/*0x08*/ u32 unk08;
/*0x18*/ u16 unk18;
/*0x1C*/ u8 unk1C;
/*0x1D*/ u8 unk1D;
/*0x20*/ u32 boUnk20;
/*0x24*/ u32 boUnk24;
/*0x28*/ u32 boUnk28;
/*0x2C*/ u32 unk2C;
/*0x30*/ u32 boUnk30;
/*0x34*/ u32 unk34;
/*0x38*/ u32 unk38;
/*0x3C*/ u32 unk3C;
/*0x40*/ u32 boUnk40;
};
===== ObjectDefA_02 struct =====
struct ObjectDefA_02
{
/*00*/ u16 type; // structure type (0x0002)
u8 _pad02[2];
CodeInfo codeInfo;
};
===== ObjectDefB struct =====
struct ObjectDefB
{
// todo
};
===== TileDimensions struct =====
struct TileDimensions
{
/*0x00*/ u16 unk00; // ?? related to width
/*0x02*/ u16 unk02; // ?? related to height
/*0x04*/ u16 tileWidth; // width of an individual tile
/*0x06*/ u16 tileHeight; // height of an individual tile
/*0x08*/ u16 mapWidth; // width of the whole map (num tiles X * tileWidth)
/*0x0A*/ u16 mapHeight // height of the whole map (num tiles Y * tileHeight)
};
===== BlockInfo struct =====
This structure references a block of data in ROM. The block of data may either be raw or SMSR00 compressed depending on the srcSize and dstSize fields.
struct BlockInfo
{
/*0x00*/ u32 dstSize; // decoded block size
/*0x04*/ u32 srcSize; // encoded block size
/*0x08*/ u32 boData; /* bank-offset of the data (may be a CMPR or raw)
if the data is raw, both size and sizeEnc will be the same value */
};
===== CodeInfo struct =====
This struct references code that an object should use. It can either reference an overlay file or a single function already in memory.
struct CodeInfo
{
u8 useOverlay; // 1 = use overlay, 0 = use nativeFunc
u8 _pad[3]; // padding
union {
void *nativeFunc; // pointer to native function
struct
{
u32 romStart; // overlay rom start address
u32 romEnd; // overlay rom end address
void *fakeMemStart; // fake ram start address
void *fakeMemEnd; // fake ram end address
} overlay;
};
};