update schema organization anf change some things.

This commit is contained in:
Ottermandias 2025-01-17 19:55:02 +01:00
parent 5f8377acaa
commit ec3ec7db4e
22 changed files with 796 additions and 676 deletions

View file

@ -24,6 +24,34 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Penumbra.String", "Penumbra
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Penumbra.CrashHandler", "Penumbra.CrashHandler\Penumbra.CrashHandler.csproj", "{EE834491-A98F-4395-BE0D-6861AE5AD953}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Schemas", "Schemas", "{BFEA7504-1210-4F79-A7FE-BF03B6567E33}"
ProjectSection(SolutionItems) = preProject
schemas\files\default_mod.json = schemas\files\default_mod.json
schemas\files\group.json = schemas\files\group.json
schemas\files\local_mod_data-v3.json = schemas\files\local_mod_data-v3.json
schemas\files\mod_meta-v3.json = schemas\files\mod_meta-v3.json
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "structs", "structs", "{B03F276A-0572-4F62-AF86-EF62F6B80463}"
ProjectSection(SolutionItems) = preProject
schemas\structs\container.json = schemas\structs\container.json
schemas\structs\group_combining.json = schemas\structs\group_combining.json
schemas\structs\group_imc.json = schemas\structs\group_imc.json
schemas\structs\group_multi.json = schemas\structs\group_multi.json
schemas\structs\group_single.json = schemas\structs\group_single.json
schemas\structs\manipulation.json = schemas\structs\manipulation.json
schemas\structs\meta_atch.json = schemas\structs\meta_atch.json
schemas\structs\meta_enums.json = schemas\structs\meta_enums.json
schemas\structs\meta_eqdp.json = schemas\structs\meta_eqdp.json
schemas\structs\meta_eqp.json = schemas\structs\meta_eqp.json
schemas\structs\meta_est.json = schemas\structs\meta_est.json
schemas\structs\meta_geqp.json = schemas\structs\meta_geqp.json
schemas\structs\meta_gmp.json = schemas\structs\meta_gmp.json
schemas\structs\meta_imc.json = schemas\structs\meta_imc.json
schemas\structs\meta_rsp.json = schemas\structs\meta_rsp.json
schemas\structs\option.json = schemas\structs\option.json
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -58,6 +86,10 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{BFEA7504-1210-4F79-A7FE-BF03B6567E33} = {F89C9EAE-25C8-43BE-8108-5921E5A93502}
{B03F276A-0572-4F62-AF86-EF62F6B80463} = {BFEA7504-1210-4F79-A7FE-BF03B6567E33}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B17E85B1-5F60-4440-9F9A-3DDE877E8CDF}
EndGlobalSection

View file

@ -1,486 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json",
"type": "object",
"properties": {
"Name": {
"description": "Name of the container/option/sub-mod.",
"type": ["string", "null"]
},
"Files": {
"description": "File redirections in this container. Keys are game paths, values are relative file paths.",
"type": "object",
"patternProperties": {
"^[^/\\\\][^\\\\]*$": {
"type": "string",
"pattern": "^[^/\\\\][^/]*$"
}
},
"additionalProperties": false
},
"FileSwaps": {
"description": "File swaps in this container. Keys are original game paths, values are actual game paths.",
"type": "object",
"patternProperties": {
"^[^/\\\\][^\\\\]*$": {
"type": "string",
"pattern": "^[^/\\\\][^/]*$"
}
},
"additionalProperties": false
},
"Manipulations": {
"type": "array",
"items": {
"$ref": "#/$defs/Manipulation"
}
}
},
"$defs": {
"Manipulation": {
"type": "object",
"properties": {
"Type": {
"enum": ["Unknown", "Imc", "Eqdp", "Eqp", "Est", "Gmp", "Rsp", "GlobalEqp", "Atch"]
},
"Manipulation": {
"type": ["object", "null"]
}
},
"required": ["Type", "Manipulation"],
"oneOf": [
{
"properties": {
"Type": {
"const": "Unknown"
},
"Manipulation": {
"type": "null"
}
}
}, {
"properties": {
"Type": {
"const": "Imc"
},
"Manipulation": {
"$ref": "#/$defs/ImcManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Eqdp"
},
"Manipulation": {
"$ref": "#/$defs/EqdpManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Eqp"
},
"Manipulation": {
"$ref": "#/$defs/EqpManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Est"
},
"Manipulation": {
"$ref": "#/$defs/EstManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Gmp"
},
"Manipulation": {
"$ref": "#/$defs/GmpManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Rsp"
},
"Manipulation": {
"$ref": "#/$defs/RspManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "GlobalEqp"
},
"Manipulation": {
"$ref": "#/$defs/GlobalEqpManipulation"
}
}
}, {
"properties": {
"Type": {
"const": "Atch"
},
"Manipulation": {
"$ref": "#/$defs/AtchManipulation"
}
}
}
],
"additionalProperties": false
},
"ImcManipulation": {
"type": "object",
"properties": {
"Entry": {
"$ref": "#/$defs/ImcEntry"
},
"Valid": {
"type": "boolean"
}
},
"required": [
"Entry"
],
"allOf": [
{
"$ref": "#/$defs/ImcIdentifier"
}
],
"unevaluatedProperties": false
},
"ImcIdentifier": {
"type": "object",
"properties": {
"PrimaryId": {
"type": "integer"
},
"SecondaryId": {
"type": "integer"
},
"Variant": {
"type": "integer"
},
"ObjectType": {
"$ref": "#/$defs/ObjectType"
},
"EquipSlot": {
"$ref": "#/$defs/EquipSlot"
},
"BodySlot": {
"$ref": "#/$defs/BodySlot"
}
},
"required": [
"PrimaryId",
"SecondaryId",
"Variant",
"ObjectType",
"EquipSlot",
"BodySlot"
]
},
"ImcEntry": {
"type": "object",
"properties": {
"AttributeAndSound": {
"type": "integer"
},
"MaterialId": {
"type": "integer"
},
"DecalId": {
"type": "integer"
},
"VfxId": {
"type": "integer"
},
"MaterialAnimationId": {
"type": "integer"
},
"AttributeMask": {
"type": "integer"
},
"SoundId": {
"type": "integer"
}
},
"required": [
"MaterialId",
"DecalId",
"VfxId",
"MaterialAnimationId",
"AttributeMask",
"SoundId"
],
"additionalProperties": false
},
"EqdpManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "integer"
},
"Gender": {
"$ref": "#/$defs/Gender"
},
"Race": {
"$ref": "#/$defs/ModelRace"
},
"SetId": {
"$ref": "#/$defs/LaxInteger"
},
"Slot": {
"$ref": "#/$defs/EquipSlot"
},
"ShiftedEntry": {
"type": "integer"
}
},
"required": [
"Entry",
"Gender",
"Race",
"SetId",
"Slot"
],
"additionalProperties": false
},
"EqpManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "integer"
},
"SetId": {
"$ref": "#/$defs/LaxInteger"
},
"Slot": {
"$ref": "#/$defs/EquipSlot"
}
},
"required": [
"Entry",
"SetId",
"Slot"
],
"additionalProperties": false
},
"EstManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "integer"
},
"Gender": {
"$ref": "#/$defs/Gender"
},
"Race": {
"$ref": "#/$defs/ModelRace"
},
"SetId": {
"$ref": "#/$defs/LaxInteger"
},
"Slot": {
"enum": ["Hair", "Face", "Body", "Head"]
}
},
"required": [
"Entry",
"Gender",
"Race",
"SetId",
"Slot"
],
"additionalProperties": false
},
"GmpManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "object",
"properties": {
"Enabled": {
"type": "boolean"
},
"Animated": {
"type": "boolean"
},
"RotationA": {
"type": "number"
},
"RotationB": {
"type": "number"
},
"RotationC": {
"type": "number"
},
"UnknownA": {
"type": "number"
},
"UnknownB": {
"type": "number"
},
"UnknownTotal": {
"type": "number"
},
"Value": {
"type": "number"
}
},
"required": [
"Enabled",
"Animated",
"RotationA",
"RotationB",
"RotationC",
"UnknownA",
"UnknownB",
"UnknownTotal",
"Value"
],
"additionalProperties": false
},
"SetId": {
"$ref": "#/$defs/LaxInteger"
}
},
"required": [
"Entry",
"SetId"
],
"additionalProperties": false
},
"RspManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "number"
},
"SubRace": {
"$ref": "#/$defs/SubRace"
},
"Attribute": {
"$ref": "#/$defs/RspAttribute"
}
},
"additionalProperties": false
},
"GlobalEqpManipulation": {
"type": "object",
"properties": {
"Condition": {
"type": "integer"
},
"Type": {
"enum": ["DoNotHideEarrings", "DoNotHideNecklace", "DoNotHideBracelets", "DoNotHideRingR", "DoNotHideRingL", "DoNotHideHrothgarHats", "DoNotHideVieraHats"]
}
},
"additionalProperties": false
},
"AtchManipulation": {
"type": "object",
"properties": {
"Entry": {
"type": "object",
"properties": {
"Bone": {
"type": "string",
"maxLength": 34
},
"Scale": {
"type": "number"
},
"OffsetX": {
"type": "number"
},
"OffsetY": {
"type": "number"
},
"OffsetZ": {
"type": "number"
},
"RotationX": {
"type": "number"
},
"RotationY": {
"type": "number"
},
"RotationZ": {
"type": "number"
}
},
"required": [
"Bone",
"Scale",
"OffsetX",
"OffsetY",
"OffsetZ",
"RotationX",
"RotationY",
"RotationZ"
],
"additionalProperties": false
},
"Gender": {
"$ref": "#/$defs/Gender"
},
"Race": {
"$ref": "#/$defs/ModelRace"
},
"Type": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"Index": {
"type": "integer"
}
},
"required": [
"Entry",
"Gender",
"Race",
"Type",
"Index"
],
"additionalProperties": false
},
"LaxInteger": {
"oneOf": [
{
"type": "integer"
}, {
"type": "string",
"pattern": "^\\d+$"
}
]
},
"EquipSlot": {
"enum": ["Unknown", "MainHand", "OffHand", "Head", "Body", "Hands", "Belt", "Legs", "Feet", "Ears", "Neck", "Wrists", "RFinger", "BothHand", "LFinger", "HeadBody", "BodyHandsLegsFeet", "SoulCrystal", "LegsFeet", "FullBody", "BodyHands", "BodyLegsFeet", "ChestHands", "Nothing", "All"]
},
"Gender": {
"enum": ["Unknown", "Male", "Female", "MaleNpc", "FemaleNpc"]
},
"ModelRace": {
"enum": ["Unknown", "Midlander", "Highlander", "Elezen", "Lalafell", "Miqote", "Roegadyn", "AuRa", "Hrothgar", "Viera"]
},
"ObjectType": {
"enum": ["Unknown", "Vfx", "DemiHuman", "Accessory", "World", "Housing", "Monster", "Icon", "LoadingScreen", "Map", "Interface", "Equipment", "Character", "Weapon", "Font"]
},
"BodySlot": {
"enum": ["Unknown", "Hair", "Face", "Tail", "Body", "Zear"]
},
"SubRace": {
"enum": ["Unknown", "Midlander", "Highlander", "Wildwood", "Duskwight", "Plainsfolk", "Dunesfolk", "SeekerOfTheSun", "KeeperOfTheMoon", "Seawolf", "Hellsguard", "Raen", "Xaela", "Helion", "Lost", "Rava", "Veena"]
},
"RspAttribute": {
"enum": ["MaleMinSize", "MaleMaxSize", "MaleMinTail", "MaleMaxTail", "FemaleMinSize", "FemaleMaxSize", "FemaleMinTail", "FemaleMaxTail", "BustMinX", "BustMinY", "BustMinZ", "BustMaxX", "BustMaxY", "BustMaxZ"]
}
}
}

View file

@ -1,25 +1,19 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json",
"allOf": [
{
"type": "object",
"properties": {
"Version": {
"description": "???",
"type": ["integer", "null"]
},
"Description": {
"description": "Description of the sub-mod.",
"type": ["string", "null"]
},
"Image": {
"description": "Unused by Penumbra.",
"type": ["string", "null"]
"description": "Mod Container version, currently unused.",
"type": "integer",
"minimum": 0,
"maximum": 0
}
}
}, {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json"
},
{
"$ref": "structs/container.json"
}
]
}

View file

@ -1,35 +1,35 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/group.json",
"type": "object",
"properties": {
"Version": {
"description": "???",
"type": ["integer", "null"]
"description": "Mod Container version, currently unused.",
"type": "integer"
},
"Name": {
"description": "Name of the group.",
"type": "string"
"type": "string",
"minLength": 1
},
"Description": {
"description": "Description of the group.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"Image": {
"description": "Relative path to a preview image for the group. Unused by Penumbra, present for round-trip import/export of TexTools-generated mods.",
"type": ["string", "null"]
"type": ["string", "null" ]
},
"Page": {
"description": "TexTools page of the group. Unused by Penumbra, present for round-trip import/export of TexTools-generated mods.",
"type": ["integer", "null"]
"type": "integer"
},
"Priority": {
"description": "Priority of the group. If several groups define conflicting files or manipulations, the highest priority wins.",
"type": ["integer", "null"]
"type": "integer"
},
"Type": {
"description": "Group type. Single groups have one and only one of their options active at any point. Multi groups can have zero, one or many of their options active. Combining groups have n options, 2^n containers, and will have one and only one container active depending on the selected options.",
"enum": ["Single", "Multi", "Imc", "Combining"]
"enum": [ "Single", "Multi", "Imc", "Combining" ]
},
"DefaultSettings": {
"description": "Default configuration for the group.",
@ -42,165 +42,16 @@
],
"oneOf": [
{
"properties": {
"Type": {
"const": "Single"
},
"Options": {
"type": "array",
"items": {
"allOf": [
{
"type": "object",
"properties": {
"Description": {
"description": "Description of the option.",
"type": ["string", "null"]
},
"Image": {
"description": "Unused by Penumbra.",
"type": ["string", "null"]
}
}
}, {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json"
}
]
}
}
}
}, {
"properties": {
"Type": {
"const": "Multi"
},
"Options": {
"type": "array",
"items": {
"allOf": [
{
"type": "object",
"properties": {
"Description": {
"description": "Description of the option.",
"type": ["string", "null"]
},
"Priority": {
"description": "Priority of the option. If several enabled options within the group define conflicting files or manipulations, the highest priority wins.",
"type": ["integer", "null"]
},
"Image": {
"description": "Unused by Penumbra.",
"type": ["string", "null"]
}
}
}, {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json"
}
]
}
}
}
}, {
"properties": {
"Type": {
"const": "Imc"
},
"AllVariants": {
"type": "boolean"
},
"OnlyAttributes": {
"type": "boolean"
},
"Identifier": {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json#/$defs/ImcIdentifier"
},
"DefaultEntry": {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json#/$defs/ImcEntry"
},
"Options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Name": {
"description": "Name of the option.",
"type": "string"
},
"Description": {
"description": "Description of the option.",
"type": ["string", "null"]
},
"Image": {
"description": "Unused by Penumbra.",
"type": ["string", "null"]
}
},
"required": [
"Name"
],
"oneOf": [
{
"properties": {
"AttributeMask": {
"type": "integer"
}
},
"required": [
"AttributeMask"
]
}, {
"properties": {
"IsDisableSubMod": {
"const": true
}
},
"required": [
"IsDisableSubMod"
]
}
],
"unevaluatedProperties": false
}
}
}
}, {
"properties": {
"Type": {
"const": "Combining"
},
"Options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Name": {
"description": "Name of the option.",
"type": "string"
},
"Description": {
"description": "Description of the option.",
"type": ["string", "null"]
},
"Image": {
"description": "Unused by Penumbra.",
"type": ["string", "null"]
}
},
"required": [
"Name"
],
"additionalProperties": false
}
},
"Containers": {
"type": "array",
"items": {
"$ref": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/container.json"
}
}
}
"$ref": "structs/group_combining.json"
},
{
"$ref": "structs/group_imc.json"
},
{
"$ref": "structs/group_multi.json"
},
{
"$ref": "structs/group_single.json"
}
],
"unevaluatedProperties": false
]
}

View file

@ -0,0 +1,32 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Local Penumbra Mod Data",
"description": "The locally stored data for an installed mod in Penumbra",
"type": "object",
"properties": {
"FileVersion": {
"description": "Major version of the local data schema used.",
"type": "integer",
"minimum": 3,
"maximum": 3
},
"ImportDate": {
"description": "The date and time of the installation of the mod as a Unix Epoch millisecond timestamp.",
"type": "integer"
},
"LocalTags": {
"description": "User-defined local tags for the mod.",
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"uniqueItems": true
},
"Favorite": {
"description": "Whether the mod is favourited by the user.",
"type": "boolean"
}
},
"required": [ "FileVersion" ]
}

View file

@ -1,6 +1,5 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/xivdev/Penumbra/master/schemas/meta-v3.json",
"title": "Penumbra Mod Metadata",
"description": "Metadata of a Penumbra mod.",
"type": "object",
@ -13,33 +12,35 @@
},
"Name": {
"description": "Name of the mod.",
"type": "string"
"type": "string",
"minLength": 1
},
"Author": {
"description": "Author of the mod.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"Description": {
"description": "Description of the mod. Can span multiple paragraphs.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"Image": {
"description": "Relative path to a preview image for the mod. Unused by Penumbra, present for round-trip import/export of TexTools-generated mods.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"Version": {
"description": "Version of the mod. Can be an arbitrary string.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"Website": {
"description": "URL of the web page of the mod.",
"type": ["string", "null"]
"type": [ "string", "null" ]
},
"ModTags": {
"description": "Author-defined tags for the mod.",
"type": "array",
"items": {
"type": "string"
"type": "string",
"minLength": 1
},
"uniqueItems": true
}

View file

@ -0,0 +1,34 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Files": {
"description": "File redirections in this container. Keys are game paths, values are relative file paths.",
"type": [ "object", "null" ],
"patternProperties": {
"^[^/\\\\.:?][^\\\\?:]+$": {
"type": "string",
"pattern": "^[^/\\\\.:?][^?:]+$"
}
},
"additionalProperties": false
},
"FileSwaps": {
"description": "File swaps in this container. Keys are original game paths, values are actual game paths.",
"type": [ "object", "null" ],
"patternProperties": {
"^[^/\\\\.?:][^\\\\?:]+$": {
"type": "string",
"pattern": "^[^/\\\\.:?][^?:]+$"
}
},
"additionalProperties": false
},
"Manipulations": {
"type": [ "array", "null" ],
"items": {
"$ref": "manipulation.json"
}
}
}
}

View file

@ -0,0 +1,31 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"Type": {
"const": "Combining"
},
"Options": {
"type": "array",
"items": {
"$ref": "option.json"
}
},
"Containers": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "container.json"
},
{
"properties": {
"Name": {
"type": [ "string", "null" ]
}
}
}
]
}
}
}
}

View file

@ -0,0 +1,50 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"Type": {
"const": "Imc"
},
"AllVariants": {
"type": "boolean"
},
"OnlyAttributes": {
"type": "boolean"
},
"Identifier": {
"$ref": "meta_imc.json#ImcIdentifier"
},
"DefaultEntry": {
"$ref": "meta_imc.json#ImcEntry"
},
"Options": {
"type": "array",
"items": {
"$ref": "option.json",
"oneOf": [
{
"properties": {
"AttributeMask": {
"type": "integer",
"minimum": 0,
"maximum": 1023
}
},
"required": [
"AttributeMask"
]
},
{
"properties": {
"IsDisableSubMod": {
"const": true
}
},
"required": [
"IsDisableSubMod"
]
}
]
}
}
}
}

View file

@ -0,0 +1,32 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Type": {
"const": "Multi"
},
"Options": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "option.json"
},
{
"$ref": "container.json"
},
{
"properties": {
"Priority": {
"type": "integer"
}
}
}
]
}
}
}
}

View file

@ -0,0 +1,22 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Type": {
"const": "Single"
},
"Options": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "option.json"
},
{
"$ref": "container.json"
}
]
}
}
}
}

View file

@ -0,0 +1,95 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Type": {
"enum": [ "Unknown", "Imc", "Eqdp", "Eqp", "Est", "Gmp", "Rsp", "GlobalEqp", "Atch" ]
},
"Manipulation": {
"type": "object"
}
},
"required": [ "Type", "Manipulation" ],
"oneOf": [
{
"properties": {
"Type": {
"const": "Imc"
},
"Manipulation": {
"$ref": "meta_imc.json"
}
}
},
{
"properties": {
"Type": {
"const": "Eqdp"
},
"Manipulation": {
"$ref": "meta_eqdp.json"
}
}
},
{
"properties": {
"Type": {
"const": "Eqp"
},
"Manipulation": {
"$ref": "meta_eqp.json"
}
}
},
{
"properties": {
"Type": {
"const": "Est"
},
"Manipulation": {
"$ref": "meta_est.json"
}
}
},
{
"properties": {
"Type": {
"const": "Gmp"
},
"Manipulation": {
"$ref": "meta_gmp.json"
}
}
},
{
"properties": {
"Type": {
"const": "Rsp"
},
"Manipulation": {
"$ref": "meta_rsp.json"
}
}
},
{
"properties": {
"Type": {
"const": "GlobalEqp"
},
"Manipulation": {
"$ref": "meta_geqp.json"
}
}
},
{
"properties": {
"Type": {
"const": "Atch"
},
"Manipulation": {
"$ref": "meta_atch.json"
}
}
}
]
}

View file

@ -0,0 +1,67 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"type": "object",
"properties": {
"Bone": {
"type": "string",
"maxLength": 34
},
"Scale": {
"type": "number"
},
"OffsetX": {
"type": "number"
},
"OffsetY": {
"type": "number"
},
"OffsetZ": {
"type": "number"
},
"RotationX": {
"type": "number"
},
"RotationY": {
"type": "number"
},
"RotationZ": {
"type": "number"
}
},
"required": [
"Bone",
"Scale",
"OffsetX",
"OffsetY",
"OffsetZ",
"RotationX",
"RotationY",
"RotationZ"
]
},
"Gender": {
"$ref": "meta_enums.json#Gender"
},
"Race": {
"$ref": "meta_enums.json#ModelRace"
},
"Type": {
"type": "string",
"minLength": 1,
"maxLength": 4
},
"Index": {
"$ref": "meta_enums.json#U16"
}
},
"required": [
"Entry",
"Gender",
"Race",
"Type",
"Index"
]
}

View file

@ -0,0 +1,57 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$defs": {
"EquipSlot": {
"$anchor": "EquipSlot",
"enum": [ "Unknown", "MainHand", "OffHand", "Head", "Body", "Hands", "Belt", "Legs", "Feet", "Ears", "Neck", "Wrists", "RFinger", "BothHand", "LFinger", "HeadBody", "BodyHandsLegsFeet", "SoulCrystal", "LegsFeet", "FullBody", "BodyHands", "BodyLegsFeet", "ChestHands", "Nothing", "All" ]
},
"Gender": {
"$anchor": "Gender",
"enum": [ "Unknown", "Male", "Female", "MaleNpc", "FemaleNpc" ]
},
"ModelRace": {
"$anchor": "ModelRace",
"enum": [ "Unknown", "Midlander", "Highlander", "Elezen", "Lalafell", "Miqote", "Roegadyn", "AuRa", "Hrothgar", "Viera" ]
},
"ObjectType": {
"$anchor": "ObjectType",
"enum": [ "Unknown", "Vfx", "DemiHuman", "Accessory", "World", "Housing", "Monster", "Icon", "LoadingScreen", "Map", "Interface", "Equipment", "Character", "Weapon", "Font" ]
},
"BodySlot": {
"$anchor": "BodySlot",
"enum": [ "Unknown", "Hair", "Face", "Tail", "Body", "Zear" ]
},
"SubRace": {
"$anchor": "SubRace",
"enum": [ "Unknown", "Midlander", "Highlander", "Wildwood", "Duskwight", "Plainsfolk", "Dunesfolk", "SeekerOfTheSun", "KeeperOfTheMoon", "Seawolf", "Hellsguard", "Raen", "Xaela", "Helion", "Lost", "Rava", "Veena" ]
},
"U8": {
"$anchor": "U8",
"oneOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 255
},
{
"type": "string",
"pattern": "^0*(1[0-9][0-9]|[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$"
}
]
},
"U16": {
"$anchor": "U16",
"oneOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 65535
},
{
"type": "string",
"pattern": "^0*([1-5][0-9]{4}|[0-9]{0,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$"
}
]
}
}
}

View file

@ -0,0 +1,30 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"type": "integer",
"minimum": 0,
"maximum": 1023
},
"Gender": {
"$ref": "meta_enums.json#Gender"
},
"Race": {
"$ref": "meta_enums.json#ModelRace"
},
"SetId": {
"$ref": "meta_enums.json#U16"
},
"Slot": {
"$ref": "meta_enums.json#EquipSlot"
}
},
"required": [
"Entry",
"Gender",
"Race",
"SetId",
"Slot"
]
}

View file

@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"type": "integer"
},
"SetId": {
"$ref": "meta_enums.json#U16"
},
"Slot": {
"$ref": "meta_enums.json#EquipSlot"
}
},
"required": [
"Entry",
"SetId",
"Slot"
]
}

View file

@ -0,0 +1,28 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"$ref": "meta_enums.json#U16"
},
"Gender": {
"$ref": "meta_enums.json#Gender"
},
"Race": {
"$ref": "meta_enums.json#ModelRace"
},
"SetId": {
"$ref": "meta_enums.json#U16"
},
"Slot": {
"enum": [ "Hair", "Face", "Body", "Head" ]
}
},
"required": [
"Entry",
"Gender",
"Race",
"SetId",
"Slot"
]
}

View file

@ -0,0 +1,40 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Condition": {
"$ref": "meta_enums.json#U16"
},
"Type": {
"enum": [ "DoNotHideEarrings", "DoNotHideNecklace", "DoNotHideBracelets", "DoNotHideRingR", "DoNotHideRingL", "DoNotHideHrothgarHats", "DoNotHideVieraHats" ]
}
},
"required": [ "Type" ],
"oneOf": [
{
"properties": {
"Type": {
"const": [ "DoNotHideHrothgarHats", "DoNotHideVieraHats" ]
},
"Condition": {
"const": 0
}
}
},
{
"properties": {
"Type": {
"const": [ "DoNotHideHrothgarHats", "DoNotHideVieraHats" ]
}
}
},
{
"properties": {
"Type": {
"const": [ "DoNotHideEarrings", "DoNotHideNecklace", "DoNotHideBracelets", "DoNotHideRingR", "DoNotHideRingL" ]
},
"Condition": {}
}
}
]
}

View file

@ -0,0 +1,59 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"type": "object",
"properties": {
"Enabled": {
"type": "boolean"
},
"Animated": {
"type": "boolean"
},
"RotationA": {
"type": "integer",
"minimum": 0,
"maximum": 1023
},
"RotationB": {
"type": "integer",
"minimum": 0,
"maximum": 1023
},
"RotationC": {
"type": "integer",
"minimum": 0,
"maximum": 1023
},
"UnknownA": {
"type": "integer",
"minimum": 0,
"maximum": 15
},
"UnknownB": {
"type": "integer",
"minimum": 0,
"maximum": 15
}
},
"required": [
"Enabled",
"Animated",
"RotationA",
"RotationB",
"RotationC",
"UnknownA",
"UnknownB"
],
"additionalProperties": false
},
"SetId": {
"$ref": "meta_enums.json#U16"
}
},
"required": [
"Entry",
"SetId"
]
}

View file

@ -0,0 +1,87 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"$ref": "#ImcEntry"
}
},
"required": [
"Entry"
],
"allOf": [
{
"$ref": "#ImcIdentifier"
}
],
"$defs": {
"ImcIdentifier": {
"type": "object",
"properties": {
"PrimaryId": {
"$ref": "meta_enums.json#U16"
},
"SecondaryId": {
"$ref": "meta_enums.json#U16"
},
"Variant": {
"$ref": "meta_enums.json#U8"
},
"ObjectType": {
"$ref": "meta_enums.json#ObjectType"
},
"EquipSlot": {
"$ref": "meta_enums.json#EquipSlot"
},
"BodySlot": {
"$ref": "meta_enums.json#BodySlot"
}
},
"$anchor": "ImcIdentifier",
"required": [
"PrimaryId",
"SecondaryId",
"Variant",
"ObjectType",
"EquipSlot",
"BodySlot"
]
},
"ImcEntry": {
"type": "object",
"properties": {
"MaterialId": {
"$ref": "meta_enums.json#U8"
},
"DecalId": {
"$ref": "meta_enums.json#U8"
},
"VfxId": {
"$ref": "meta_enums.json#U8"
},
"MaterialAnimationId": {
"$ref": "meta_enums.json#U8"
},
"AttributeMask": {
"type": "integer",
"minimum": 0,
"maximum": 1023
},
"SoundId": {
"type": "integer",
"minimum": 0,
"maximum": 63
}
},
"$anchor": "ImcEntry",
"required": [
"MaterialId",
"DecalId",
"VfxId",
"MaterialAnimationId",
"AttributeMask",
"SoundId"
]
}
}
}

View file

@ -0,0 +1,20 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Entry": {
"type": "number"
},
"SubRace": {
"$ref": "meta_enums.json#SubRace"
},
"Attribute": {
"enum": [ "MaleMinSize", "MaleMaxSize", "MaleMinTail", "MaleMaxTail", "FemaleMinSize", "FemaleMaxSize", "FemaleMinTail", "FemaleMaxTail", "BustMinX", "BustMinY", "BustMinZ", "BustMaxX", "BustMaxY", "BustMaxZ" ]
}
},
"required": [
"Entry",
"SubRace",
"Attribute"
]
}

View file

@ -0,0 +1,24 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"Name": {
"description": "Name of the option.",
"type": "string",
"minLength": 1
},
"Description": {
"description": "Description of the option.",
"type": [ "string", "null" ]
},
"Priority": {
"description": "Priority of the option. If several enabled options within the group define conflicting files or manipulations, the highest priority wins.",
"type": "integer"
},
"Image": {
"description": "Unused by Penumbra.",
"type": [ "string", "null" ]
}
},
"required": [ "Name" ]
}