Game data tables
1,291 tables in 1.0.364 (table version 39432, 1,049,915 rows); live set 39516 = 1,298; 1.0.351 shipped 1,279. Data-only Lua modules from a spreadsheet pipeline.
Table shape
T.index = { id = {1,"number"}, cost_resource = {19,"string",true} }(field →{col, type, isLinked?})T.data = { [10100000] = {10100000, "135104", ..., "30030;200|30031;200", ...} }T.vExt= interned string pool (1-based index whenisLinked)T.link = { [1]={9,512025}, [2]={512026,535161} }= split-table partition ranges
Only 4 field types corpus-wide: string, number, array, table. Column declarations 1.0.364: 8,641 string, 5,166 number, 587 array, 78 table. Compound values packed as id;count pairs joined |.
Container & delivery
- Plain ZIP, one flat-namespace entry per table (
.dataextension misleading;unzip -lworks). Local manifest one lineversion,size,md5,crc32; filenametable_{version}_{md5}.data; 4th field = archive CRC32 (APKtable/version=39432,19332173,,1911068049, MD5+CRC match archive).ApplyUpdatechecks size+CRC after patching static. Table updates are patched (bsdiff) independently of the Lua bundle and asset bundles. - Version check [live 2026-10-05]: C# reads the check-version
table_versionfield (version,size,md5[,crc][;patch chain]); the server returns it +localeonly when the request carriestable_env=table_online. APK ships 39432 / locale 23557; server named 39516 / 23570 (matches the iOSresVersiontail). Android and iOS got identicaltable_versionandlocalelive. - CDN (no app id / platform segment, unlike the Lua bundle; 1.0.364 C#
TableFileUpdate): https://lastwar-cdn.akamaized.net/hotupdate/table/table_{version}_{md5}.datahttps://lastwar-cdn.akamaized.net/hotupdate/table/table_{new}_{old}.patch- Full archive is a plain ZIP (HEAD 200 on all three CDN bases, ETag = MD5); 39516 downloads as plain PKZip, not ChaCha-wrapped. Patch = plain
BSDIFF40; ChaChaPURBDPwrapping optional; the client downloads a patch only when theclient_configswitch 0 is on and the local version is in the;old|size|crcchain. Origin = Aliyun OSS bucketlastwar-client-us(listing AccessDenied). Live patch chain (2026-10-05): 39500, 39487, 39323, 39277, 39273, 39267, 39250, 39228, 39191, 39182 — skips 39432, so a fresh 1.0.364 install pulls the full 19.5 MB archive. - 39432→39516 diff: no schema change; 8 tables added (unread A/B "new" variants:
lw_world_monster_B,lw_hero_skill_B,lw_guide_flow_new,detect_event_new); 1 removed (test_all_types); 13 changed rows (weekly rotations,activityscore thresholds, shop limits, goods/decorations/stages). Production/VIP/daily-task/visitor/alliance-gift/subscription/dispatch/idle-reward tables byte-identical.
Split tables
10 tables, 335 sub-tables: exchange (3), lw_army (12), lw_monster (31), lw_monster_B (31), lw_monster_C (27), lw_monster_born (73), lw_monster_born_B (73), lw_monster_born_C (51), quest (10), reward (24) static. Base holds index/vExt/link, data empty; each _split holds data only, interning into the base vExt; read = find the link range containing the id, then open _split. LocalController's OLD_STYLE list builds sub-table names without _split; reward is OLD_STYLE but ships reward_split1..24, so 34 getLine/tryGetLine(TableName.RewardConfig, id) call sites return nil as shipped (live 39516 still ships reward_split1..24).
A/B variants
PlayerInfo:GetABTestTableName picks from init.user.monopoly_ab; value 18 → civilization-spark set (building_B, lw_monster_B, lw_stage_feature_B, lw_guide_flow_B, monopoly_B + seven more _B); value 1 → detect_level_B. building_B = same production numbers as building.
Misnamed / unused
item is the DataConfig table (1,328 keys, columns k1..k30), replaced wholesale by init dataConfig; 267 non-split tables never read by the client (daily_reward, lw_base_visitor_config, vip_privilege, develop_simulation at 88,019 rows); lw_monster_point strings are GBK-encoded, not UTF-8.
Categorized index (1.0.351 — 1,279 tables; sums 1,230, ~49 unbucketed)
lw_* 601 (incl. lw_monster* 304 files), activity_* 124, aps_* 52, season* 46, build*/city*/scene* 38, monster/pve/battle 63, shop/pay/gold 23, alliance* 26, misc 257.