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.
The 1.0.364 C# reads the current table version from a check-version table_version field (version,size,md5[,crc][;patch chain]) and requests the online table set with table_env=table_online (see Startup, version-check & hot-update). The 1.0.364 APK ships table version 39432 and locale 23557. On 2026-10-04 the iOS app’s resVersion ended in 39516.23570, which the C# maps to the table and locale versions, but that day’s iOS check-version response carried no table_version or locale field at all. Where the live client gets those numbers is open. The live tables weren’t fetched, and their CDN path hasn’t been derived. The only table read for the 1.0.364 pass was season_weekcard, whose farm_building and farm_building_weekcard columns name each season week card’s production buildings (see City & building).
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.