Story
Quests
(Idea) Written like Data/Quests/prologue.json. Flags are integers; a missing flag reads as 0. The conditions use the flag, all, any and not forms the quest code already parses, and startWhen.
Main quest: Act 3
{
"id": "act3",
"title": "Corran",
"description": "The warps have reached Sallowbank, and they come down the Sallow from Corran. Go upstream. Aske is coming with you, to the town she froze twenty years ago.",
"startWhen": { "flag": "act2.done", "op": "!=", "value": 0 },
"stages": [
{
"id": "glints_by_day",
"text": "Glints are in Sallowbank by daylight. Help hold the village.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 1 }
},
{
"id": "aske_comes",
"text": "Ask Aske to come upstream with you.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 2 }
},
{
"id": "sallow_warp",
"text": "Look at the Sallow warp on the way upstream.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 3 }
},
{
"id": "reach_corran",
"text": "Go to Corran; Aske comes with you.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 4 }
},
{
"id": "glass_remembers",
"text": "Look into the glass of Corran.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 5 }
},
{
"id": "the_girl",
"text": "Find the girl at the well.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 6 }
},
{
"id": "hour_stair",
"text": "Climb the Hour Stair and find Keeper Hale.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 7 }
},
{
"id": "keep_the_hour",
"text": "Get into the Keepers' archive.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 8 }
},
{
"id": "sealed_records",
"text": "Read the sealed records, and decide who else reads them.",
"completeWhen": {
"all": [
{ "flag": "act3.stage", "op": ">=", "value": 9 },
{ "flag": "act3.records", "op": "!=", "value": 0 }
]
}
},
{
"id": "back_to_corran",
"text": "Get back to Corran before the menders seal it again.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 10 }
},
{
"id": "colossus",
"text": "Bring down the glint colossus at Corran's warp.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 11 }
},
{
"id": "two_halves",
"text": "Trace the two halves of the Corran glyph together.",
"completeWhen": {
"all": [
{ "flag": "act3.stage", "op": ">=", "value": 12 },
{ "flag": "spell.learned.pavilion_wake", "op": "!=", "value": 0 }
]
}
},
{
"id": "unstill",
"text": "Thread the door-mark into the Corran glyph.",
"completeWhen": { "flag": "act3.stage", "op": ">=", "value": 13 }
},
{
"id": "corran_wakes",
"text": "See Corran wake.",
"completeWhen": { "flag": "act3.done", "op": "!=", "value": 0 }
}
]
}
The Undermere (fallen players)
{
"id": "act3_undermere",
"title": "The Undermere",
"description": "The gates have started closing on you. There's a ladder under the Shardfield for people the gates close on.",
"startWhen": {
"all": [
{ "flag": "morality", "op": "<=", "value": -20 },
{ "flag": "act3.stage", "op": ">=", "value": 4 }
]
},
"stages": [
{
"id": "way_down",
"text": "Find the way down near Corran.",
"completeWhen": { "flag": "undermere.stage", "op": ">=", "value": 1 }
},
{
"id": "smugglers_climb",
"text": "The Hour Stair gate won't open for you. Take the smugglers' climb.",
"completeWhen": {
"any": [
{ "flag": "undermere.stage", "op": ">=", "value": 2 },
{ "flag": "act3.stage", "op": ">=", "value": 8 }
]
}
},
{
"id": "under_the_warp",
"text": "See what is being dug out from under Corran's warp.",
"completeWhen": { "flag": "undermere.stage", "op": ">=", "value": 3 }
}
]
}
The long way up (redemption)
The stages read the same morality flag, so a player who fell only a little starts near the top: the first incomplete stage is the one they are on.
{
"id": "long_way_up",
"title": "The Long Way Up",
"description": "Nobody takes the Atonement board. That's why it's still up. Every deed counts the same; the deeper you are, the more of them it takes.",
"startWhen": { "flag": "morality", "op": "<=", "value": -20 },
"stages": [
{
"id": "out_of_the_depths",
"text": "Climb out of the depths: do one deed from the Atonement board, and one more for every 5 below -80.",
"completeWhen": { "flag": "morality", "op": ">", "value": -80 }
},
{
"id": "out_of_the_dark",
"text": "Climb out of the dark: do 8 deeds from the Atonement board.",
"completeWhen": { "flag": "morality", "op": ">", "value": -40 }
},
{
"id": "back_to_the_gates",
"text": "Earn your way back through the gates: do 4 deeds from the Atonement board.",
"completeWhen": { "flag": "morality", "op": ">", "value": -20 }
},
{
"id": "trusted_again",
"text": "Be trusted again: two more deeds.",
"completeWhen": { "flag": "morality", "op": ">", "value": -10 }
}
]
}
Morality only moves in steps of 5, so the bottom of each band is −15 (Wary), −35 (Fallen) and −75 (Dark). The deed counts in the stage text are for a player at the bottom of the band that stage climbs out of: 8 deeds from −75 to −35, 4 from −35 to −15, 2 from −15 to −5. The log should show the real number left (floor((threshold − morality) / 5) + 1, since each stage needs morality strictly above its threshold), which needs the quest log to support a computed count (section 17).
Side quest: the bell-ringer
{
"id": "side_bell_ringer",
"title": "The Third Bell",
"description": "Old Pim has rung the third bell of the Hour Stair for sixty years. His knees have stopped agreeing to it.",
"startWhen": { "flag": "side.ringer.asked", "op": "!=", "value": 0 },
"stages": [
{
"id": "ring_three",
"text": "Ring the third bell on the hour, three times.",
"completeWhen": { "flag": "side.ringer.rings", "op": ">=", "value": 3 }
},
{
"id": "learn_toll",
"text": "Let Pim show you the bell's glyph.",
"completeWhen": { "flag": "spell.learned.toll", "op": "!=", "value": 0 }
}
]
}