Overview
Bus Crowd — Traffic Jam is a portrait traffic-puzzle game for Unity 6000.0.62f1 (URP). A depot of parked buses faces a crowd of coloured passengers queuing around a ring road. The player taps a bus whose path out of the depot is clear; it drives to one of four parking bays and passengers of its colour board it. A full bus drives away and frees its bay. Every bus must leave before the attempt timer runs out.
The package contains a 500-level validated campaign, three boosters on the HyperCasualLiveOpsKit (HLK) booster bar, mystery buses, a level editor and an automatic level generator, and the HLK menu, economy, results and LiveOps screens configured for this game in a LocalQA profile (simulated ads and purchases).
Getting Started
- Create a Unity 6000.0.62f1 project with the Universal Render Pipeline. Install
com.unity.inputsystemandcom.unity.ugui, then import TMP Essential Resources (Window → TextMeshPro → Import TMP Essential Resources). - Import the package. It creates two folders:
Assets/GameandAssets/HyperCasualLiveOpsKit. - Assign the included pipeline asset
Assets/Game/ProjectRenderSettings/PC_RPAsset.assetunder Project Settings → Graphics (and Quality), and set the colour space to Linear. - Add the scenes to Build Settings in this order:
Assets/HyperCasualLiveOpsKit/StarterMenu/Scenes/HLK_MainMenu.unity, thenAssets/Game/Scenes/Game.unity. - Open
HLK_MainMenuand press Play. PLAY NEXT LEVEL starts level 1, the guided tutorial.
Set Player Settings → Resolution to a portrait window (for example 540 × 960) for desktop testing. The game fits its board between the HLK top bar, the booster shelf and the banner lane on any portrait aspect.
Folder Structure
| Folder | Contents |
|---|---|
Game/Scripts/Core | Pure C# rules: GameSim (fixed 1/60 s simulation, dispatch, parking, boarding, crowd, timer, boosters, mystery reveal), LevelData (level JSON parser), geometry and JSON helpers. No UnityEngine references. |
Game/Scripts/Game | Unity presentation: GameController (input, clock, events), Viewport (code-built camera and portrait fit), vehicle/crowd/environment/effects views, HUD, tutorial hand. |
Game/Campaign | Pure C# campaign model: board templates, formation families, constructive generator, solver and policies, the frozen chapter progression. |
Game/Integration | HLK boundary: BusCrowdHlkBridge (level selection, settlement, rewards, sound cues), BusCrowdLevelSource, BusCrowdPowerUpAdapter and its three booster assets, the campaign menu binding. |
Game/CampaignLevels/Resources/Levels | The published campaign Level_1.json … Level_500.json plus CampaignAuthoring.json (editor authoring data). Loaded at runtime with Resources.Load("Levels/Level_N"). |
Game/Resources | The two recorded source levels (level-1, level-200), vehicle models, materials, the soft-toy shader and palette. |
Game/LevelTools, Game/ProductionLevelTools | Editor-only level editor and generator (Bus Crowd adapter + shared framework). |
Game/Scenes/Game.unity | Gameplay scene: the game root with the HLK gameplay overlay. The world, camera and HUD are built in code at runtime. |
Game/ProjectRenderSettings | URP pipeline/renderer assets used by the game. |
HyperCasualLiveOpsKit | Menu, results, economy, boosters UI, LiveOps and service interfaces; see its own manual. |
Gameplay
- Dispatch. Tap a bus. If nothing stands in its exit path and a bay is free, it drives to the bay. A blocked bus bumps the blocker and returns; with all four bays taken the tap is refused ("Slots Full").
- Boarding. The passenger at the front of the ring boards a parked bus of the same colour. Rows of four keep coming from one or two feeder arms. Long, medium and small buses hold different numbers of riders.
- Leaving. A full bus drives away and frees its bay. The level is won when every bus has left.
- Timer. Each level has an attempt time limit (from the level JSON, scaled by chapter). When it runs out the level is lost; TRY AGAIN restarts the attempt.
- Mystery buses (from chapter 5) show a “?” cover and cannot be dispatched until the stated number of other buses have left; then their colour is revealed.
- Tutorial. Level 1 guides the first four dispatches with a hand pointer.
Win/lose settlement goes through HLK once per attempt: a win credits the configured coin reward and opens the results overlay; a loss credits nothing. Gameplay sound cues (bus released, blocked tap, full bus, mystery reveal, win, lose) are played through the HLK sound bank and follow the Settings sound toggle.
Scripts Reference
| Type | Role |
|---|---|
BusCrowd.Core.GameSim | Deterministic rules. TapVehicle(i), Step(), events (SimEventKind), Phase, TimeLimit; booster effects CrowdShuffleEffect(), AirliftEffect(i), BusShuffleEffect(). |
BusCrowd.Core.LevelData | Parses the level JSON (see Level Format). |
BusCrowd.Game.GameController | Owns the simulation, maps pointer input to taps, advances the clock and raises OnSimEvent/LevelStarted. Integration seams: ExternalResults, ExternalBoosters, PointerBlocked, TapInterceptor, PlayRectProvider. |
BusCrowd.Game.Viewport | Builds the game camera in code and fits the depot column into the reserved play rectangle. |
BusCrowd.Integration.BusCrowdHlkBridge | Selects the HLK level, blocks gameplay input under overlays, settles results, emits buscrowd_level_end, plays semantic sound cues and hands the audio listener to the code-built camera. |
BusCrowd.Integration.BusCrowdLevelSource | Maps the HLK level index to Levels/Level_N. |
BusCrowd.Integration.BusCrowdPowerUpAdapter | Registers the three boosters with the HLK booster bar (effects + availability). |
BusCrowd.Campaign.* | Progression (chapters), Formations, Generator, Solver (Replay, Greedy, FindLosingRoute). |
Level Editor
The current preview draws vehicle lengths, widths and routes at the same fitted physical-world scale. Controls use normal editor layout so dummy Layout-event rectangles do not clip the control rows. Recorded evidence levels remain read-only in this canvas; their first-layout preview is guarded.
Open Tools → BusCrowd → Level Editor. The window lists all published levels with a live canvas preview of the depot (bus sizes, colours and headings, mystery marks), the crowd rows and the saved witness order.
- Validate selected checks the selected level's rules (every bus can leave, per-colour seats equal waiting passengers, bays and timer) and replays its saved witness to a win.
- Duplicate, Delete, Up/Down reorder the campaign; Undo reverts the last edit (up to 64).
- Apply data edit (invalidates witness) applies a hand edit of the level payload. The old witness no longer proves the edited level, so validation fails until a new proven order is stored (regenerate the level if needed).
- Play saved level opens the gameplay scene on the selected level.
- Validate + save validates the whole campaign first; publication is staged and swapped in one step, and an invalid or
cancelled save leaves the existing JSON untouched. Previous versions are kept under
Artifacts/Phase04/Backups. Reload discards unsaved edits.
Levels 1 and 200 are the recorded source levels and must stay in place; the campaign check refuses a save that moves them.
Automatic Level Generator
Open Tools → BusCrowd → Auto Level Generator (the same window; the generator controls are in the lower
panel). The saved request holds count, seed, attemptsPerLevel,
minimumFormations, maximumRepeatStreak and append. In a fresh project it is recreated from
the campaign's own CampaignAuthoring.json.
Generation is constructive: it picks a formation for the level's chapter, builds a blocking order from the real sweep rules,
generates the crowd sequence (with decoys), and proves a witness dispatch order by replaying it through the actual
GameSim. A candidate that fails validation or its witness is retried. With append on, existing levels
are kept byte-for-byte and only new ones are added (for example count 502 appends levels 501–502). The same seed reproduces
the same campaign. Generate into editor (review, then save) fills the editor with the result; nothing is published until
Validate + save. Save request stores the settings.
Boosters
| Booster | Effect | Start count |
|---|---|---|
| Crowd Shuffle | Brings a row of a parked bus's colour forward in the queue (instant). Refused when no row matches. | 2 on unlock |
| Balloon | Arm, then tap a blocked bus: it is lifted straight into a free bay. Missed taps and hidden buses keep it armed at no cost; a second press cancels. | 2 on unlock |
| Bus Shuffle | Swaps equal-size waiting buses in a short staggered flight; taps wait until they land. | 2 on unlock |
Crowd Shuffle, Balloon and Bus Shuffle unlock at player levels 2, 7 and 12 respectively. Each receives two initial uses and is consumed once per successful activation. The current progression policy is included in the current-delivery section; per-booster offer overrides take precedence. Counts, prices and unlock level are defined in
Game/Integration/PowerUps/*.asset and the HLK power-up catalog.
Level Variation
The campaign has nine chapters: First taps, Blocked paths, Cars and decoys, Two arms, Mystery buses, Dense depots, Super hard, Master depots and Grand master. Chapters raise the bus count (4–6 in chapter 1 up to 60–84 in chapter 9), colours, blocking depth, decoy ratio and mystery buses, and tighten the time factor; recovery levels follow difficulty peaks. Two board templates (A: large buses, B: the Level 200 depot), three crowd topologies (left arm, right arm, both arms) and twelve formation families with dense variants give 190 distinct depot formations in the current campaign with no formation repeated more than twice in a row.
Customization Guide
- Win reward, menu copy, level count:
HyperCasualLiveOpsKit/StarterMenu/Resources/HLK/StarterMenuConfig.asset. - Economy, ads, purchases, services:
HLKSettings(see the kit manual). Replace LocalQA/mock providers with real ones before release. - Colours and palette:
Game/Resources/palette.json. - Vehicle models:
Game/Resources/Generated/*.glb; the procedural fallback is used whenGeneratedModels.Enabledis false. - Timing: per-level
timeLimitSecondsand the chapter time factor inCampaign/Progression.cs. - New levels: use the editor/generator rather than editing JSON by hand, so each level keeps a proven witness.
Level Format
Each level is one JSON file. Coordinates are normalised to the portrait design frame. Key fields:
vehicles (id, colour, size, capacity, x, y, headingDeg, length, width), slots (the four bays),
crowd (rowSize, the ring path and its queued rows as [colour, row count], feeder arms),
timeLimitSeconds, mystery (bus id + reveal count), generator (formation provenance) and
solution (the proven witness order and its duration). Below is the complete published Level_4.json:
{
"schemaVersion": 1,
"id": "Level_4",
"number": 4,
"caption": "LEVEL 4",
"design": {
"aspect": [
9,
20
],
"unitsPerHeight": 20,
"cameraPitchDeg": 60
},
"generator": {
"board": "B",
"topology": "Double",
"big": true,
"family": "echelon",
"cols": 3,
"rows": 6,
"headings": "24-72e58685",
"seed": 1621612758,
"source": "generated",
"route": "stadium"
},
"vehicles": [
{
"id": "V01",
"colour": "red",
"size": "long",
"capacity": 40,
"x": 0.5792,
"y": 0.4998,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V02",
"colour": "purple",
"size": "long",
"capacity": 40,
"x": 0.6682,
"y": 0.5198,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V03",
"colour": "blue",
"size": "long",
"capacity": 40,
"x": 0.7572,
"y": 0.5399,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V04",
"colour": "green",
"size": "car",
"capacity": 16,
"x": 0.467,
"y": 0.5755,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V05",
"colour": "blue",
"size": "car",
"capacity": 16,
"x": 0.5561,
"y": 0.5955,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V06",
"colour": "yellow",
"size": "long",
"capacity": 40,
"x": 0.6451,
"y": 0.6155,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V07",
"colour": "blue",
"size": "car",
"capacity": 16,
"x": 0.3549,
"y": 0.6512,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V08",
"colour": "blue",
"size": "long",
"capacity": 40,
"x": 0.4439,
"y": 0.6712,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V09",
"colour": "purple",
"size": "car",
"capacity": 16,
"x": 0.533,
"y": 0.6912,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V10",
"colour": "red",
"size": "car",
"capacity": 16,
"x": 0.2428,
"y": 0.7268,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V11",
"colour": "green",
"size": "long",
"capacity": 40,
"x": 0.3318,
"y": 0.7469,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
}
],
"lot": {
"rect": [
0,
0.425,
1,
0.8417
]
},
"road": {
"laneV": 0.4167,
"departLaneV": 0.4278,
"topV": 0.3125,
"bottomV": 0.4417,
"exitEdge": "left"
},
"slots": {
"count": 4,
"lockedCount": 3,
"tiltDeg": 15,
"parkedHeadingDeg": -75,
"centers": [
[
0.2516,
0.375
],
[
0.3459,
0.375
],
[
0.4371,
0.375
],
[
0.5283,
0.375
]
],
"locked": [
[
0.6195,
0.375
],
[
0.7107,
0.375
],
[
0.8019,
0.375
]
],
"size": [
0.623,
1.444
],
"counterOffsetV": -0.0111
},
"hud": {
"speedPill": {
"u": 0.9026,
"v": 0.306,
"w": 0.177,
"h": 0.037
},
"caption": {
"u": 0.5,
"v": 0.06
}
},
"bushes": [
[
0.1101,
0.2639
],
[
0.8899,
0.2639
]
],
"speedPill": {
"initial": 1,
"multipliers": {
"1": 1,
"2": 1.93,
"3": 2.78
},
"holdToTripleSeconds": 0.25
},
"crowd": {
"rowSize": 4,
"rowPitchUnits": 0.2586,
"speedUnitsPerSec": 0.9815,
"ring": {
"path": [
[
0.5157,
0.2917
],
[
0.4843,
0.2919
],
[
0.453,
0.2924
],
[
0.4216,
0.2927
],
[
0.3902,
0.2926
],
[
0.359,
0.2913
],
[
0.3282,
0.289
],
[
0.3021,
0.2826
],
[
0.29,
0.2714
],
[
0.2842,
0.2594
],
[
0.2811,
0.2472
],
[
0.2829,
0.235
],
[
0.2891,
0.223
],
[
0.3017,
0.2119
],
[
0.3281,
0.2057
],
[
0.359,
0.2036
],
[
0.3902,
0.2024
],
[
0.4216,
0.2023
],
[
0.4529,
0.2026
],
[
0.4843,
0.203
],
[
0.5157,
0.2032
],
[
0.5471,
0.203
],
[
0.5785,
0.2026
],
[
0.6098,
0.2023
],
[
0.6412,
0.2024
],
[
0.6724,
0.2036
],
[
0.7033,
0.2057
],
[
0.7297,
0.2119
],
[
0.7423,
0.223
],
[
0.7485,
0.235
],
[
0.7503,
0.2472
],
[
0.7472,
0.2594
],
[
0.7414,
0.2714
],
[
0.7293,
0.2826
],
[
0.7032,
0.289
],
[
0.6724,
0.2913
],
[
0.6412,
0.2926
],
[
0.6098,
0.2927
],
[
0.5784,
0.2924
],
[
0.5471,
0.2919
]
],
"closed": true,
"exitIndex": 0,
"direction": "clockwise",
"rows": [
[
"blue",
3
],
[
"green",
1
],
[
"blue",
5
],
[
"purple",
1
],
[
"green",
1
],
[
"blue",
1
],
[
"purple",
2
],
[
"blue",
1
],
[
"purple",
6
],
[
"red",
2
],
[
"purple",
1
],
[
"red",
1
],
[
"blue",
3
],
[
"green",
4
],
[
"red",
10
],
[
"blue",
1
],
[
"red",
1
]
],
"phaseOffsetUnits": -0.1093,
"junctions": {
"left": [
0.3008,
0.2127
],
"right": [
0.7306,
0.2127
]
}
},
"feeders": [
{
"id": "left",
"junction": "left",
"path": [
[
0.0957,
0.0232
],
[
0.0954,
0.0389
],
[
0.095,
0.0546
],
[
0.0949,
0.0703
],
[
0.096,
0.0859
],
[
0.0974,
0.1016
],
[
0.1,
0.1173
],
[
0.1055,
0.1328
],
[
0.1149,
0.1481
],
[
0.1286,
0.1628
],
[
0.1491,
0.1763
],
[
0.1759,
0.1879
],
[
0.2091,
0.1967
],
[
0.3008,
0.2127
]
],
"rows": [
[
"blue",
8
],
[
"yellow",
1
],
[
"green",
1
],
[
"blue",
1
],
[
"green",
1
],
[
"yellow",
1
],
[
"green",
4
],
[
"yellow",
2
],
[
"blue",
2
],
[
"green",
2
]
]
},
{
"id": "right",
"junction": "right",
"path": [
[
0.9357,
0.0232
],
[
0.936,
0.0389
],
[
0.9364,
0.0546
],
[
0.9365,
0.0703
],
[
0.9354,
0.0859
],
[
0.934,
0.1016
],
[
0.9314,
0.1173
],
[
0.9259,
0.1328
],
[
0.9165,
0.1481
],
[
0.9028,
0.1628
],
[
0.8823,
0.1763
],
[
0.8555,
0.1879
],
[
0.8223,
0.1967
],
[
0.7306,
0.2127
]
],
"rows": [
[
"blue",
1
],
[
"yellow",
1
],
[
"blue",
2
],
[
"purple",
1
],
[
"yellow",
5
],
[
"purple",
3
]
]
}
],
"exit": {
"u": 0.5157,
"v": 0.2917
}
},
"timing": {
"vehicleSpeedUnitsPerSec": 17.222,
"exitSpeedUnitsPerSec": 21,
"laneSpeedUnitsPerSec": 15,
"parkSeconds": 0.2,
"reverseOutSeconds": 0.4,
"reverseOutUnits": 1.245,
"departSpeedUnitsPerSec": 14.444,
"bumpSpeedUnitsPerSec": 17.222,
"bumpFlashSeconds": 0.07,
"bumpBurstSeconds": 0.35,
"slotsFullPopupSeconds": 0.6,
"slotsFullFadeSeconds": 0.1,
"slotBlinkPeriod": 1,
"slotBlinkOn": 0.3,
"winDelayAfterLastDeparture": 1.56,
"flashToConfetti": 0.04,
"confettiSeconds": 0.3
},
"timeLimitSeconds": 90,
"mystery": [],
"solution": {
"order": [
"V01",
"V04",
"V07",
"V10",
"V02",
"V05",
"V08",
"V11",
"V03",
"V06",
"V09"
],
"seconds": 24.2
}
}Support
Contact satisvizion@gmail.com with the Unity version, the level number and reproducible steps. Do not send account credentials. Read AI-DISCLOSURE.txt for the provenance items the owner must confirm.
Licences and Notices
The packaged Third-Party Notices.txt records the verified dependency inventory and unresolved provenance. Owner confirmation of original supplied asset rights remains required.
Current delivery and examples
Unity 6000.0.62f1 / URP. Support: satisvizion@gmail.com.
Buyer roots: Assets/Game, 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/BusCrowd/Documentation, Tools/BusCrowd/Level Editor, Tools/BusCrowd/Auto Level Generator.
Current complete level example
Assets/Game/CampaignLevels/Resources/Levels/Level_4.json
{
"schemaVersion": 1,
"id": "Level_4",
"number": 4,
"caption": "LEVEL 4",
"design": {
"aspect": [
9,
20
],
"unitsPerHeight": 20,
"cameraPitchDeg": 60
},
"generator": {
"board": "B",
"topology": "Double",
"big": true,
"family": "echelon",
"cols": 3,
"rows": 6,
"headings": "24-72e58685",
"seed": 1621612758,
"source": "generated",
"route": "stadium"
},
"vehicles": [
{
"id": "V01",
"colour": "red",
"size": "long",
"capacity": 40,
"x": 0.5792,
"y": 0.4998,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V02",
"colour": "purple",
"size": "long",
"capacity": 40,
"x": 0.6682,
"y": 0.5198,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V03",
"colour": "blue",
"size": "long",
"capacity": 40,
"x": 0.7572,
"y": 0.5399,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V04",
"colour": "green",
"size": "car",
"capacity": 16,
"x": 0.467,
"y": 0.5755,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V05",
"colour": "blue",
"size": "car",
"capacity": 16,
"x": 0.5561,
"y": 0.5955,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V06",
"colour": "yellow",
"size": "long",
"capacity": 40,
"x": 0.6451,
"y": 0.6155,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V07",
"colour": "blue",
"size": "car",
"capacity": 16,
"x": 0.3549,
"y": 0.6512,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V08",
"colour": "blue",
"size": "long",
"capacity": 40,
"x": 0.4439,
"y": 0.6712,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
},
{
"id": "V09",
"colour": "purple",
"size": "car",
"capacity": 16,
"x": 0.533,
"y": 0.6912,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V10",
"colour": "red",
"size": "car",
"capacity": 16,
"x": 0.2428,
"y": 0.7268,
"headingDeg": 60,
"length": 1.0668,
"width": 0.5224
},
{
"id": "V11",
"colour": "green",
"size": "long",
"capacity": 40,
"x": 0.3318,
"y": 0.7469,
"headingDeg": 60,
"length": 1.778,
"width": 0.685
}
],
"lot": {
"rect": [
0,
0.425,
1,
0.8417
]
},
"road": {
"laneV": 0.4167,
"departLaneV": 0.4278,
"topV": 0.3125,
"bottomV": 0.4417,
"exitEdge": "left"
},
"slots": {
"count": 4,
"lockedCount": 3,
"tiltDeg": 15,
"parkedHeadingDeg": -75,
"centers": [
[
0.2516,
0.375
],
[
0.3459,
0.375
],
[
0.4371,
0.375
],
[
0.5283,
0.375
]
],
"locked": [
[
0.6195,
0.375
],
[
0.7107,
0.375
],
[
0.8019,
0.375
]
],
"size": [
0.623,
1.444
],
"counterOffsetV": -0.0111
},
"hud": {
"speedPill": {
"u": 0.9026,
"v": 0.306,
"w": 0.177,
"h": 0.037
},
"caption": {
"u": 0.5,
"v": 0.06
}
},
"bushes": [
[
0.1101,
0.2639
],
[
0.8899,
0.2639
]
],
"speedPill": {
"initial": 1,
"multipliers": {
"1": 1,
"2": 1.93,
"3": 2.78
},
"holdToTripleSeconds": 0.25
},
"crowd": {
"rowSize": 4,
"rowPitchUnits": 0.2586,
"speedUnitsPerSec": 0.9815,
"ring": {
"path": [
[
0.5157,
0.2917
],
[
0.4843,
0.2919
],
[
0.453,
0.2924
],
[
0.4216,
0.2927
],
[
0.3902,
0.2926
],
[
0.359,
0.2913
],
[
0.3282,
0.289
],
[
0.3021,
0.2826
],
[
0.29,
0.2714
],
[
0.2842,
0.2594
],
[
0.2811,
0.2472
],
[
0.2829,
0.235
],
[
0.2891,
0.223
],
[
0.3017,
0.2119
],
[
0.3281,
0.2057
],
[
0.359,
0.2036
],
[
0.3902,
0.2024
],
[
0.4216,
0.2023
],
[
0.4529,
0.2026
],
[
0.4843,
0.203
],
[
0.5157,
0.2032
],
[
0.5471,
0.203
],
[
0.5785,
0.2026
],
[
0.6098,
0.2023
],
[
0.6412,
0.2024
],
[
0.6724,
0.2036
],
[
0.7033,
0.2057
],
[
0.7297,
0.2119
],
[
0.7423,
0.223
],
[
0.7485,
0.235
],
[
0.7503,
0.2472
],
[
0.7472,
0.2594
],
[
0.7414,
0.2714
],
[
0.7293,
0.2826
],
[
0.7032,
0.289
],
[
0.6724,
0.2913
],
[
0.6412,
0.2926
],
[
0.6098,
0.2927
],
[
0.5784,
0.2924
],
[
0.5471,
0.2919
]
],
"closed": true,
"exitIndex": 0,
"direction": "clockwise",
"rows": [
[
"blue",
3
],
[
"green",
1
],
[
"blue",
5
],
[
"purple",
1
],
[
"green",
1
],
[
"blue",
1
],
[
"purple",
2
],
[
"blue",
1
],
[
"purple",
6
],
[
"red",
2
],
[
"purple",
1
],
[
"red",
1
],
[
"blue",
3
],
[
"green",
4
],
[
"red",
10
],
[
"blue",
1
],
[
"red",
1
]
],
"phaseOffsetUnits": -0.1093,
"junctions": {
"left": [
0.3008,
0.2127
],
"right": [
0.7306,
0.2127
]
}
},
"feeders": [
{
"id": "left",
"junction": "left",
"path": [
[
0.0957,
0.0232
],
[
0.0954,
0.0389
],
[
0.095,
0.0546
],
[
0.0949,
0.0703
],
[
0.096,
0.0859
],
[
0.0974,
0.1016
],
[
0.1,
0.1173
],
[
0.1055,
0.1328
],
[
0.1149,
0.1481
],
[
0.1286,
0.1628
],
[
0.1491,
0.1763
],
[
0.1759,
0.1879
],
[
0.2091,
0.1967
],
[
0.3008,
0.2127
]
],
"rows": [
[
"blue",
8
],
[
"yellow",
1
],
[
"green",
1
],
[
"blue",
1
],
[
"green",
1
],
[
"yellow",
1
],
[
"green",
4
],
[
"yellow",
2
],
[
"blue",
2
],
[
"green",
2
]
]
},
{
"id": "right",
"junction": "right",
"path": [
[
0.9357,
0.0232
],
[
0.936,
0.0389
],
[
0.9364,
0.0546
],
[
0.9365,
0.0703
],
[
0.9354,
0.0859
],
[
0.934,
0.1016
],
[
0.9314,
0.1173
],
[
0.9259,
0.1328
],
[
0.9165,
0.1481
],
[
0.9028,
0.1628
],
[
0.8823,
0.1763
],
[
0.8555,
0.1879
],
[
0.8223,
0.1967
],
[
0.7306,
0.2127
]
],
"rows": [
[
"blue",
1
],
[
"yellow",
1
],
[
"blue",
2
],
[
"purple",
1
],
[
"yellow",
5
],
[
"purple",
3
]
]
}
],
"exit": {
"u": 0.5157,
"v": 0.2917
}
},
"timing": {
"vehicleSpeedUnitsPerSec": 17.222,
"exitSpeedUnitsPerSec": 21,
"laneSpeedUnitsPerSec": 15,
"parkSeconds": 0.2,
"reverseOutSeconds": 0.4,
"reverseOutUnits": 1.245,
"departSpeedUnitsPerSec": 14.444,
"bumpSpeedUnitsPerSec": 17.222,
"bumpFlashSeconds": 0.07,
"bumpBurstSeconds": 0.35,
"slotsFullPopupSeconds": 0.6,
"slotsFullFadeSeconds": 0.1,
"slotBlinkPeriod": 1,
"slotBlinkOn": 0.3,
"winDelayAfterLastDeparture": 1.56,
"flashToConfetti": 0.04,
"confettiSeconds": 0.3
},
"timeLimitSeconds": 90,
"mystery": [],
"solution": {
"order": [
"V01",
"V04",
"V07",
"V10",
"V02",
"V05",
"V08",
"V11",
"V03",
"V06",
"V09"
],
"seconds": 24.2
}
}Level fields
| Field | JSON type |
|---|---|
| schemaVersion | int |
| id | str |
| number | int |
| caption | str |
| design | dict |
| generator | dict |
| vehicles | list |
| lot | dict |
| road | dict |
| slots | dict |
| hud | dict |
| bushes | list |
| speedPill | dict |
| crowd | dict |
| timing | dict |
| timeLimitSeconds | int |
| mystery | list |
| solution | dict |
Safe worked editing procedure
- Open Level 4 in the Level Editor, duplicate it and move the duplicate to the end. Preserve the recorded source levels at positions 1 and 200 before saving.
- Use the editor’s supported controls for a small placement change; keep legal occupancy and required targets. Do not invent JSON fields.
- Run the shipped validator, correct any rule errors, save, then open the duplicate in gameplay and complete it.
- 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,
"game": "buscrowd",
"profile": "local",
"campaignLevels": 500,
"initialGrant": 2,
"refillAmount": 1,
"baseCoinCost": 100,
"coinCostStep": 25,
"levelsPerPriceStep": 10,
"boosters": [
{
"id": "buscrowd_crowd_shuffle",
"unlockLevel": 2,
"rewardedPlacement": "booster_refill_buscrowd_crowd_shuffle",
"baseCoinCost": 0,
"coinCostStep": 0,
"reason": "Default first slot. No target to pick: one tap trades waiting rows so they match parked buses, the easiest booster to teach."
},
{
"id": "buscrowd_balloon",
"unlockLevel": 7,
"rewardedPlacement": "booster_refill_buscrowd_balloon",
"baseCoinCost": 0,
"coinCostStep": 0,
"reason": "Default second slot. The first targeted booster (pick a blocked bus and lift it into a free bay) once the bar is familiar."
},
{
"id": "buscrowd_bus_shuffle",
"unlockLevel": 12,
"rewardedPlacement": "booster_refill_buscrowd_bus_shuffle",
"baseCoinCost": 0,
"coinCostStep": 0,
"reason": "Default third slot. Swaps equal-size buses across the depot; most useful once boards are dense enough to have several."
}
]
}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.