Store chunk tile data as a dense minified grid instead of per-tile objects

Cuts the six overworld chunk JSON files from 146KB to 10KB by replacing
{"pos":[x,y,z],"type":t,"tile":u} entries with a fixed 256-slot array
(index x + y*16, value null or [type, z]) and dropping pretty-printing.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-09-09 15:28:22 -05:00
co-authored by Claude Sonnet 5
parent f303d24f4a
commit efd760fb2e
7 changed files with 16 additions and 12818 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+10 -14
View File
@@ -54,9 +54,11 @@ static bool_t assetChunkTilesHaveTerrain(const tile_t *tiles) {
return false;
}
// Reads the "tiles" array - one quad's worth of column data per entry,
// last one in the array wins per (x, y) column - matching
// tools/asset/chunk/__main__.py:390-403.
// Reads the "tiles" array - a dense, fixed-size CHUNK_TILE_COUNT grid,
// one slot per (x, y) column at index x + y * CHUNK_WIDTH (position is
// implicit in the index, not stored). Each slot is either `null` (empty
// column, already zeroed = TILE_SHAPE_NULL) or a 2-element [type, z]
// array.
static void assetChunkParseTiles(yyjson_val *root, tile_t *tiles) {
memoryZero(tiles, CHUNK_TILE_COUNT * sizeof(tile_t));
@@ -66,18 +68,12 @@ static void assetChunkParseTiles(yyjson_val *root, tile_t *tiles) {
size_t idx, len;
yyjson_val *tileVal;
yyjson_arr_foreach(tilesArr, idx, len, tileVal) {
yyjson_val *posArr = yyjson_obj_get(tileVal, "pos");
if(!yyjson_is_arr(posArr) || yyjson_arr_size(posArr) < 3) continue;
if(idx >= CHUNK_TILE_COUNT) break;
if(!yyjson_is_arr(tileVal) || yyjson_arr_size(tileVal) < 2) continue;
int32_t x = (int32_t)yyjson_get_int(yyjson_arr_get(posArr, 0));
int32_t y = (int32_t)yyjson_get_int(yyjson_arr_get(posArr, 1));
int32_t z = (int32_t)yyjson_get_int(yyjson_arr_get(posArr, 2));
if(x < 0 || x >= CHUNK_WIDTH || y < 0 || y >= CHUNK_HEIGHT) continue;
int32_t type = (int32_t)yyjson_get_int(yyjson_obj_get(tileVal, "type"));
tiles[x + y * CHUNK_WIDTH] = (tile_t){
.shape = (tileshape_t)type, .z = (uint8_t)z
};
int32_t type = (int32_t)yyjson_get_int(yyjson_arr_get(tileVal, 0));
int32_t z = (int32_t)yyjson_get_int(yyjson_arr_get(tileVal, 1));
tiles[idx] = (tile_t){ .shape = (tileshape_t)type, .z = (uint8_t)z };
}
}