47-Tile Blob Tileset — Identify the Layout, Check, Generate
Several incompatible 47-tile orders exist and nothing in the PNG says which one you have. The Studio scores every known order at every position by how seamlessly neighbouring tiles join, and tells you which it is and how sure it is.
A blob tileset has one tile for every way a terrain cell can look given all eight of its neighbours. Eight neighbours give 2⁸ = 256 combinations, but a diagonal neighbour is only visible when both sides next to it are the same terrain, and that folds the 256 into exactly 47 tiles. Godot 4 stores such a set as a terrain set in Match Corners and Sides mode, Tiled as a mixed Wang set, Unity as a Rule Tile with eight-neighbour rules. The 47 tiles are published in several incompatible orders; the Studio tells you which one a sheet uses and exports the bits.

- Godot 4 TileSetVerified· Godot 4.7.2
- TiledVerified· Tiled 1.12.2
- Unity 6 Rule TileVerified· Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3
- LDtkPartly verified· LDtk 1.5.3 schema + loader
From 256 neighbour masks to 47 tiles
Give each neighbour a bit: N 1, NE 2, E 4, SE 8, S 16, SW 32, W 64, NW 128 (y grows downwards). A cell's mask is the sum of the neighbours that are the same terrain, 0 to 255. Without a rule, that would need 256 tiles.
But a corner is hidden behind an open side. If the cell above is empty, the tile already draws a rim along its top edge, and whether the cell up-right is land changes nothing you can see. So NE counts only when N and E are both land, and the same for the other three corners. Applying that rule to all 256 masks leaves 47 different ones — the table under "Worked example" counts them.
Nothing inside a PNG says in which order those 47 tiles are laid out. cr31's ascending order, the 7×7 "wang blob", the caeles templates, GameMaker's template and Godot 3's 12×4 template all put different tiles in the same cell. Importing with the wrong table puts every tile under the wrong rule, which is why the Studio scores every known order against the seams of your art before writing any bit (how the layout is recognised).
For one terrain the complete set carries 188 neighbour bits in total: 8 on the full tile, none on the isolated tile. Godot writes them as peering bits, Tiled as Wang IDs (Tiled's manual calls a complete two-terrain mixed set 256 tiles and says a reduced set such as the 47-tile blob is compatible), Unity as Rule Tile neighbours.
- Neighbour mask
- The sum of the bits of the neighbours that share the terrain: 0 (alone) to 255 (surrounded).
- Reduced mask
- The mask after dropping every corner whose two sides are not both set; only 47 values remain.
- Inner corner
- A tile whose four sides connect but one diagonal is open, e.g. 127 = everything except NW.
- Isolated and full tile
- Mask 0 (a lone cell, rim all round) and 255 (land on every side, no rim).
Counting the 47
Group the masks by how many sides are set; each corner that has both of its sides set can be on or off:
sides set side patterns corners that can count tiles
0 1 0 1 × 2⁰ = 1
1 4 0 4 × 2⁰ = 4
2 opposite 2 (N+S, E+W) 0 2 × 2⁰ = 2
2 adjacent 4 (N+E, E+S, …) 1 4 × 2¹ = 8
3 4 2 4 × 2² = 16
4 1 4 1 × 2⁴ = 16
total = 47
raw N + NE = 1 + 2 = 3 → reduced 1 (NE is behind the open E side)
raw 255 − NW = 127 → stays 127 (an inner corner: all sides set)The first reduced masks in ascending order are 0, 1, 4, 5, 7, 16, 17, 20 and the last is 255: that list, eight per row, is the cr31 ascending layout.
The published 47-tile orders the Studio recognises
| Layout | Sheet | How to tell it |
|---|---|---|
| cr31 ascending ID | 8 × 6: 47 tiles + 1 empty cell | Masks in ascending order: the isolated tile first, the full tile last; also the classic Tile Lab template |
| cr31 wang blob | 7 × 7 = 49 cells | Mask 0 in three corner cells; Tiled's wangblob example uses it |
| caeles seamless template II | 7 × 7 or 8 × 6 | The OpenGameArt template sheets; a different order from both cr31 layouts |
| GameMaker Studio 2 47-tile | 8 × 6, first cell unused | The full tile sits in the last cell |
| Godot 3 "3×3 minimal" template | 12 × 4: 47 masks + 1 blank | Sampled from the template image in the Godot 3.5 documentation |
In the corpus run, all four blob templates were identified with high confidence (seam AUC 1.000) and a real 64 px cave tileset as GameMaker 47 with medium confidence (0.964), all 47 tiles with the right bits.
What it does
- Known blob-47 orders: cr31 ascending (8×6), cr31 wang blob 7×7, caeles 7×7 and 8×6, GameMaker Studio 2, Godot 3 3×3-minimal (12×4).
- Scored by seam continuity (ROC AUC, 1.0 = perfect); textured art is measured with colour-band histograms.
- Bits for sheets in no known order can be suggested from the pixels, as a preview.
- A generator builds a blob-47 set from an RPG Maker A2 block or a 2×3 base, byte-exact from its quarters.
How to do it
- Drop the 47-tile sheet.
- Use the grid; read the layout candidates and their confidence.
- Apply the right one and read the Check panel.
- Export for Godot 4, Tiled, Unity or LDtk.
Files you get
What the Studio writes for a blob set, here from a sheet named cave.png (each target in its own ZIP):
| File | What it is for |
|---|---|
nerulio_tileset_import.gd | Godot 4: run it (File › Run) beside the PNG and nerulio-tileset.json; it saves nerulio-tileset.tres with one Match Corners and Sides terrain set — for one terrain, 47 tiles and 188 peering bits. |
cave.tsx | Tiled: a mixed Wang set, one colour per terrain, plus sample.tmx drawn with it. The isolated tile of a one-colour set is left out, because Tiled drops a Wang ID of all zeros. |
nerulio-ruletile.json | Unity 6: with Editor/NerulioRuleTileImporter.cs, one Rule Tile per terrain, sprites sliced with Point filtering. |
cave.ldtk | LDtk 1.5.3: an IntGrid value per terrain and one 3×3 rule per tile (checked against the schema and loader, not opened in the app). |
tileset.json | Generic: per tile its pattern, cr31 mask, Tiled Wang ID, Godot peering names and rectangle. |
Troubleshooting
| Symptom | Likely cause | How to check | Fix |
|---|---|---|---|
| Rims appear inside the land in the engine, everywhere | The sheet was read with the wrong 47-tile order | Compare the Studio's top layout candidate with the order you assumed | Apply the identified layout and export again; the mapping above lists the orders |
| Holes or odd tiles at lake corners and one-tile paths | The set has fewer than 47 distinct patterns: a missing inner corner, or a duplicate in a 48-cell sheet | Check panel: missing masks as ghost tiles, duplicates listed | Draw the missing tiles or generate the set from a base block (tileset generator) |
| The Check panel reports corner bits behind open sides | A tile carries a corner whose sides are not both set (e.g. N + NE without E) — not one of the 47 | Click the listed tile and read its 3×3 bits | Clear the corner bit; that combination is the same tile as the one without it |
| Lone single tiles never appear in Tiled | Tiled drops the all-zero Wang ID of the isolated tile in a one-colour set | The .tsx has 46 Wang tiles for 47 on the sheet | Expected for one-colour sets; lone cells work in Godot, Unity and LDtk |
| Godot paints transitions to another terrain badly | The blob set covers one terrain against empty; transitions need their own tiles | Paint two terrains next to each other on the test map | Generate an A-over-B set, one pair at a time, or draw the transition tiles |
Other ways to do it
| Option | When it is the better choice |
|---|---|
| A dual-grid set of 16 corner tiles | You are drawing a new set and can accept a display layer offset by half a tile: 16 tiles instead of 47 (dual grid explained). |
| A 16-tile side set | Roads, fences, pipes and platforms, where only the four sides matter and inner corners are not drawn. |
| Generate the 47 from a base block | You have an RPG Maker A2 block or a 2×3 base: the tileset generator assembles the whole set from 20 quarters. |
Engine exports and how each was checked
"Verified" means the exported files were loaded by the real engine or tool on real CC0 assets and the result was compared with the source. Anything that was not loaded is labelled as such.
| Target | Files | Check |
|---|---|---|
| Godot 4 TileSet | PNG · nerulio-tileset.json · nerulio_tileset_import.gd | Verified Godot 4.7.2The included import script builds the TileSet with terrain peering bits; a map painted with set_cells_terrain_connect equals the Studio preview in every cell on 9 corpus sheets. |
| Tiled | .tsx Wang set · sample.tmx | Verified Tiled 1.12.2Tiled's own readers load every Wang ID as written and the sample map renders pixel-exact. The terrain brush itself was not driven. |
| Unity 6 Rule Tile | nerulio-ruletile.json · Editor/NerulioRuleTileImporter.cs | Verified Unity 6000.5.3f1 + 2D Tilemap Extras 8.0.3Blob and side sets: a painted Tilemap shows the predicted sprite in every cell. Corner / dual-grid sets are not exported to Unity. |
| LDtk | .ldtk (1.5.3) · rules · sample level | Partly verified LDtk 1.5.3 schema + loaderAccepted by the LDtk JSON schema and its official loader, and the rules re-run to the exported tiles; not opened in the LDtk app. |
Evidence
Layouts identified from the pixels alone on the tile corpus: 4 blob-47 templates and 2 Wang templates with high confidence, a real 64 px cave tileset with medium confidence — every tile's bits right. Godot 4.7.2 painted every test cell exactly as the Studio predicted (485/485 per blob set, 251/251 on a 4-terrain dual-grid pack); Tiled 1.12.2 read every Wang ID back; Unity 6000.5 matched on every painted cell of the blob and side sets.
Limits
- One terrain against empty per blob set; A-over-B transitions are generated one pair at a time.
- Orders not in the list (Tilesetter's output order is not published) need the bits painted or suggested from the pixels.
- Unity gets one Rule Tile per terrain, with no transitions between terrains.
- Tiled's terrain brush, the LDtk app and Godot's editor painter were not driven; the checks use the engines' readers and set_cells_terrain_connect.
- Unity gets blob and side sets only; several terrains become several Rule Tiles with no transitions between them.
- Isometric and hex tiles, animated tiles, occlusion and navigation layers are out of scope.
- Suggesting bits without a known layout needs a reference "full" tile; on side-only path templates the guess can fail until you select it.
Versions and sources
The 256 → 47 reduction is checked by tests/game-autotile.test.mjs for all 256 masks. The layout tables were verified against their sheets in the corpus manifest; the Godot 3 table was sampled from the Godot 3.5 documentation's template image. Exports verified 2026-09-23: Godot 4.7.2 (485/485 cells on each blob set), Tiled 1.12.2, Unity 6000.5.3f1; LDtk 1.5.3 by schema and loader only. The engine terms follow the linked documentation.
Official documentation used
Questions
How reliable is the identification?
All four blob templates in the test corpus were identified with high confidence (AUC 1.000), and a real 64 px cave tileset with medium confidence (0.964) — all 47 tiles with the right bits.
What if two tiles are swapped in my sheet?
The art check finds exactly the two swapped tiles on every blob set in the corpus.
Is it free, and do I need an account?
Everything on these pages is free and works without an account. There is no watermark and no export that is held back.
Are my sprites uploaded?
No. The Studio decodes, packs and exports in this browser tab. Projects are autosaved in the browser (IndexedDB) and can be saved as a .nerulio file.
Does it need Aseprite or an engine plugin installed?
No. .aseprite files are read and written in the browser, and each engine bundle carries what that engine needs (for Godot, the import settings and scene; for Unity and the Godot TileSet, a small editor script).