Building Overheat: Overheat: Match 3 Blast — the match-3 puzzle where every combo heats the board
23 Sept 2026, 2:34 am
Overheat is out now on Web, iOS, Android. This is how it got made: the decisions, the pipeline, and what I would do differently. What it is
Overheat is the match-3 puzzle where every combo sets the board alight. Swap gem tiles, fill the Heat Meter with combos and specials, then press BURST to blow a cross through the board — for free, without spending a move. 400 levels across 20 worlds that each clear their own way, hot tiles, ice, coal and frozen boards, daily rewards, trophies and a weekly Heat League. See the board flat or tilted into 3D. Every colour is also a shape, so everyone can play. Free, family friendly, works offline. From level 30 the optional Overheat Club removes ads and adds lives, coins and exclusive themes — pay once and keep it forever, or monthly.
Swap gem tiles, fill the Heat Meter with combos and specials, then press BURST to blow a cross through the board — for free, without spending a move. 400 levels across 20 worlds that each clear their own way, hot tiles, ice, coal and frozen Archetype JSON
One file per model; adding a model is a JSON edit, not a Blender session. Buildings:
Vehicles use the same shape with base (car | plane | ship | train | bus | truck), scale, palette, cargo, coaches and boolean flags. Archetypes can also be synthesised from the content catalog (core/scripts/lib/), so a new entry in the content JSON gets a model without hand-authoring — the archetype file is then a build artifact you can still edit.
Determinism is the contract: a variant is keyed (archetype, VARIANT), SEED = seed + VARIANT, and variant row 0 is all-defaults so the base model never moves. High-frequency archetypes (the ones the game repeats hundreds of times) get 8 variants; everything else 3 — spend payload where repetition is visible. Vary independent axes (palette wheel, wall material, roof shape, window rhythm, massing, mirrored plan) and make every wheel length coprime with the variant count, or all axes turn over together and eight variants read as one. The runtime needs no variant table: the model registry counts the ids that actually shipped and walks a variant index down to the highest present Textures — baked in Blender, tiered per platform
Models ship untextured; one atlas set per asset family ships beside them. core/scripts/blender/bake_textures.py builds 16 procedural node-tree materials per family on a 4×4 tile grid and runs two Cycles EMIT bakes (1 sample, no lights — a bake, not a render): base colour, and a packed data map. core/scripts/gen-textures.mjs then derives the tangent-space normal (from the baked height field) and the ORM (R occlusion / G roughness / B metalness / A emissive mask), and encodes one set per quality tier, capped at each tier's textureMax from config/platform-quality.json (high 2048 / medium 1024 / low 512):
The client fetches exactly one tier (its own), chosen by the quality system — this is the other half of the platform-quality contract: the pipeline caps what each tier can even downlo…
https://dev.to/sam_ayoub_f53707eb9f506b4/building-overheat-overheat-match-3-blast-the-match-3-puzzle-where-every-combo-heats-the-board-5505