From 6a901af6485e6a2533996ee8337f34bb5c8e8e2a Mon Sep 17 00:00:00 2001 From: Spappz <34202141+Spappz@users.noreply.github.com> Date: Tue, 28 May 2024 03:24:51 +0100 Subject: [PATCH] npm run build --- _dist/schema/bundle.json | 2 +- _dist/schema/data.json | 2 +- _dist/zod/_bundle.js | 4 +- _dist/zod/_content.d.ts | 224 +++++++++++++++++++++++- _dist/zod/_content.js | 4 +- _dist/zod/_data.d.ts | 224 +++++++++++++++++++++++- _dist/zod/_data.js | 2 +- _dist/zod/_index.js | 2 +- _dist/zod/content/background.d.ts | 32 +++- _dist/zod/content/common/reference.d.ts | 32 +++- _dist/zod/content/common/reference.js | 5 +- _dist/zod/content/condition.d.ts | 32 +++- _dist/zod/content/domain.d.ts | 32 +++- _dist/zod/content/event.d.ts | 32 +++- _dist/zod/content/familiarAbility.d.ts | 32 +++- _dist/zod/content/relicGift.d.ts | 32 +++- _dist/zod/content/skill.d.ts | 32 +++- _dist/zod/contentTemplate.d.ts | 32 +++- zod/_bundle.ts | 11 +- zod/_content.ts | 11 +- zod/_data.ts | 2 +- zod/_index.ts | 2 +- 22 files changed, 742 insertions(+), 41 deletions(-) diff --git a/_dist/schema/bundle.json b/_dist/schema/bundle.json index 7d55ae5..750159d 100644 --- a/_dist/schema/bundle.json +++ b/_dist/schema/bundle.json @@ -1 +1 @@ -{"type":"object","properties":{"license":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"license"},"ID":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$","description":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.","markdownDescription":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the license's `name` for display purposes.","markdownDescription":"An abbreviation or other shortening of the license's `name` for display purposes."},"short":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the license's name","markdownDescription":"An object representing the license's name"},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},{"type":"object","properties":{"type":{"type":"string","minLength":1}},"required":["type"],"additionalProperties":true}]},"minItems":1,"description":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation."}},"required":["entries"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},"minItems":1},"source":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"source"},"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number.","markdownDescription":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source's name","markdownDescription":"An object representing the source's name"},"data":{"type":"object","properties":{"released":{"type":"string","format":"date","description":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available.","markdownDescription":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available."},"version":{"type":"string","minLength":1,"description":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")","markdownDescription":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")"},"errataed":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed.","markdownDescription":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed."},"added":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise).","markdownDescription":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise)."},"modified":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified.","markdownDescription":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified."},"URL":{"type":"string","format":"uri","description":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\".","markdownDescription":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\"."},"groupIDs":{"type":"array","items":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of a source group.","markdownDescription":"The `ID` of a source group."},"minItems":1,"description":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\").","markdownDescription":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\")."},"requiredSourceIDs":{"type":"array","items":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of the dependent homebrew source.","markdownDescription":"The `ID` of the dependent homebrew source."},"minItems":1,"description":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`.","markdownDescription":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`."},"licenseID":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of the source's license.","markdownDescription":"The `ID` of the source's license."},"copyright":{"type":"array","items":{"$ref":"#/properties/license/items/properties/data/properties/entries/items"},"minItems":1,"description":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation."},"authors":{"type":"array","items":{"type":"string","description":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\").","markdownDescription":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\")."},"minItems":1,"description":"A list of unique authors as credited by the source itself.","markdownDescription":"A list of unique authors as credited by the source itself."},"publisher":{"type":"string","minLength":2,"description":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\").","markdownDescription":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\")."},"converters":{"type":"array","items":{"type":"string","minLength":2,"description":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated.","markdownDescription":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated."},"minItems":1,"description":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates.","markdownDescription":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates."},"_tags":{"type":"object","properties":{"publicationType":{"type":"object","properties":{"Comic":{"type":"boolean","const":true,"description":"The source is content bundled with a comic.","markdownDescription":"The source is content bundled with a comic."},"Blog post":{"type":"boolean","const":true,"description":"The source is a blog post or another similar type of short, online article.","markdownDescription":"The source is a blog post or another similar type of short, online article."}},"additionalProperties":false,"description":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook.","markdownDescription":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook."},"status":{"type":"object","properties":{"Missing content":{"type":"boolean","const":true,"description":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date.","markdownDescription":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date."},"Missing tags":{"type":"boolean","const":true,"description":"The converted content this source contains isn't completely tagged, even if it all displays correctly.","markdownDescription":"The converted content this source contains isn't completely tagged, even if it all displays correctly."},"Invalid":{"type":"boolean","const":true,"description":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained.","markdownDescription":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained."}},"additionalProperties":false},"misc":{"type":"object","properties":{"legacyRuleset":{"type":"boolean","const":true,"description":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023).","markdownDescription":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023)."},"Official":{"type":"boolean","const":true,"description":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official').","markdownDescription":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official')."},"GM-facing":{"type":"boolean","const":true,"description":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like.","markdownDescription":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like."},"PFS-legal":{"type":"boolean","const":true,"description":"This source is legal for Pathfinder Society play.","markdownDescription":"This source is legal for Pathfinder Society play."},"Playtest":{"type":"boolean","const":true,"description":"This source contains playtest, early-access, or otherwise 'unfinished' content.","markdownDescription":"This source contains playtest, early-access, or otherwise 'unfinished' content."},"Ongoing":{"type":"boolean","const":true,"description":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication.","markdownDescription":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication."},"Deprecated":{"type":"boolean","const":true,"description":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not.","markdownDescription":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not."},"NSFW":{"type":"boolean","const":true,"description":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature.","markdownDescription":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature."}},"additionalProperties":false}},"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["released","added","modified","URL","licenseID"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},"minItems":1},"sourceGroup":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"sourceGroup"},"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups).","markdownDescription":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups)."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source group's name","markdownDescription":"An object representing the source group's name"},"data":{"type":"object","properties":{"publisher":{"type":"string","minLength":2,"description":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group.","markdownDescription":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group."},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"Adventure":{"type":"boolean","const":true,"description":"This source group is an adventure path or the like.","markdownDescription":"This source group is an adventure path or the like."},"Ongoing":{"type":"boolean","const":true,"description":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools.","markdownDescription":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools."}},"additionalProperties":false}},"required":["misc"],"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["publisher"],"additionalProperties":false}},"required":["type","ID","title"],"additionalProperties":false,"description":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like.","markdownDescription":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like."},"minItems":1},"background":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"background"},"name":{"type":"object","properties":{"primary":{"type":"string","minLength":1,"description":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case.","markdownDescription":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case."},"aliases":{"type":"array","items":{"type":"string","minLength":1,"description":"An alternative name for the content.","markdownDescription":"An alternative name for the content."},"minItems":1,"description":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\").","markdownDescription":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\")."},"specifier":{"type":"string","minLength":1,"description":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated.","markdownDescription":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated."}},"required":["primary"],"additionalProperties":false},"source":{"type":"object","properties":{"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source ID that contains the data.","markdownDescription":"The source ID that contains the data."},"page":{"type":"integer","description":"The page number (if any) on which the content begins.","markdownDescription":"The page number (if any) on which the content begins."}},"required":["ID"],"additionalProperties":false},"data":{"type":"object","properties":{"traits":{"type":"array","items":{"type":"object","properties":{"trait":{"type":"string","minLength":1,"pattern":"^[a-z]","description":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\").","markdownDescription":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\")."},"variables":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"description":"The variable elements of a trait in an array.","markdownDescription":"The variable elements of a trait in an array."},"display":{"type":"string","minLength":1,"description":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)","markdownDescription":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)"}},"required":["trait"],"additionalProperties":false,"description":"A trait with both keyword and variable elements.","markdownDescription":"A trait with both keyword and variable elements."},"minItems":1,"description":"An array of objects representing a list of traits.","markdownDescription":"An array of objects representing a list of traits."},"entries":{"type":"array","items":{"$ref":"#/properties/license/items/properties/data/properties/entries/items"},"minItems":1},"_tags":{"type":"object","properties":{"abilityBoosts":{"type":"object","properties":{"abilities":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of boost that the background can grant.","markdownDescription":"An object containing the types of boost that the background can grant."},"count":{"type":"integer","minimum":1,"maximum":3,"description":"The total number of boosts the background can grant.","markdownDescription":"The total number of boosts the background can grant."}},"required":["abilities","count"],"additionalProperties":false,"description":"The ability boosts the background grants.","markdownDescription":"The ability boosts the background grants."},"trainedSkills":{"type":"object","properties":{"skills":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"A list of skills in which the background can grant proficiency.","markdownDescription":"A list of skills in which the background can grant proficiency."},"count":{"type":"integer","minimum":1,"maximum":4,"description":"The total number of distinct skill proficiencies the background can grant.","markdownDescription":"The total number of distinct skill proficiencies the background can grant."}},"required":["skills","count"],"additionalProperties":false,"description":"The skills in which the background can grant proficiency.","markdownDescription":"The skills in which the background can grant proficiency."},"gainedFeats":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"specifier":{"type":"string","minLength":1},"sourceID":{"$ref":"#/properties/license/items/properties/ID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell).","markdownDescription":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell)."},"minItems":1,"description":"A list of feats the background can grant.","markdownDescription":"A list of feats the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The feats the background grants.","markdownDescription":"The feats the background grants."},"gainedSpells":{"type":"object","properties":{"options":{"type":"array","items":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"minItems":1,"description":"A list of spells the background can grant.","markdownDescription":"A list of spells the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The spells the background grants.","markdownDescription":"The spells the background grants."},"misc":{"type":"object","properties":{"Grants ability":{"type":"boolean","const":true,"description":"The background background grants an active, voluntary ability.","markdownDescription":"The background background grants an active, voluntary ability."},"Grants equipment":{"type":"boolean","const":true,"description":"The background grants a free item (not just access or proficiency—the actual concrete thing).","markdownDescription":"The background grants a free item (not just access or proficiency—the actual concrete thing)."},"Grants language":{"type":"boolean","const":true,"description":"The background grants a language.","markdownDescription":"The background grants a language."},"Grants resistance":{"type":"boolean","const":true,"description":"The background grants a damage resistance.","markdownDescription":"The background grants a damage resistance."},"Grants sense":{"type":"boolean","const":true,"description":"The background grants a sense (e.g. darkvision, scent).","markdownDescription":"The background grants a sense (e.g. darkvision, scent)."},"Grants situational benefit":{"type":"boolean","const":true,"description":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days.","markdownDescription":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days."},"Has drawback":{"type":"boolean","const":true,"description":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad.","markdownDescription":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad."},"GM influence":{"type":"boolean","const":true,"description":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants.","markdownDescription":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"type":"object","properties":{"type":{"type":"string","enum":["reprint","variant","replacement","extension"],"description":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell).","markdownDescription":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell)."},"target":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"modifications":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1,"description":"The type of modification being applied.","markdownDescription":"The type of modification being applied."},"target":{"type":"object","properties":{"property":{"type":"string","pattern":"^\\w+(?:\\.\\w+)+&","description":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\").","markdownDescription":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\")."},"name":{"type":"string","minLength":1,"description":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s.","markdownDescription":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s."}},"required":["property"],"additionalProperties":true},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"object","properties":{},"additionalProperties":true},{"type":"array"},{"type":"boolean"}],"description":"The modification value.","markdownDescription":"The modification value."}},"required":["type","target"],"additionalProperties":true,"description":"A single modification step.","markdownDescription":"A single modification step."},"minItems":1,"description":"An array of changes which, when applied consecutively, transforms the target content into the referring content.","markdownDescription":"An array of changes which, when applied consecutively, transforms the target content into the referring content."}},"required":["type","target"],"additionalProperties":false,"description":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content.","markdownDescription":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content."}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},"minItems":1},"condition":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"condition"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"group":{"type":"object","properties":{"Attitudes":{"type":"boolean","const":true,"description":"The condition is in the 'Attitudes' group (CRB p619).","markdownDescription":"The condition is in the 'Attitudes' group (CRB p619)."},"Death and Dying":{"type":"boolean","const":true,"description":"The condition is in the 'Death and Dying' group (CRB p619).","markdownDescription":"The condition is in the 'Death and Dying' group (CRB p619)."},"Degrees of Detection":{"type":"boolean","const":true,"description":"The condition is in the 'Degrees of Detection' group (CRB p619).","markdownDescription":"The condition is in the 'Degrees of Detection' group (CRB p619)."},"Lowered Abilities":{"type":"boolean","const":true,"description":"The condition is in the 'Lowered Abilities' group (CRB p619).","markdownDescription":"The condition is in the 'Lowered Abilities' group (CRB p619)."},"Senses":{"type":"boolean","const":true,"description":"The condition is in the 'Senses' group (CRB p619).","markdownDescription":"The condition is in the 'Senses' group (CRB p619)."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing any groups the condition belongs to. The properties should be in title case.","markdownDescription":"An object containing any groups the condition belongs to. The properties should be in title case."}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},"minItems":1},"domain":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"domain"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"preamble":{"type":"string","minLength":1,"description":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use.","markdownDescription":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use."},"domainSpell":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"advancedDomainSpell":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"apocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A reference target to the domain's apocryphal spell (see Dark Archive p142)","markdownDescription":"A reference target to the domain's apocryphal spell (see Dark Archive p142)"},"advancedApocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)","markdownDescription":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)"}},"required":["domainSpell","advancedDomainSpell"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A domain (for a religion)","markdownDescription":"A domain (for a religion)"},"minItems":1},"event":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"event"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"level":{"type":"integer","minimum":-1,"description":"The event's level","markdownDescription":"The event's level"},"traits":{"$ref":"#/properties/background/items/properties/data/properties/traits"},"applicableSkills":{"type":"array","items":{"type":"object","properties":{"skill":{"type":"string","enum":["Acrobatics","Arcana","Athletics","Crafting","Deception","Diplomacy","Intimidation","Lore","Medicine","Nature","Occultism","Performance","Religion","Society","Stealth","Survival","Thievery"],"description":"The name of the skill (title case).","markdownDescription":"The name of the skill (title case)."},"variables":{"type":"array","items":{"type":"string","minLength":1,"pattern":"^[A-Z]"},"minItems":1,"description":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\").","markdownDescription":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\")."},"display":{"type":"string","minLength":1,"description":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)","markdownDescription":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)"}},"required":["skill"],"additionalProperties":false,"description":"A combined object to describe a type of skill referenced by other content.","markdownDescription":"A combined object to describe a type of skill referenced by other content."},"minItems":1,"description":"An array of objects representing the event's applicable skills.","markdownDescription":"An array of objects representing the event's applicable skills."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"}},"required":["level","entries"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"An event","markdownDescription":"An event"},"minItems":1},"familiarAbility":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"familiarAbility"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"abilityType":{"type":"string","enum":["Familiar","Master"],"description":"The familiar ability's type.","markdownDescription":"The familiar ability's type."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"affectsCommunication":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages).","markdownDescription":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages)."},"affectsSenses":{"type":"boolean","const":true,"description":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent).","markdownDescription":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent)."},"affectsMovement":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to move or grants a new Speed.","markdownDescription":"The ability affects the familiar's capacity to move or grants a new Speed."},"hasRequirement":{"type":"boolean","const":true,"description":"You or the familiar must satisfy a certain requirement to choose this ability.","markdownDescription":"You or the familiar must satisfy a certain requirement to choose this ability."},"grantsAbility":{"type":"boolean","const":true,"description":"The ability grants you or the familiar an active, voluntary ability.","markdownDescription":"The ability grants you or the familiar an active, voluntary ability."},"repeatable":{"type":"boolean","const":true,"description":"You can select this ability multiple times.","markdownDescription":"You can select this ability multiple times."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["abilityType","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A familiar ability","markdownDescription":"A familiar ability"},"minItems":1},"relicGift":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"relicGift"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"tier":{"type":"string","minLength":1,"pattern":"^[A-Z]","description":"The relic gift's tier (title case)","markdownDescription":"The relic gift's tier (title case)"},"traits":{"$ref":"#/properties/background/items/properties/data/properties/traits"},"aspects":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The aspect's name","markdownDescription":"The aspect's name"},"note":{"type":"string","minLength":1,"description":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\").","markdownDescription":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\")."}},"required":["name"],"additionalProperties":false}},"prerequisites":{"$ref":"#/properties/license/items/properties/data/properties/entries/items/anyOf/0","description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"itemTypes":{"type":"object","properties":{"Armor":{"type":"boolean","const":true,"description":"The relic must be a piece or suit of armour to have this gift.","markdownDescription":"The relic must be a piece or suit of armour to have this gift."},"Worn Item":{"type":"boolean","const":true,"description":"The relic must be a worn item to have this gift.","markdownDescription":"The relic must be a worn item to have this gift."},"Weapon":{"type":"boolean","const":true,"description":"The relic must be a weapon to have this gift.","markdownDescription":"The relic must be a weapon to have this gift."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case.","markdownDescription":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case."},"misc":{"type":"object","properties":{"Alters relic":{"type":"boolean","const":true,"description":"The gift permanently changes the relic's nature in some way.","markdownDescription":"The gift permanently changes the relic's nature in some way."},"Grants ability":{"type":"boolean","const":true,"description":"The gift grants the character a new, activatable ability (including spells).","markdownDescription":"The gift grants the character a new, activatable ability (including spells)."},"Grants passive attribute":{"type":"boolean","const":true,"description":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability.","markdownDescription":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability."},"Is rune":{"type":"boolean","const":true,"description":"The gift mimics the effect of a rune.","markdownDescription":"The gift mimics the effect of a rune."},"Soul seed":{"type":"boolean","const":true,"description":"The gift is \"particularly appropriate\" for soul seeds (SoM p230).","markdownDescription":"The gift is \"particularly appropriate\" for soul seeds (SoM p230)."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["tier","aspects","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A relic gift","markdownDescription":"A relic gift"},"minItems":1},"skill":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"skill"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"}},"required":["entries"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source","data"],"additionalProperties":false,"description":"A skill","markdownDescription":"A skill"},"minItems":1}},"required":["source"],"additionalProperties":true,"$schema":"http://json-schema.org/draft-07/schema#"} \ No newline at end of file +{"type":"object","properties":{"license":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"license"},"ID":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$","description":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.","markdownDescription":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the license's `name` for display purposes.","markdownDescription":"An abbreviation or other shortening of the license's `name` for display purposes."},"short":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the license's name","markdownDescription":"An object representing the license's name"},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},{"type":"object","properties":{"type":{"type":"string","minLength":1}},"required":["type"],"additionalProperties":true}]},"minItems":1,"description":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation."}},"required":["entries"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},"minItems":1},"source":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"source"},"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number.","markdownDescription":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source's name","markdownDescription":"An object representing the source's name"},"data":{"type":"object","properties":{"released":{"type":"string","format":"date","description":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available.","markdownDescription":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available."},"version":{"type":"string","minLength":1,"description":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")","markdownDescription":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")"},"errataed":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed.","markdownDescription":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed."},"added":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise).","markdownDescription":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise)."},"modified":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified.","markdownDescription":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified."},"URL":{"type":"string","format":"uri","description":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\".","markdownDescription":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\"."},"groupIDs":{"type":"array","items":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of a source group.","markdownDescription":"The `ID` of a source group."},"minItems":1,"description":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\").","markdownDescription":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\")."},"requiredSourceIDs":{"type":"array","items":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of the dependent homebrew source.","markdownDescription":"The `ID` of the dependent homebrew source."},"minItems":1,"description":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`.","markdownDescription":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`."},"licenseID":{"$ref":"#/properties/license/items/properties/ID","description":"The `ID` of the source's license.","markdownDescription":"The `ID` of the source's license."},"copyright":{"type":"array","items":{"$ref":"#/properties/license/items/properties/data/properties/entries/items"},"minItems":1,"description":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation."},"authors":{"type":"array","items":{"type":"string","description":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\").","markdownDescription":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\")."},"minItems":1,"description":"A list of unique authors as credited by the source itself.","markdownDescription":"A list of unique authors as credited by the source itself."},"publisher":{"type":"string","minLength":2,"description":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\").","markdownDescription":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\")."},"converters":{"type":"array","items":{"type":"string","minLength":2,"description":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated.","markdownDescription":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated."},"minItems":1,"description":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates.","markdownDescription":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates."},"_tags":{"type":"object","properties":{"publicationType":{"type":"object","properties":{"Comic":{"type":"boolean","const":true,"description":"The source is content bundled with a comic.","markdownDescription":"The source is content bundled with a comic."},"Blog post":{"type":"boolean","const":true,"description":"The source is a blog post or another similar type of short, online article.","markdownDescription":"The source is a blog post or another similar type of short, online article."}},"additionalProperties":false,"description":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook.","markdownDescription":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook."},"status":{"type":"object","properties":{"Missing content":{"type":"boolean","const":true,"description":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date.","markdownDescription":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date."},"Missing tags":{"type":"boolean","const":true,"description":"The converted content this source contains isn't completely tagged, even if it all displays correctly.","markdownDescription":"The converted content this source contains isn't completely tagged, even if it all displays correctly."},"Invalid":{"type":"boolean","const":true,"description":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained.","markdownDescription":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained."}},"additionalProperties":false},"misc":{"type":"object","properties":{"legacyRuleset":{"type":"boolean","const":true,"description":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023).","markdownDescription":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023)."},"Official":{"type":"boolean","const":true,"description":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official').","markdownDescription":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official')."},"GM-facing":{"type":"boolean","const":true,"description":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like.","markdownDescription":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like."},"PFS-legal":{"type":"boolean","const":true,"description":"This source is legal for Pathfinder Society play.","markdownDescription":"This source is legal for Pathfinder Society play."},"Playtest":{"type":"boolean","const":true,"description":"This source contains playtest, early-access, or otherwise 'unfinished' content.","markdownDescription":"This source contains playtest, early-access, or otherwise 'unfinished' content."},"Ongoing":{"type":"boolean","const":true,"description":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication.","markdownDescription":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication."},"Deprecated":{"type":"boolean","const":true,"description":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not.","markdownDescription":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not."},"NSFW":{"type":"boolean","const":true,"description":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature.","markdownDescription":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature."}},"additionalProperties":false}},"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["released","added","modified","URL","licenseID"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},"minItems":1},"sourceGroup":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"sourceGroup"},"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups).","markdownDescription":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups)."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source group's name","markdownDescription":"An object representing the source group's name"},"data":{"type":"object","properties":{"publisher":{"type":"string","minLength":2,"description":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group.","markdownDescription":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group."},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"Adventure":{"type":"boolean","const":true,"description":"This source group is an adventure path or the like.","markdownDescription":"This source group is an adventure path or the like."},"Ongoing":{"type":"boolean","const":true,"description":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools.","markdownDescription":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools."}},"additionalProperties":false}},"required":["misc"],"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["publisher"],"additionalProperties":false}},"required":["type","ID","title"],"additionalProperties":false,"description":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like.","markdownDescription":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like."},"minItems":1},"background":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"background"},"name":{"type":"object","properties":{"primary":{"type":"string","minLength":1,"description":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case.","markdownDescription":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case."},"aliases":{"type":"array","items":{"type":"string","minLength":1,"description":"An alternative name for the content.","markdownDescription":"An alternative name for the content."},"minItems":1,"description":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\").","markdownDescription":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\")."},"specifier":{"type":"string","minLength":1,"description":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated.","markdownDescription":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated."}},"required":["primary"],"additionalProperties":false},"source":{"type":"object","properties":{"ID":{"$ref":"#/properties/license/items/properties/ID","description":"The source ID that contains the data.","markdownDescription":"The source ID that contains the data."},"page":{"type":"integer","description":"The page number (if any) on which the content begins.","markdownDescription":"The page number (if any) on which the content begins."}},"required":["ID"],"additionalProperties":false},"data":{"type":"object","properties":{"traits":{"type":"array","items":{"type":"object","properties":{"trait":{"type":"string","minLength":1,"pattern":"^[a-z]","description":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\").","markdownDescription":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\")."},"variables":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"description":"The variable elements of a trait in an array.","markdownDescription":"The variable elements of a trait in an array."},"display":{"type":"string","minLength":1,"description":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)","markdownDescription":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)"}},"required":["trait"],"additionalProperties":false,"description":"A trait with both keyword and variable elements.","markdownDescription":"A trait with both keyword and variable elements."},"minItems":1,"description":"An array of objects representing a list of traits.","markdownDescription":"An array of objects representing a list of traits."},"entries":{"type":"array","items":{"$ref":"#/properties/license/items/properties/data/properties/entries/items"},"minItems":1},"_tags":{"type":"object","properties":{"abilityBoosts":{"type":"object","properties":{"abilities":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of boost that the background can grant.","markdownDescription":"An object containing the types of boost that the background can grant."},"count":{"type":"integer","minimum":1,"maximum":3,"description":"The total number of boosts the background can grant.","markdownDescription":"The total number of boosts the background can grant."}},"required":["abilities","count"],"additionalProperties":false,"description":"The ability boosts the background grants.","markdownDescription":"The ability boosts the background grants."},"trainedSkills":{"type":"object","properties":{"skills":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"A list of skills in which the background can grant proficiency.","markdownDescription":"A list of skills in which the background can grant proficiency."},"count":{"type":"integer","minimum":1,"maximum":4,"description":"The total number of distinct skill proficiencies the background can grant.","markdownDescription":"The total number of distinct skill proficiencies the background can grant."}},"required":["skills","count"],"additionalProperties":false,"description":"The skills in which the background can grant proficiency.","markdownDescription":"The skills in which the background can grant proficiency."},"gainedFeats":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"specifier":{"type":"string","minLength":1},"sourceID":{"$ref":"#/properties/license/items/properties/ID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell).","markdownDescription":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell)."},"minItems":1,"description":"A list of feats the background can grant.","markdownDescription":"A list of feats the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The feats the background grants.","markdownDescription":"The feats the background grants."},"gainedSpells":{"type":"object","properties":{"options":{"type":"array","items":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"minItems":1,"description":"A list of spells the background can grant.","markdownDescription":"A list of spells the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The spells the background grants.","markdownDescription":"The spells the background grants."},"misc":{"type":"object","properties":{"Grants ability":{"type":"boolean","const":true,"description":"The background background grants an active, voluntary ability.","markdownDescription":"The background background grants an active, voluntary ability."},"Grants equipment":{"type":"boolean","const":true,"description":"The background grants a free item (not just access or proficiency—the actual concrete thing).","markdownDescription":"The background grants a free item (not just access or proficiency—the actual concrete thing)."},"Grants language":{"type":"boolean","const":true,"description":"The background grants a language.","markdownDescription":"The background grants a language."},"Grants resistance":{"type":"boolean","const":true,"description":"The background grants a damage resistance.","markdownDescription":"The background grants a damage resistance."},"Grants sense":{"type":"boolean","const":true,"description":"The background grants a sense (e.g. darkvision, scent).","markdownDescription":"The background grants a sense (e.g. darkvision, scent)."},"Grants situational benefit":{"type":"boolean","const":true,"description":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days.","markdownDescription":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days."},"Has drawback":{"type":"boolean","const":true,"description":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad.","markdownDescription":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad."},"GM influence":{"type":"boolean","const":true,"description":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants.","markdownDescription":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"type":"object","properties":{"type":{"type":"string","enum":["reprint","variant","replacement","extension"],"description":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell).","markdownDescription":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell)."},"target":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"modifications":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1,"description":"The type of modification being applied.","markdownDescription":"The type of modification being applied."},"target":{"type":"object","properties":{"property":{"type":"string","pattern":"^\\w+(?:\\.\\w+)*$","description":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\").","markdownDescription":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\")."},"name":{"type":"string","minLength":1,"description":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s.","markdownDescription":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s."}},"required":["property"],"additionalProperties":true},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"object","properties":{},"additionalProperties":true},{"type":"array"},{"type":"boolean"}],"description":"The modification value.","markdownDescription":"The modification value."}},"required":["type","target"],"additionalProperties":true,"description":"A single modification step.","markdownDescription":"A single modification step."},"minItems":1,"description":"An array of changes which, when applied consecutively, transforms the target content into the referring content.","markdownDescription":"An array of changes which, when applied consecutively, transforms the target content into the referring content."}},"required":["type","target"],"additionalProperties":false,"description":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content.","markdownDescription":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content."}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},"minItems":1},"condition":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"condition"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"group":{"type":"object","properties":{"Attitudes":{"type":"boolean","const":true,"description":"The condition is in the 'Attitudes' group (CRB p619).","markdownDescription":"The condition is in the 'Attitudes' group (CRB p619)."},"Death and Dying":{"type":"boolean","const":true,"description":"The condition is in the 'Death and Dying' group (CRB p619).","markdownDescription":"The condition is in the 'Death and Dying' group (CRB p619)."},"Degrees of Detection":{"type":"boolean","const":true,"description":"The condition is in the 'Degrees of Detection' group (CRB p619).","markdownDescription":"The condition is in the 'Degrees of Detection' group (CRB p619)."},"Lowered Abilities":{"type":"boolean","const":true,"description":"The condition is in the 'Lowered Abilities' group (CRB p619).","markdownDescription":"The condition is in the 'Lowered Abilities' group (CRB p619)."},"Senses":{"type":"boolean","const":true,"description":"The condition is in the 'Senses' group (CRB p619).","markdownDescription":"The condition is in the 'Senses' group (CRB p619)."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing any groups the condition belongs to. The properties should be in title case.","markdownDescription":"An object containing any groups the condition belongs to. The properties should be in title case."}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},"minItems":1},"domain":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"domain"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"preamble":{"type":"string","minLength":1,"description":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use.","markdownDescription":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use."},"domainSpell":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"advancedDomainSpell":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"apocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A reference target to the domain's apocryphal spell (see Dark Archive p142)","markdownDescription":"A reference target to the domain's apocryphal spell (see Dark Archive p142)"},"advancedApocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/properties/background/items/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)","markdownDescription":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)"}},"required":["domainSpell","advancedDomainSpell"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A domain (for a religion)","markdownDescription":"A domain (for a religion)"},"minItems":1},"event":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"event"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"level":{"type":"integer","minimum":-1,"description":"The event's level","markdownDescription":"The event's level"},"traits":{"$ref":"#/properties/background/items/properties/data/properties/traits"},"applicableSkills":{"type":"array","items":{"type":"object","properties":{"skill":{"type":"string","enum":["Acrobatics","Arcana","Athletics","Crafting","Deception","Diplomacy","Intimidation","Lore","Medicine","Nature","Occultism","Performance","Religion","Society","Stealth","Survival","Thievery"],"description":"The name of the skill (title case).","markdownDescription":"The name of the skill (title case)."},"variables":{"type":"array","items":{"type":"string","minLength":1,"pattern":"^[A-Z]"},"minItems":1,"description":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\").","markdownDescription":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\")."},"display":{"type":"string","minLength":1,"description":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)","markdownDescription":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)"}},"required":["skill"],"additionalProperties":false,"description":"A combined object to describe a type of skill referenced by other content.","markdownDescription":"A combined object to describe a type of skill referenced by other content."},"minItems":1,"description":"An array of objects representing the event's applicable skills.","markdownDescription":"An array of objects representing the event's applicable skills."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"}},"required":["level","entries"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"An event","markdownDescription":"An event"},"minItems":1},"familiarAbility":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"familiarAbility"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"abilityType":{"type":"string","enum":["Familiar","Master"],"description":"The familiar ability's type.","markdownDescription":"The familiar ability's type."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"affectsCommunication":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages).","markdownDescription":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages)."},"affectsSenses":{"type":"boolean","const":true,"description":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent).","markdownDescription":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent)."},"affectsMovement":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to move or grants a new Speed.","markdownDescription":"The ability affects the familiar's capacity to move or grants a new Speed."},"hasRequirement":{"type":"boolean","const":true,"description":"You or the familiar must satisfy a certain requirement to choose this ability.","markdownDescription":"You or the familiar must satisfy a certain requirement to choose this ability."},"grantsAbility":{"type":"boolean","const":true,"description":"The ability grants you or the familiar an active, voluntary ability.","markdownDescription":"The ability grants you or the familiar an active, voluntary ability."},"repeatable":{"type":"boolean","const":true,"description":"You can select this ability multiple times.","markdownDescription":"You can select this ability multiple times."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["abilityType","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A familiar ability","markdownDescription":"A familiar ability"},"minItems":1},"relicGift":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"relicGift"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"tier":{"type":"string","minLength":1,"pattern":"^[A-Z]","description":"The relic gift's tier (title case)","markdownDescription":"The relic gift's tier (title case)"},"traits":{"$ref":"#/properties/background/items/properties/data/properties/traits"},"aspects":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The aspect's name","markdownDescription":"The aspect's name"},"note":{"type":"string","minLength":1,"description":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\").","markdownDescription":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\")."}},"required":["name"],"additionalProperties":false}},"prerequisites":{"$ref":"#/properties/license/items/properties/data/properties/entries/items/anyOf/0","description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"itemTypes":{"type":"object","properties":{"Armor":{"type":"boolean","const":true,"description":"The relic must be a piece or suit of armour to have this gift.","markdownDescription":"The relic must be a piece or suit of armour to have this gift."},"Worn Item":{"type":"boolean","const":true,"description":"The relic must be a worn item to have this gift.","markdownDescription":"The relic must be a worn item to have this gift."},"Weapon":{"type":"boolean","const":true,"description":"The relic must be a weapon to have this gift.","markdownDescription":"The relic must be a weapon to have this gift."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case.","markdownDescription":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case."},"misc":{"type":"object","properties":{"Alters relic":{"type":"boolean","const":true,"description":"The gift permanently changes the relic's nature in some way.","markdownDescription":"The gift permanently changes the relic's nature in some way."},"Grants ability":{"type":"boolean","const":true,"description":"The gift grants the character a new, activatable ability (including spells).","markdownDescription":"The gift grants the character a new, activatable ability (including spells)."},"Grants passive attribute":{"type":"boolean","const":true,"description":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability.","markdownDescription":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability."},"Is rune":{"type":"boolean","const":true,"description":"The gift mimics the effect of a rune.","markdownDescription":"The gift mimics the effect of a rune."},"Soul seed":{"type":"boolean","const":true,"description":"The gift is \"particularly appropriate\" for soul seeds (SoM p230).","markdownDescription":"The gift is \"particularly appropriate\" for soul seeds (SoM p230)."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["tier","aspects","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A relic gift","markdownDescription":"A relic gift"},"minItems":1},"skill":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"skill"},"name":{"$ref":"#/properties/background/items/properties/name"},"source":{"$ref":"#/properties/background/items/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/properties/background/items/properties/data/properties/entries"}},"required":["entries"],"additionalProperties":false},"reference":{"$ref":"#/properties/background/items/properties/reference"}},"required":["type","name","source","data"],"additionalProperties":false,"description":"A skill","markdownDescription":"A skill"},"minItems":1}},"required":["source"],"additionalProperties":true,"$schema":"http://json-schema.org/draft-07/schema#"} \ No newline at end of file diff --git a/_dist/schema/data.json b/_dist/schema/data.json index fee9374..d6bd685 100644 --- a/_dist/schema/data.json +++ b/_dist/schema/data.json @@ -1 +1 @@ -{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"background"},"name":{"type":"object","properties":{"primary":{"type":"string","minLength":1,"description":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case.","markdownDescription":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case."},"aliases":{"type":"array","items":{"type":"string","minLength":1,"description":"An alternative name for the content.","markdownDescription":"An alternative name for the content."},"minItems":1,"description":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\").","markdownDescription":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\")."},"specifier":{"type":"string","minLength":1,"description":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated.","markdownDescription":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated."}},"required":["primary"],"additionalProperties":false},"source":{"type":"object","properties":{"ID":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$","description":"The source ID that contains the data.","markdownDescription":"The source ID that contains the data."},"page":{"type":"integer","description":"The page number (if any) on which the content begins.","markdownDescription":"The page number (if any) on which the content begins."}},"required":["ID"],"additionalProperties":false},"data":{"type":"object","properties":{"traits":{"type":"array","items":{"type":"object","properties":{"trait":{"type":"string","minLength":1,"pattern":"^[a-z]","description":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\").","markdownDescription":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\")."},"variables":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"description":"The variable elements of a trait in an array.","markdownDescription":"The variable elements of a trait in an array."},"display":{"type":"string","minLength":1,"description":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)","markdownDescription":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)"}},"required":["trait"],"additionalProperties":false,"description":"A trait with both keyword and variable elements.","markdownDescription":"A trait with both keyword and variable elements."},"minItems":1,"description":"An array of objects representing a list of traits.","markdownDescription":"An array of objects representing a list of traits."},"entries":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},{"type":"object","properties":{"type":{"type":"string","minLength":1}},"required":["type"],"additionalProperties":true}]},"minItems":1},"_tags":{"type":"object","properties":{"abilityBoosts":{"type":"object","properties":{"abilities":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of boost that the background can grant.","markdownDescription":"An object containing the types of boost that the background can grant."},"count":{"type":"integer","minimum":1,"maximum":3,"description":"The total number of boosts the background can grant.","markdownDescription":"The total number of boosts the background can grant."}},"required":["abilities","count"],"additionalProperties":false,"description":"The ability boosts the background grants.","markdownDescription":"The ability boosts the background grants."},"trainedSkills":{"type":"object","properties":{"skills":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"A list of skills in which the background can grant proficiency.","markdownDescription":"A list of skills in which the background can grant proficiency."},"count":{"type":"integer","minimum":1,"maximum":4,"description":"The total number of distinct skill proficiencies the background can grant.","markdownDescription":"The total number of distinct skill proficiencies the background can grant."}},"required":["skills","count"],"additionalProperties":false,"description":"The skills in which the background can grant proficiency.","markdownDescription":"The skills in which the background can grant proficiency."},"gainedFeats":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"specifier":{"type":"string","minLength":1},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell).","markdownDescription":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell)."},"minItems":1,"description":"A list of feats the background can grant.","markdownDescription":"A list of feats the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The feats the background grants.","markdownDescription":"The feats the background grants."},"gainedSpells":{"type":"object","properties":{"options":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"minItems":1,"description":"A list of spells the background can grant.","markdownDescription":"A list of spells the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The spells the background grants.","markdownDescription":"The spells the background grants."},"misc":{"type":"object","properties":{"Grants ability":{"type":"boolean","const":true,"description":"The background background grants an active, voluntary ability.","markdownDescription":"The background background grants an active, voluntary ability."},"Grants equipment":{"type":"boolean","const":true,"description":"The background grants a free item (not just access or proficiency—the actual concrete thing).","markdownDescription":"The background grants a free item (not just access or proficiency—the actual concrete thing)."},"Grants language":{"type":"boolean","const":true,"description":"The background grants a language.","markdownDescription":"The background grants a language."},"Grants resistance":{"type":"boolean","const":true,"description":"The background grants a damage resistance.","markdownDescription":"The background grants a damage resistance."},"Grants sense":{"type":"boolean","const":true,"description":"The background grants a sense (e.g. darkvision, scent).","markdownDescription":"The background grants a sense (e.g. darkvision, scent)."},"Grants situational benefit":{"type":"boolean","const":true,"description":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days.","markdownDescription":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days."},"Has drawback":{"type":"boolean","const":true,"description":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad.","markdownDescription":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad."},"GM influence":{"type":"boolean","const":true,"description":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants.","markdownDescription":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"type":"object","properties":{"type":{"type":"string","enum":["reprint","variant","replacement","extension"],"description":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell).","markdownDescription":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell)."},"target":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"modifications":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1,"description":"The type of modification being applied.","markdownDescription":"The type of modification being applied."},"target":{"type":"object","properties":{"property":{"type":"string","pattern":"^\\w+(?:\\.\\w+)+&","description":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\").","markdownDescription":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\")."},"name":{"type":"string","minLength":1,"description":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s.","markdownDescription":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s."}},"required":["property"],"additionalProperties":true},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"object","properties":{},"additionalProperties":true},{"type":"array"},{"type":"boolean"}],"description":"The modification value.","markdownDescription":"The modification value."}},"required":["type","target"],"additionalProperties":true,"description":"A single modification step.","markdownDescription":"A single modification step."},"minItems":1,"description":"An array of changes which, when applied consecutively, transforms the target content into the referring content.","markdownDescription":"An array of changes which, when applied consecutively, transforms the target content into the referring content."}},"required":["type","target"],"additionalProperties":false,"description":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content.","markdownDescription":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content."}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},{"type":"object","properties":{"type":{"type":"string","const":"condition"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"group":{"type":"object","properties":{"Attitudes":{"type":"boolean","const":true,"description":"The condition is in the 'Attitudes' group (CRB p619).","markdownDescription":"The condition is in the 'Attitudes' group (CRB p619)."},"Death and Dying":{"type":"boolean","const":true,"description":"The condition is in the 'Death and Dying' group (CRB p619).","markdownDescription":"The condition is in the 'Death and Dying' group (CRB p619)."},"Degrees of Detection":{"type":"boolean","const":true,"description":"The condition is in the 'Degrees of Detection' group (CRB p619).","markdownDescription":"The condition is in the 'Degrees of Detection' group (CRB p619)."},"Lowered Abilities":{"type":"boolean","const":true,"description":"The condition is in the 'Lowered Abilities' group (CRB p619).","markdownDescription":"The condition is in the 'Lowered Abilities' group (CRB p619)."},"Senses":{"type":"boolean","const":true,"description":"The condition is in the 'Senses' group (CRB p619).","markdownDescription":"The condition is in the 'Senses' group (CRB p619)."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing any groups the condition belongs to. The properties should be in title case.","markdownDescription":"An object containing any groups the condition belongs to. The properties should be in title case."}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},{"type":"object","properties":{"type":{"type":"string","const":"domain"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"preamble":{"type":"string","minLength":1,"description":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use.","markdownDescription":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use."},"domainSpell":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"advancedDomainSpell":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"apocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A reference target to the domain's apocryphal spell (see Dark Archive p142)","markdownDescription":"A reference target to the domain's apocryphal spell (see Dark Archive p142)"},"advancedApocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)","markdownDescription":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)"}},"required":["domainSpell","advancedDomainSpell"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A domain (for a religion)","markdownDescription":"A domain (for a religion)"},{"type":"object","properties":{"type":{"type":"string","const":"event"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"level":{"type":"integer","minimum":-1,"description":"The event's level","markdownDescription":"The event's level"},"traits":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/traits"},"applicableSkills":{"type":"array","items":{"type":"object","properties":{"skill":{"type":"string","enum":["Acrobatics","Arcana","Athletics","Crafting","Deception","Diplomacy","Intimidation","Lore","Medicine","Nature","Occultism","Performance","Religion","Society","Stealth","Survival","Thievery"],"description":"The name of the skill (title case).","markdownDescription":"The name of the skill (title case)."},"variables":{"type":"array","items":{"type":"string","minLength":1,"pattern":"^[A-Z]"},"minItems":1,"description":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\").","markdownDescription":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\")."},"display":{"type":"string","minLength":1,"description":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)","markdownDescription":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)"}},"required":["skill"],"additionalProperties":false,"description":"A combined object to describe a type of skill referenced by other content.","markdownDescription":"A combined object to describe a type of skill referenced by other content."},"minItems":1,"description":"An array of objects representing the event's applicable skills.","markdownDescription":"An array of objects representing the event's applicable skills."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"}},"required":["level","entries"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"An event","markdownDescription":"An event"},{"type":"object","properties":{"type":{"type":"string","const":"familiarAbility"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"abilityType":{"type":"string","enum":["Familiar","Master"],"description":"The familiar ability's type.","markdownDescription":"The familiar ability's type."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"affectsCommunication":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages).","markdownDescription":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages)."},"affectsSenses":{"type":"boolean","const":true,"description":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent).","markdownDescription":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent)."},"affectsMovement":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to move or grants a new Speed.","markdownDescription":"The ability affects the familiar's capacity to move or grants a new Speed."},"hasRequirement":{"type":"boolean","const":true,"description":"You or the familiar must satisfy a certain requirement to choose this ability.","markdownDescription":"You or the familiar must satisfy a certain requirement to choose this ability."},"grantsAbility":{"type":"boolean","const":true,"description":"The ability grants you or the familiar an active, voluntary ability.","markdownDescription":"The ability grants you or the familiar an active, voluntary ability."},"repeatable":{"type":"boolean","const":true,"description":"You can select this ability multiple times.","markdownDescription":"You can select this ability multiple times."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["abilityType","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A familiar ability","markdownDescription":"A familiar ability"},{"type":"object","properties":{"type":{"type":"string","const":"relicGift"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"tier":{"type":"string","minLength":1,"pattern":"^[A-Z]","description":"The relic gift's tier (title case)","markdownDescription":"The relic gift's tier (title case)"},"traits":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/traits"},"aspects":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The aspect's name","markdownDescription":"The aspect's name"},"note":{"type":"string","minLength":1,"description":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\").","markdownDescription":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\")."}},"required":["name"],"additionalProperties":false}},"prerequisites":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items/anyOf/0","description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"itemTypes":{"type":"object","properties":{"Armor":{"type":"boolean","const":true,"description":"The relic must be a piece or suit of armour to have this gift.","markdownDescription":"The relic must be a piece or suit of armour to have this gift."},"Worn Item":{"type":"boolean","const":true,"description":"The relic must be a worn item to have this gift.","markdownDescription":"The relic must be a worn item to have this gift."},"Weapon":{"type":"boolean","const":true,"description":"The relic must be a weapon to have this gift.","markdownDescription":"The relic must be a weapon to have this gift."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case.","markdownDescription":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case."},"misc":{"type":"object","properties":{"Alters relic":{"type":"boolean","const":true,"description":"The gift permanently changes the relic's nature in some way.","markdownDescription":"The gift permanently changes the relic's nature in some way."},"Grants ability":{"type":"boolean","const":true,"description":"The gift grants the character a new, activatable ability (including spells).","markdownDescription":"The gift grants the character a new, activatable ability (including spells)."},"Grants passive attribute":{"type":"boolean","const":true,"description":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability.","markdownDescription":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability."},"Is rune":{"type":"boolean","const":true,"description":"The gift mimics the effect of a rune.","markdownDescription":"The gift mimics the effect of a rune."},"Soul seed":{"type":"boolean","const":true,"description":"The gift is \"particularly appropriate\" for soul seeds (SoM p230).","markdownDescription":"The gift is \"particularly appropriate\" for soul seeds (SoM p230)."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["tier","aspects","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A relic gift","markdownDescription":"A relic gift"},{"type":"object","properties":{"type":{"type":"string","const":"skill"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"}},"required":["entries"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source","data"],"additionalProperties":false,"description":"A skill","markdownDescription":"A skill"}]},{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"license"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.","markdownDescription":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the license's `name` for display purposes.","markdownDescription":"An abbreviation or other shortening of the license's `name` for display purposes."},"short":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the license's name","markdownDescription":"An object representing the license's name"},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items"},"minItems":1,"description":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation."}},"required":["entries"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"source"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number.","markdownDescription":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source's name","markdownDescription":"An object representing the source's name"},"data":{"type":"object","properties":{"released":{"type":"string","format":"date","description":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available.","markdownDescription":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available."},"version":{"type":"string","minLength":1,"description":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")","markdownDescription":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")"},"errataed":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed.","markdownDescription":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed."},"added":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise).","markdownDescription":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise)."},"modified":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified.","markdownDescription":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified."},"URL":{"type":"string","format":"uri","description":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\".","markdownDescription":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\"."},"groupIDs":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of a source group.","markdownDescription":"The `ID` of a source group."},"minItems":1,"description":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\").","markdownDescription":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\")."},"requiredSourceIDs":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of the dependent homebrew source.","markdownDescription":"The `ID` of the dependent homebrew source."},"minItems":1,"description":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`.","markdownDescription":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`."},"licenseID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of the source's license.","markdownDescription":"The `ID` of the source's license."},"copyright":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items"},"minItems":1,"description":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation."},"authors":{"type":"array","items":{"type":"string","description":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\").","markdownDescription":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\")."},"minItems":1,"description":"A list of unique authors as credited by the source itself.","markdownDescription":"A list of unique authors as credited by the source itself."},"publisher":{"type":"string","minLength":2,"description":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\").","markdownDescription":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\")."},"converters":{"type":"array","items":{"type":"string","minLength":2,"description":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated.","markdownDescription":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated."},"minItems":1,"description":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates.","markdownDescription":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates."},"_tags":{"type":"object","properties":{"publicationType":{"type":"object","properties":{"Comic":{"type":"boolean","const":true,"description":"The source is content bundled with a comic.","markdownDescription":"The source is content bundled with a comic."},"Blog post":{"type":"boolean","const":true,"description":"The source is a blog post or another similar type of short, online article.","markdownDescription":"The source is a blog post or another similar type of short, online article."}},"additionalProperties":false,"description":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook.","markdownDescription":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook."},"status":{"type":"object","properties":{"Missing content":{"type":"boolean","const":true,"description":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date.","markdownDescription":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date."},"Missing tags":{"type":"boolean","const":true,"description":"The converted content this source contains isn't completely tagged, even if it all displays correctly.","markdownDescription":"The converted content this source contains isn't completely tagged, even if it all displays correctly."},"Invalid":{"type":"boolean","const":true,"description":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained.","markdownDescription":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained."}},"additionalProperties":false},"misc":{"type":"object","properties":{"legacyRuleset":{"type":"boolean","const":true,"description":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023).","markdownDescription":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023)."},"Official":{"type":"boolean","const":true,"description":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official').","markdownDescription":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official')."},"GM-facing":{"type":"boolean","const":true,"description":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like.","markdownDescription":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like."},"PFS-legal":{"type":"boolean","const":true,"description":"This source is legal for Pathfinder Society play.","markdownDescription":"This source is legal for Pathfinder Society play."},"Playtest":{"type":"boolean","const":true,"description":"This source contains playtest, early-access, or otherwise 'unfinished' content.","markdownDescription":"This source contains playtest, early-access, or otherwise 'unfinished' content."},"Ongoing":{"type":"boolean","const":true,"description":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication.","markdownDescription":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication."},"Deprecated":{"type":"boolean","const":true,"description":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not.","markdownDescription":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not."},"NSFW":{"type":"boolean","const":true,"description":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature.","markdownDescription":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature."}},"additionalProperties":false}},"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["released","added","modified","URL","licenseID"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"sourceGroup"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups).","markdownDescription":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups)."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source group's name","markdownDescription":"An object representing the source group's name"},"data":{"type":"object","properties":{"publisher":{"type":"string","minLength":2,"description":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group.","markdownDescription":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group."},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"Adventure":{"type":"boolean","const":true,"description":"This source group is an adventure path or the like.","markdownDescription":"This source group is an adventure path or the like."},"Ongoing":{"type":"boolean","const":true,"description":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools.","markdownDescription":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools."}},"additionalProperties":false}},"required":["misc"],"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["publisher"],"additionalProperties":false}},"required":["type","ID","title"],"additionalProperties":false,"description":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like.","markdownDescription":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like."}]}],"$schema":"http://json-schema.org/draft-07/schema#"} \ No newline at end of file +{"anyOf":[{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"background"},"name":{"type":"object","properties":{"primary":{"type":"string","minLength":1,"description":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case.","markdownDescription":"The full name of the statblock or header, exactly as it appears in the source. The only exception is when the source uses stylistic all-caps or no-caps, in which case you should use your judgement and possibly convert it to title-case."},"aliases":{"type":"array","items":{"type":"string","minLength":1,"description":"An alternative name for the content.","markdownDescription":"An alternative name for the content."},"minItems":1,"description":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\").","markdownDescription":"An array of alternative names of an entity. Some entities have multiple common names, whether defined in the statblock itself or the surrounding text. Alternative names may also be provided to ease searching, sorting, and filtering with common mistakes (e.g. calling the Aid action \"Help\")."},"specifier":{"type":"string","minLength":1,"description":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated.","markdownDescription":"A string to meaningfully disambiguate identically named entities (by necessity if they're from the same source). This often occurs, for example, with feats common to multiple classes (e.g. \"Attack of Opportunity\"). It can also occur when one entity in the source effectively defines multiple entities in data, each of which need to be disambiguated."}},"required":["primary"],"additionalProperties":false},"source":{"type":"object","properties":{"ID":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$","description":"The source ID that contains the data.","markdownDescription":"The source ID that contains the data."},"page":{"type":"integer","description":"The page number (if any) on which the content begins.","markdownDescription":"The page number (if any) on which the content begins."}},"required":["ID"],"additionalProperties":false},"data":{"type":"object","properties":{"traits":{"type":"array","items":{"type":"object","properties":{"trait":{"type":"string","minLength":1,"pattern":"^[a-z]","description":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\").","markdownDescription":"The bare, keyworded name of the trait (e.g. the \"versatile\" in \"versatile P\")."},"variables":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"description":"The variable elements of a trait in an array.","markdownDescription":"The variable elements of a trait in an array."},"display":{"type":"string","minLength":1,"description":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)","markdownDescription":"How the trait should display, if it cannot be trivially inferred from `trait` and `variables`. (Example: \"modular (P and grapple, or S and sweep)\".)"}},"required":["trait"],"additionalProperties":false,"description":"A trait with both keyword and variable elements.","markdownDescription":"A trait with both keyword and variable elements."},"minItems":1,"description":"An array of objects representing a list of traits.","markdownDescription":"An array of objects representing a list of traits."},"entries":{"type":"array","items":{"anyOf":[{"type":"string","minLength":1,"description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},{"type":"object","properties":{"type":{"type":"string","minLength":1}},"required":["type"],"additionalProperties":true}]},"minItems":1},"_tags":{"type":"object","properties":{"abilityBoosts":{"type":"object","properties":{"abilities":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of boost that the background can grant.","markdownDescription":"An object containing the types of boost that the background can grant."},"count":{"type":"integer","minimum":1,"maximum":3,"description":"The total number of boosts the background can grant.","markdownDescription":"The total number of boosts the background can grant."}},"required":["abilities","count"],"additionalProperties":false,"description":"The ability boosts the background grants.","markdownDescription":"The ability boosts the background grants."},"trainedSkills":{"type":"object","properties":{"skills":{"type":"object","additionalProperties":{"type":"boolean","const":true},"description":"A list of skills in which the background can grant proficiency.","markdownDescription":"A list of skills in which the background can grant proficiency."},"count":{"type":"integer","minimum":1,"maximum":4,"description":"The total number of distinct skill proficiencies the background can grant.","markdownDescription":"The total number of distinct skill proficiencies the background can grant."}},"required":["skills","count"],"additionalProperties":false,"description":"The skills in which the background can grant proficiency.","markdownDescription":"The skills in which the background can grant proficiency."},"gainedFeats":{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1},"specifier":{"type":"string","minLength":1},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell).","markdownDescription":"A direct reference to another statblock. The `type` of the content is typically inferred from the context in which it is invoked (e.g. a reference in a deity's \"Cleric Spells\" entry is a spell)."},"minItems":1,"description":"A list of feats the background can grant.","markdownDescription":"A list of feats the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The feats the background grants.","markdownDescription":"The feats the background grants."},"gainedSpells":{"type":"object","properties":{"options":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"minItems":1,"description":"A list of spells the background can grant.","markdownDescription":"A list of spells the background can grant."},"count":{"type":"integer","minimum":1,"maximum":2,"description":"The total number of feats the background can grant.","markdownDescription":"The total number of feats the background can grant."}},"required":["options","count"],"additionalProperties":false,"description":"The spells the background grants.","markdownDescription":"The spells the background grants."},"misc":{"type":"object","properties":{"Grants ability":{"type":"boolean","const":true,"description":"The background background grants an active, voluntary ability.","markdownDescription":"The background background grants an active, voluntary ability."},"Grants equipment":{"type":"boolean","const":true,"description":"The background grants a free item (not just access or proficiency—the actual concrete thing).","markdownDescription":"The background grants a free item (not just access or proficiency—the actual concrete thing)."},"Grants language":{"type":"boolean","const":true,"description":"The background grants a language.","markdownDescription":"The background grants a language."},"Grants resistance":{"type":"boolean","const":true,"description":"The background grants a damage resistance.","markdownDescription":"The background grants a damage resistance."},"Grants sense":{"type":"boolean","const":true,"description":"The background grants a sense (e.g. darkvision, scent).","markdownDescription":"The background grants a sense (e.g. darkvision, scent)."},"Grants situational benefit":{"type":"boolean","const":true,"description":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days.","markdownDescription":"The background grants a passive benefit that isn't otherwise categorisable. For example, this would apply if the background grants a +1 circumstance bonus to Seek on cloudy days."},"Has drawback":{"type":"boolean","const":true,"description":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad.","markdownDescription":"The background comes with an objective, mandatory drawback, such as a penalty to some check or the inability to use an item or spell; not something that is both good and bad."},"GM influence":{"type":"boolean","const":true,"description":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants.","markdownDescription":"The GM determines some mechanical aspect of the background. For instance, this would apply if the background specifies that the GM alone chooses one of the boosts or the type of Lore skill it grants."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"type":"object","properties":{"type":{"type":"string","enum":["reprint","variant","replacement","extension"],"description":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell).","markdownDescription":"`reprint`: The statblock is (near) identical to another one, and is intended to be as such.\n`variant`: The statblock is dependent on but distinct to the target (e.g. unique NPCs based on generic monsters).\n`replacement`: The statblock replaces the target entirely everywhere.\n`extension`: The statblock adds additional content to the target but doesn't supersede it (e.g. a new option added to a spell)."},"target":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"modifications":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","minLength":1,"description":"The type of modification being applied.","markdownDescription":"The type of modification being applied."},"target":{"type":"object","properties":{"property":{"type":"string","pattern":"^\\w+(?:\\.\\w+)*$","description":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\").","markdownDescription":"A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. \"castingTime.unit\")."},"name":{"type":"string","minLength":1,"description":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s.","markdownDescription":"The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s."}},"required":["property"],"additionalProperties":true},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"object","properties":{},"additionalProperties":true},{"type":"array"},{"type":"boolean"}],"description":"The modification value.","markdownDescription":"The modification value."}},"required":["type","target"],"additionalProperties":true,"description":"A single modification step.","markdownDescription":"A single modification step."},"minItems":1,"description":"An array of changes which, when applied consecutively, transforms the target content into the referring content.","markdownDescription":"An array of changes which, when applied consecutively, transforms the target content into the referring content."}},"required":["type","target"],"additionalProperties":false,"description":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content.","markdownDescription":"An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content."}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},{"type":"object","properties":{"type":{"type":"string","const":"condition"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"group":{"type":"object","properties":{"Attitudes":{"type":"boolean","const":true,"description":"The condition is in the 'Attitudes' group (CRB p619).","markdownDescription":"The condition is in the 'Attitudes' group (CRB p619)."},"Death and Dying":{"type":"boolean","const":true,"description":"The condition is in the 'Death and Dying' group (CRB p619).","markdownDescription":"The condition is in the 'Death and Dying' group (CRB p619)."},"Degrees of Detection":{"type":"boolean","const":true,"description":"The condition is in the 'Degrees of Detection' group (CRB p619).","markdownDescription":"The condition is in the 'Degrees of Detection' group (CRB p619)."},"Lowered Abilities":{"type":"boolean","const":true,"description":"The condition is in the 'Lowered Abilities' group (CRB p619).","markdownDescription":"The condition is in the 'Lowered Abilities' group (CRB p619)."},"Senses":{"type":"boolean","const":true,"description":"The condition is in the 'Senses' group (CRB p619).","markdownDescription":"The condition is in the 'Senses' group (CRB p619)."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing any groups the condition belongs to. The properties should be in title case.","markdownDescription":"An object containing any groups the condition belongs to. The properties should be in title case."}},"additionalProperties":false}},"required":["entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A condition","markdownDescription":"A condition"},{"type":"object","properties":{"type":{"type":"string","const":"domain"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"preamble":{"type":"string","minLength":1,"description":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use.","markdownDescription":"The typically brief sentence or two of flavour text that describes the domain or otherwise provides guidance on its use."},"domainSpell":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"advancedDomainSpell":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items"},"apocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"A reference target to the domain's apocryphal spell (see Dark Archive p142)","markdownDescription":"A reference target to the domain's apocryphal spell (see Dark Archive p142)"},"advancedApocryphalSpell":{"type":"object","properties":{"name":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/name"},"specifier":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/specifier"},"sourceID":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/_tags/properties/gainedFeats/properties/options/items/properties/sourceID"}},"required":["name","sourceID"],"additionalProperties":false,"description":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)","markdownDescription":"The reference target to the domain's advanced apocryphal spell (see Dark Archive p142)"}},"required":["domainSpell","advancedDomainSpell"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A domain (for a religion)","markdownDescription":"A domain (for a religion)"},{"type":"object","properties":{"type":{"type":"string","const":"event"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"level":{"type":"integer","minimum":-1,"description":"The event's level","markdownDescription":"The event's level"},"traits":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/traits"},"applicableSkills":{"type":"array","items":{"type":"object","properties":{"skill":{"type":"string","enum":["Acrobatics","Arcana","Athletics","Crafting","Deception","Diplomacy","Intimidation","Lore","Medicine","Nature","Occultism","Performance","Religion","Society","Stealth","Survival","Thievery"],"description":"The name of the skill (title case).","markdownDescription":"The name of the skill (title case)."},"variables":{"type":"array","items":{"type":"string","minLength":1,"pattern":"^[A-Z]"},"minItems":1,"description":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\").","markdownDescription":"A skill's variable element (e.g. \"Accounting\" and \"Midwifery\" in \"Accounting or Midwifery Lore\")."},"display":{"type":"string","minLength":1,"description":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)","markdownDescription":"How the skill should display, if it cannot be trivially inferred from `skill` and `variables`. (Example: \"Accounting and Midwifery Lore\".)"}},"required":["skill"],"additionalProperties":false,"description":"A combined object to describe a type of skill referenced by other content.","markdownDescription":"A combined object to describe a type of skill referenced by other content."},"minItems":1,"description":"An array of objects representing the event's applicable skills.","markdownDescription":"An array of objects representing the event's applicable skills."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"}},"required":["level","entries"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"An event","markdownDescription":"An event"},{"type":"object","properties":{"type":{"type":"string","const":"familiarAbility"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"abilityType":{"type":"string","enum":["Familiar","Master"],"description":"The familiar ability's type.","markdownDescription":"The familiar ability's type."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"affectsCommunication":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages).","markdownDescription":"The ability affects the familiar's capacity to communicate (e.g. by granting it languages)."},"affectsSenses":{"type":"boolean","const":true,"description":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent).","markdownDescription":"The ability affects the familiar's senses or grants a new sense (e.g. darkvision, scent)."},"affectsMovement":{"type":"boolean","const":true,"description":"The ability affects the familiar's capacity to move or grants a new Speed.","markdownDescription":"The ability affects the familiar's capacity to move or grants a new Speed."},"hasRequirement":{"type":"boolean","const":true,"description":"You or the familiar must satisfy a certain requirement to choose this ability.","markdownDescription":"You or the familiar must satisfy a certain requirement to choose this ability."},"grantsAbility":{"type":"boolean","const":true,"description":"The ability grants you or the familiar an active, voluntary ability.","markdownDescription":"The ability grants you or the familiar an active, voluntary ability."},"repeatable":{"type":"boolean","const":true,"description":"You can select this ability multiple times.","markdownDescription":"You can select this ability multiple times."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["abilityType","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A familiar ability","markdownDescription":"A familiar ability"},{"type":"object","properties":{"type":{"type":"string","const":"relicGift"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"tier":{"type":"string","minLength":1,"pattern":"^[A-Z]","description":"The relic gift's tier (title case)","markdownDescription":"The relic gift's tier (title case)"},"traits":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/traits"},"aspects":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The aspect's name","markdownDescription":"The aspect's name"},"note":{"type":"string","minLength":1,"description":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\").","markdownDescription":"A bracketed note qualifying the aspect (e.g. the \"azata-themed\" in \"celestial (azata-themed)\")."}},"required":["name"],"additionalProperties":false}},"prerequisites":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items/anyOf/0","description":"A single paragraph that accepts in-line formatting via `@tag`s.","markdownDescription":"A single paragraph that accepts in-line formatting via `@tag`s."},"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"},"_tags":{"type":"object","properties":{"itemTypes":{"type":"object","properties":{"Armor":{"type":"boolean","const":true,"description":"The relic must be a piece or suit of armour to have this gift.","markdownDescription":"The relic must be a piece or suit of armour to have this gift."},"Worn Item":{"type":"boolean","const":true,"description":"The relic must be a worn item to have this gift.","markdownDescription":"The relic must be a worn item to have this gift."},"Weapon":{"type":"boolean","const":true,"description":"The relic must be a weapon to have this gift.","markdownDescription":"The relic must be a weapon to have this gift."}},"additionalProperties":{"type":"boolean","const":true},"description":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case.","markdownDescription":"An object containing the types of item the relic must be in order to have this gift. The properties should be in title case."},"misc":{"type":"object","properties":{"Alters relic":{"type":"boolean","const":true,"description":"The gift permanently changes the relic's nature in some way.","markdownDescription":"The gift permanently changes the relic's nature in some way."},"Grants ability":{"type":"boolean","const":true,"description":"The gift grants the character a new, activatable ability (including spells).","markdownDescription":"The gift grants the character a new, activatable ability (including spells)."},"Grants passive attribute":{"type":"boolean","const":true,"description":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability.","markdownDescription":"The gift grants the character a new Speed, a damage resistance, an automatic bonus, or another always-active ability."},"Is rune":{"type":"boolean","const":true,"description":"The gift mimics the effect of a rune.","markdownDescription":"The gift mimics the effect of a rune."},"Soul seed":{"type":"boolean","const":true,"description":"The gift is \"particularly appropriate\" for soul seeds (SoM p230).","markdownDescription":"The gift is \"particularly appropriate\" for soul seeds (SoM p230)."}},"additionalProperties":false,"description":"Miscellaneous tags","markdownDescription":"Miscellaneous tags"}},"additionalProperties":false}},"required":["tier","aspects","entries"],"additionalProperties":false,"description":"An object describing the content for filtering, searching, and sorting.","markdownDescription":"An object describing the content for filtering, searching, and sorting."},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source"],"additionalProperties":false,"description":"A relic gift","markdownDescription":"A relic gift"},{"type":"object","properties":{"type":{"type":"string","const":"skill"},"name":{"$ref":"#/anyOf/0/anyOf/0/properties/name"},"source":{"$ref":"#/anyOf/0/anyOf/0/properties/source"},"data":{"type":"object","properties":{"entries":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries"}},"required":["entries"],"additionalProperties":false},"reference":{"$ref":"#/anyOf/0/anyOf/0/properties/reference"}},"required":["type","name","source","data"],"additionalProperties":false,"description":"A skill","markdownDescription":"A skill"}]},{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"license"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.","markdownDescription":"The license's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the license's `name` for display purposes.","markdownDescription":"An abbreviation or other shortening of the license's `name` for display purposes."},"short":{"type":"string","minLength":1,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the license's name","markdownDescription":"An object representing the license's name"},"data":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items"},"minItems":1,"description":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"The full text of the license. Formatting may be used where it doesn't detract from its interpretation."}},"required":["entries"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"source"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number.","markdownDescription":"The source's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem.\n\nFor multi-part adventures, the standard is to use \"0\" for the player's guide (if any), and then \"#\" for each part, where \"#\" is the part's number."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source's name","markdownDescription":"An object representing the source's name"},"data":{"type":"object","properties":{"released":{"type":"string","format":"date","description":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available.","markdownDescription":"The source's publication date (YYYY-MM-DD). For content with a staggered release or early-access program, use the date the source was first made publicly available."},"version":{"type":"string","minLength":1,"description":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")","markdownDescription":"The target version for the converted data (if any). This value serves akin to a `specifier` in case multiple distinct versions of the same source are maintained. Leave undefined if there has only ever been one version. (Examples: \"2nd Printing\", \"v1.2\", \"Revised 2025\")"},"errataed":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed.","markdownDescription":"The date (YYYY-MM-DD) of the source's most recent errata applied to Pf2ools' content. Leave undefined if the source has never been errataed."},"added":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise).","markdownDescription":"The date (YYYY-MM-DD) the source was first made available on the Pf2ools ecosystem (complete or otherwise)."},"modified":{"type":"string","format":"date","description":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified.","markdownDescription":"The date (YYYY-MM-DD) the source's content-data as maintained by the Pf2ools project was last modified."},"URL":{"type":"string","format":"uri","description":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\".","markdownDescription":"A website on which the content can be legally and publicly viewed, downloaded, or purchased. A first-party website (i.e. one controlled by the authors) is preferred. If the Pf2ools source is the authoritative version for distribution, you can use \"https://github.com/pf2ools/pf2ools-data\"."},"groupIDs":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of a source group.","markdownDescription":"The `ID` of a source group."},"minItems":1,"description":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\").","markdownDescription":"A list of `ID`s of the source's parent groups (if any). This is used for a source that is part of a larger, clearly defined, multi-part series. For instance, \"Extinction Curse #1: The Show Must Go On\" belongs to the \"Extinction Curse\" series (\"EC\"), and \"Lost Omens: Travel Guide\" belongs to the \"Lost Omens\" series (\"LO\")."},"requiredSourceIDs":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of the dependent homebrew source.","markdownDescription":"The `ID` of the dependent homebrew source."},"minItems":1,"description":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`.","markdownDescription":"A list of `ID`s of other homebrew sources that this source requires. The requirement is strict: a source that adds a subclass to another, external homebrew class would list that class' source `ID`."},"licenseID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The `ID` of the source's license.","markdownDescription":"The `ID` of the source's license."},"copyright":{"type":"array","items":{"$ref":"#/anyOf/0/anyOf/0/properties/data/properties/entries/items"},"minItems":1,"description":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation.","markdownDescription":"Any additional copyright text associated with the source. For instance, the copyright notice that accompanies the OGLv1.0a license would be entered here (but not the license itself), as does the ORC license's attribution notice. Formatting may be used where it doesn't detract from its interpretation."},"authors":{"type":"array","items":{"type":"string","description":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\").","markdownDescription":"An author's name. Online handles should be reasonably indicated (e.g. \"Twitter: @ThatVauxs\", \"Discord: @spap\")."},"minItems":1,"description":"A list of unique authors as credited by the source itself.","markdownDescription":"A list of unique authors as credited by the source itself."},"publisher":{"type":"string","minLength":2,"description":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\").","markdownDescription":"The name of the source's publishing company or group (e.g. \"Paizo\" or \"Roll for Combat\", but not a general marketplace like \"Pathfinder Infinite\")."},"converters":{"type":"array","items":{"type":"string","minLength":2,"description":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated.","markdownDescription":"A converter's name. Discord usernames are strongly preferred; other online handles should be reasonably indicated."},"minItems":1,"description":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates.","markdownDescription":"A list of unique Pf2ools contributors who converted this source. If multiple converters exist, choose one 'principal' to go first in the case of questions or bug reports. This is particularly used for homebrew, both for attributing work done and to help organise updates."},"_tags":{"type":"object","properties":{"publicationType":{"type":"object","properties":{"Comic":{"type":"boolean","const":true,"description":"The source is content bundled with a comic.","markdownDescription":"The source is content bundled with a comic."},"Blog post":{"type":"boolean","const":true,"description":"The source is a blog post or another similar type of short, online article.","markdownDescription":"The source is a blog post or another similar type of short, online article."}},"additionalProperties":false,"description":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook.","markdownDescription":"An object representing the type of publication the source can be categorised as. This is most relevant when the game content is bundled along with something that isn't a typical Pathfinder rulebook."},"status":{"type":"object","properties":{"Missing content":{"type":"boolean","const":true,"description":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date.","markdownDescription":"This source is only partially converted right now (i.e. it lacks some content), but, one day, it could be completely up-to-date."},"Missing tags":{"type":"boolean","const":true,"description":"The converted content this source contains isn't completely tagged, even if it all displays correctly.","markdownDescription":"The converted content this source contains isn't completely tagged, even if it all displays correctly."},"Invalid":{"type":"boolean","const":true,"description":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained.","markdownDescription":"This source's data is invalid and either contains serious schema errors or is generally malformed. It exists for archival purposes only and is unmaintained."}},"additionalProperties":false},"misc":{"type":"object","properties":{"legacyRuleset":{"type":"boolean","const":true,"description":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023).","markdownDescription":"This source targets the original Pathfinder 2e ruleset, as published in the Core Rulebook (2019), and not as published in Player Core (2023)."},"Official":{"type":"boolean","const":true,"description":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official').","markdownDescription":"This source was created and published by Paizo as 'official' Pathfinder 2e content (that is, it's official insofar that something can be 'official')."},"GM-facing":{"type":"boolean","const":true,"description":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like.","markdownDescription":"This source is intended to be GM-facing, to the exclusion of players. This is typically due to it being an adventure, module, one-shot, scenario, or the like."},"PFS-legal":{"type":"boolean","const":true,"description":"This source is legal for Pathfinder Society play.","markdownDescription":"This source is legal for Pathfinder Society play."},"Playtest":{"type":"boolean","const":true,"description":"This source contains playtest, early-access, or otherwise 'unfinished' content.","markdownDescription":"This source contains playtest, early-access, or otherwise 'unfinished' content."},"Ongoing":{"type":"boolean","const":true,"description":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication.","markdownDescription":"This source is being continually expanded. The data only reflects content only up until the `errataed` date. This is used for 'monster a day' projects and the like, where the conversion may entail a substantial lag behind the publication."},"Deprecated":{"type":"boolean","const":true,"description":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not.","markdownDescription":"This source has been wholly superseded by another version of the same content. This applies when a completely rewritten, revised version of the source exists; simple, minor modifications via errata do not."},"NSFW":{"type":"boolean","const":true,"description":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature.","markdownDescription":"This source contains content of a particularly provocative, unsavoury, or otherwise adult-oriented nature."}},"additionalProperties":false}},"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["released","added","modified","URL","licenseID"],"additionalProperties":false}},"required":["type","ID","title","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"sourceGroup"},"ID":{"$ref":"#/anyOf/0/anyOf/0/properties/source/properties/ID","description":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups).","markdownDescription":"The source group's identifying string for the computer. This must be only composed of alphanumeric characters and non-initial, non-terminal hyphens. It must be globally and case-insensitively unique across the Pf2ools ecosystem (both sources and source groups)."},"title":{"type":"object","properties":{"full":{"type":"string","minLength":1,"description":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason.","markdownDescription":"The source group's full, human-readable name. Title case is preferred but anything can be used within reason."},"short":{"type":"string","minLength":1,"maxLength":8,"description":"An abbreviation or other shortening of the source's name for display purposes.","markdownDescription":"An abbreviation or other shortening of the source's name for display purposes."}},"required":["full","short"],"additionalProperties":false,"description":"An object representing the source group's name","markdownDescription":"An object representing the source group's name"},"data":{"type":"object","properties":{"publisher":{"type":"string","minLength":2,"description":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group.","markdownDescription":"The name of the original, first-party publisher of the source group. Sources with publishers not matching this value are considered 'third-party' contributors to the source group."},"_tags":{"type":"object","properties":{"misc":{"type":"object","properties":{"Adventure":{"type":"boolean","const":true,"description":"This source group is an adventure path or the like.","markdownDescription":"This source group is an adventure path or the like."},"Ongoing":{"type":"boolean","const":true,"description":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools.","markdownDescription":"This source group is being continually expanded. Not all member-sources may exist on Pf2ools."}},"additionalProperties":false}},"required":["misc"],"additionalProperties":false,"description":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes.","markdownDescription":"This object contains a list of categories the source falls into, for sorting, searching, and filtering purposes."}},"required":["publisher"],"additionalProperties":false}},"required":["type","ID","title"],"additionalProperties":false,"description":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like.","markdownDescription":"A `sourceGroup` object defines the existence of a group of sources. Tautology aside, this is used to describe adventure paths, book series, and the like."}]}],"$schema":"http://json-schema.org/draft-07/schema#"} \ No newline at end of file diff --git a/_dist/zod/_bundle.js b/_dist/zod/_bundle.js index 1cd2d28..1e73218 100644 --- a/_dist/zod/_bundle.js +++ b/_dist/zod/_bundle.js @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z } from "zod"; import { license } from "./license.js"; import { source } from "./source.js"; @@ -10,7 +10,7 @@ import { event } from "./content/event.js"; import { familiarAbility } from "./content/familiarAbility.js"; import { relicGift } from "./content/relicGift.js"; import { skill } from "./content/skill.js"; -const refineContent = (content) => content.refine((content) => (content.reference ? !!content.data !== !!content.reference.modifications : content.data), "`data` and `reference.modifications` cannot be used simultaneously; choose one method to describe the content."); +const refineContent = (content) => content.refine((content) => (content.reference ? (content.reference.type === "reprint" ? true : !!content.data !== !!content.reference.modifications) : content.data), "Choose one of `data` and `reference.modifications` to describe the content."); export const bundle = z.object({ license: z.array(license).min(1).optional(), source: z.array(source).min(1), diff --git a/_dist/zod/_content.d.ts b/_dist/zod/_content.d.ts index 493e907..5ddcdb2 100644 --- a/_dist/zod/_content.d.ts +++ b/_dist/zod/_content.d.ts @@ -33,7 +33,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"background">; @@ -721,7 +751,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -822,6 +852,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"condition">; @@ -1053,7 +1113,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1154,6 +1214,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"domain">; @@ -1390,7 +1480,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1491,6 +1581,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"event">; @@ -1696,7 +1816,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1797,6 +1917,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"familiarAbility">; @@ -2034,7 +2184,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -2135,6 +2285,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"relicGift">; @@ -2500,7 +2680,7 @@ export declare const content: z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -2601,6 +2781,36 @@ export declare const content: z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"skill">; diff --git a/_dist/zod/_content.js b/_dist/zod/_content.js index c06cd09..a377a6d 100644 --- a/_dist/zod/_content.js +++ b/_dist/zod/_content.js @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z } from "zod"; import { background } from "./content/background.js"; import { condition } from "./content/condition.js"; @@ -15,4 +15,4 @@ export const content = z.discriminatedUnion("type", [ familiarAbility, relicGift, skill, -]).refine((content) => (content.reference ? !!content.data !== !!content.reference.modifications : content.data), "`data` and `reference.modifications` cannot be used simultaneously; choose one method to describe the content."); +]).refine((content) => (content.reference ? (content.reference.type === "reprint" ? true : !!content.data !== !!content.reference.modifications) : content.data), "Choose one of `data` and `reference.modifications` to describe the content."); diff --git a/_dist/zod/_data.d.ts b/_dist/zod/_data.d.ts index 58bd55e..b899043 100644 --- a/_dist/zod/_data.d.ts +++ b/_dist/zod/_data.d.ts @@ -33,7 +33,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"background">; @@ -721,7 +751,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -822,6 +852,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"condition">; @@ -1053,7 +1113,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1154,6 +1214,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"domain">; @@ -1390,7 +1480,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1491,6 +1581,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"event">; @@ -1696,7 +1816,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -1797,6 +1917,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"familiarAbility">; @@ -2034,7 +2184,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -2135,6 +2285,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"relicGift">; @@ -2500,7 +2680,7 @@ export declare const data: z.ZodUnion<[z.ZodEffects; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -2601,6 +2781,36 @@ export declare const data: z.ZodUnion<[z.ZodEffects | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"skill">; diff --git a/_dist/zod/_data.js b/_dist/zod/_data.js index b13f192..3e428f7 100644 --- a/_dist/zod/_data.js +++ b/_dist/zod/_data.js @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z } from "zod"; import { license } from "./license.js"; import { source } from "./source.js"; diff --git a/_dist/zod/_index.js b/_dist/zod/_index.js index a528301..055032f 100644 --- a/_dist/zod/_index.js +++ b/_dist/zod/_index.js @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-index.js at Thu, 16 May 2024 02:02:47 GMT +// This file was generated by scripts/generate-zod-index.js at Tue, 28 May 2024 02:24:25 GMT // . export { contentTemplate } from "./contentTemplate.js"; export { license } from "./license.js"; diff --git a/_dist/zod/content/background.d.ts b/_dist/zod/content/background.d.ts index d2dae77..d4d88f3 100644 --- a/_dist/zod/content/background.d.ts +++ b/_dist/zod/content/background.d.ts @@ -33,7 +33,7 @@ export declare const background: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const background: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"background">; diff --git a/_dist/zod/content/common/reference.d.ts b/_dist/zod/content/common/reference.d.ts index 5dd0ab9..f8d987d 100644 --- a/_dist/zod/content/common/reference.d.ts +++ b/_dist/zod/content/common/reference.d.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -export declare const reference: z.ZodObject<{ +export declare const reference: z.ZodEffects; target: z.ZodObject<{ name: z.ZodString; @@ -100,4 +100,34 @@ export declare const reference: z.ZodObject<{ }; value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; }[] | undefined; +}>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; +}, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>; diff --git a/_dist/zod/content/common/reference.js b/_dist/zod/content/common/reference.js index 4920963..26d8457 100644 --- a/_dist/zod/content/common/reference.js +++ b/_dist/zod/content/common/reference.js @@ -15,7 +15,7 @@ export const reference = z property: z .string() .describe('A dot-separated hierarchy of properties leading to the target from the top-level `data` (e.g. "castingTime.unit").') - .regex(/^\w+(?:\.\w+)+&/, "Invalid property accessor"), + .regex(/^\w+(?:\.\w+)*$/, "Invalid property accessor"), name: z .string() .describe("The `name` of the target object, if it is found in an array. This typically refers to arrays of `entryObject`s.") @@ -39,4 +39,5 @@ export const reference = z .optional(), }) .describe("An explicit reference to some other content, possibly with modifications applied on top. The referenced content's type is always assumed to be the same as the referring content.") - .strict(); + .strict() + .refine((obj) => (obj.type !== "reprint" ? !!obj.modifications : true), "This reference doesn't make sense."); diff --git a/_dist/zod/content/condition.d.ts b/_dist/zod/content/condition.d.ts index c9608ed..e3ccc1a 100644 --- a/_dist/zod/content/condition.d.ts +++ b/_dist/zod/content/condition.d.ts @@ -33,7 +33,7 @@ export declare const condition: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const condition: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"condition">; diff --git a/_dist/zod/content/domain.d.ts b/_dist/zod/content/domain.d.ts index 63488cc..8032d17 100644 --- a/_dist/zod/content/domain.d.ts +++ b/_dist/zod/content/domain.d.ts @@ -33,7 +33,7 @@ export declare const domain: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const domain: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"domain">; diff --git a/_dist/zod/content/event.d.ts b/_dist/zod/content/event.d.ts index fcd40c2..5095bc1 100644 --- a/_dist/zod/content/event.d.ts +++ b/_dist/zod/content/event.d.ts @@ -33,7 +33,7 @@ export declare const event: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const event: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"event">; diff --git a/_dist/zod/content/familiarAbility.d.ts b/_dist/zod/content/familiarAbility.d.ts index 53b6056..a84aa65 100644 --- a/_dist/zod/content/familiarAbility.d.ts +++ b/_dist/zod/content/familiarAbility.d.ts @@ -33,7 +33,7 @@ export declare const familiarAbility: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const familiarAbility: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"familiarAbility">; diff --git a/_dist/zod/content/relicGift.d.ts b/_dist/zod/content/relicGift.d.ts index 68975bd..6efa3be 100644 --- a/_dist/zod/content/relicGift.d.ts +++ b/_dist/zod/content/relicGift.d.ts @@ -33,7 +33,7 @@ export declare const relicGift: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const relicGift: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"relicGift">; diff --git a/_dist/zod/content/skill.d.ts b/_dist/zod/content/skill.d.ts index 9af6eec..daa48a2 100644 --- a/_dist/zod/content/skill.d.ts +++ b/_dist/zod/content/skill.d.ts @@ -33,7 +33,7 @@ export declare const skill: z.ZodObject; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const skill: z.ZodObject | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, { type: z.ZodLiteral<"skill">; diff --git a/_dist/zod/contentTemplate.d.ts b/_dist/zod/contentTemplate.d.ts index 71d8521..cc0a719 100644 --- a/_dist/zod/contentTemplate.d.ts +++ b/_dist/zod/contentTemplate.d.ts @@ -33,7 +33,7 @@ export declare const contentTemplate: z.ZodObject<{ page?: number | undefined; }>; data: z.ZodOptional>; - reference: z.ZodOptional; target: z.ZodObject<{ name: z.ZodString; @@ -134,6 +134,36 @@ export declare const contentTemplate: z.ZodObject<{ }; value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; }[] | undefined; + }>, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; + }, { + type: "variant" | "reprint" | "replacement" | "extension"; + target: { + name: string; + sourceID: string; + specifier?: string | undefined; + }; + modifications?: { + type: string; + target: { + property: string; + name?: string | undefined; + }; + value?: string | number | boolean | any[] | z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined; + }[] | undefined; }>>; }, "strict", z.ZodTypeAny, { type: string; diff --git a/zod/_bundle.ts b/zod/_bundle.ts index 222f92a..824504a 100644 --- a/zod/_bundle.ts +++ b/zod/_bundle.ts @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z, type AnyZodObject } from "zod"; @@ -15,8 +15,13 @@ import { skill } from "./content/skill.js"; const refineContent = (content: AnyZodObject) => content.refine( - (content) => (content.reference ? !!content.data !== !!content.reference.modifications : content.data), - "`data` and `reference.modifications` cannot be used simultaneously; choose one method to describe the content.", + (content) => + content.reference + ? content.reference.type === "reprint" + ? true + : !!content.data !== !!content.reference.modifications + : content.data, + "Choose one of `data` and `reference.modifications` to describe the content.", ); export const bundle = z.object({ diff --git a/zod/_content.ts b/zod/_content.ts index ce7efb6..86e7041 100644 --- a/zod/_content.ts +++ b/zod/_content.ts @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z } from "zod"; @@ -13,6 +13,11 @@ import { skill } from "./content/skill.js"; export const content = z .discriminatedUnion("type", [background, condition, domain, event, familiarAbility, relicGift, skill]) .refine( - (content) => (content.reference ? !!content.data !== !!content.reference.modifications : content.data), - "`data` and `reference.modifications` cannot be used simultaneously; choose one method to describe the content.", + (content) => + content.reference + ? content.reference.type === "reprint" + ? true + : !!content.data !== !!content.reference.modifications + : content.data, + "Choose one of `data` and `reference.modifications` to describe the content.", ); diff --git a/zod/_data.ts b/zod/_data.ts index 1fd10c7..29beab7 100644 --- a/zod/_data.ts +++ b/zod/_data.ts @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-combinedTypes.js at Thu, 16 May 2024 02:02:46 GMT +// This file was generated by scripts/generate-zod-combinedTypes.js at Tue, 28 May 2024 02:24:24 GMT import { z } from "zod"; diff --git a/zod/_index.ts b/zod/_index.ts index e026cf1..d6f574f 100644 --- a/zod/_index.ts +++ b/zod/_index.ts @@ -1,4 +1,4 @@ -// This file was generated by scripts/generate-zod-index.js at Thu, 16 May 2024 02:02:47 GMT +// This file was generated by scripts/generate-zod-index.js at Tue, 28 May 2024 02:24:25 GMT // . export { contentTemplate } from "./contentTemplate.js";