नियमसेट की लेयर, अनुवाद और माइग्रेशन

खिलाड़ी किसी एक गेम के लिए जो रूपांतर चालू करते हैं उन्हें देने, नियमसेट के टेक्स्ट का अनुवाद करने, और शीट बदलने पर सेव किए गए मान नए ID पर ले जाने के लिए यह पेज इस्तेमाल करें। यह नियमसेट लेखकों के लिए है। शुरू करने से पहले Game Mode के नियमसेट लिखना पढ़ें।

लेयर: आपके अपने नियमसेट के रूपांतर

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

"layers": [
  {
    "id": "hard_winter",
    "label": "Hard winter",
    "summary": "Cold, hunger and short days. Everything is harder.",
    "conflicts": ["mud_season"],
    "gm": {
      "guidance": "Hard winter is on. Let a failed check cost warmth, food or daylight as well as progress.",
      "worldGuidance": "Hard winter is on. Build a world of closed roads, thin stores and rationed settlements."
    },
    "fields": [{ "id": "calling", "removeValues": ["Sailor"], "default": "Hauler" }],
    "difficultyLadder": [{ "label": "Easy", "dc": 7 }],
    "catalogs": [{ "id": "knacks", "hide": { "filter": "grit", "above": 0 } }]
  },
  {
    "id": "mud_season",
    "label": "Mud season",
    "summary": "Thaw, flooded roads and slow going."
  }
]

लेयर क्या कर सकती है। सूची बंद है, और हर असर या तो कुछ सीमित करता है या टेक्स्ट जोड़ता है:

"items": {
  "market": { "removeSellers": ["magic_dealer", "scribe"], "unsold": [{ "tag": "magical" }] },
  "lootTables": [{ "id": "treasure_low", "label": "Pocket treasure", "entries": [{ "coins": "sp", "weight": 1, "count": "4d6" }] }]
}

लेयर क्या नहीं कर सकती। वह enum मान नहीं जोड़ सकती, फ़ील्ड, स्किल, पूल या आराम नहीं जोड़ सकती, विक्रेता या लूट टेबल नहीं जोड़ सकती, हल करने का प्रकार नहीं बदल सकती, लाइव स्टेट या युद्ध की संख्याएँ नहीं छू सकती, और मॉडल कॉल नहीं जोड़ सकती। लेयर का _जोड़ा_ गया मान शीट के बाकी हर पढ़ने वाले के लिए अनजान होगा, इसलिए मान सिर्फ़ हटते हैं। इस सूची से आगे की कोई भी चीज़ खुद नियमसेट में बदलाव है, या दूसरा नियमसेट।

टकराव। conflicts उन लेयर के नाम देता है जो साथ चालू नहीं हो सकतीं। जोड़ी की एक तरफ़ नाम देना काफ़ी है। विज़ार्ड दूसरा टॉगल बंद कर देता है, और अगर किसी सेव चुनाव में किसी तरह दोनों हों, तो बाद में घोषित लेयर हटा दी जाती है, ताकि वही दो चुनाव हमेशा वही नियम दें।

हटाया गया मान पहले से रखने वाली शीट उसे रखती है। कुछ भी किसी कैरेक्टर को दोबारा नहीं लिखता। एडिटर वह मान देना बंद कर देता है, और जिस कैरेक्टर के पास वह पहले से था, वह उसे जैसा है वैसा दिखाता है। नए गेम में लेयर बंद करें तो मान फिर से मिलता है। छिपी कैटलॉग एंट्री के साथ भी यही है: वह पिकर से बाहर रहती है, और खिलाड़ी की पहले चुनी पंक्ति शीट पर बनी रहती है। लेयर के हटाए सिक्के जो किसी के पास पहले से हैं, उसके थैले में बने रहते हैं।

सीमाएँ। हर नियमसेट में 12 लेयर, और हर लेयर में दोनों टेक्स्ट मिलाकर 4000 अक्षरों के निर्देश। layers या मूल gm.worldGuidance घोषित करने वाले पैकेज वाले नियमसेट को Capability API 1.25 चाहिए, जिसकी लेयर सिक्के हटाती हैं उसे 1.64, और जिसकी लेयर उसके items बदलती हैं उसे 1.813। आपका इंपोर्ट किया नियमसेट उसे पढ़ने वाला Engine जाँचता है, इसलिए उसे कुछ नहीं चाहिए।

किसी और की लिखी लेयर (ऐसे नियमसेट के लिए कम जादू वाली लेयर जो आपने नहीं लिखा, अपनी अलग फ़ाइल में) बाद में जोड़ी जाने वाली चीज़ है। आज लेयर उसी नियमसेट के अंदर आती है जिसकी वह है।

अनुवाद

अनुवाद (Capability API 1.811)। किसी दूसरी भाषा में नियमसेट की दिखाई जाने वाली स्ट्रिंग उस भाषा के लिए एक अनुवाद में रखी जाती हैं, जिसका नाम भाषा के कोड पर होता है, जैसे Engine के अपने भाषा पैक के होते हैं (ru, pt-BR, zh-Hans)। आधिकारिक एजेंट कैटलॉग में हर अनुवाद नियमसेट की फ़ाइल के साथ रखा भाषा पैक होता है (नीचे देखें)। इसके बजाय आपके साझा किए जाने वाले नियमसेट पैकेज की फ़ाइल में वे अंदर भी हो सकते हैं, हर भाषा के लिए एक फ़ाइल, ruleset.json के साथ: locales/<language>.json, जो दूसरी फ़ाइलों की तरह मैनिफ़ेस्ट में सूचीबद्ध होती है। दोनों ही मामलों में, हर अनुवाद पैकेज का लोकलाइज़ेशन कैटलॉग है जिसमें ruleset सेक्शन होता है: हर कुंजी नियमसेट या उसके कैटलॉग की दिखाई जाने वाली स्ट्रिंग है, अंग्रेज़ी में शब्दशः, और उसका मान फ़ाइल की भाषा में वही स्ट्रिंग है।

{
  "_meta": { "locale": "ru", "direction": "ltr" },
  "package": { "name": "5e (SRD 5.1)" },
  "ruleset": { "Prone": "Лежащий", "Fire Bolt": "Огненный снаряд", "Goblin": "Гоблин" }
}

_meta.locale वही भाषा होनी चाहिए जिसके नाम पर फ़ाइल का नाम है, और फ़ाइल में $schema, _meta, package और ruleset के अलावा कुछ नहीं होता, हर मान टेक्स्ट होता है। खाली छोड़ी गई स्ट्रिंग का अनुवाद अभी नहीं हुआ है और वह अंग्रेज़ी में दिखती है; जिस फ़ाइल में ruleset सेक्शन नहीं है (पैकेज की अपनी अंग्रेज़ी लिस्टिंग, locales/en.json), वह किसी चीज़ का अनुवाद नहीं करती। अनुवाद सिर्फ़ दिखाने के लिए हैं: नियम, शीट कमांड और Game Master को बताई जाने वाली हर चीज़ अंग्रेज़ी ही पढ़ते रहते हैं। लड़ाई की स्क्रीन (नाम, स्थितियाँ, एक्शन, स्पेल, लॉग और टर्न क्रम) हर स्ट्रिंग को खिलाड़ी की भाषा में दिखाती है जहाँ नियमसेट के अनुवाद में वह मौजूद हो, पहले भाषा की अपनी फ़ाइल से और फिर उस भाषा की फ़ाइल से जिसका वह एक रूप है (pt-BR के लिए pt), और बाकी मामलों में अंग्रेज़ी में; "Goblin 2" के लिए "Goblin" का अनुवाद उसकी संख्या के साथ पढ़ा जाता है। अनुवाद वाली पैकेज फ़ाइल को Capability API 1.811 चाहिए। उसे इंपोर्ट करने पर सिर्फ़ उस भाषा का अनुवाद रखा जाता है जिस पर Engine सेट है (या उस भाषा का जिसका वह एक रूप है) और बाकी हटा दिए जाते हैं; नियमसेट को किसी दूसरी भाषा में पढ़ने के लिए Engine की भाषा बदलें और फ़ाइल फिर से इंपोर्ट करें, जो रखे गए अनुवाद की जगह ले लेती है। अनुवाद वर्ज़न का हिस्सा नहीं हैं, इसलिए सुधारे हुए अनुवाद के साथ वही वर्ज़न फिर से इंपोर्ट करने पर भी अनुवाद बदल दिया जाता है, और बिना अनुवाद वाली उसकी फ़ाइल पहले से रखे गए अनुवाद को रहने देती है।

कैटलॉग के नियमसेट की फ़ाइल के अंदर कभी locales/<language>.json नहीं होता (जिसमें होता है, उसे डाउनलोड करने से पहले ही अस्वीकार कर दिया जाता है)। उसके अनुवाद भाषा पैक होते हैं (Capability API 1.811): हर भाषा के लिए एक JSON फ़ाइल, <id>-<version>.<language>.json, जो <id>-<version>.ruleset.json के साथ प्रकाशित होती है और जिसमें ठीक वही होता है जो locales/<language>.json में होता है (_meta.locale में वही भाषा जिसके नाम पर फ़ाइल का नाम है, और ruleset सेक्शन)। कैटलॉग एंट्री उन्हें अपने artifact के साथ सूचीबद्ध करती है:

"locales": {
  "ru": {
    "url": "https://raw.githubusercontent.com/Pasta-Devs/Marinara-Agents/main/artifacts/ember-roads-1.0.0.ru.json",
    "sha256": "<64 hex>",
    "bytes": 812345,
    "name": "Угольные дороги",
    "description": "<the store card's description in Russian>"
  }
}

हर पैक का https URL उसी रूप का होता है जिस रूप का आर्टिफ़ैक्ट का होता है, उसके वर्ज़न और भाषा के नाम पर, साथ में उसका sha256 और आकार (अधिकतम 8 MB); नियमसेट अधिकतम 40 पैक सूचीबद्ध करता है, कभी en नहीं (अंग्रेज़ी खुद नियमसेट है), और उसका मैनिफ़ेस्ट Capability API 1.811 घोषित करता है। name और description उस भाषा में स्टोर कार्ड के नाम और विवरण हैं, इसलिए पैक फ़ेच किए बिना कार्ड Engine की भाषा में पढ़ा जा सकता है। इंस्टॉल करते समय नियमसेट की फ़ाइल और फिर सिर्फ़ उस भाषा का पैक फ़ेच होता है जिस पर Engine सेट है (या उस भाषा का जिसका वह एक रूप है), उसके आकार, चेकसम और भाषा की जाँच होती है, और उसे इंस्टॉल हुए वर्ज़न के साथ रखा जाता है। जब Engine की भाषा बदलती है (और हर बार जब उसमें पेज खुलता है), तो हर इंस्टॉल हुआ कैटलॉग नियमसेट, जो नई भाषा का पैक सूचीबद्ध करता है, उसे फ़ेच करता है और पुरानी भाषा का पैक हटा दिया जाता है। जो पैक मिल नहीं सकता (ऑफ़लाइन होने, सूचीबद्ध न होने, या कैटलॉग में सूचीबद्ध फ़ाइल न होने के कारण), वह नियमसेट को अंग्रेज़ी में रहने देता है; अगला इंस्टॉल या भाषा का बदलाव फिर कोशिश करता है। अपडेट पिछले वर्ज़न को उसके पैक के बिना रोलबैक के लिए रखता है: रोलबैक के बाद भाषा का अगला बदलाव उस वर्ज़न का पैक फिर फ़ेच करता है, अगर कैटलॉग अब भी उसे सूचीबद्ध करता है।

नए ID पर मान ले जाना: sheet.migrations

चीज़ें जोड़ने के लिए और कुछ नहीं चाहिए। जब नया लेआउट किसी मान को कहीं और ले जाता है (नाम बदला गया फ़ील्ड, एक स्तर जो हर क्लास का अलग स्तर बन जाता है, हिट डाइस का एक पूल जो हर डाइस का अलग पूल बन जाता है), तो sheet.migrations (Capability API 1.77) में बताएँ कैसे, ताकि पुराने लेआउट पर बना हर कैरेक्टर अपनी संख्याएँ रखे: लाइब्रेरी में, गेम में, पुराने सेव, ब्रांच और चेकपॉइंट में, और इंपोर्ट किए कार्ड में।

"migrations": [
  {
    "from": 3,
    "steps": [
      { "rename": "field", "from": "xp", "to": "experience" },
      {
        "route": "level",
        "by": "class",
        "cases": [
          { "words": ["fighter"], "to": "level_fighter" },
          { "words": ["wizard"], "to": "level_wizard" }
        ],
        "else": "level_other",
        "default": 1
      },
      {
        "routeLive": "pool",
        "from": "hit_dice",
        "cases": ["hit_dice_d6", "hit_dice_d8", "hit_dice_d10", "hit_dice_d12"],
        "else": "hit_dice_d8"
      }
    ]
  }
]