Game Mode के नियमसेट लिखना

नियमसेट Game Mode को बताता है कि टेबलटॉप सिस्टम कैसे चलता है: चेक में कौन से डाइस रोल होते हैं, कैरेक्टर शीट पर क्या होता है, कौन से संसाधन खर्च होते हैं और आराम क्या लौटाता है। अपना सिस्टम Game Mode में लाने और उसे साझा करने के लिए नियमसेट लिखें। किसी और के बनाए नियमसेट से खेलने के लिए नियमसेट के साथ खेलना देखें।

नियमसेट एक JSON फ़ाइल है। यह डेटा है, कोड नहीं, इसलिए इसमें कुछ नहीं चलता और इसे इंपोर्ट करने से आपके कंप्यूटर को कोई नुकसान नहीं हो सकता। किसी और की फ़ाइल इंपोर्ट करने से पहले उसका Game Master टेक्स्ट पढ़ें, क्योंकि नियमसेट इस्तेमाल करने वाले हर गेम में वह टेक्स्ट मॉडल को भेजा जाता है।

नियमसेट शुरू करें

  1. अपने सिस्टम के रोल करने के तरीके से मेल खाती उदाहरण फ़ाइल कॉपी करें:
  1. id बदलकर अपना रखें। ID में छोटे अक्षर, अंक और अकेले हाइफ़न होते हैं, जैसे ember-roads।
  2. अपनी कॉपी Notepad या VS Code जैसे टेक्स्ट एडिटर में खोलें, और उसे ऐसे नाम से सेव करें जो .json पर खत्म हो। सबसे पहले name बदलें, फिर sheet में एबिलिटी के नाम, फिर rests और gm टेक्स्ट। फ़ाइल के भाग में हर कुंजी दी गई है, और रेफ़रेंस पेज में उन्हें समझाने वाले पेजों के लिंक हैं।
  3. इसे इंपोर्ट करें (अपना नियमसेट आज़माएँ देखें)। कुछ भी सेव करने से पहले इंपोर्ट पूरी फ़ाइल जाँचता है और लाइन-दर-लाइन बताता है कि क्या गलत है।
  4. नया गेम बनाएँ (Game Mode: शुरुआत देखें), Rules (नियम) में अपना नियमसेट चुनें और कुछ चेक खेलें।

अगर यह काम न करे, तो समस्या-समाधान देखें।

टाइप करते समय एडिटर से मदद पाने के लिए फ़ाइल की बाहरी ब्रेसेज़ के अंदर पहली लाइन के रूप में यह जोड़ें। यह एडिटर को JSON Schema की ओर ले जाता है:

"$schema": "https://raw.githubusercontent.com/Pasta-Devs/Marinara-Engine/staging/docs/extending/ruleset.schema.json",

स्कीमा गलत लिखी कुंजियाँ और गलत टाइप पकड़ता है। वह यह नहीं जाँच सकता कि नाम मौजूद चीज़ों की ओर इशारा करते हैं, जैसे स्किल में बताई गई एबिलिटी। यह जाँच इंपोर्ट करता है। अपने लिए नोट छोड़ने के लिए किसी भी ऑब्जेक्ट में "$comment": "..." लाइन जोड़ सकते हैं। Engine उसे अनदेखा करता है।

नियमसेट क्या कर सकता है और क्या नहीं

नियमसेट ऐसी यांत्रिकी के खाली हिस्से भरता है जिसे Engine पहले से जानता है। Engine चेक हल करने के पाँच तरीके जानता है, और आपकी फ़ाइल resolution.kind से उनमें से एक चुनती है:

पाँचों का पूरा ब्योरा हल करने के प्रकार में है।

जो यांत्रिकी इन रूपों में नहीं आती, जैसे एक-दूसरे के विरुद्ध पूल, वह नियमसेट फ़ाइल में नहीं लिखी जा सकती। उसके लिए Engine के अंदर हल करने का नया प्रकार चाहिए, जो टेस्ट के साथ कोड कंट्रिब्यूशन है। आपके सिस्टम को ऐसा प्रकार चाहिए तो Engine रिपॉज़िटरी में फ़ीचर रिक्वेस्ट खोलें और कुछ पूरे हल किए हुए रोल से यांत्रिकी समझाएँ। यही रोल टेस्ट बनते हैं।

Game Mode लड़ाई को या तो Marinara के अपने युद्ध सिस्टम से हल करता है या आपके नियमसेट के नियमों से। वैकल्पिक battle ब्लॉक आपकी कैरेक्टर शीट की संख्याएँ Marinara के युद्ध सिस्टम को देता है: लड़ाइयाँ देखें। वैकल्पिक combat ब्लॉक बताता है कि नियमसेट खुद लड़ाई कैसे हल करता है: युद्ध देखें। गेम की Combat Preference (लड़ाई की पसंद) Classic प्रस्तुति चुनती है या, नियमसेट में दूरी तय हो तो, Tactical युद्धक्षेत्र। नियमसेट combat.styles से तय कर सकता है कि उसके गेम इनमें से कौन से तरीके इस्तेमाल करें (गेम किन तरीकों से खेला जा सकता है देखें)।

फ़ाइल के भाग

कुंजीइसमें क्या है
schemaVersionहमेशा 1।
id, versionEngine के लिए आपके नियमसेट का नाम, और हर बदलाव प्रकाशित करते समय बढ़ाया जाने वाला पूर्णांक।
nameसेटअप विज़ार्ड में खिलाड़ियों को दिखने वाला नाम।
editionवैकल्पिक। यह कौन सा संस्करण या ड्राफ़्ट है, इसकी एक लाइन।
licenseवैकल्पिक। SPDX ID और आपके स्रोत के लिए ज़रूरी श्रेय टेक्स्ट।
coverageनियमसेट क्या सँभालता है, और सेटअप विज़ार्ड में दिखने वाला एक लाइन का सारांश।
resolutionचेक या सेव कैसे रोल होता है।
sheetकैरेक्टर शीट की सारी चीज़ें।
restsहर तरह का आराम क्या लौटाता और क्या साफ़ करता है।
gmGame Master मॉडल को दिया जाने वाला टेक्स्ट, और हर कैरेक्टर के लिए उसे दिखने वाले शीट मान।
catalogsवैकल्पिक। शीट एडिटर की तैयार एंट्री, ताकि खिलाड़ी लंबी सूचियाँ हाथ से न लिखें।
itemsवैकल्पिक। वे शब्द जिनमें आपके आइटम लिखे जाते हैं: श्रेणियाँ, दुर्लभता, स्टैट, स्लॉट, पैसे।
battleवैकल्पिक। बैटल शीट से क्या पढ़ सकती है और बाद में क्या वापस लिखती है।
combatवैकल्पिक। आपके अपने नियमों से लड़ाई कैसे हल होती है, और फिर बैटल स्क्रीन क्या चलाती है।
layersवैकल्पिक। आपके नियमसेट के रूपांतर, जिन्हें खिलाड़ी गेम बनाते समय चालू करता है।

फ़ाइल अधिकतम 512 KB हो सकती है (Capability API 1.340 से पहले 256 KB)। प्रॉम्प्ट में पहुँचने वाले टेक्स्ट (नाम, लेबल, Game Master टेक्स्ट) में लाइन ब्रेक, वर्ग ब्रैकेट या दोहरे कर्ली ब्रेसेज़ नहीं हो सकते।

शीट के अंदर के ID (एबिलिटी, स्किल, फ़ील्ड, पूल वगैरह) अक्षर से शुरू होते हैं और उनमें छोटे अक्षर, अंक और अंडरस्कोर होते हैं, जैसे grit_max।

रेफ़रेंस पेज

इस पेज में नियमसेट शुरू करना, आज़माना और साझा करना बताया गया है। बाकी पेज एक-एक विषय पर हैं:

अपना नियमसेट आज़माएँ

शुरू करने से पहले Settings → Advanced → Danger Zone (सेटिंग्स → एडवांस्ड → डेंजर ज़ोन) में Allow custom Agent imports (कस्टम एजेंट इंपोर्ट की इजाज़त दें) चालू करें। इंपोर्ट किए गए नियमसेट वही सुरक्षा स्विच इस्तेमाल करते हैं जो इंपोर्ट किए गए एजेंट, इसलिए जब तक आप इसे चालू न करें, यह बंद रहता है। इंपोर्ट के लिए localhost एक्सेस या एडमिन सीक्रेट भी चाहिए, जो Settings → Advanced → Admin Access (सेटिंग्स → एडवांस्ड → एडमिन एक्सेस) में डाला जाता है।

  1. Agents (एजेंट) पैनल खोलें और Import agents (एजेंट इंपोर्ट करें) बटन चुनें (पैनल के ऊपर बटनों की पंक्ति में डाउनलोड आइकन)।
  2. Game Mode ruleset (Game Mode नियमसेट) चुनें और अपनी JSON फ़ाइल चुनें, या .ruleset.json पर खत्म होने वाली नियमसेट पैकेज फ़ाइल (अपना नियमसेट साझा करना देखें)।
  3. समीक्षा पढ़ें। इसमें नाम, वर्ज़न, लाइसेंस, नियमसेट क्या सँभालता है और Game Master टेक्स्ट दिखता है। Import (इंपोर्ट करें) चुनें।

आपका नियमसेट पैनल के Rules भाग में और नए गेम के सेटअप विज़ार्ड के Rules विकल्प में दिखता है। फ़ाइल से इंपोर्ट किया गया नियमसेट local/<your id> के रूप में रखा जाता है, इसलिए उसे कभी किसी आधिकारिक नियमसेट या किसी और के नियमसेट से गलत नहीं समझा जाता।

पहले इंपोर्ट किया नियमसेट बदलें

इंपोर्ट किया गया वर्ज़न कभी दोबारा नहीं लिखा जाता। अगर आप बदली हुई फ़ाइल उसी version के साथ इंपोर्ट करें, तो इंपोर्ट अस्वीकार होता है और आपसे नंबर बढ़ाने को कहता है। गेम ठीक उसी वर्ज़न से जुड़ा होता है जिस पर वह बना था, इसलिए चलते हुए अभियान का गणित कभी नहीं बदलता।

ड्राफ़्ट करते समय चक्र यह है: एडिट करें, version बढ़ाएँ, इंपोर्ट करें, नया गेम शुरू करें। पुराने वर्ज़न नए के साथ इंस्टॉल रहते हैं, जब तक आप Rules भाग से नियमसेट हटा न दें। जिस नियमसेट को कोई गेम अब भी इस्तेमाल करता है, उसे हटाने पर वह गेम तब तक बताता है कि उसका नियमसेट गायब है जब तक आप उसे फिर इंपोर्ट न करें।

अगर आप शीट का आकार बदलते हैं (चीज़ें जोड़ते, हटाते या उनके नाम बदलते हैं), तो sheet.version भी बढ़ाएँ। मौजूदा शीट उदारता से पढ़ी जाती हैं: जो मान नई शीट नहीं जानती वे रखे जाते हैं, और गायब मान अपने डिफ़ॉल्ट लेते हैं।

अपना नियमसेट साझा करना

साझा करने के पाँच तरीके हैं।

फ़ाइल के रूप में

JSON फ़ाइल किसी दोस्त को भेजें। वे उसे वैसे ही इंपोर्ट करते हैं जैसे आपने किया।

पैकेज फ़ाइल के रूप में

एक फ़ाइल के लिए बहुत बड़ा नियमसेट, जिसके कैटलॉग अपनी अलग फ़ाइलों में हैं, <name>.ruleset.json नाम की एक सादी JSON फ़ाइल के रूप में जाता है। इसमें पैकेज का मैनिफ़ेस्ट और नियमसेट के दस्तावेज़ होते हैं, हर एक base64 में सेव होता है (फ़ाइल को सादे टेक्स्ट के रूप में लिखने का एक तरीका):

{
  "format": "marinara-ruleset",
  "version": 1,
  "manifest": { "kind": ["ruleset"], "…": "the package manifest" },
  "files": {
    "ruleset.json": "<base64>",
    "catalogs/spells.json": "<base64>"
  }
}

मैनिफ़ेस्ट ruleset.json और हर catalogs/<id>.json को contributions.assets.paths में और files में सूचीबद्ध करता है, हर एक के आकार और sha256 (फ़ाइल का फ़िंगरप्रिंट) के साथ। Pixelforge जैसा नियमसेट एडिटर इसे बनाता है। Import agents → Game Mode ruleset फ़ाइल लेता है और वही समीक्षा दिखाता है जो नियमसेट फ़ाइल के लिए, हर कैटलॉग और उसकी एंट्री की संख्या के साथ।

फ़ाइल को डेटा के रूप में पढ़ा जाता है और कभी पैकेज के रूप में इंस्टॉल नहीं किया जाता। इसमें कुछ भी कंप्रेस नहीं होता, इसलिए इसमें कभी इसके अपने आकार से ज़्यादा डेटा नहीं होता। सीमाएँ:

इसे वजह बताकर अस्वीकार किया जाता है, अगर:

आधिकारिक एजेंट कैटलॉग से

कैटलॉग में प्रकाशित नियमसेट ठीक इसी रूप की नियमसेट पैकेज फ़ाइल है, <id>.ruleset.json, कभी पैकेज zip नहीं। उसका मैनिफ़ेस्ट Capability API 1.374 या नया घोषित करता है, ताकि पुराने Engine को वह कभी न दिया जाए। Engine उसे उसी रीडर और उन्हीं जाँचों से पढ़ता है जिनसे वह आपकी इंपोर्ट की पैकेज फ़ाइल पढ़ता है, उसे कैटलॉग में दिए मैनिफ़ेस्ट से मिलाता है, और किसी भी कैटलॉग पैकेज की तरह इंस्टॉल करता है। जिस कैटलॉग नियमसेट की फ़ाइल zip है उसे कुछ भी डाउनलोड करने से पहले अस्वीकार किया जाता है; पहले से इंस्टॉल नियमसेट काम करते रहते हैं।

GitHub रिपॉज़िटरी से

अगर आप अपना काम सार्वजनिक GitHub रिपॉज़िटरी में रखते हैं, तो हर नियमसेट को रिपॉज़िटरी के सबसे ऊपर rulesets फ़ोल्डर में रखें, हर नियमसेट की एक फ़ाइल:

your-repository/
  agents.json        (optional, only if you also share agents)
  rulesets/
    ember-roads.json
    another-system.json

यूज़र आपकी रिपॉज़िटरी एक बार जोड़ते हैं, उसमें क्या है इसकी समीक्षा करते हैं, और नए वर्ज़न पाने के लिए बाद में सिंक करते हैं। कस्टम रिपॉज़िटरी सूची एक एडवांस्ड सुविधा है। सर्वर चलाने वाला व्यक्ति इसे ENABLE_CUSTOM_AGENT_REPOS=true से चालू करता है, फिर Agents → Agent Organizer → Custom Sources (एजेंट → एजेंट ऑर्गनाइज़र → कस्टम सोर्स) खोलता है। रिपॉज़िटरी के नियमसेट रिपॉज़िटरी के मालिक के नाम के नीचे रखे जाते हैं, जैसे alice/ember-roads, इसलिए दो लेखक बिना टकराव के v20 नाम का नियमसेट प्रकाशित कर सकते हैं।

दो सीमाएँ लागू होती हैं। रिपॉज़िटरी में सीधे rulesets के अंदर अधिकतम 32 JSON फ़ाइलें हो सकती हैं, और इससे ज़्यादा वाली रिपॉज़िटरी अस्वीकार होती है। local नाम का अकाउंट नियमसेट प्रकाशित नहीं कर सकता, क्योंकि local/ फ़ाइल से इंपोर्ट किए गए नियमसेट के लिए रखा गया है।

आधिकारिक कैटलॉग में

साफ़ लाइसेंस वाला, बड़े पैमाने पर खेला जाने वाला सिस्टम Agent Organizer के ज़रिए सबको दिया जा सकता है। इसका प्रस्ताव रखने के लिए Marinara-Agents रिपॉज़िटरी में पुल रिक्वेस्ट खोलें। लेआउट के लिए वहाँ का ruleset-5e-2014 पैकेज देखें।

लाइसेंसिंग

सिर्फ़ वही नियम-टेक्स्ट प्रकाशित करें जिसे साझा करने का आपको अधिकार है। कई सिस्टम खुले लाइसेंस के तहत संदर्भ दस्तावेज़ प्रकाशित करते हैं, और आप उसी दस्तावेज़ से कॉपी कर सकते हैं। लाइसेंस ID (SPDX ID, यानी CC-BY-4.0 जैसा छोटा मानक नाम) और लाइसेंस का माँगा श्रेय टेक्स्ट license के अंदर रखें। जो नियम-पुस्तकें खुले लाइसेंस में नहीं हैं, उनसे टेक्स्ट कॉपी न करें। नियमसेट को ज़्यादातर नाम और संख्याएँ चाहिए। Game Master टेक्स्ट अपने शब्दों में लिखें।

समस्या-समाधान