नियमसेट के कैटलॉग
इस पेज की मदद से नियमसेट के साथ तैयार एंट्री (स्पेल, सामान, क्लास फ़ीचर) भेजें, जिन्हें शीट एडिटर पिकर में देता है, ताकि खिलाड़ियों को लंबी सूचियाँ हाथ से न लिखनी पड़ें। इसमें कैटलॉग हेडर, एंट्री, नियमसेट द्वारा अपडेट रखे जाने वाले मान, शीट कमांड और इस्तेमाल की कमांड शामिल हैं। यह पेज नियमसेट लिखने वालों के लिए है। शुरू करने से पहले Game Mode के नियमसेट लिखना पढ़ें।
लंबी स्पेल सूची या सामान की टेबल एक-एक पंक्ति करके लिखना धीमा काम है। कैटलॉग तैयार एंट्री का नामित संग्रह है जिसे आप नियमसेट के साथ भेजते हैं। शीट एडिटर कैटलॉग से भरने वाली हर सूची पर इन्हें पिकर में देता है, और किसी एक को चुनने पर पंक्ति भर जाती है।
कैटलॉग वैकल्पिक है। नियमसेट में अधिकतम बारह हो सकते हैं, और Engine में कुछ भी नहीं जानता कि वे किस बारे में हैं: हर ID, कॉलम, फ़िल्टर और शब्द आपकी फ़ाइल से आता है।
हेडर
हेडर फ़ाइल के सबसे ऊपरी स्तर पर, gm के बगल में, catalogs में जाता है।
"catalogs": [
{
"id": "knacks",
"label": "Knacks",
"feeds": ["knacks", "tricks"],
"filters": [
{ "id": "grit", "label": "Grit cost", "type": "number" },
{ "id": "road", "label": "Road", "type": "text" },
{ "id": "callings", "label": "Calling", "type": "tags", "startFrom": { "field": "calling" } }
],
"units": { "distance": { "label": "paces", "perCell": 2 } },
"entries": []
}
]idऔरlabel: ID शीट ID के नियमों का पालन करता है, और लेबल पिकर का नाम है।holds:"rows"(डिफ़ॉल्ट, और इस रिलीज़ से पहले लिखा हर कैटलॉग यही है),"creatures"या"items"। जीवों का कैटलॉग ऐसा जीव-संग्रह है जिसे लड़ाई पढ़ती है, और आइटम का कैटलॉग पार्टी के साथ चलने वाली चीज़ें सूचीबद्ध करता है। इनमें से कोई भी शीट पर कुछ नहीं लिखता,feedsघोषित नहीं करता, और पिकर उसे कभी नहीं देता। नीचे जीव और आइटम देखें।feeds: आपकी शीट की वे सूचियाँ जिनमें इस कैटलॉग की एंट्री लिख सकती हैं, एक से आठ तक। पंक्तियों के कैटलॉग के लिए ज़रूरी, और जीवों या आइटम के कैटलॉग पर अस्वीकार। एंट्री कभी ऐसी सूची में नहीं लिख सकती जो यहाँ नहीं है, और कभी ऐसा मान नहीं लिख सकती जो सूची के कॉलम में न समा सके।filters: वैकल्पिक, अधिकतम आठ। पिकर किस आधार पर सूची छोटी कर सकता है। फ़िल्टरnumber,textमान याtags(कई शब्द) होता है।startFromउस शीट फ़ील्ड का नाम देता है जिस पर पिकर खुलता है, इसलिए जिस कैरेक्टर की Calling, Tinker है, वह पहले Tinker वाली एंट्री देखता है।units: वैकल्पिक। आपके सिस्टम में एंट्री केmechanicsब्लॉक की रेंज या क्षेत्र के आकार का क्या मतलब है।
एक एंट्री
{
"id": "road-sense",
"label": "Road Sense",
"summary": "You read a road the way other people read a face.",
"filters": { "grit": 0, "road": "Ash Flats", "callings": ["Scout", "Courier"] },
"rows": [
{
"list": "knacks",
"values": { "name": "Road Sense", "notes": "Sneak to notice where a road turns bad." }
}
]
}id: छोटे अक्षर, अंक और अकेले हाइफ़न, कैटलॉग के अंदर अनोखा।labelऔरsummary: पिकर में दिखने वाला टेक्स्ट। सारांश वैकल्पिक है, एक लाइन का, और अधिकतम 300 अक्षर।filters: हेडर में घोषित फ़िल्टर के मान।numberफ़िल्टर संख्या लेता है,textफ़िल्टर एक स्ट्रिंग, औरtagsफ़िल्टर स्ट्रिंग की सूची।rows: एंट्री चुनने पर क्या लिखा जाता है, एक से छह पंक्तियाँ।listकैटलॉग केfeedsमें से एक है, औरvaluesकी कुंजियाँ उस सूची के कॉलम ID हैं।creature: जिस कैटलॉग काholdsजीव है, उसमें पंक्तियों के बजाय विरोधी। एंट्री मेंrowsयाcreatureमें से ठीक एक होता है, और जीव में कोईmechanicsनहीं होता: वह अपने एक्शन में बताता है कि क्या करता है।
हर मान लक्ष्य सूची के कॉलम से जाँचा जाता है, इसलिए गलत लिखा कॉलम नाम या कॉलम के दायरे से बाहर की संख्या उस एंट्री के साथ बताई जाती है जिससे वह आई। नियमसेट फ़ाइल के अंदर लिखी एंट्री नियमसेट लोड होते समय जाँची जाती हैं, जिसका मतलब इंपोर्ट की गई फ़ाइल के लिए इंपोर्ट के समय है। पैकेज की अलग कैटलॉग फ़ाइल तब जाँची जाती है जब पिकर पहली बार उसे माँगता है, और गलती वाली फ़ाइल वहाँ एंट्री के बजाय अपने कारण दिखाती है।
एक एंट्री, कई सूचियाँ
सीमित उपयोग वाला फ़ीचर शीट पर दो पंक्तियाँ है: खुद फ़ीचर, और उसे ट्रैक करने वाला काउंटर। फिर भी यह एक ही चुनाव है।
{
"id": "last-ember",
"label": "Last Ember",
"rows": [
{
"list": "knacks",
"values": { "name": "Last Ember", "notes": "Spend 1 Grit to give a downed friend 3 Grit back." }
},
{ "list": "tricks", "values": { "name": "Last Ember", "uses": 1, "recharge": "camp" } }
]
}नियमसेट द्वारा अपडेट रखे जाने वाले मान
चुने जाने के बाद पंक्ति की संख्याएँ खिलाड़ी की होती हैं। एक अपवाद काम का है: ऐसा अधिकतम जो कैरेक्टर के साथ चलता है, जैसे एबिलिटी स्कोर जितने उपयोग, या स्तर के साथ बढ़ने वाला क्लास संसाधन। पंक्ति scaled मैप में अपने अधिकतम चार नंबर कॉलम का नाम दे सकती है, और शीट एडिटर उन सेल को सही रखता है।
{
"list": "tricks",
"values": { "name": "Last Ember", "uses": 1, "recharge": "camp" },
"scaled": { "uses": { "from": { "abilityScore": "heart" } } }
}- कुंजी सूची के
numberकॉलम में से एक है। fromसाधारण वैल्यू रेफ़रेंस है, वही बंद शब्दावली जो बाकी हर जगह इस्तेमाल होती है। इससे ज़्यादा जटिल कुछ भी आपकी शीट में घोषितderivedमान है, जिसकी ओरfromफिर इशारा करता है ("from": { "derived": "lay_on_hands_max" })। यहाँ कोई नया गणित नहीं जुड़ता।tableवैकल्पिक है। इसके साथ, रेफ़रेंस का मान चरण टेबल में खोजा जाता है, जिस तरह स्तर से कोई संख्या मिलती है:"scaled": { "max": { "from": { "field": "level" }, "table": [[1, 2], [3, 3], [6, 4]] } }।valuesमें कॉलम के लिए साधारण संख्या फिर भी होनी चाहिए, और उसे छोड़ने वाली पंक्ति अस्वीकार होती है। कोई शीट पता होने से पहले पंक्ति यही होती है, और ऐसे रेफ़रेंस के बिना वाली शीट यही रखती है।scaledवाली पंक्ति उस सूची के लिए एंट्री की इकलौती पंक्ति होनी चाहिए, ताकि शीट पर चिह्नित पंक्ति हमेशा एक ही स्पेक से मेल खाए, या (Capability API 1.92) एंट्री उस सूची में जो भी पंक्ति लिखती है, हर एक के सूची के नाम वाले कॉलम (सूची के पूल काnameColumn, वरना उसका पहला टेक्स्ट कॉलम) में उसका अपना नाम होना चाहिए। तब शीट की पंक्ति उस नाम से अपने स्पेक से मिलाई जाती है, इसलिए एक ही गुण दो ऐसे उपयोग दे सकता है जो अलग-अलग बढ़ते हैं; जिस पंक्ति का नाम खिलाड़ी बदल दे, उसे छेड़ा नहीं जाता।
मान शीट एडिट करते समय निकाला जाता है, पढ़ते समय कभी नहीं, इसलिए सेव हुई पंक्ति हमेशा वही संख्या है जो वह बताती है। उसे उस कॉलम में फ़िट किया जाता है जिसमें वह जाता है: कॉलम के min और max तक सीमित, और पूर्णांक लेने वाले कॉलम में नीचे राउंड। ऊपर के उदाहरण में Heart 3 वाले कैरेक्टर के तीन उपयोग हैं और Heart 0 या उससे कम वाले के कोई नहीं। पंक्ति उसकी शीट पर 0 उपयोग के साथ रहती है, और क्योंकि अधिकतम 0 वाला काउंटर पूल नहीं है, खेल में खर्च करने को कुछ नहीं होता।
पैकेज वाले नियमसेट में scaled कॉलम Capability API 1.23 हैं। आपका इंपोर्ट किया सामुदायिक नियमसेट उसे पढ़ने वाला Engine जाँचता है, इसलिए उसे कुछ और नहीं चाहिए।
चुनी गई पंक्तियाँ कॉपी हैं
हर चुनी गई पंक्ति एक अतिरिक्त कुंजी _catalog के साथ शीट पर कॉपी होती है, जिसमें <catalog id>/<entry id> होता है। कॉलम ID हमेशा अक्षर से शुरू होते हैं, इसलिए यह कुंजी कभी आपकी नहीं हो सकती।
कॉपी कैरेक्टर की है। खिलाड़ी बाद में इसमें कुछ भी बदल सकता है, आपका नियमसेट इंस्टॉल न हो तब भी शीट काम करती रहती है, और नियमसेट का नया वर्ज़न प्रकाशित करने से कभी किसी का कैरेक्टर दोबारा नहीं लिखा जाता। यही निशान पिकर पढ़ता है ताकि दिखा सके कि शीट में पहले से क्या है, और नीचे Refresh भी इसे पढ़ता है।
नियमसेट से रिफ़्रेश करना
चुनी गई पंक्ति अपना निशान रखती है, इसलिए शीट एडिटर खिलाड़ी को बता सकता है कि आपका नया टेक्स्ट उसकी पंक्ति से अलग है। सूची के नीचे एक छोटी लाइन बताती है कि कितनी पंक्तियों में नया टेक्स्ट है, और Review (रिव्यू करें) बटन हर पंक्ति के लिए शीट और नियमसेट का टेक्स्ट साथ-साथ दिखाता है, हर पंक्ति के लिए एक टिक के साथ। खिलाड़ी के Update selected (चुनी गई अपडेट करें) पर क्लिक करने तक कुछ नहीं लिखा जाता, और फिर सिर्फ़ टिक की गई पंक्तियों के अलग कॉलम लिखे जाते हैं। पंक्ति का बाकी सब कुछ, निशान समेत, बचा रहता है।
तुलना का दायरा जानबूझकर सीमित है:
- मौजूदा मानों की तुलना सिर्फ़
text,longtext,diceऔरenumकॉलम में होती है। मौजूदाnumberऔरbooleanमान खिलाड़ी के हैं और बचे रहते हैं, 0 और false भी। जो कॉलम पंक्ति में अभी नहीं है, वह अपने टाइप वाले मान के साथ दिया जा सकता है, संख्याएँ और स्विच भी। scaled कॉलम शामिल नहीं होता, क्योंकि वह पहले से शीट के साथ चलता है। - सिर्फ़ वे कॉलम जो आपकी एंट्री सेट करती है। आपकी एंट्री जो कॉलम छोड़ती है उसे कभी नहीं छुआ जाता, शीट में उसमें कुछ भी हो।
- ऐसा मान जिसे कॉलम खुद अस्वीकार करता, जैसे
enumका वह मान जो आप अब नहीं देते याmaxLengthसे लंबा टेक्स्ट, लिखने के बजाय छोड़ दिया जाता है। - पंक्ति को उसकी मूल एंट्री की पंक्ति से उस सूची में एक ही निशान वाली पंक्तियों के बीच उसकी जगह के हिसाब से मिलाया जाता है, जो तब तक सही है जब तक शीट में उनकी संख्या उतनी है जितनी आपकी एंट्री लिखती है। वरना यह सिर्फ़ तब काम करता है जब आपकी एंट्री उस सूची में एक ही पंक्ति लिखती हो। अगर खिलाड़ी ने दो पंक्तियों वाली एंट्री की एक पंक्ति हटा दी, तो अंदाज़ा लगाने के बजाय उस एंट्री को वैसे ही छोड़ दिया जाता है।
- जिस पंक्ति की एंट्री अब आपके कैटलॉग में नहीं है, उसे चुपचाप वैसे ही छोड़ दिया जाता है।
इसलिए एंट्री के शब्द या नाम बदलना उन कैरेक्टर तक पहुँच सकता है जिन्होंने उसे पहले चुना है, अगर वे इसे मान लें। किसी संख्या का मतलब बदलना ऐसे नहीं पहुँच सकता, और नहीं पहुँचेगा: पंक्ति खिलाड़ी की होने के बाद वह कॉलम भी उसका है।
शीट कमांड: स्थायी उन्नति
नियमसेट sheet.advancement से स्थायी बिल्ड में बदलाव चालू कर सकता है:
"advancement": {
"fields": ["xp", "level", "humanity", "discipline"],
"abilities": true,
"skills": true,
"saves": true,
"text": "Award XP at the end of a session; change other values only when earned."
}सिर्फ़ वे फ़ील्ड ID शामिल करें जिन्हें आपकी शीट number या text (text या longtext) घोषित करती है, अधिकतम 24। boolean क्रमशः सारी एबिलिटी, स्किल या सेव की इजाज़त देते हैं; छोड़ने या false का मतलब है कोई परमिशन नहीं। खाली परमिशन सेट, अनजान फ़ील्ड, असमर्थित फ़ील्ड टाइप या अनजान कुंजी इंपोर्ट पर अस्वीकार होती है। text अधिकतम 400 प्रॉम्प्ट में सुरक्षित अक्षरों का वैकल्पिक निर्देश है। advancement के बिना मौजूदा कमांड पहले जैसी चलती हैं और हर advance रिक्वेस्ट अस्वीकार होती है।
[sheet: op="advance" field="xp" by="250" who="party"]
[sheet: op="advance" field="xp" to="1200"]
[sheet: op="advance" field="humanity" by="-1"]
[sheet: op="advance" field="discipline" to="Auspex"]
[sheet: op="advance" ability="str" by="1"]
[sheet: op="advance" ability="str" to="16"]
[sheet: op="advance" skill="stealth" tier="expert"]
[sheet: op="advance" save="will" tier="trained"]ठीक एक लक्ष्य का नाम दें। फ़ील्ड और एबिलिटी by या to में से ठीक एक लेते हैं; text सिर्फ़ to लेता है। नाम और स्तर छोटे-बड़े अक्षर का फ़र्क किए बिना ID या लेबल से मिलाए जाते हैं। स्किल और सेव resolution.proficiencyTiers में घोषित कोई भी स्तर मानते हैं। नंबर फ़ील्ड integer, min और max का पालन करते हैं; एबिलिटी अपनी पूर्णांक सीमाओं का; text maxLength का। अमान्य मान bad-amount कारण के साथ अस्वीकार होता है जो सीमा बताता है, और कभी चुपचाप सीमा में नहीं लाया जाता। बंद उन्नति, गैर-मंज़ूर लक्ष्य, अनजान नाम और अनजान स्तर भी अस्वीकार होते हैं। दोबारा लिखे गए टैग में result होता है और now में नया मान। खिलाड़ी के लिए who छोड़ दें, या पार्टी के हर साफ़ पहचाने जा सकने वाले कार्ड के लिए who="party" इस्तेमाल करें; आंशिक अस्वीकृति बताती है कि कौन से कार्ड आगे नहीं बढ़ सके।
Engine बिल्ड को गेम के कार्ड पर उसी मेटाडेटा स्टोरेज से सेव करता है जिससे खिलाड़ी का एडिट होता है, उसका शीट वर्ज़न रखते हुए और नए बिल्ड से निकाले गए मान दोबारा निकालते हुए। लाइब्रेरी के कार्ड नहीं बदलते। लाइव कमांड की तरह, दूसरा स्वाइप या दोबारा जेनरेट किया गया जवाब जाने वाले जवाब के बदलावों से पहले से शुरू होता है। हर जवाब अपना आखिरी बिल्ड दर्ज करता है, बिना उन्नति वाले जवाब भी। स्वाइप चुनना उसका स्नैपशॉट लौटाता है; सबसे नया जवाब हटाने पर पिछला स्नैपशॉट दिखता है। किसी पुराने जवाब को हटाने पर बाद का स्नैपशॉट तब तक लागू रहता है जब तक वह बाद का जवाब न हटाया जाए। आगे बढ़ाया गया जवाब उसी जवाब का स्नैपशॉट अपडेट करता है। वापस लेना (undo) सिर्फ़ वे मान बदलता है जो अब भी दर्ज नतीजे से मेल खाते हैं, इसलिए खिलाड़ी के बाद के एडिट बचे रहते हैं और असंबंधित एडिट XP इनाम को वापस लेने से नहीं रोकते।
use कमांड: Game Master को आपकी लिखी कीमत खर्च करने देना
नैरेशन करते समय Game Master हर शीट को [sheet: ...] कमांड से अपडेट रखता है: spend, restore (heal का भी यही मतलब है), damage, temp, track, condition, note और rest। कैटलॉग देने वाले नियमसेट को एक और कमांड मिलती है:
[sheet: who="Mira" op="use" name="Fireball"]
[sheet: who="Mira" op="use" name="Fireball" pool="3rd-level slots"]op="cast" का मतलब op="use" जैसा और spell= का मतलब name= जैसा है, ताकि Game Master जो शब्द स्वाभाविक रूप से चुनता है वे काम करें, और आपके फ़ॉर्मैट को "spell" शब्द जानने की ज़रूरत न पड़े।
नाम का मिलान, छोटे-बड़े अक्षर का फ़र्क किए बिना, उस कैरेक्टर की शीट की उन पंक्तियों से होता है जो आपके किसी कैटलॉग से आई हैं। पंक्ति उस नाम से मिलती है जो Game Master को दिखाया गया था (उस सूची का sheetSummary नाम कॉलम, फिर सूची का pools.nameColumn, फिर उसका पहला टेक्स्ट कॉलम), और अपनी मूल एंट्री के label से भी, इसलिए जिस खिलाड़ी ने अपनी पंक्ति का नाम बदल दिया, उसके पास भी वह बनी रहती है। जिस नाम से कुछ नहीं मिलता, और जो नाम दो अलग एंट्री से मिलता है, दोनों अस्वीकार होते हैं।
क्या खर्च होता है:
- एंट्री के
mechanics.costका हर पद। लाइव पूल का नाम देने वाला पद उसी पूल से चुकाया जाता है; पूल समूह का नाम देने वाला पद उस समूह के पहले ऐसे पूल से, घोषणा के क्रम में, चुकाया जाता है जो उसे चुका सके। अपने आप ऊँचे पूल पर नहीं जाया जाता, क्योंकि हर समूह सीढ़ी नहीं होता। - साथ में उसी एंट्री की लिखी हर सूची-पंक्ति वाले पूल से एक, जैसे किसी फ़ीचर के उपयोग गिनने वाला काउंटर। यह ऊपर की
Last Emberएंट्री की दूसरी पंक्ति है। अधिकतम 0 वाले काउंटर के पास देने को कोई उपयोग नहीं है, इसलिए कमांड मुफ़्त में चलने के बजाय अस्वीकार होती है।
pool= ऊँचे स्तर पर इस्तेमाल (upcast) है: वही एक कीमत, उसी समूह के दूसरे पूल से चुकाई गई। यह सिर्फ़ तब स्वीकार होता है जब कीमत में ठीक एक पद हो और बताया गया पूल उस पद के समूह में हो, या उसके लिए चुकाता हो। बाकी कुछ भी नया मतलब निकालने के बजाय अस्वीकार होता है।
दूसरे समूह के लिए चुकाने वाला पूल (Capability API 1.171)। लाइव पूल का pays अधिकतम चार दूसरे समूहों का नाम देता है जिनकी कीमतें वह भी चुका सकता है, अपने स्तर पर (उसका level, या उसके अपने समूह में उसकी जगह), और अपने स्तर से ऊँची कीमत के लिए कभी नहीं। 5e के pact स्लॉट उन स्पेल के लिए चुकाते हैं जिनकी कीमत स्पेल स्लॉट में तय है, जैसा multiclass warlock कर सकता है:
{
"id": "pact_slots",
"label": "Pact Slots",
"group": "pact",
"max": { "field": "pact_slot_count" },
"level": { "field": "pact_slot_level" },
"pays": ["slots"]
}लड़ाई ऐसा पूल स्पेल के अपने समूह के ऊँचे पूल के साथ देती है, और उससे भुगतान स्पेल को उतने चरण बढ़ाता है जितना उसका स्तर स्पेल के स्तर से ऊपर है: तीसरे स्तर का pact स्लॉट Magic Missile के लिए वैसे ही चुकाता है जैसे तीसरे स्तर का स्लॉट चुकाता। जिस इस्तेमाल का अपना पूल खाली है वह फिर भी दिया जाता है, जो सिर्फ़ ऊँचे पूल से या उसके लिए चुकाने वाले पूल से चुकाया जाता है, इसलिए पहले स्तर के स्लॉट खत्म होने पर पहले स्तर का स्पेल दूसरे स्तर के स्लॉट से कास्ट होता है। एंट्री के mechanics पर targetsPerCostStep (1.171, 1 से 10) जितने चरण ऊपर चुकाया जाता है, हर चरण के लिए उतने लक्ष्य जोड़ता है, अधिकतम 20 तक: Hold Person "targetCount": 1, "targetsPerCostStep": 1 है।
यह पूरा या कुछ नहीं है। अगर कोई भी हिस्सा चुकाया न जा सके तो पूरी कमांड अस्वीकार होती है, कुछ नहीं बदलता, और खिलाड़ी को बताया जाता है। बिल्कुल बिना कीमत वाली एंट्री, जैसे कैन्ट्रिप या पैसिव फ़ीचर, स्वीकार होती है और कुछ नहीं बदलती।
इनलाइन, या अपनी अलग फ़ाइल
छोटा कैटलॉग ruleset.json में हेडर के entries में इनलाइन रहता है। लंबा कैटलॉग अपनी अलग फ़ाइल में रहता है और हेडर इसके बजाय asset से उसका नाम देता है। कैटलॉग में इन दोनों में से ठीक एक होता है।
{ "id": "knacks", "label": "Knacks", "feeds": ["knacks"], "asset": "catalogs/knacks.json" }पाथ हमेशा catalogs/<the catalog's id>.json होता है। फ़ाइल खुद ऐसी दिखती है:
{ "schemaVersion": 1, "catalog": "knacks", "entries": [] }अलग कैटलॉग फ़ाइलें पैकेज में आती हैं: आधिकारिक कैटलॉग से प्रकाशित पैकेज, या नियमसेट पैकेज फ़ाइल जिसे आप खुद इंपोर्ट करते हैं (अपना नियमसेट साझा करना देखें)। पैकेज contributions.assets.paths में ruleset.json के साथ फ़ाइल सूचीबद्ध करता है, और उसे Capability API 1.21 चाहिए। जीवों के कैटलॉग को, इनलाइन हो या अलग फ़ाइल में, Capability API 1.27 चाहिए, और आइटम के कैटलॉग को 1.49। एक फ़ाइल के रूप में इंपोर्ट किया गया, या GitHub रिपॉज़िटरी से साझा किया गया नियमसेट अपने कैटलॉग इनलाइन रखता है, जिसका मतलब है कि उन्हें पूरी नियमसेट फ़ाइल की 512 KB सीमा में समाना होगा। इसमें कुछ सौ छोटी एंट्री की जगह है।
सीमाएँ हैं: हर नियमसेट में 12 कैटलॉग, दोनों रूपों में हर कैटलॉग में 2000 एंट्री, और एक कैटलॉग फ़ाइल के लिए 2 MB। जिस पैकेज का ruleset.json 256 KB से ज़्यादा है, या जिसकी कोई कैटलॉग फ़ाइल 1 MB से ज़्यादा है, उसे Capability API 1.340 चाहिए, जिसने दोनों सीमाएँ बढ़ाईं।