Game Mode की स्टोरी स्क्रिप्ट लिखना
स्टोरी स्क्रिप्ट तय करती है कि Game Mode का गेम कैसे आगे बढ़े: पार्टी के कहीं पहुँचने पर चलने वाले सीन, कोई शर्त पूरी होने पर Game Master से करवाए जाने वाले काम, जर्नल में खिलाड़ी के लिए दिखने वाले उद्देश्य, और ऐसे पल जिन्हें Game Master खुद मार्क कर सकता है। अगर आप दूसरों के लिए दुनिया बनाते हैं, तो एक स्टोरी स्क्रिप्ट लिखें। जिस दुनिया में स्टोरी हो, उसे खेलने के लिए दुनिया बनाना देखें।
स्टोरी स्क्रिप्ट डेटा है, कोड नहीं। इसमें कुछ भी चलता नहीं। Engine इसे उस दुनिया से जाँचता है जिसके लिए यह लिखी गई है, हर टर्न पर इसे लागू करता है, और जो कुछ फ़िट न हो उसे अस्वीकार करता है।
शुरू करने से पहले आपको एक ऐसी दुनिया चाहिए जिससे स्टोरी जोड़ी जाए, और उसकी जगहों और लोगों के ID। स्टोरी सेव करने के लिए गेम का API इस्तेमाल होता है, इसलिए आपको JSON रिक्वेस्ट भेजना आना चाहिए; स्टोरी आज़माना देखें।
स्टोरी कहाँ रहती है
स्टोरी एक ही दुनिया की होती है। उसमें उस दुनिया की जगहों और लोगों के नाम होते हैं, इसलिए उसका मतलब सिर्फ़ उसी दुनिया के साथ बनता है जिसके लिए वह लिखी गई थी (उसका सीड, उसका ब्रीफ़ और उसमें हाथ से किए गए बदलाव)।
- वर्ल्ड फ़ाइल (
.world.json) में,worldके बगल में टॉप-लेवलstoryके रूप में। जो Engine स्टोरी को नहीं जानता, वह भी दुनिया पढ़ लेता है। - किसी Experience के मैप पैक में: हर वर्ल्ड फ़ाइल अपनी स्टोरी साथ रख सकती है, और नया गेम मैप के साथ उसे भी ले लेता है। वैकल्पिक एजेंट पैकेज देखें।
- लाइब्रेरी में रखी दुनिया में, किसी भी गेम के बाहर:
GET,PUTऔरDELETE /api/game-worlds/:id/story, ठीक गेम वाले रूट की तरह। उस दुनिया से शुरू हुआ नया गेम स्टोरी को अपने साथ ले जाता है। - गेम शुरू होने के बाद उसमें:
GET,PUTऔरDELETE /api/game/:chatId/storyउसे पढ़ते, सेव करते और हटाते हैं। सेव की गई स्टोरी गेम की दुनिया से जाँची जाती है, हाथ से किए गए बदलावों समेत, और ऐसे हाथ के बदलाव अस्वीकार होते हैं जो स्टोरी में नाम ली गई किसी चीज़ को हटा दें।
नए गेम के सेटअप में, फ़ाइल या मैप पैक से पढ़ी गई स्टोरी तब तक बनी रहती है जब तक दुनिया का सीड और ब्रीफ़ वैसे ही रहें।
ढाँचा
{
"storyVersion": 1,
"flags": [],
"directions": [],
"events": [],
"cutscenes": [],
"fights": [],
"endings": [],
"knowledge": []
}सबसे छोटी काम करने वाली स्टोरी में एक फ़्लैग और एक इवेंट होता है। यह स्टोरी गेम के पहले जवाब पर Game Master को कुछ बताती है:
{
"storyVersion": 1,
"flags": [{ "id": "met_guide", "kind": "bool", "initial": false }],
"events": [
{
"id": "welcome",
"when": { "on": "start" },
"do": [{ "tell": "Open with a guide waiting at the gate." }, { "set": "met_guide", "value": true }]
}
]
}ID में 1 से 40 तक छोटे अक्षर, अंक, _ या - होते हैं, और हर ID अपनी सूची में दूसरों से अलग होता है। एक स्टोरी में अधिकतम 256 फ़्लैग, 64 निर्देश, 256 इवेंट, 64 कटसीन, 32 लड़ाइयाँ, 16 अंत और जानकारी की 600 एंट्री हो सकती हैं। इसके किसी भी टेक्स्ट में लाइन ब्रेक, वर्ग ब्रैकेट या {{ नहीं हो सकते, और टैग में लिखे जाने वाले नामों (कोई समूह, कोई बैकग्राउंड) में डबल कोट नहीं हो सकता: स्टोरी की कोई भी बात Game Master के किसी टैग जैसी नहीं दिख सकती।
फ़्लैग
फ़्लैग वह वैल्यू है जिसे स्टोरी याद रखती है: "bool" (सही या गलत) या "number"।
{ "id": "trust", "kind": "number", "initial": 0, "gm": true, "note": "How far the town trusts the party" }gm: trueसे Game Master इसे सेट कर सकता है (Game Master के टैग देखें);noteउसे बताता है कि फ़्लैग का मतलब क्या है।- फ़्लैग खिलाड़ी से छिपे रहते हैं।
questसे फ़्लैग जर्नल में क्वेस्ट उद्देश्य बन जाता है:
{
"id": "favours",
"kind": "number",
"initial": 0,
"quest": { "title": "Favours", "text": "Do the town three favours", "goal": 3 }
}संख्या वाले फ़्लैग में min और max हो सकते हैं: हर set और add उसे उन्हीं के बीच रखता है, Game Master के अपने टैग भी। इसलिए मंज़ूरी का स्कोर -10 और 10 के बीच रहता है, चाहे कितने भी इवेंट उसमें जोड़ें। उसका initial भी उन्हीं के बीच होना चाहिए।
{ "id": "approval", "kind": "number", "initial": 0, "min": -10, "max": 10, "gm": true }हाँ-या-ना वाला उद्देश्य तब पूरा होता है जब उसका फ़्लैग सही (true) हो; संख्या वाला उद्देश्य तब, जब वह अपने goal तक पहुँचे (न दिया हो तो 1), और goal लिखा हो तो जर्नल दिखाता है कि वह कितना आगे बढ़ा है। "hidden": true वाला उद्देश्य जर्नल में तब तक छिपा रहता है जब तक कोई इवेंट उसे दिखा न दे।
क्लॉक
संख्या वाला फ़्लैग ऐसा क्लॉक हो सकता है जिसे खिलाड़ी भरते हुए देखते हैं: 2 से 12 खंडों वाला घेरा, हर पॉइंट पर एक खंड भरता है। यह गेम के HUD और World टैब में अपने शीर्षक और पूरा भरने पर क्या होगा, इसके साथ दिखता है।
{
"id": "reeve",
"kind": "number",
"initial": 0,
"gm": true,
"clock": { "title": "The Reeve's patience", "segments": 6, "full": "The Reeve sends his men." }
}इसे दूसरे संख्या वाले फ़्लैग की तरह सेट करें, इसमें जोड़ें और शर्तों में जाँचें। Game Master को हर टर्न क्लॉक बताए जाते हैं, और जब कोई भरता है तब एक बार बताया जाता है कि क्या करवाना है (इवेंट से भरने पर, या उसके अपने टैग से भरने के अगले टर्न पर)। "hidden": true वाला क्लॉक तब तक छिपा रहता है जब तक कोई इवेंट उसे show न करे।
निर्देश
निर्देश Game Master के लिए ऐसी हिदायत है जो अपनी शर्तें पूरी रहने तक लागू रहती है:
{ "id": "wary", "text": "The town is wary of strangers.", "if": [{ "flag": "trust", "is": "<", "value": 2 }] }शर्तें
{ "flag": "<id>", "is": "=" | "!=" | ">" | ">=" | "<" | "<=", "value": <value> }। if सूची की सारी शर्तें पूरी होनी चाहिए। हाँ-या-ना वाले फ़्लैग की तुलना सिर्फ़ = या != से होती है।
{ "party": "<person id>", "is": "in" | "out" } पूछता है कि क्या दुनिया का कोई व्यक्ति अभी पार्टी के साथ सफ़र कर रहा है, जैसे स्टोरी का भर्ती किया साथी।
{ "partySize": { "is": "=" | "!=" | ">" | ">=" | "<" | "<=", "value": <1 to 32> } } पूछता है कि पार्टी में कितने लोग हैं: खिलाड़ी का कैरेक्टर और उसके साथ सफ़र कर रहे सारे साथी, सिवाय उन साथियों के जो कभी नहीं लड़ते। यह शर्त तभी पूरी होती है जब Engine को पार्टी का आकार पता हो।
{ "any": [<condition>, <condition>, ...] } तब पूरी होती है जब उसकी 2 से 8 शर्तों में से कोई एक पूरी हो: दो इवेंट की जगह एक ही सूची में या-तो वाली शर्त।
"if": [{ "any": [{ "flag": "won_granary", "is": "=", "value": true }, { "party": "p11-3", "is": "in" }] }]जानकारी
लोग अपने, एक-दूसरे और परिवेश के बारे में क्या जानते और कहते हैं, जो स्टोरी आगे बढ़ने पर बदलता है। हर एंट्री Game Master को ऐसी बात के रूप में बताई जाती है जिसे वह व्यक्ति ज़िक्र आने पर कह सकता है, उस टर्न पर जब:
- उसकी शर्तें पूरी हों,
- उसका
personसीन में हो: ताज़ा जवाब या खिलाड़ी के संदेश में उसका नाम आया हो, या वह पार्टी के साथ सफ़र कर रहा हो, - और अगर उसमें
keysहों, तो उनमें से कोई वहीं कही गई हो। व्यक्ति के बिना एंट्री को कुंजियाँ चाहिए, और वह सिर्फ़ उन्हीं से आती है।
एक टर्न पर अधिकतम 12 बताई जाती हैं। उन्हें प्राथमिकता दी जाती है: पहले वे लोग जिनका सीन नाम लेता है, फिर बिना व्यक्ति वाली एंट्री जिन्हें उसके शब्द लाते हैं, फिर सिर्फ़ साथ सफ़र कर रहे साथी। हर वर्ग के भीतर एंट्री बारी-बारी से हर व्यक्ति के बीच बाँटी जाती हैं, ताकि एक बातूनी साथी बाकी सबकी जगह न ले ले। सीन कितना भी भरा हो, साथ सफ़र कर रहे साथियों को 12 में से दो जगह हमेशा मिलती हैं, इसी तरह बाँटी हुई।
"knowledge": [
{ "id": "hob-self", "person": "p3-4", "text": "Hob was a miller's boy before the year stopped." },
{ "id": "hob-mill", "person": "p3-4", "if": [{ "flag": "act", "is": ">=", "value": 2 }],
"text": "Since the second act, Hob is afraid of the mill." },
{ "id": "hob-bells", "person": "p3-4", "keys": ["bells"], "text": "Hob thinks the bells are a lie." },
{ "id": "wheel", "keys": ["mill", "millwheel"], "text": "The mill's wheel has not turned in a hundred autumns." }
]स्क्रिप्ट में अधिकतम 600 एंट्री होती हैं। हर टर्न अधिकतम 12 बताई जाती हैं, स्क्रिप्ट के क्रम में, इसलिए सबसे ज़रूरी एंट्री पहले रखें।
इवेंट
इवेंट ऐसी चीज़ है जो घटती है: जब उसका ट्रिगर चलता है और उसकी शर्तें पूरी होती हैं, तब वह अपने एक्शन करता है।
{
"id": "gates",
"when": { "on": "arrive", "place": "p11" },
"if": [{ "flag": "banished", "is": "=", "value": false }],
"do": [{ "cutscene": "gates" }, { "set": "arrived", "value": true }, { "show": "key" }]
}इवेंट एक ही बार होता है, जब तक उसमें "repeat": true न हो (जिसे start, turn और day अनदेखा करते हैं)। एक टर्न में अधिकतम 32 इवेंट होते हैं, हर एक अधिकतम एक बार, उसी क्रम में जिसमें स्क्रिप्ट उन्हें लिखती है।
ट्रिगर (when.on), जो सब गेम के रिकॉर्ड से पढ़े जाते हैं:
| ट्रिगर | कब चलता है |
start | गेम के पहले जवाब पर। |
turn | पूरे गेम में, सभी सेशन मिलाकर, Game Master के turn नंबर वाले जवाब पर या उसके बाद। |
day | जब दुनिया का दिन (जो Game Master के समय बीतने और सफ़र से आगे बढ़ता है) day या उसके बाद का हो जाए। |
arrive | जब पार्टी place (किसी जगह का ID) में या उसके अंदर की किसी जगह में हो, और वहाँ इनमें से किसी तरह पहुँची हो: वहीं से शुरुआत करके, ओवरवर्ल्ड पर सफ़र करके, शहर में कहीं जाकर, या Game Master के किसी जगह का नाम लेने पर। repeat के साथ, हर बार जब वह कहीं और से वहाँ लौटे। |
meet | जब कोई जवाब person (किसी व्यक्ति का ID, जैसे p11-3, या हाथ से जोड़े गए व्यक्ति के लिए p11-e1) का पूरा नाम ले चुका हो। repeat के साथ, हर उस जवाब पर जो उसका नाम ले। नामों के लिए सिर्फ़ इसी सेशन के जवाब पढ़े जाते हैं। |
deed | जब दुनिया पार्टी का कोई कारनामा दर्ज कर चुकी हो, deed प्रकार का, और place दिया हो तो उसी जगह पर। repeat के साथ, हर उस जवाब पर जो ऐसा कारनामा दर्ज करे। |
fight | जब कोई लड़ाई outcome पर खत्म हो: victory, defeat या flee। fight (स्क्रिप्ट की कोई लड़ाई) के साथ, सिर्फ़ जब वही लड़ाई ऐसे खत्म हुई हो: Game Master के ताज़ा जवाब ने जो लड़ाई शुरू की थी, स्टोरी के fight एक्शन से या उसके अपने ट्रिगर से। |
leave | जब पार्टी place (किसी जगह का ID) और उसके अंदर की सारी जगहें छोड़ दे: सफ़र से, शहर में कहीं जाने से, Game Master के किसी जगह का नाम लेने से या स्टोरी के move से, ताज़ा जवाब में या इस टर्न पर। repeat के साथ, हर बार जब वह वहाँ से जाए। |
broke | जब किसी लड़ाई ने prop नाम का प्रॉप तोड़ा हो; नाम छोटे-बड़े अक्षर का फ़र्क किए बिना मिलाया जाता है। सिर्फ़ दुनिया के किसी युद्धक्षेत्र पर पेंट किए गए प्रॉप का नाम दिया जा सकता है। |
flags | जब उसकी शर्तें पूरी हों। repeat के साथ, हर बार जब वे पूरी न रहने के बाद फिर से पूरी हों। |
gm | सिर्फ़ तब, जब Game Master इसे ट्रिगर करे (इवेंट में "gm": true होना चाहिए)। |
rest | उस जवाब के बाद जिसमें पार्टी ने आराम किया हो: Game Master के जवाब का अपनाया हुआ [sheet: op="rest"], नियमसेट के उस आराम का जिसे rest नाम देता है (उसका ID या लेबल, जैसे long), या किसी भी आराम का। |
travel | उस टर्न पर जब पार्टी एक जगह से दूसरी जगह के लिए निकले, from और to दिए हों तो from के अंदर से to के अंदर तक। |
idle | लगातार turns जवाबों में कुछ न होने के बाद: कोई स्टोरी इवेंट, सफ़र या लड़ाई नहीं। |
step | जब कोई सफ़र place के सेल x, y (ऊपर-बाएँ से 0 से गिने हुए) से होकर गुज़रे: किसी बस्ती का शहर (वहाँ किसी जगह जाने का रास्ता, दरवाज़े से दरवाज़े तक), या किसी जगह का हाथ से बनाया गया मैप (उस पर सफ़र)। सेल ऐसा होना चाहिए जिस पर पार्टी चल सके: शहर में ऐसी ज़मीन जहाँ चौक से पहुँचा जा सके और जो खाली प्लॉट न हो, क्योंकि वहाँ स्टोरी कुछ बना सकती है; मैप पर ऐसा फ़र्श जहाँ उसके प्रवेश से पहुँचा जा सके। जेनरेट किए गए मैप में नाम देने लायक सेल नहीं होते। repeat के साथ, हर उस टर्न पर जिसका सफ़र उस सेल से होकर गुज़रे। |
जो हाथ के बदलाव किसी स्टेप इवेंट का सेल छीन लें (उस पर कोई इमारत रख दी जाए, या मैप का फ़र्श दीवार से बंद कर दिया जाए), वे सेव करते समय अस्वीकार होते हैं, और उस इवेंट का नाम बताया जाता है।
जो दोहराने वाला meet इवेंट अपने ही सीन में उस व्यक्ति का नाम लेता है, या जो दोहराने वाला deed इवेंट खुद वही कारनामा करता है जिसका वह इंतज़ार करता है, वह हर टर्न खुद को फिर से चला देगा, इसलिए Engine उसे अस्वीकार करता है।
एक्शन (do):
| एक्शन | क्या करता है |
{ "set": "<flag>", "value": <value> } | फ़्लैग सेट करता है। |
{ "add": "<flag>", "amount": <number> } | संख्या वाले फ़्लैग में जोड़ता है। |
{ "tell": "<text>" } | Game Master से कुछ करने को कहता है, एक बार, इसी टर्न में। |
{ "cutscene": "<id>" } | कटसीन चलाता है। |
{ "show": "<flag>" } | जर्नल में छिपा हुआ क्वेस्ट उद्देश्य दिखाता है। |
{ "world": { "deed": "<kind>", "group": "...", "with": "...", "place": "<place id>", "who": "..." } } | दुनिया में कारनामा दर्ज करता है, और Engine उसका जवाब वैसे ही देता है जैसे Game Master के अपने दर्ज किए कारनामे का। |
{ "give": { "item": "<catalog/entry or a name>", "count": 1, "who": "...", "summary": "..." } } | आइटम देता है: गेम के नियमसेट का आइटम उसके ID से, या कोई और उसके नाम से (summary बताता है कि वह क्या है), खिलाड़ी के बैग में या who के बताए पार्टी सदस्य को। यह Game Master के दिए आइटम की तरह जुड़ता है, इसलिए इन्वेंटरी के नियम लागू होते हैं। गेम के नियमसेट में न मिलने वाला ID अस्वीकार होता है, और वजह जवाब में आती है। |
{ "fight": "<fight id>" } | स्क्रिप्ट की कोई लड़ाई शुरू करता है। Game Master से उसकी भूमिका बनाने को कहा जाता है, और आगे की लड़ाई में स्टोरी के विरोधी होते हैं। |
{ "move": "<place id>" } | पार्टी को दुनिया की किसी जगह पर रखता है, सफ़र की तरह; इससे आने वाला arrive इवेंट उसी टर्न पर होता है। |
{ "ending": "<ending id>" } | स्क्रिप्ट के किसी अंत से गेम खत्म करता है: उसका सीन चलता है, Game Master उसके उपसंहार पर समापन करता है, और खिलाड़ी को अंत दिखाकर सेशन खत्म करने का विकल्प मिलता है। इसके बाद स्टोरी में कुछ नहीं होता। |
{ "music": "<track id>" } या { "music": null } | जगह के संगीत के ऊपर उसके Experience का कोई ट्रैक बजाता है, अगले संकेत तक, या null जगह का संगीत वापस लाता है। ट्रैक मैप पैक के music में होना चाहिए। |
{ "recruit": "<person id>" } | Experience के किसी साथी को पार्टी में लेता है, गेम के नियमसेट की उसकी शीट के साथ। Game Master से उसका शामिल होना दिखाने को कहा जाता है। |
{ "dismiss": "<person id>" } | साथी को पार्टी से जाने देता है। |
{ "season": { "place": "<place id>", "to": "winter" } } | तारीख जो भी हो, किसी जगह और उसके अंदर की हर जगह का मौसम रोककर रखता है; place के बिना, पूरी दुनिया का। "to": null उसे स्क्रिप्ट के अपने seasons, या तारीख के मौसम पर वापस जाने देता है। |
{ "sheet": { "condition": "<id>", "state": "on" } या { "sheet": { "track": "<id>", "by": 1, "upTo": 3 } } | पार्टी के हर सदस्य पर शीट की कोई कंडीशन लगाता या हटाता ("off") है, या हर सदस्य की शीट का ट्रैक बदलता है, upTo पर रुककर: Rime Edge की ठंड जिसे कोई आराम ठीक नहीं करता, ऐसी कंडीशन से जिसकी लड़ाई वाली कंडीशन में cannot-heal-nonmagical है। Engine का अपना ट्रिगर इसे अपने लिखे जवाब के साथ लागू करता है; Game Master का ट्रिगर, उसके मार्क करने के अगले टर्न पर। |
हर एक्शन का अपना if हो सकता है: वह तभी किया जाता है जब इवेंट के उस तक पहुँचने पर उसकी शर्तें पूरी हों, इवेंट के पहले वाले एक्शन हो चुकने के बाद। इस तरह एक इवेंट अलग रास्ते ले सकता है।
"do": [
{ "add": "approval", "amount": 2 },
{ "tell": "Hob warms to the party.", "if": [{ "flag": "approval", "is": ">=", "value": 5 }] },
{ "tell": "Hob keeps his distance.", "if": [{ "flag": "approval", "is": "<", "value": 5 }] }
]कौन से एक्शन किए गए, यह ट्रिगर के साथ दर्ज होता है, ताकि gm इवेंट के सीन और माँगें अगले टर्न वैसे ही आएँ जैसे Game Master के उसे मार्क करते समय किए गए थे।
साथी पैक की लोगों वाली फ़ाइल का ऐसा व्यक्ति है जिसे साथी मार्क किया गया है (वैकल्पिक एजेंट पैकेज में मैप पैक के लोग देखें)।
एक टर्न पर हो सकने वाले rest, travel और idle इवेंट में से सिर्फ़ एक होता है: सबसे ऊँची priority वाला (-100 से 100 तक पूर्णांक, न दिया हो तो 0; बराबर होने पर स्क्रिप्ट में पहला)। इससे साथी की अलाव पर बात, रास्ते में दो साथियों की नोकझोंक या शांत समय में खिलाड़ी के पास आते साथी के सीन एक साथ जमा नहीं होते। party शर्त के साथ ऐसा सीन तभी होता है जब वे साथी पार्टी के साथ सफ़र कर रहे हों।
एक्सपोज़र
किसी जगह पर रहने से समय के साथ पार्टी पर क्या असर पड़ता है, जैसे दोपहर की रोशनी वाला मैदान जो लड़ाई के बाहर यात्रियों को थकाता है, जैसे बोर्ड का रोशनी वाला नियम लड़ाई के अंदर करता है:
"exposures": [
{ "id": "noonfield", "place": "e9", "label": "Noonfield's light", "hours": 1,
"tracks": [{ "track": "exhaustion", "by": 1 }], "applies": ["sunstruck"],
"if": [{ "flag": "darkness_carried", "is": "=", "value": false }],
"tell": "The light presses on them; darkness would be a mercy." }
]गेम की घड़ी के हिसाब से: जिस पहले टर्न पर पार्टी place में (या उसके अंदर) हो और if पूरा हो, यह शुरू होता है। हर अगले टर्न पर गिना जाता है कि तब से वहाँ कितने hours बीते हैं। हर बार इतने घंटे बीतने पर Engine पार्टी के हर सदस्य के tracks को by से बदलता और applies कंडीशन लगाता है। इसके अपने शीट कमांड जवाब के कमांड के साथ लागू होते हैं, और Game Master को (tell से) बताया जाता है। जगह छोड़ने या if पूरा न रहने पर यह खत्म होता है; अगली बार नए सिरे से शुरू होता है। यह जवाब में ([story: exposure="<id>" ...]) एक बार दर्ज होता है।
ट्रैक किसी अधिकतम वैल्यू पर रुक सकता है: { "track": "exhaustion", "by": 1, "upTo": 3 } कभी उसे 3 से आगे नहीं ले जाता, और जो पहले ही उससे आगे हो उसे नहीं बदलता। एक्सपोज़र सबको प्रभावित करने के बजाय सेव माँग सकता है, लड़ाई के बोर्ड के रोशनी नियम वाले save के ही ढाँचे में:
"save": { "save": "con_save", "difficulty": 12, "against": { "conditions": ["noon_light"] } }हर बार असर पड़ने पर Engine पार्टी के हर सदस्य की अपनी शीट से वह सेव रोल करता है, और सिर्फ़ फ़ेल होने वालों पर उसके ट्रैक और कंडीशन लागू होते हैं, हर एक के अपने शीट कमांड से। against बताता है कि सेव किसके खिलाफ़ है, इसलिए सिर्फ़ उसके लिए लागू सेव मॉडिफ़ायर लड़ाई के बाहर भी वैसे ही गिना जाता है जैसे अंदर: ओवरले की { "to": "saves", "mode": "advantage", "against": { "conditions": ["noon_light"] } } वाली भूसे की टोपी पहनने वाले को एडवांटेज देती है। Game Master को कुल नतीजों समेत बताया जाता है कि कौन सेव में सफल रहा और कौन फ़ेल हुआ।
"sparedByShade": true के साथ, पार्टी का कोई भी सदस्य जलती हुई छाया लिए हो तो एक्सपोज़र बंद रहता है, जैसे if पूरा न रहने पर: ऐसा आइटम जिसकी पहनी या साथ रखी light में "shade": true हो (शोकेस का Lantern of Dusk), स्विच वाला आइटम सिर्फ़ चालू रहते समय। उसे जलाने से एक्सपोज़र खत्म होता है; बुझाने से नए सिरे से शुरू होता है।
Held Ground
जहाँ मौत रुकी हुई है, जैसे शोकेस की घाटी उसे रोके रखती है:
"heldGround": [
{ "id": "valley", "place": "p0", "label": "The Held Autumn", "condition": "felled",
"marks": [{ "track": "owing", "by": 1 }],
"if": [{ "flag": "year_turned", "is": "=", "value": false }],
"tell": "Nobody here has died in forty years." }
]जब तक पार्टी place में (या उसके अंदर; जगह न दी हो तो पूरी दुनिया में) हो और if पूरा हो, वहाँ शुरू हुई नियमसेट की लड़ाई Held Ground पर लड़ी जाती है: जिसकी हेल्थ खत्म होती है वह मरने के बजाय गिर जाता है, लड़ाई से बाहर, स्थिर और कभी मरने की हालत में नहीं, और बाद में फिर उठता है, जब तक कि उसे गिराने वाली चीज़ प्राण लेने वाली न हो। गिरे हुए पर condition लगती है, और हर गिरे कैरेक्टर के marks ट्रैक बदलते हैं (Owing का एक निशान)। पहली लागू एंट्री ही चुनी जाती है। स्टोरी पार्टी के वहाँ आने और वहाँ से जाने को ([story: held="<id>" ...]; जाने पर खाली ID दर्ज होता है) दर्ज करती है और हर बार Game Master को (tell से) बताती है; हर टर्न जब यह लागू हो, Game Master को इसका मतलब याद दिलाया जाता है।
Held Ground छोड़ भी सकता है: शोकेस का साल बदलना। उसका release बताता है कि तब क्या चुकाना पड़ता है:
"release": { "felled": "die", "owing": { "track": "owing", "bonus": { "flag": "hymn_bonus" } } }felled बताता है कि गिरे पड़े लोगों का क्या होता है: वे मरते हैं ("die", डिफ़ॉल्ट) या गिरकर नियमसेट के अपने नियम से मरने की हालत में आते हैं ("down")। owing पार्टी के हर सदस्य से track के हर निशान के लिए नियमसेट का मरने वाला सेव रोल करवाता है (ट्रैक न बताया हो तो Held Ground का पहला मार्क किया ट्रैक), हर रोल में bonus जोड़कर (संख्या, या छोड़ते समय पढ़ा जाने वाला संख्या फ़्लैग), जब तक निशान खत्म न हों या नतीजा तय न हो जाए। निशान खर्च हो जाते हैं, और तीन नाकामियाँ मौत हैं। उस पर चल रही नियमसेट की लड़ाई में, यह उस कदम पर छोड़ता है जो इसे बदलता है: आइटम का इस्तेमाल जो उसके if में पढ़ी स्टोरी की संख्या खर्च करे, या प्रॉप टूटना जिसका कोई broke इवेंट जवाब दे, और उनसे चलने वाले फ़्लैग इवेंट। गिरे हुए लोगों और Owing का हिसाब उसी राउंड में होता है, लड़ाई के अपने रिलीज़ से। लड़ाई के बाहर, उसे दर्ज करने वाला स्टोरी टर्न हर सदस्य की अपनी शीट से उसका Owing रोल करता है और Game Master को बताता है कि कौन जिया और कौन मरा; वहाँ अधूरी छोड़ी लड़ाई अपने अगले कदम पर छोड़ती है। लड़ाई जिसका हिसाब कर चुकी हो उसे कभी दोबारा रोल नहीं किया जाता।
मौसम
दुनिया के मौसम उसके कैलेंडर के साथ चलते हैं, हर एक 90 दिन। तारीख जो भी हो, स्टोरी किसी जगह का मौसम रोककर रख सकती है: पतझड़ में अटकी घाटी, सर्दी में रुकी पहाड़ी।
"seasons": [{ "place": "p3", "season": "autumn" }, { "season": "summer" }]हर रोक उस जगह और उसके अंदर की हर जगह पर लागू होती है; place के बिना पूरी दुनिया पर। सबसे पास की रोकी गई जगह तय करती है: पतझड़ में रुके क्षेत्र के अंदर सर्दी में रुका गाँव सर्दी में है। season एक्शन खेल के दौरान रोक बदलता या छोड़ता है। अपने अंदर सब कुछ समेटने वाली over रोक अपवाद है: वह वहाँ के हर मौसम को पीछे छोड़ती है, स्क्रिप्ट के अपने और हर दूसरी रोक को (सबसे बाहरी ऐसी रोक पहले)। इसलिए { "season": { "to": "spring", "over": true } } एक साथ पूरी दुनिया बदल देता है। जहाँ पार्टी का मौसम रोका गया हो, Game Master को मौसम और उसके रुके होने की बात बताई जाती है; उसी के लिए मौसम का हाल बनाया जाता है; ओवरवर्ल्ड हर सेल को उसकी सबसे पास की जगह के मौसम में बनाता है (टाइल पैक की <id>@<season> टाइल), और शहर अपने मौसम में।
दुनिया के हाथ से पेंट किए युद्धक्षेत्र में मौसम भी पेंट किए जा सकते हैं: हर टाइल पंक्ति के लिए seasons की एक पंक्ति, हर टाइल के लिए अक्षर या ., और seasonKeys में अक्षरों के नाम ({ "a": "autumn", "w": "winter" })। . छोड़ी टाइल उस जगह के मौसम में होती है जहाँ लड़ाई है। लड़ाई की टाइल इन्हीं मौसमों में शुरू होती हैं, और राउंड के मैप इवेंट उन्हें बदल सकते हैं, जैसे फैलता पाले का घेरा या पार जाती वसंत की रेखा।
लड़ाइयाँ
स्टोरी की तय की लड़ाई: किससे लड़ना है, और दुनिया में उसके लिए बोर्ड पेंट किया हो तो कहाँ।
{
"id": "granary",
"name": "The Granary",
"creatures": [
{ "creature": "creatures/scarecrow", "count": 3 },
{ "creature": "The Owed", "name": "The Owed" }
],
"battlefield": "b2",
"note": "The jars break when hit."
}हर जीव गेम के नियमसेट की बेस्टियरी का जीव है, उसके ID (catalog/entry) या नाम से, और उनकी count संख्या होती है (कई हों तो नंबर दिए जाते हैं), name दिया हो तो लड़ाई में उसी नाम से। battlefield दुनिया में हाथ से पेंट किया बोर्ड है (b<n>), जहाँ भी लड़ाई शुरू हो उसी पर लड़ी जाती है; उसके बिना लड़ाई वहीं लड़ी जाती है जहाँ शुरू होती है, दूसरी लड़ाइयों की तरह। note Game Master को बताता है कि यह कैसे शुरू होती है। गेम के नियमसेट में न होने वाला ID अस्वीकार होता है: वे जीव लड़ाई से बाहर रहते हैं और अस्वीकार की बात लॉग होती है। कोई जीव न बचने पर भी लड़ाई स्टोरी के तय किए ढंग से, अपने युद्धक्षेत्र पर शुरू होती है, लेकिन दुश्मन Game Master चुनता है।
दूसरे आकार की पार्टियों के लिए भी लड़ाई तय हो सकती है। पार्टी में खिलाड़ी का कैरेक्टर और उसके साथ सफ़र कर रहे सारे साथी हैं, सिवाय noncombatant मार्क किए साथी के।
"variants": [
{ "party": { "min": 3, "max": 4 }, "creatures": [{ "creature": "creatures/scarecrow", "count": 4 }] },
{ "party": 5, "creatures": [{ "creature": "creatures/scarecrow", "count": 5 }], "battlefield": "b3",
"note": "The Owed wakes in the loft." }
]जिस वेरिएंट का party पार्टी के आकार से मेल खाता है, वही लड़ा जाता है, उसके अपने जीवों के साथ, और उसके अपने battlefield और note हों तो उनके साथ (वरना लड़ाई के)। किसी वेरिएंट में न आने वाली पार्टी मूल लिखी लड़ाई लड़ती है। कोई आकार दो वेरिएंट में नहीं आ सकता।
लड़ाई या वेरिएंट की जीव एंट्री उसे उस लड़ाई के लिए adjust कर सकती है, ताकि बॉस पार्टी के साथ बदल सके और उसके लिए अलग जीव न चाहिए: "adjust": { "legendaryResistance": 2, "maxHp": 40 } उसे उतना Legendary Resistance (0 उसे हटाता है) और उतनी हेल्थ देता है (उसके ब्लॉक के डाइस समेत हेल्थ की जगह तय संख्या)। Game Master को जीव के पास यह बताया जाता है। एडजस्ट का calls बदलता है कि जीव के एक्शन किसे बुलाते हैं: [{ "action": "shelves_lean", "creature": "creatures/wraith" }], बुलाने वाले एक्शन के ID या नाम से। उसका levels पार्टी के किसी लेवल से ऊपर इनमें से कोई भी चीज़ बदलता है, हर बदलाव पिछले के ऊपर: "levels": [{ "from": 8, "calls": [{ "action": "shelves_lean", "creature": "creatures/wraith" }] }]। पार्टी का लेवल उसके किसी भी सदस्य का सबसे ऊँचा लेवल है, गेम के नियमसेट के लिए Experience की साथी शीट के बताए लेवल फ़ील्ड से पढ़ा जाता है; उसके बिना levels नहीं पढ़े जाते। party अधिकतम 32 के आकार बताता है; max के बिना रेंज ({ "min": 7 }, Capability API 1.360) अपने min से ऊपर हर पार्टी को समेटती है, चाहे कितनी बड़ी हो। Game Master को लड़ाई शुरू होने पर और फिर उसके सार के बाद बताया जाता है कि वह किस पार्टी आकार के लिए तय थी।
अंत
{ "id": "kept", "title": "The Year Kept", "cutscene": "bells", "epilogue": "The valley stays held." }cutscene स्क्रिप्ट के सीन में से एक है, जो अंत शुरू होते ही चलता है; epilogue वह उपसंहार है जिस पर Game Master गेम समाप्त करता है, और अंत दिखाए जाने पर खिलाड़ी जिसे पढ़ते हैं।
कटसीन
कटसीन या तो खिलाड़ी को हूबहू वैसा ही दिखाया जाता है जैसा लिखा गया है, या Game Master को नैरेट करने के लिए बताया जाता है।
{
"id": "gates",
"kind": "pages",
"background": "backgrounds:generated:town-gates",
"pages": [
{ "text": "The gates creak open." },
{ "speaker": "p11-3", "expression": "happy", "text": "Welcome, travellers." },
{ "speaker": "player", "text": "We come in peace." }
]
}pages कटसीन Game Master के जवाब से पहले, नैरेशन में, एक बार में एक पेज करके चलता है: बोलने वाले के बिना पेज नैरेशन होता है, और बोलने वाले के साथ पेज उस व्यक्ति की लाइन होता है, दुनिया में उसके नाम से (या player के लिए खिलाड़ी के नाम से), Game Master की अपनी सूची के किसी expression के साथ। background गेम में मौजूद कोई बैकग्राउंड होता है, या इमेज जेनरेशन चालू होने पर नया बैकग्राउंड बनवाने के लिए backgrounds:generated:<words>। Game Master को बताया जाता है कि सीन दिखाया गया, और वह वहीं से आगे बढ़ता है।
पेज का अपना if हो सकता है: सीन चलते समय उसकी शर्तें पूरी हों तभी वह दिखता है, ताकि कैंप के सीन में हर साथी की लाइन सिर्फ़ उसके पार्टी के साथ सफ़र करते समय आए।
{ "speaker": "p11-3", "text": "Another night.", "if": [{ "party": "p11-3", "is": "in" }] }जिस सीन के सारे पेज रोके गए हों, वह कुछ नहीं दिखाता।
{ "id": "dusk", "kind": "beats", "beats": ["Lamps are lit.", "A bell tolls."] }beats कटसीन को Game Master उसी टर्न पर अपने शब्दों में, बीट-दर-बीट नैरेट करता है। किसी gm इवेंट की बीट Game Master को इवेंट के साथ बताई जाती हैं, और वह उन्हें उस जवाब में नैरेट करता है जो उस पल को मार्क करता है। इसलिए जिस बीट वाले सीन को कोई gm इवेंट इस्तेमाल करता है, उसे Game Master शुरू से जानता है, भले ही कोई Engine इवेंट भी उसे चलाए। चूँकि ये बीट उसे हर टर्न बताई जाती हैं, इसलिए सभी gm इवेंट की बीट मिलाकर 16,000 अक्षरों तक सीमित रहती हैं।
इंट्रो संदेश
intro तय करता है कि गेम कैसे शुरू होता है, यह वही विकल्प है जो GM सेटअप हर गेम को देता है:
"intro": { "mode": "defined", "text": "The leaves have not fallen in Hollowmere for nine years.", "locked": true }"defined" गेम का पहला संदेश हूबहू text बना देता है; Game Master उसके लिए कुछ नहीं लिखता, और उसे दोबारा जेनरेट करने पर वही टेक्स्ट मिलता है। "guided" सिर्फ़ Game Master के लिखे शुरुआती हिस्से को दिशा देता है, ऐसे मार्गदर्शन के रूप में जिसे वह सिर्फ़ उस पहले जवाब के लिए पढ़ता है। text 1 से 8000 अक्षरों का होता है और उसमें लाइन ब्रेक हो सकते हैं (स्टोरी में यही एक टेक्स्ट है जिसमें ये हो सकते हैं), लेकिन {{ कभी नहीं; गाइडेड टेक्स्ट में वर्ग ब्रैकेट भी नहीं हो सकते। locked के साथ खिलाड़ी GM सेटअप में इंट्रो देखते हैं, पर उसे बदल नहीं सकते; इसके बिना इंट्रो सिर्फ़ सेटअप की फ़ील्ड भरता है, और खिलाड़ी उसे बदल या मिटा सकते हैं। जिस गेम का पहला जवाब पहले ही लिखा जा चुका हो, या जो अपनी पार्टी पिछले गेम से आगे ले जाता हो, उसमें इंट्रो नहीं होता। Experience भी अपने दूसरे GM सेटअप वैल्यू के पास इंट्रो सेट कर सकता है (contributions.gameSurface.setup.defaults.intro); उसे पहले पढ़ा जाता है।
स्टोरी कैसे चलती है
हर टर्न में एक बार, Game Master के जवाब देने से पहले, Engine पढ़ता है कि स्टोरी अब तक क्या कर चुकी है और यह टर्न क्या लाया है (कोई सफ़र, शहर में कहीं जाना, किसी लड़ाई का अंत), और इवेंट होने देता है। जो होता है, वह उस जवाब की शुरुआत में लिखा जाता है: हर इवेंट और उसने जो सेट किया, उसे दर्ज करने वाला टैग, और हूबहू दिखाया गया कोई भी सीन। चूँकि स्टोरी जवाबों से वापस पढ़ी जाती है, इसलिए स्वाइप या दोबारा जेनरेट करने से उस जवाब का किया हुआ वापस हो जाता है, और गेम के बीच बदली गई स्टोरी पहले हो चुकी बातों को कभी दोबारा नहीं लिखती। स्टोरी गेम के अगले सेशन में भी साथ चलती है।
Game Master के टैग
हर टर्न Game Master को स्टोरी की वैल्यू (जो खिलाड़ी से छिपी रहती हैं) और लागू निर्देश बताए जाते हैं। बाकी स्क्रिप्ट में से उसे सिर्फ़ वह बताया जाता है जिसे स्क्रिप्ट उसके ज़िम्मे करती है: gm इवेंट (उनके note और उनके साथ नैरेट करने के लिए कोई beats समेत) और gm फ़्लैग, और यह कि उनमें से कौन से इवेंट वह अभी मार्क नहीं कर सकता (जो हो चुके हैं, या अपनी शर्तों की वजह से रुके हुए हैं)। वह अपने जवाब में उन्हें मार्क करता है:
[story: event="<id>"]ऐसेgmइवेंट को ट्रिगर करता है जिसकी शर्तें पूरी हों (एक बार, जब तक वह दोहराने वाला न हो)।[story: flag="<id>" value="<value>"], या संख्या वाले फ़्लैग के लिएadd="<number>", किसीgmफ़्लैग को सेट करता है।
gm इवेंट के उपहार, लड़ाई और जगह बदलना उसके टैग के साथ जवाब में आते हैं; उसके अंत का सीन और उपसंहार अगले जवाब की शुरुआत में आते हैं।
Engine हर टैग का जवाब उसी जगह देता है, एक इवेंट को एक टर्न में अधिकतम एक बार, और बाकी सब कुछ वजह बताकर अस्वीकार करता है। जिस गेम में स्टोरी नहीं है, उसमें हर स्टोरी टैग अस्वीकार होता है। Game Master जो ट्रिगर करता है, उसका असर तुरंत होता है (उसके फ़्लैग, उसके कारनामे); उसके सीन और उसकी माँगें अगले जवाब की शुरुआत में आती हैं, सिवाय उसकी beats के (उन्हें उसी पल के साथ नैरेट करने को कहा गया था)। किसी gm इवेंट के pages को उस पल के बाद आने वाली बात के रूप में लिखें, क्योंकि वह पल Game Master खुद सुना चुका होता है।
स्टोरी आज़माना
- उस दुनिया पर गेम शुरू करें जिसके लिए स्टोरी लिखी गई है।
PUT /api/game/:chatId/storyऔर{ "story": { ... } }बॉडी के साथ स्टोरी भेजें। जो स्टोरी फ़िट नहीं होती, वह हर वजह के साथ अस्वीकार होती है।- एक टर्न खेलें। गेम का World टैब वे उद्देश्य और क्लॉक दिखाता है जो स्टोरी ने दिखाए हैं, और Game Master के प्रॉम्प्ट में हर टर्न स्टोरी की वैल्यू और निर्देश रहते हैं।
सेव की गई स्टोरी पढ़ने के लिए उसी पते पर GET और उसे हटाने के लिए DELETE इस्तेमाल करें।
Capability API वर्ज़न के हिसाब से फ़ीचर
स्टोरी के हर फ़ीचर को Capability API का कम से कम एक तय वर्ज़न चाहिए।
brokeइवेंट को 1.316 चाहिए।introको 1.339 चाहिए, और किसी Experience केcontributions.gameSurface.setup.defaults.introको 1.372 चाहिए।- क्लॉक को 1.342 चाहिए।
- लड़ाई, अंत और
give,fight,moveऔरendingएक्शन को 1.343 चाहिए। - संगीत के संकेत को 1.345 चाहिए।
- साथी भर्ती करने या विदा करने को 1.347 चाहिए।
- जानकारी को 1.348 चाहिए।
rest,travelऔरidleइवेंट,priority,partyशर्त या 128 से ज़्यादा इवेंट को 1.349 चाहिए (सीमा 256 है)।seasonsऔरseasonएक्शन को 1.351 चाहिए।- 64 से ज़्यादा फ़्लैग को 1.353 चाहिए (सीमा 256 है)।
- लड़ाई के
variantsको 1.356 चाहिए। anyशर्तें, अपनी लड़ाई का नाम देने वालाfightइवेंट,leaveइवेंट, फ़्लैग काminयाmax, और एक्शन या पेज परifको 1.358 चाहिए।- ऐसे मैप पैक को 1.359 चाहिए जिसके नियमसेट ओवरले में
storyUsesएंट्री हो (स्टोरी की संख्या खर्च करने वाला आइटम का इस्तेमाल, जिसे Held Ground काifपढ़ सकता है); स्टोरी की संख्या खर्च करने वाले आइटम देखें। partySizeशर्त, 6 से बड़ी पार्टी के लिए या बिना ऊपरी सीमा वाला वेरिएंट, या 6 से ज़्यादा वेरिएंट को 1.360 चाहिए।- पार्टी के आकार में न गिने जाने वाले
noncombatantसाथी को 1.360 चाहिए। - अपने अंदर सब कुछ समेटने वाले
overके साथseasonएक्शन को 1.361 चाहिए। - हर टर्न कौन सी जानकारी एंट्री बताई जाएँ, इसकी प्राथमिकता (पहले वे लोग जिनका सीन नाम लेता है) को 1.361 चाहिए।
exposuresको 1.362 चाहिए।adjustकरने वाले लड़ाई के जीवों को 1.363 चाहिए।- एक्सपोज़र के
saveया ट्रैक केupToको 1.364 चाहिए। - एक्सपोज़र के
sparedByShadeको 1.365 चाहिए। heldGroundको 1.366 चाहिए।sheetएक्शन को 1.368 चाहिए।- Held Ground के
releaseको 1.369 चाहिए। - विकल्पों की सूची देने को 1.370 चाहिए। 1.370 से अकेला बिना कैटलॉग वाला एंट्री ID उस कैटलॉग में खोजा जाता है जिसमें वह हो, और पुराना Engine उसे नाम के रूप में पढ़ता है।
callsयाlevelsकोadjustकरने वाले लड़ाई के जीवों को 1.371 चाहिए।