169 lines
13 KiB
JSON
169 lines
13 KiB
JSON
{
|
|
"_comment": "The QUESTS console (deck slot right of SHIP, main deck + surface deck). The window mirrors the RESEARCH/MAP consoles (js/ui/QuestWindow.js): a 2:3 archive feed (assets/videos/quests.mp4 — the same aspect as assets/videos/research.mp4; NO SIGNAL plate until the clip is authored) on the left, and on the right the category tabs (Main Story / Side Quests — side quests are not defined yet: the tab is a STANDBY socket), a THIN list of active quests, and the big detail plate below it: title, issuer, description, the requirement checklist, and the reward, with the CLAIM action. A quest's progress is evaluated LIVE from the run (research, lifetime minerals mined from asteroids, the home tether's level, discovery) and, once a step reads DONE, it is recorded on the ledger and stays done (monotonic — the home tether's step keeps standing after the ship leaves the home system). js/quests/QuestState.js tracks who holds which quest, which reward has been claimed, and which steps have stood — and that is what gets saved.",
|
|
"enabled": true,
|
|
"title": "OPERATIONS DOSSIER",
|
|
"meta": "MISSION LOG // ACTIVE CONTRACTS",
|
|
"video": {
|
|
"file": "quests.mp4",
|
|
"_comment": "The archive feed (assets/videos/). quests.mp4 mirrors the 2:3 aspect of research.mp4 — fit the same way.",
|
|
"aspect": [2, 3]
|
|
},
|
|
"sweep": {
|
|
"_comment": "The band that crawls down the feed (the research/map console's sweep, tuned for this window).",
|
|
"enabled": true,
|
|
"intervalMs": [5200, 9800],
|
|
"durationMs": [1400, 2200]
|
|
},
|
|
"glitch": {
|
|
"enabled": true,
|
|
"intervalMs": [4200, 9200],
|
|
"durationMs": [110, 260],
|
|
"slices": [1, 4],
|
|
"maxOffset": 9
|
|
},
|
|
"tabs": [
|
|
{
|
|
"id": "main",
|
|
"label": "Main Story",
|
|
"accent": "#00e5ff",
|
|
"_comment": "The campaign's spine. Live — the starter quest is granted on the run's first boot."
|
|
},
|
|
{
|
|
"id": "side",
|
|
"label": "Side Quests",
|
|
"accent": "#ffc94d",
|
|
"standby": true,
|
|
"_comment": "The socket for side quests — deferred by design. Pressing it toasts the standby note until side quests are authored (quests.json → quests, category 'side')."
|
|
}
|
|
],
|
|
"sideStandbyNote": "SIDE QUESTS OFFLINE — NO CONTRACTS ON FILE YET",
|
|
"starterToast": {
|
|
"_comment": "The one-shot note when a quest lands on the ledger — the starter on the run's first boot (GameScene.create) and an unlock grant (leaving_the_nest, when the starter's reward is claimed — GameScene._grantUnlockedQuests).",
|
|
"glyph": "◆",
|
|
"color": "#ffc94d",
|
|
"text": "NEW QUEST — {title}"
|
|
},
|
|
"readyToast": {
|
|
"glyph": "◆",
|
|
"color": "#ffc94d",
|
|
"text": "QUEST READY — {title} · CLAIM ITS REWARD"
|
|
},
|
|
"claimToast": {
|
|
"glyph": "✓",
|
|
"color": "#67e863",
|
|
"text": "REWARD CLAIMED — {reward}"
|
|
},
|
|
"claimDenyToast": {
|
|
"glyph": "✗",
|
|
"color": "#ff5c77",
|
|
"text": "REQUIREMENTS INCOMPLETE — {missing}"
|
|
},
|
|
"capitalDenyToast": {
|
|
"_comment": "The capital world's landing gate (js/scenes/GameScene.js → startLanding — _capitalLandingBlocked): the 'Leaving the Nest' reward must be CLAIMED before the player can land on the neutral capital world (the quest completes when the ship arrives at the planet; the claim is the last step before the world opens). A landing request before the claim is this flat denial on the console (the comms panel already closed — the toast is the ack; the ✗ mark reads the deny).",
|
|
"glyph": "✗",
|
|
"color": "#ff5c77",
|
|
"text": "REQUEST DENIED. PLEASE CLAIM YOUR QUEST REWARD FIRST."
|
|
},
|
|
"tracker": {
|
|
"_comment": "The QUEST TRACKER HUD (js/ui/QuestTrackerHud.js) — the thin quest list that slides in from offscreen-left right below the system dossier ONCE the dossier has folded (auto-fold or the player's manual fold — first fold arms it; visible ⇔ dossier folded). ACTIVE = held + not claimed. Titles stack main-story-first then side-quests, up to maxVisible, the priority quest's checklist renders under its title and tracks LIVE (GameScene.questSnapshot); more than maxVisible → SHOW MORE (opens the QUESTS console on the first hidden quest). The ONE priority quest (js/quests/QuestState.js): the player sets/clears it (row popup + the console's SET PRIORITY), else the first active story quest is the priority; claiming it auto-advances to the next story/side quest. priorityToast/clearToast fire on set/clear (data colors: green = the tracker accent, dim = the cleared note).",
|
|
"enabled": true,
|
|
"title": "QUESTS",
|
|
"noneTracked": "NONE TRACKED",
|
|
"showMore": "SHOW MORE",
|
|
"maxVisible": 5,
|
|
"slideMs": 320,
|
|
"shimmer": {
|
|
"_comment": "The READY row's DUAL-SHIMMER rim (js/ui/PerimeterShimmer.js): a constant amber base rim + soft glow, and two comets in counter-streams around the plate's cut-corner perimeter (comets[0] amber clockwise, comets[1] neon cyan counter-clockwise) — they cross twice per cycle. Runs until the reward is claimed: the row drops off with a one-shot rim flash (claimFlashMs). periodMs = one full lap; dashFrac = a comet's dash as a fraction of the perimeter; phaseOffsetPerRow staggers simultaneous READY rows; notch = the READY plate's corner-cut (the console's CLAIM plate in miniature).",
|
|
"enabled": true,
|
|
"notch": 6,
|
|
"periodMs": 2400,
|
|
"dashFrac": 0.3,
|
|
"phaseOffsetPerRow": 0.25,
|
|
"claimFlashMs": 150,
|
|
"base": { "color": "#ffc94d", "alpha": 0.55, "glowAlpha": 0.14, "width": 1.5 },
|
|
"comets": [
|
|
{ "color": "#ffc94d", "dir": 1, "phase": 0, "width": 2, "alpha": 1, "haloAlpha": 0.32 },
|
|
{ "color": "#00e5ff", "dir": -1, "phase": 0.5, "width": 2, "alpha": 0.9, "haloAlpha": 0.32 }
|
|
]
|
|
},
|
|
"priorityToast": {
|
|
"glyph": "◆",
|
|
"color": "#67e863",
|
|
"text": "PRIORITY SET — {title}"
|
|
},
|
|
"clearToast": {
|
|
"glyph": "·",
|
|
"color": "#7d92c4",
|
|
"text": "PRIORITY CLEARED"
|
|
}
|
|
},
|
|
"quests": [
|
|
{
|
|
"id": "start_your_journey",
|
|
"category": "main",
|
|
"starter": true,
|
|
"icon": "diamond",
|
|
"title": "Start Your Journey",
|
|
"description": "The universe is cold, and it ain't gonna do you any favors kid. The sooner you discover that, the sooner you'll be able to start taking care of yourself. And what better way to discover the universe, than to discover the universe.",
|
|
"issuer": "A Friend",
|
|
"_comment": "The first quest, granted on the run's first boot (js/quests/QuestState.js → starters). Its checklist is the run's opening arc — research, mine, build, discover. The checks are evaluated LIVE (GameScene._questCheckEval): 'research' resolves against data/research/exploration.json (the Tether Level 2 node), 'mineralsMined' against the run's lifetime asteroid mining (the Mining sequence's onOre), 'tetherBuilt' against the home world's standing tether level, 'discoveredWorld' against the discovery ledger (any discovered world besides the home). Once a step reads DONE it is RECORDED on the ledger (QuestState's completed set — rides record.quests) and stays done: monotonic, the check keeps standing even where the live read can no longer see it (the home tether's standing once the ship has left the home system).",
|
|
"checks": [
|
|
{ "type": "research", "category": "exploration", "node": "tether_l2", "label": "Research Tether Level 2" },
|
|
{ "type": "mineralsMined", "amount": 200, "label": "Mine 200 Minerals from asteroids" },
|
|
{ "type": "tetherBuilt", "planet": "home", "level": 2, "label": "Build a Level 2 Tether on your Home world" },
|
|
{ "type": "discoveredWorld", "count": 1, "label": "Discover another planet or space station" }
|
|
],
|
|
"reward": {
|
|
"minerals": 200,
|
|
"_comment": "The completion reward — 200 Minerals, claimed via the CLAIM REWARD action (fits the ship's hold: ship.stats.mineralStorage)."
|
|
}
|
|
},
|
|
{
|
|
"id": "leaving_the_nest",
|
|
"category": "main",
|
|
"icon": "diamond",
|
|
"title": "Leaving the Nest",
|
|
"description": "The nest did its job — it kept you alive long enough to learn the sky. Now the sky is yours. Chart the whole system, light its gates, and come find me out past the gate. I'll be waiting.",
|
|
"issuer": "Trestle",
|
|
"_comment": "The run's SECOND quest — the starter's follow-up (the 'Leaving the Nest' arc). It GRANTS the moment the starter quest is COMPLETED AND CLAIMED (unlocks.claimed — QuestState.isUnlockMet, armed by GameScene._grantUnlockedQuests on the claim itself + on scene create for loaded saves whose starter is already paid out). Trestle — the 'A Friend' behind the starter — is the issuer: his firstWorld pair (data/comms.json) promised the meeting. The four checks are the run's exit arc, witnessed by the run's COMMS played-ledger (registry 'commsPlayed' — marked when a comm starts, saved with the run, so the witness survives reloads and a quit mid-sequence): the system's full NAV chart (the same set that gates the jumpgate research), the home system's gates ACTIVATED (the activateGates effect), Trestle's THREE-BRIEF sequence (trestle-brief-1/2/3, trigger 'trestleBrief' — armed when the home gates go online, GameScene._trestleBeats; ALL THREE heard = 'Talk to Trestle'), and his ARRIVAL PAIR when the player arrives at the destination planet — the NEUTRAL CAPITAL WORLD (trestle-arrive-1/2, trigger 'trestleArrival' — armed the moment the ship reaches the capital world, GameScene._checkDestinationReached, plus a scene-create arm for loaded saves; 'Meet Trestle'). Both Trestle checks are read data-driven from the trigger's comms (GameScene._questCheckEval).",
|
|
"unlocks": {
|
|
"_comment": "The grant condition: the listed quests' rewards CLAIMED (the ledger's paid-out set) — 'unlocked as soon as the first quest is completed and its reward collected'.",
|
|
"claimed": ["start_your_journey"]
|
|
},
|
|
"checks": [
|
|
{ "type": "systemCharted", "system": "home", "label": "Discover all Planets, Space Stations and Jump Gates in the system" },
|
|
{ "type": "gatesActivated", "system": "home", "label": "Activate System Jump Gates" },
|
|
{ "type": "trestleTalked", "label": "Talk to Trestle" },
|
|
{ "type": "trestleMet", "label": "Meet Trestle on the capital world" }
|
|
],
|
|
"reward": {
|
|
"credits": 200,
|
|
"_comment": "The completion reward — 200 Credits, claimed via the CLAIM REWARD action."
|
|
}
|
|
},
|
|
{
|
|
"id": "special_delivery",
|
|
"category": "main",
|
|
"icon": "diamond",
|
|
"title": "Special Delivery",
|
|
"description": "The mail routes are dead, and a sealed package that must reach the home world is sitting at the neutral capital's bar. Carol is paying for the run, and Trestle will see it off — the only question is whether your ship can hold the cargo. Meet the two of them at the bar, upgrade the hold, and deliver the package to the home world.",
|
|
"issuer": "Carol",
|
|
"_comment": "The run's THIRD quest (the 'Leaving the Nest' follow-up — the bar at the neutral capital). It GRANTS the moment 'Leaving the Nest' is COMPLETED AND CLAIMED (unlocks.claimed — the same chain mechanic as leaving_the_nest). The three checks are witnessed by the run's STORY ledger (registry 'story', saved as record.story — GameScene._recordLanding / onSurfaceDeparture): step 1 'capitalLanded' — a real landing on the NEUTRAL CAPITAL WORLD (startLanding — the bar; the shop gate lifts with it, SurfaceScene reads GameScene.isShopUnlocked, and the SPECIAL PACKAGE — packageGood 'special-package', data/goods.json, sheet frame 114, tradeable:false so no shop touches it — lands in the hold, GameScene._handoffSpecialPackage); step 2 'cargoUpgraded' — a cargo-bay SHIP build installed (data/builds.json → effects.cargo.bays — the record is ship-scoped, so any world's build counts); step 3 'packageDelivered' — the delivery's proof (story.delivered, MONOTONIC): a real launch off the capital (SurfaceScene.finishTakeoff → GameScene.onSurfaceDeparture, which also sets the destination back to the home world) followed by a landing ON the home world (the proof is recorded at that landing and stands — a later landing elsewhere can't un-deliver it). Reward: 200 credits (claimQuest's credit seam — the same as 'Leaving the Nest').",
|
|
"unlocks": {
|
|
"_comment": "The grant condition: the listed quests' rewards CLAIMED — the run's chain (leaving_the_nest paid out → this one grants).",
|
|
"claimed": ["leaving_the_nest"]
|
|
},
|
|
"packageGood": "special-package",
|
|
"checks": [
|
|
{ "type": "capitalLanded", "label": "Meet with Trestle and Carol at the neutral capital's bar" },
|
|
{ "type": "cargoUpgraded", "label": "Upgrade Ship to hold Cargo" },
|
|
{ "type": "packageDelivered", "label": "Deliver Package for Carol" }
|
|
],
|
|
"reward": {
|
|
"credits": 200,
|
|
"_comment": "The completion reward — 200 Credits, claimed via the CLAIM REWARD action."
|
|
}
|
|
}
|
|
]
|
|
}
|