Overview
Jewel Coloring is a portrait colour-by-gems puzzle with 500 levels. Every board is a picture of sockets, each tinted with the colour it wants, filled with gems of the wrong colours. Tap a gem to select its connected same-colour group, then tap an empty socket of that colour to send the group there, or tap the shelf to park it. Completing a colour opens more shelf slots. The level is won when every gem is home and the shelf is empty; it is lost when you park a group while the shelf is already full. Level 1 (the tutorial) and level 200 are the two recorded boards of the original game; the other 498 are generated from a saved seed.
Getting Started
- Create or open a Unity 6000.0.62f1 project that uses the Universal Render Pipeline, the Input System package (
activeInputHandler= Input System or Both) and Unity UI. Import TextMesh Pro Essential Resources when prompted. The optional glTFast package (com.unity.cloud.gltfast) is only needed to re-import the.glbmodel masters; the shipped prefabs work without it. - Import this package. Two roots appear:
Assets/Game(game, scene, levels, tools) andAssets/HyperCasualLiveOpsKit(menu, economy, LiveOps, boosters). - Assign a URP pipeline asset in Graphics/Quality settings (the tested PC/Mobile assets are in
Assets/Game/ProjectRenderSettings) and set Player → Color Space to Linear. - Add
Assets/HyperCasualLiveOpsKit/StarterMenu/Scenes/HLK_MainMenu.unityfirst andAssets/Game/Scenes/Game.unitysecond to the build list, open the menu scene and press Play. Choose a level or press Play Next Level. - Open Tools → JewelColoring → Documentation for this guide, Level Editor / Auto Level Generator for the tools.
Folder Structure
| Folder | Contents |
|---|---|
Game/Scripts/Core | Pure C# rules: GameSim (60 Hz simulation), LevelData (JSON contract), Witness (tap sequences, replay, solver), MiniJson. |
Game/Scripts/Game, Game/Scripts/UI | Presentation: camera/viewport, board and shelf views, models, HUD, the level catalog. |
Game/Integration | The HLK bridge (level selection, pointer gating, single reward settlement, analytics, audio cues) and the booster adapter. |
Game/Resources/Levels | Level_1.json … Level_500.json plus CampaignAuthoring.json (editor metadata, never a level). |
Game/LevelSources | The two recorded levels, unchanged, used as authored sources for slots 1 and 200. |
Game/Resources/Models, Materials, Shaders | Gem, socket and shelf models (three switchable sets), materials and the jewel shaders. |
Game/LevelTools, Game/ProductionLevelTools | The level editor and generator (game adapter plus the shared framework). |
Game/ProjectRenderSettings | Tested URP pipeline/renderer assets. |
Gameplay
- Select: tap a gem that is not on its own colour; its 8-connected group of same-colour misplaced gems lifts.
- Place: tap an empty socket of that colour; as many selected gems as fit fly into that socket's empty region, nearest first. The rest stay selected.
- Park: tap the shelf; as many selected gems as there are free slots move onto it. Tap a shelved gem to select all shelved gems of its colour, then tap an empty socket to send them home.
- Shelf capacity: 24 slots; levels open with 12, 9 or 6 slots and every completed colour opens three more.
- Arrivals: from level 36 some levels start with gems flying from the picture onto the shelf (the recorded level 200 intro).
- Win / loss: win when all gems are home and the shelf is empty. Parking onto a full shelf loses. The number of empty sockets always equals the number of shelved gems, so a board never deadlocks by itself — only overflowing the shelf loses.
Scripts Reference
| Script | Role |
|---|---|
GameSim | All rules: selection, dispatch, parking, unlocks, boosters, win/loss, events. Deterministic, engine-free. |
LevelData | Parses cells (recorded levels) or compact layout rows (campaign) and validates gem/socket conservation. |
Witness | Tap codec, settle/replay, greedy solver, seeded players and a fixed losing route. |
GameController | Loads a level, routes pointer input (tap on release), ticks the simulation, hosts the HUD. LevelCatalog counts numbered levels only. |
BoardView, HudView, Viewport | Rendering of board/shelf/effects, HUD, and the portrait column fit. |
JewelHlkBridge | Kit menu level selection, ad/UI pointer gate, one settlement per attempt (coins, progress, results), jewel_level_end analytics, audio cues, camera listener ownership. |
JewelPowerUpAdapter | Binds the three boosters to the kit power-up bar. |
Level Editor
Tools → JewelColoring → Level Editor opens the shared window. The left list holds the campaign; Duplicate, Delete, Up/Down and Undo (Ctrl+Z) manage it. The canvas draws the real board at its grid positions: socket colours, gem previews, and the 24-slot shelf with open/locked slots and arrivals. Tools: Paint socket, Paint gem, Empty socket, Remove socket with the colour swatches (the nine recorded colours plus ten measured from the original's screenshots), grid size (+C/−C/+R/−R, the pitch refits automatically), open shelf slots and arrivals. The readout shows gem/socket counts per colour. Every edit clears the witness: press Solve witness, then Validate + save. Saving validates every level (geometry, gem size, colours, conservation, witness replay, variety and chapter rules) and publishes through a staging folder; invalid campaigns leave the existing JSON untouched. Play saved level opens the game on that level.
Automatic Level Generator
The same window (also Tools → JewelColoring → Auto Level Generator) holds the saved request: final count, seed, attempts per level, minimum formations (80), maximum formation streak (2) and append mode. Generate into editor builds the campaign in memory; review it on the canvas, then save. Generation is deterministic for a seed. Every generated board is a pixel-art picture of an object, as in the original: one of 70 subjects in JewelPictures (fruit and food, household objects, toys, plants, animals, vehicles) drawn from simple shapes, with an automatic one-cell outline, a darker shade band and, for the background variant, a backdrop with a frame or ground band. The generator draws the picture at the level's size and gives it exactly the chapter's number of colours. Levels 2–3 use the 20 simplest silhouettes. The older geometric formations (27 silhouettes × 15 colour-region patterns) remain available to the tools. Each chapter sets colours, board size, scramble style, arrivals and open slots (see Level Variation). Every generated level carries a witness proven by replaying it through GameSim. Levels 1 and 200 are placed from Game/LevelSources.
Boosters
| Booster | Effect | Unlocks |
|---|---|---|
| Magic Wand | Sends one gem of the selected colour (or the next unfinished colour) to its socket; a gem sitting there swaps back. | Level 2 |
| Paint Brush | Fills every unfinished socket of that colour, one gem after another. | Level 7 |
| Magnet | Pulls one shelved gem into an empty socket of its colour. | Level 12 |
Each booster grants two free charges once at its first legitimate unlock. Zero-stock actions open the refill flow. Inventory, first-use tutorials and the DEV Unlock/Refill/Tutorials controls come from the kit power-up bar. A press that cannot change the board costs nothing.
Level Variation
| Levels | Chapter | Colours | Features |
|---|---|---|---|
| 1 | Tutorial | 2 | Recorded level 1; the Magic Wand unlocks at level 2 |
| 2–3 | Park and place | 2 | Small simple pictures that read at a glance, whole-region scrambles |
| 4–5 | First pictures | 3–4 | Full-size pictures, some on a background |
| 6–15 | Shaped pictures | 3–4 | All picture subjects; the Paint Brush unlocks at level 7 and the Magnet at level 12 |
| 16–35 | Silhouettes | 4–5 | More parts per picture and longer solution paths |
| 36–70 | Shelf arrivals | 4–6 | Gems arrive on the shelf first |
| 71–120 | Scattered pieces | 5–6 | More, smaller groups |
| 121–190 | Tight shelf | 5–7 | Nine open slots |
| 191–280 | Big pictures | 6–7 | Recorded level 200 scale |
| 281–380 | Dense pictures | 7–8 | Six-slot starts |
| 381–500 | Master pictures | 8–9 | Look-alike colours, tight shelves with arrivals |
Board size is a property of the picture, not of the difficulty ramp: from level 4 on, boards hold roughly 80–920 sockets and a small picture can follow a large one. Difficulty grows through the number of colours, the number of groups and the length of the solution. Every x5 level from 25 is a lighter relief level (one fewer colour, a smaller board). No formation appears more than twice in a row.
Customization Guide
- Difficulty and chapters: edit
JewelProgression.Chapters(colours, sizes, scramble mix, arrivals, open slots) and regenerate with a new seed, or hand-edit levels in the editor. - Colours:
JewelBoards.Swatcheslists the nine recorded colours and their socket tints. - Shapes and patterns: add masks or patterns in
JewelBoards; new structures raise formation variety automatically. - Boosters: counts/unlocks in the power-up definition assets (
Game/Integration/PowerUps); effects inGameSim.UseBooster. - Rewards, ads, LiveOps: see the HyperCasualLiveOpsKit guide.
- DEV panel: the orange DEV button is a development tool; hide it for store builds with
StarterGameplayDevPanel.IsAvailable = false.
Level Format
Each Level_N.json holds the palette and tints of its colours, the grid (columns, rows, centre and pitch as fractions of the portrait frame), the compact layout (one string per row; target letters are socket colours via legend, initial letters are the starting gems, . an empty socket, a space no socket), the shelf (active, locked, preplaced arrivals), timings and HUD data, plus index and the witness taps (c=cell, s=shelf slot, t=tray). Level 2 (a T-shirt), shortened:
{
"id": "Level_2", "number": 2,
"palette": { "orange": [249, 172, 33], "navy": [92, 136, 171] },
"grid": { "cols": 8, "rows": 8, "centerU": 0.5, "centerV": 0.3775, "pitchU": 0.10576 },
"layout": {
"legend": { "a": "orange", "b": "navy" },
"target": [" bb ", "bbbaabbb", "baaaaaab", " baaaab ", " baaaab ", " baaaab ", " baaaab ", " bbbbbb "],
"initial": [" aa ", "aaabbaaa", "abbbbbba", " abbbba ", " abbbba ", " abbbba ", " abbbba ", " aaaaaa "]
},
"shelf": { "active": 12, "locked": 12, "preplaced": [] },
"index": 2,
"witness": "c0 t c5 c0 s0 c5 c16 c23 s0 c16 c22 t c29 c22 s0 c29 c17 c37 s0 c17"
}Support
Questions and bug reports: satisvizion@gmail.com. Please include the Unity version, the level number and the editor console output.