The experience toolkit lets creators build a focused scored shift, an authored Night Shift sequence or a separate campaign. Multiplayer reuses compatible shared call content through a private modded lobby with an agreement step. It does not turn every single-player challenge or campaign into a multiplayer scenario.
Install and enable a pack using Profiles and saved games. Its challenges and campaigns appear under Community Experiences on the title screen. The catalog previews the authored calls/chapters and objectives. Studio playtest buttons enter scratch runs; the normal catalog records eligible custom results or campaign saves.
Shared shift configuration
This config fragment selects a short deterministic pool:
{
"label": "Router desk",
"intro": "Keep every household connected.",
"calls": 6,
"minGapSec": 5,
"callTimeTarget": 120,
"scenarioIds": ["ROUTER_RESTART", "KB_ERROR_CALL"],
"scenarioWeights": {"ROUTER_RESTART": 3, "KB_ERROR_CALL": 1},
"specials": []
}
The referenced scenarios must be supplied by the full pack or available dependencies/stock content. This is not a standalone pack.
| Field | Bounds/meaning |
|---|---|
calls |
Integer 1–100; total scheduled call count. |
minGapSec |
1–600 seconds between scheduled calls. |
callTimeTarget |
10–1,800 seconds, the authored handling target. |
label, intro |
Optional authored plain text, up to 10,000 characters. |
scenarioIds |
Optional selected regular-call pool; if present, nonempty and at most 100 references. |
scenarioWeights |
Optional map, at most 100 scenario references with finite weights 0–100. |
specials |
Optional explicit scheduled calls, at most 100 references and no more than calls. |
A weight of zero excludes the specified scenario. Unspecified weights inherit the scenario's own weight. Relative weights affect selection, not a guaranteed quota. Make sure a valid eligible pool remains after minimum-day checks and exclusions. Fixed explicit specials count within the configured total rather than adding unbounded extra calls.
The same configuration structure is used by shift challenges, custom Night Shift waves and authored campaign days. Stock career dayConfigs has its own separate bounds and only overrides days one to five.
Starting resources and equipment
Optional start supplies bank (0–100,000), stress (0–99), and upgrades. Upgrades reference stock equipment and a tier from zero to the table's maximum:
| Equipment ID | Maximum tier |
|---|---|
coffee |
3 |
chair |
3 |
headset |
3 |
callerid |
2 |
kbindex |
2 |
holdmusic |
1 |
queue |
1 |
union |
1 |
Tier zero supplies no upgrade. A tier higher than the supported stock count is invalid. A starting bank is an authored resource, not a transfer from the player's regular career. Choose equipment that makes the challenge's expected route usable; requiring a capability without its necessary equipment can create an accidental soft lock.
Optional challenge effects uses the existing modifier whitelist: pay, resolution pay, risk, strike, sip/stress multipliers, ring gap/call count multipliers, mood, surreal chance, stress floor, VIP/irate flags and break/focus disable flags. The full names/ranges are in Content reference. Unknown coefficients are rejected.
Objectives and completion conditions
Objectives describe evaluated result thresholds. A challenge has an objectives array containing at most 16 entries with id, label, metric, op, finite value. Metric choices are resolved, taken, csat, stress, strikes, score, waves. Operators are >=, <=, >, <, ==.
Use readable labels that match the metric: “Resolve all six calls” with resolved ≥6, or “Finish with stress at most 30” with stress ≤30. Objectives do not create new mechanics merely from their label. A text label saying “never put a caller on hold” would be misleading because hold count is not among these objective metrics.
Night Shift score is the average score across completed waves. CSAT covers completed calls across waves. waves counts completed hours, not the wave currently in progress. A challenge can also declare bounded failureWhen or completionWhen conditions. These are evaluated after call completion, separate from the objective labels. Failure ends the owned run; early completion stops further scheduling and goes through normal wrap-up/clock-out. Otherwise a shift challenge ends at shift end and a custom Night Shift ends at its wave limit.
Example shift challenge
This is a challenges section fragment. Supply ROUTER_RESTART as in Your first mod and include challenge in the manifest modes:
[
{
"id": "router-rush",
"name": "Router rush",
"description": "Resolve four router calls while keeping stress under control.",
"mode": "shift",
"seed": 4101,
"config": {"calls": 4, "minGapSec": 5, "callTimeTarget": 100, "scenarioIds": ["ROUTER_RESTART"]},
"start": {"bank": 25, "stress": 10, "upgrades": {"headset": 1, "coffee": 1}},
"effects": {"stressMul": 0.9},
"objectives": [
{"id": "fixes", "label": "Resolve every call", "metric": "resolved", "op": ">=", "value": 4},
{"id": "calm", "label": "Finish at stress 30 or lower", "metric": "stress", "op": "<=", "value": 30}
],
"failureWhen": {"field": "strikes", "op": ">=", "value": 3}
}
]
mode is shift or nightshift, defaulting to shift if omitted. Optional seed is an unsigned 32-bit integer including zero. Reproducible scheduling helps compare difficulty, but equipment, responses and conditions still affect the result. Optional rules use the event/condition/effect contract in Stories and campaigns.
Do not promise a global Workshop leaderboard: custom results use a separate local record. The game tracks run count, best score and the latest 20 results per experience. A normal custom run can update those records; a Studio scratch test cannot. Challenge runs are not saved mid-run.
Custom Night Shift waves
nightshiftWaves is an array of up to 100 authored wave definitions. A wave needs id plus a valid shift configuration. nightshiftMemos contains up to 100 memos with id, name, desc and whitelisted effects. A Night Shift challenge references wave/memo IDs in its waves and memos arrays, each with at most 100 entries.
This content fragment provides two waves and one memo; it assumes the referenced router call exists:
{
"nightshiftWaves": [
{"id": "first-hour", "label": "First hour", "intro": "Start with a steady queue.", "calls": 2, "minGapSec": 6, "callTimeTarget": 120, "scenarioIds": ["ROUTER_RESTART"]},
{"id": "last-hour", "label": "Last hour", "intro": "Clear the final queue.", "calls": 3, "minGapSec": 4, "callTimeTarget": 100, "scenarioIds": ["ROUTER_RESTART"]}
],
"nightshiftMemos": [
{"id": "quiet-confidence", "name": "Quiet confidence", "desc": "Calmer calls and less stress, with lower pay.", "effects": {"moodDelta": 8, "stressMul": 0.8, "payMul": 0.9}}
],
"challenges": [
{
"id": "last-router",
"name": "The last router",
"mode": "nightshift",
"config": {"calls": 2, "minGapSec": 6, "callTimeTarget": 120, "scenarioIds": ["ROUTER_RESTART"]},
"waves": ["first-hour", "last-hour"],
"memos": ["quiet-confidence"],
"maxWaves": 2,
"start": {"bank": 0, "stress": 15, "upgrades": {"coffee": 1}},
"objectives": [{"id": "finish-night", "label": "Finish both hours", "metric": "waves", "op": ">=", "value": 2}]
}
]
}
Waves run in authored order. maxWaves is an integer 1–100; if omitted, the supplied wave count is used where available. Test the chosen limit against your available waves and fallback configuration. Memos are offered between waves and their approved effects stack. Their text should state the actual tradeoff instead of claiming unsupported abilities.
Custom Night Shift uses separate result records. It does not bank stock Overtime Tokens or update stock Night Shift bests. The player's ordinary Night Shift meta-progression is not the reward channel for an authored custom run. For stock Night Shift play, see Night Shift player guide.
Private modded co-op
Private modded co-op is a distinct lobby choice. A standard lobby keeps its standard content policy. For a modded lobby:
- Enable compatible gameplay packs in the profile you intend to share.
- Choose Multiplayer → Host → Private Modded Co-op.
- Select the profile and create the private lobby.
- Invite teammates or share the lobby code.
- Let each peer install/import the displayed requirements, recheck and become Ready.
- Start after everyone agrees to the same frozen gameplay content.
Gameplay packs must explicitly include multiplayer in manifest modes. The Calls starter can supply shared added calls. Standalone campaigns, challenge rules and custom Night Shift experiences remain their own single-player modes; multiplayer support does not automatically convert their objectives, saves or story sequence into co-op.
The host displays required pack IDs, versions and hashes. Subscribe & Download Required Packs requests Workshop requirements and reports installation progress. For a local-only requirement, the host must share a matching exported ZIP and each peer imports it. Recheck Installed Packs verifies the selected content before Ready. Subscription alone is insufficient while the download is incomplete.
What must match and what can remain local?
Multiplayer checks the actual game/API compatibility, pack identity/version, gameplay content and effective ordered requirement set. It uses a gameplay hash distinct from single-player's full content hash. Shared gameplay includes calls, articles, actions, mail, modifiers, experience-related data and local trophy definitions; presentation dictionaries, voice replacements and office appearances are excluded from that gameplay hash.
Consequently, a local ZIP can satisfy a requirement originating from Workshop when its identity/version/gameplay content matches. The originating Workshop item ID is a delivery hint, not the only acceptable source. A same-named edited pack is not enough, and changing just the version string does not bypass the hash check.
Players can retain presentation-only packs from their active local profile, provided those packs support multiplayer and do not declare gameplay content. Language, recording and office preferences can differ between peers without changing the shared calls. A mixed pack containing both cosmetic and gameplay changes is still a shared gameplay requirement; describe its capabilities honestly.
Before a peer becomes Ready, required content is frozen. The host also freezes its selection before starting. A Workshop update arriving afterward does not replace the files already agreed for that match. Changing or refreshing the host profile invalidates readiness and sends new requirements; every peer must recheck the new set. Keep the profile fixed while assembling a group to avoid repeated readiness resets.
Private modded match scores are session-only, using multiplayer's scratch-save policy. They do not write a career, campaign progress or stock awards. Do not advertise campaign save transfer, persistent shared worlds or an arbitrary multiplayer scripting API through this toolkit.
Multiplayer test checklist
Use two computers/accounts for the real delivery test. Check subscription download, local ZIP matching, an intentionally wrong version, changed data under the same version, missing dependency, invalid multiplayer mode, Ready invalidation after a host refresh, disconnect/rejoin and an update during an active frozen match. Verify cosmetic differences do not change the requirement agreement.
Local automated protocol checks are useful, but successful simulated networking does not establish a successful two-account Steam session. At the time of this manual's implementation, live Workshop upload/download and two-PC multiplayer verification remain pending. Treat that as the current validation boundary and record real account/device results when publishing your pack.
