Goods Sorting — Buyer Guide

Unity 6000.0.62f1 · Universal Render Pipeline · LocalQA handoff candidate

Overview

Goods Sorting is a portrait drag-to-match shelf puzzle with 500 levels. Goods sit in three-slot boxes stacked in two to four columns; only the first rows of each column are on the shelf, the rest queue behind it. Drag a good into a free slot of another open box. Three matching goods clear a box, an emptied box also leaves the shelf, and the next queued box slides in. Chained boxes open after enough boxes have left. Clear every box to win; when no open box on the shelf has a free slot, the level is lost. The owner's original hand-made 3 × 17 shelf ships as level 500.

Getting Started

  1. 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.
  2. Import this package. Two roots appear: Assets/_GoodsSorting (game, engine scene, tools, resources) and Assets/HyperCasualLiveOpsKit (menu, economy, LiveOps, boosters).
  3. Assign a URP pipeline asset in Graphics/Quality settings and set Player → Color Space to Linear (the game was authored and tested in Linear; Gamma renders the shelf noticeably brighter). Assets/_GoodsSorting/ProjectRenderSettings contains the tested PC/Mobile pipeline and renderer assets.
  4. Add Assets/HyperCasualLiveOpsKit/StarterMenu/Scenes/HLK_MainMenu.unity first and Assets/_GoodsSorting/Scenes/Campaign.unity second to Build Settings. Play from the menu; the results overlay drives next level, replay and menu.
  5. Open Tools → GoodsSorting → Documentation to reopen this guide inside the editor.

Folder Structure

PathContents
_GoodsSorting/GameOriginal shelf game: Scripts (rules, input, boosters), Prefabs (Box, FillBox, Item, completion texts), Datas (goods sprite mapping, the authored level asset), Textures, Materials.
_GoodsSorting/EngineHypercasual Game Engine core used by the shelf scene (camera switcher, lose/win panel prefab).
_GoodsSorting/Scenes/Campaign.unityThe playable campaign scene: shelf, input, campaign bootstrap, camera fit and the authored kit gameplay overlay.
_GoodsSorting/IntegrationKit bridge (settlement, analytics), booster adapter, campaign model/solver, runtime loader, camera fit and booster definitions (PowerUps).
_GoodsSorting/Resources/LevelsLevel_1.json … Level_500.json plus CampaignAuthoring.json (editor ownership metadata). Loaded by Resources.Load("Levels/Level_N").
_GoodsSorting/LevelToolsGame adapter, spatial editor, existing-level assessment, progression rules and the shipped campaign baseline (Data).
_GoodsSorting/ProductionLevelToolsShared level-tool framework: editor window, document/undo, seeded generation, staged publication.
HyperCasualLiveOpsKitMenu, economy, ads/IAP simulation, quests, battle pass, minigames, boosters, audio bank. See its own Documentation folder.

Gameplay

Scripts Reference

ScriptRole
GameLevel / GameLevel.BoostersBuilds the shelf from a LevelData, applies moves (TryMove), completion/empty/chain rules, jam grace, events (OutcomeReached, MoveAttempted, BoxRemoved) and the three booster effects.
InputManagerMouse/touch drag; PointerBlocked gate for overlays; TapInterceptor for armed boosters.
Box, FillBox, Item, ChainFeatureScene entities: a box with three slots, a slot, a draggable good, the chain visual/counter.
LevelData, ItemDataAuthored level ScriptableObject (columns of boxes) and the goods-type → sprite mapping (37 types).
GoodsJsonLevel, ShelfState, GoodsShelfSolverRuntime level contract, pure rules model and bounded solver/replay used by runtime, editor and generator.
GoodsSortingCampaign, GoodsSortingCampaignBootstrapLoad Resources/Levels/Level_N.json, convert to LevelData, select the level from the kit's selector and bind the level number.
GoodsSortingCameraFitFits the orthographic camera to the shelf between HUD and booster bar; refits on resolution, safe-area and tray changes.
GoodsSortingHlkBridge, GoodsSortingPowerUpAdapterKit settlement/analytics/audio cues and booster handler registration.

Level Editor

Tools → GoodsSorting → Level Editor opens the shared level window with the shelf canvas. The left list selects a level; Duplicate/Delete/Up/Down and Undo (Ctrl+Z) edit the campaign; Validate + save publishes runtime JSON through staging only when every level validates and its witness replays.

Automatic Level Generator

Tools → GoodsSorting → Auto Level Generator opens the same window; the Saved generation request block holds count, seed, attempts per level, minimum formations, maximum repeat streak and append mode. Generate into editor builds the campaign in memory (deterministic for a seed), validates every level's solver witness, colour-normalised uniqueness and structural variety, then Validate + save publishes. Append keeps the existing prefix. The shipped LevelTools/Data/CampaignBaseline.json records the generated campaign so later manual edits can be told apart; ExistingLevels.json records how the owner's authored shelf was assessed and placed.

Boosters

BoosterEffect
SHUFFLEEvery good on the open shelf swaps places (queue and chained boxes untouched); new matches may settle.
UNLOCKArm it, then tap a pulsing chained box; its chain breaks at once.
EXTRA TRAYAdds an empty tray beside the shelf for this attempt, up to three; rescues a shelf that just jammed.

Definitions live in _GoodsSorting/Integration/PowerUps; counts, unlock levels, copy and art are edited there. Each booster has its own AI-generated centre icon and explainer illustration under _GoodsSorting/Art/Boosters; swap those six PNGs to re-skin the bar without touching effects. See AI-DISCLOSURE.txt for their origin.

Level Variation

Chapters change one lever at a time: level 1 is a single drag, the queue appears at level 5, chains at 16, four columns at 36, then more goods types (up to 12), deeper queues, tighter free slots and more chains, with recovery levels every tenth level after 20. Structure is the column count, per-column queue depth silhouette, visible rows and chain layout — 490+ distinct formations across the 500 levels and never the same formation three times in a row. The frozen progression rules are encoded in GoodsProgression.

Customization Guide

Level Format

Each Level_N.json is a GoodsJsonLevel: index, formation key, lesson, visibleRows, columns (each a list of boxes with three items, 0 = empty, 1–37 = goods type, and a chain count) and the solver witness as flat triples from-box, type, to-box (box ids count column by column from the bottom of each queue).

{
  "index": 3,
  "formation": "c2-v3-d2.1-k0",
  "lesson": "Match goods; an emptied box leaves",
  "visibleRows": 3,
  "columns": [
    { "boxes": [ { "items": [1, 2, 0], "chain": 0 }, { "items": [1, 1, 0], "chain": 0 } ] },
    { "boxes": [ { "items": [2, 2, 0], "chain": 0 } ] }
  ],
  "witness": [0, 1, 1, 0, 2, 2]
}

Support

Questions and bug reports: satisvizion@gmail.com. Please include the Unity version, the level number and the editor console output.

Current delivery and examples

Unity 6000.0.62f1 / URP. Support: satisvizion@gmail.com.

Buyer roots: Assets/_GoodsSorting, Assets/HyperCasualLiveOpsKit. Internal production, build and upload folders are excluded. The kit is an owner-approved first-party asset.

Current campaign: 500 levels. Use the shipped Level Editor and Auto Level Generator menu entries: Tools/GoodsSorting/Documentation, Tools/GoodsSorting/Level Editor, Tools/GoodsSorting/Auto Level Generator.

Current complete level example

Assets/_GoodsSorting/Resources/Levels/Level_4.json

{
  "index": 4,
  "formation": "c2-v2-d2.2-k0",
  "lesson": "Boxes queue behind the shelf",
  "visibleRows": 2,
  "columns": [
    {
      "boxes": [
        {
          "items": [
            1,
            2,
            0
          ],
          "chain": 0
        },
        {
          "items": [
            3,
            3,
            0
          ],
          "chain": 0
        }
      ]
    },
    {
      "boxes": [
        {
          "items": [
            1,
            1,
            0
          ],
          "chain": 0
        },
        {
          "items": [
            2,
            2,
            3
          ],
          "chain": 0
        }
      ]
    }
  ],
  "witness": [
    0,
    1,
    2,
    3,
    3,
    1,
    0,
    2,
    3
  ]
}

Level fields

FieldJSON type
indexint
formationstr
lessonstr
visibleRowsint
columnslist
witnesslist

Safe worked editing procedure

  1. Open Level 4 in the Level Editor and duplicate it into an unused slot.
  2. Use the editor’s supported controls for a small placement change; keep legal occupancy and required targets. Do not invent JSON fields.
  3. Run the shipped validator, correct any rule errors, save, then open the duplicate in gameplay and complete it.
  4. For generation, record the current seed, request a small append batch using the exposed controls, validate its solutions and confirm the previous campaign prefix is unchanged. Cancelling must leave the campaign unchanged.

Run these procedures in a clean import of the final candidate before claiming buyer acceptance; restore test additions afterward.

Current booster policy

{
  "schemaVersion": 1,
  "gameId": "goodssort",
  "defaultProfileId": "default",
  "initialGrant": 2,
  "refillAmount": 1,
  "baseCoinCost": 100,
  "coinCostStep": 25,
  "levelsPerPriceStep": 10,
  "rewardedTimeoutSeconds": 90,
  "boosters": [
    {
      "id": "goods_shuffle",
      "unlockLevel": 2,
      "rewardedPlacementId": "goods_refill_shuffle",
      "reason": "Phase04 default first slot. Untargeted and always legal, so it teaches 'change the board' with no selection step."
    },
    {
      "id": "goods_extra_tray",
      "unlockLevel": 7,
      "rewardedPlacementId": "goods_refill_extra_tray",
      "reason": "Phase04 default second slot. Also untargeted and useful on any shelf, so it needs no mechanic prerequisite."
    },
    {
      "id": "goods_unlock",
      "unlockLevel": 16,
      "rewardedPlacementId": "goods_refill_unlock",
      "reason": "Justified deviation from the default third slot (12). UNLOCK can only target a chained box, and an independent scan of all 500 published levels finds ZERO chained boxes in levels 1-15, with the first at level 16. Introducing it earlier would give the player a booster with no legal target. Level 16 introduces chains, so its first use has a guaranteed opportunity. Round-001 finding GS-002; saved once rather than re-decided per run."
    }
  ]
}

Hosting, native-device tests and live-service verification are separately recorded in the delivery handoff. A local build is not proof of a hosted release.

Fonts

Unity-provided defaults only: TextMesh Pro default font for TMP text and LegacyRuntime.ttf for legacy Unity UI. Official TMP Essentials must be installed. Do not add custom font files or atlases. Any historical custom-font references above describe an older revision; they are not current dependencies.

Demo and publishing configuration

Current source verified on 2026-10-09. The Android download is a development demo with debug signing; WebGL is a LocalQA showcase. Ads are included as LiveOps provider adapters and test/local configuration; vendor SDKs and production credentials are not bundled in the buyer package. Native device and live store certification remain pending.

For product help, contact SatisVizion at satisvizion@gmail.com

See Third-Party Notices.txt in the package for the verified dependency and license inventory.

HyperCasual LiveOps Kit manual