// all credit for this file goes to the guys who write the wiki article about ADT files @ wowdev.org #ifndef ADTFILESTRUCTS_H #define ADTFILESTRUCTS_H #define OFFSET_TEXTURES 7 #define OFFSET_MODELS 8 #define OFFSET_WMOS 10 struct MHDR_chunk { uint32 pad; uint32 offsInfo; uint32 offsTex; uint32 offsModels; uint32 offsModelsIds; uint32 offsMapObjects; uint32 offsMapObjectsIds; uint32 offsDoodsDef; uint32 offsObjectsDef; uint32 pad1; uint32 pad2; uint32 pad3; uint32 pad4; uint32 pad5; uint32 pad6; uint32 pad7; }; struct MCIN_chunk { uint32 offset; uint32 size; uint32 flags; uint32 async; }; // MTEX: texture filename list. strings only! // MMDX: M2 models filename list. strings only! // MMID: string start offset list of the MMDX block // MWMO: filename list for WMOs // MWID: string start offset list of the MWMO block struct MDDF_chunk { uint32 id; // position in the MMDX list uint32 uniqueid; // unique instance id (?) float x; float y; float z; float oy; float oz; float ox; uint16 flags; uint16 scale; }; struct MODF_chunk { uint32 id; uint32 uniqueid; float x; float y; float z; float oy; float oz; float ox; // unk floats (orientation?) float ou11; float ou12; float ou13; float ou21; float ou22; float ou23; uint32 flags; uint16 doodadSet; uint16 nameSet; }; enum ADTMapChunkHeaderFlags { FLAG_SHADOW, FLAG_IMPASS, FLAG_LQ_RIVER, FLAG_LQ_OCEAN, FLAG_LQ_MAGMA, }; struct ADTMapChunkHeader { uint32 flags; uint32 IndexX; uint32 IndexY; uint32 nLayers; uint32 nDoodadRefs; uint32 offsHeight; uint32 offsNormal; uint32 offsLayer; uint32 offsRefs; uint32 offsAlpha; uint32 sizeAlpha; uint32 offsShadow; uint32 sizeShadow; uint32 areaid; uint32 nMapObjRefs; uint32 holes; uint16 unk1; uint16 unk2; uint32 unk3; uint32 unk4; uint32 unk5; uint32 predTex; uint32 noEffectDoodad; uint32 offsSndEmitters; uint32 nSndEmitters; uint32 offsLiquid; uint32 sizeLiquid; // includes the 8 initinal bytes ("MCLQ" and size) float xbase; float ybase; float zbase; uint32 textureId; uint32 props; uint32 effectId; }; // MCNK sub-chunk // 9x9+8x8 vertices. 145 floats, format: 9 outer, 8 inner, 9 outer, 8 inner, ... , 9 outer. // MCNR chunk: Normal vectors for each vertex, encoded as 3 signed bytes per normal, in the same order as specified above. struct MCLY_chunk { uint32 textureId; // offset in MTEX list uint32 flags; // 0x100 means using alpha map uint32 offAlpha; uint32 effectId; //detail texture id (?) }; // MCRF chunk: // A list of indices into the parent file's MDDF chunk, // saying which MCNK subchunk those particular MDDF doodads are drawn within. // This MCRF list contains duplicates for map doodads that overlap areas. // But I guess that's what the MDDF's UniqueID field is for. // MCSH chunk: 8x8 bytes (64x64 bits) shadow map struct MCSE_chunk { uint32 soundPointID; uint32 soundNameID; float x; float y; float z; float minDistance; float maxDistance; float cutoffDistance; uint16 startTime; uint16 endTime; uint16 groupSilenceMin; uint16 groupSilenceMax; uint16 playInstancesMin; uint16 playInstancesMax; uint16 loopCountMin; uint16 loopCountMax; uint16 interSoundGapMin; uint16 interSoundGapMax; }; struct LiquidVertex { uint16 unk1; uint16 unk2; float h; }; struct NormalVector { uint8 x; uint8 y; uint8 z; }; // also known as MCNK block // 256 per adt file struct ADTMapChunk { ADTMapChunkHeader hdr; float vertices[145]; NormalVector normalvecs[145]; MCLY_chunk layer[4]; // can be less uint32 nTextures; uint8 shadowmap[512]; // 1 bit 64x64 uint8 alphamap[4][2048]; // 4 bits, 64x64. max 4, 1 per layer bool haswater; float waterlevel; LiquidVertex lqvertex[81]; uint8 lqflags[64]; }; #endif