Table shape
string, number, array, table. Compound values are packed strings, almost universally id;count pairs joined by |. Very large tables (world monster spawns, army data) are physically split across sibling files, resolved via the link range table.
Container & versioning
A plain ZIP, one flat-namespace entry per table name, the odd.data extension is misleading; unzip -l works on it directly. Local version manifest, one line: version,size,md5,timestamp, matching the filename table_{version}_{md5}.data. Table updates are tracked and patched (bsdiff) fully independently of the Lua bundle and asset bundles.
Categorized index (1,279 tables)
These rows sum to 1,230, not the full 1,279; they’re the dominant categories, not an exhaustive partition. The remaining ~49 tables (hero/troop/army data, resource/economy, rank/leaderboard, guide/novice-flow, item/artifact, and a few UI/language tables) weren’t individually bucketed.