├── .github └── workflows │ ├── pr.yml │ └── publish.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── dat-schema ├── 0_11_Anarchy.gql ├── 1_00_Domination.gql ├── 1_01_Ambush.gql ├── 1_01_Invasion.gql ├── 1_02_Beyond.gql ├── 1_03_Torment.gql ├── 2_00_The_Awakening.gql ├── 2_00_Warbands.gql ├── 2_01_Talisman.gql ├── 2_02_Ascendancy.gql ├── 2_04_Atlas_of_Worlds.gql ├── 2_04_Essence.gql ├── 2_05_Breach.gql ├── 3_00_Harbinger.gql ├── 3_00_The_Fall_of_Oriath.gql ├── 3_01_Abyss.gql ├── 3_01_War_for_the_Atlas.gql ├── 3_02_Bestiary.gql ├── 3_03_Incursion.gql ├── 3_04_Delve.gql ├── 3_05_Betrayal.gql ├── 3_06_Synthesis.gql ├── 3_07_Legion.gql ├── 3_08_Blight.gql ├── 3_09_Conquerors_of_the_Atlas.gql ├── 3_09_Metamorph.gql ├── 3_10_Delirium.gql ├── 3_11_Harvest.gql ├── 3_12_Heist.gql ├── 3_13_Echoes_of_the_Atlas.gql ├── 3_13_Ritual.gql ├── 3_14_Ultimatum.gql ├── 3_15_Expedition.gql ├── 3_16_Scourge.gql ├── 3_17_Archnemesis.gql ├── 3_17_Siege_of_the_Atlas.gql ├── 3_18_Sentinel.gql ├── 3_19_Lake_of_Kalandra.gql ├── 3_20_Sanctum.gql ├── 3_21_Crucible.gql ├── 3_22_Trial_of_the_Ancestors.gql ├── 3_23_Affliction.gql ├── 3_24_Necropolis.gql ├── 3_25_Settlers_of_Kalguur.gql ├── _Core.gql └── poe2 │ ├── ActionTypes.gql │ ├── ActiveSkillWeaponRequirement.gql │ ├── ActiveSkills.gql │ ├── Acts.gql │ ├── AddBuffToTargetVarieties.gql │ ├── AdditionalLifeScaling.gql │ ├── AegisVariations.gql │ ├── AlternatePassiveAdditions.gql │ ├── AlternatePassiveSkills.gql │ ├── AlternateQualityTypes.gql │ ├── AlternateTreeVersions.gql │ ├── AnimateWeaponUniques.gql │ ├── ArmourTypes.gql │ ├── Ascendancy.gql │ ├── AtlasPassiveSkillSubTrees.gql │ ├── AttributeRequirements.gql │ ├── BaseItemTypes.gql │ ├── BlightCraftingItems.gql │ ├── BlightCraftingRecipes.gql │ ├── BuffDefinitions.gql │ ├── BuffTemplates.gql │ ├── BuffVisualOrbTypes.gql │ ├── BuffVisualsArtVariations.gql │ ├── Chanceableitemclasses.gql │ ├── CharacterCreationButton.gql │ ├── CharacterCreationDialogue.gql │ ├── CharacterMeleeSkills.gql │ ├── Characters.gql │ ├── Chests.gql │ ├── ClassPassiveSkillOverrides.gql │ ├── ClientStrings.gql │ ├── CostTypes.gql │ ├── CraftableModTypes.gql │ ├── CraftingBenchOptions.gql │ ├── CraftingItemClassCategories.gql │ ├── CurrencyItems.gql │ ├── DefaultMonsterStats.gql │ ├── DelveCraftingModifiers.gql │ ├── EndgameCorruptionMods.gql │ ├── EndgameMapBiomes.gql │ ├── EndgameMapCompletionQuests.gql │ ├── EndgameMapContent.gql │ ├── EndgameMapContentSet.gql │ ├── EndgameMapDecorations.gql │ ├── EndgameMapPins.gql │ ├── EndgameMaps.gql │ ├── Essences.gql │ ├── ExpeditionCurrency.gql │ ├── Flasks.gql │ ├── FlavourText.gql │ ├── GemEffects.gql │ ├── GemTags.gql │ ├── GoldModPrices.gql │ ├── GrantedEffectLabels.gql │ ├── GrantedEffectQualityStats.gql │ ├── GrantedEffectStatSets.gql │ ├── GrantedEffectStatSetsPerLevel.gql │ ├── GrantedEffects.gql │ ├── GrantedEffectsPerLevel.gql │ ├── HideoutNPCs.gql │ ├── ItemClasses.gql │ ├── ItemExperiencePerLevel.gql │ ├── ItemFrameType.gql │ ├── ItemInherentSkills.gql │ ├── ItemSpirit.gql │ ├── ItemStances.gql │ ├── ItemVisualEffect.gql │ ├── ItemVisualIdentity.gql │ ├── KeywordPopups.gql │ ├── MapSeries.gql │ ├── Maps.gql │ ├── ModGrantedSkills.gql │ ├── Mods.gql │ ├── MonsterPacks.gql │ ├── MonsterVarieties.gql │ ├── NPCTextAudio.gql │ ├── NPCs.gql │ ├── PantheonPanelLayout.gql │ ├── PassiveJewelSlots.gql │ ├── PassiveSkillMasteryEffects.gql │ ├── PassiveSkills.gql │ ├── QuestItems.gql │ ├── Rarity.gql │ ├── RitualStashTabLayout.gql │ ├── ShapeShiftForms.gql │ ├── ShieldTypes.gql │ ├── ShopTag.gql │ ├── SkillCraftingData.gql │ ├── SkillGemSupports.gql │ ├── SkillGems.gql │ ├── SkillGemsForUniqueStat.gql │ ├── SocketableStashTabLayout.gql │ ├── SoulCores.gql │ ├── SoulCoresPerClass.gql │ ├── Stats.gql │ ├── StatsFromSkillStats.gql │ ├── SupportGems.gql │ ├── Tags.gql │ ├── Topologies.gql │ ├── UltimatumModifiers.gql │ ├── UltimatumTrialLength.gql │ ├── UltimatumWagerTypes.gql │ ├── UncutGemAdditionalTiers.gql │ ├── UncutGemTiers.gql │ ├── UtilityFlaskBuffs.gql │ ├── WeaponClasses.gql │ ├── WeaponTypes.gql │ ├── WieldableClasses.gql │ └── WorldAreas.gql ├── graphql.config.yml ├── meta.gql ├── package-lock.json ├── package.json ├── src ├── cli.ts ├── index.ts ├── reader.ts └── types.ts └── tsconfig.json /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: CheckPR 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - 'main' 7 | pull_request: 8 | branches: 9 | - '**' 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | - uses: actions/setup-node@v4 17 | - run: npm ci 18 | - run: npm exec tsc 19 | - run: node dist/cli.js 20 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: actions/setup-node@v4 14 | - run: npm ci 15 | - run: npm exec tsc 16 | - run: node dist/cli.js 17 | - name: Upload schema 18 | uses: ncipollo/release-action@v1 19 | with: 20 | artifacts: "schema.min.json,schema.jsonl" 21 | token: ${{ secrets.GITHUB_TOKEN }} 22 | tag: latest 23 | allowUpdates: true 24 | omitBodyDuringUpdate: true 25 | omitNameDuringUpdate: true 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | schema.min.json 3 | schema.jsonl 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Dependency directories 15 | node_modules/ 16 | 17 | # TypeScript cache 18 | *.tsbuildinfo 19 | 20 | # Optional npm cache directory 21 | .npm 22 | 23 | # yarn v2 24 | .yarn/cache 25 | .yarn/unplugged 26 | .yarn/build-state.yml 27 | .yarn/install-state.gz 28 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Alexander Drozdov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PoE dat schema 2 | 3 | Source of truth schema for dat files. 4 | 5 | ## Using 6 | 7 | Each commit triggers a CI build that exports schema to JSON. 8 | You can always `curl` latest version at 9 | [github.com/poe-tool-dev/dat-schema/releases/download/latest/schema.min.json](https://github.com/poe-tool-dev/dat-schema/releases/download/latest/schema.min.json) 10 | 11 | Structure of JSON file is described in [src/types.ts](https://github.com/poe-tool-dev/dat-schema/blob/main/src/types.ts) 12 | 13 | ## Schema 14 | 15 | The schema is based on GraphQL syntax. 16 | 17 | ### Supported scalar types 18 | 19 | | Type | Description | 20 | |----------|-----------------------------------| 21 | | bool | Boolean | 22 | | string | String | 23 | | i16, i32 | Signed Integer | 24 | | u16, u32 | Unsigned Integer | 25 | | f32 | Floating Point Number | 26 | | rid | Index to a Row in a Foreign Table | 27 | 28 | The `rid` type is intended to be used temporarily until we know the name of foreign table. 29 | 30 | The other type for temporary use is `_`, which is only allowed inside array `[_]`. 31 | You will find it useful if you know that a column is an array but don't know of which type (because they are all zero-length). 32 | 33 | ### Defining relations 34 | 35 | - Using a row index 36 | 37 | Example `BaseItem: BaseItemTypes` 38 | 39 | - Using a matching value in column (like in relational databases) 40 | 41 | Example `SkillId: ActiveSkills @ref(column: "Id")` 42 | 43 | ### Supported directives 44 | 45 | | Directive | Description | 46 | |-------------------------|-------------| 47 | | `@ref(column: String)` | Defines a relation | 48 | | `@unique` | All values in a column are different | 49 | | `@localized` | Content of column differs depending on the language | 50 | | `@file(ext: String)` | Value in a column is a file path | 51 | | `@files(ext: [String])` | Value in a column is a common prefix for several files (often with different extensions) | 52 | | `@tags(list: [String])` | Add tags to the table as metadata that can be used by tools | 53 | -------------------------------------------------------------------------------- /dat-schema/0_11_Anarchy.gql: -------------------------------------------------------------------------------- 1 | type RogueExiles { 2 | MonsterVarietiesKey: MonsterVarieties 3 | _: bool 4 | _: rid 5 | } 6 | 7 | type RogueExileLifeScalingPerLevel { 8 | Level: i32 9 | AdditionalLife: i32 10 | } 11 | -------------------------------------------------------------------------------- /dat-schema/1_00_Domination.gql: -------------------------------------------------------------------------------- 1 | type Shrines { 2 | Id: string @unique 3 | TimeoutInSeconds: i32 4 | ChargesShared: bool 5 | Player_ShrineBuffsKey: rid 6 | _: i32 7 | _: i32 8 | Monster_ShrineBuffsKey: rid 9 | SummonMonster_MonsterVarietiesKey: MonsterVarieties 10 | SummonPlayer_MonsterVarietiesKey: MonsterVarieties 11 | _: i32 12 | Duration: i32 13 | ShrineSoundsKey: ShrineSounds 14 | _: bool 15 | AchievementItemsKeys: [AchievementItems] 16 | IsPVPOnly: bool 17 | _: bool 18 | IsLesserShrine: bool 19 | Description: ClientStrings 20 | Name: ClientStrings 21 | _: bool 22 | _: rid 23 | _: [_] 24 | } 25 | 26 | type ShrineSounds { 27 | Id: string @unique 28 | StereoSoundFile: string @file(ext: ".ogg") 29 | MonoSoundFile: string @file(ext: ".ogg") 30 | } 31 | -------------------------------------------------------------------------------- /dat-schema/1_01_Ambush.gql: -------------------------------------------------------------------------------- 1 | type Strongboxes { 2 | ChestsKey: Chests @unique 3 | SpawnWeight: i32 4 | _: i32 5 | _: bool 6 | _: bool 7 | SpawnWeightIncrease: Stats 8 | SpawnWeightHardmode: i32 9 | } 10 | -------------------------------------------------------------------------------- /dat-schema/1_01_Invasion.gql: -------------------------------------------------------------------------------- 1 | enum InvasionMonsterGroups @indexing(first: 0) { _ } 2 | 3 | type InvasionMonsterRestrictions { 4 | Id: string @unique 5 | WorldAreasKey: WorldAreas 6 | MonsterVarietiesKeys: [MonsterVarieties] 7 | _: [i32] 8 | } 9 | 10 | enum InvasionMonsterRoles @indexing(first: 0) { _ } 11 | 12 | type InvasionMonstersPerArea { 13 | WorldAreasKey: WorldAreas 14 | _: i32 15 | _: [i32] 16 | MonsterVarietiesKeys1: [MonsterVarieties] 17 | MonsterVarietiesKeys2: [MonsterVarieties] 18 | _: i32 19 | _: i32 20 | _: i32 21 | _: i32 22 | } 23 | -------------------------------------------------------------------------------- /dat-schema/1_02_Beyond.gql: -------------------------------------------------------------------------------- 1 | type BeyondFactions { 2 | Id: string 3 | Boss: MonsterVarieties 4 | _: rid 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/1_03_Torment.gql: -------------------------------------------------------------------------------- 1 | type TormentSpirits { 2 | MonsterVarietiesKey: MonsterVarieties 3 | Spirit_ModsKeys: [Mods] 4 | Touched_ModsKeys: [Mods] 5 | Possessed_ModsKeys: [Mods] 6 | MinZoneLevel: i32 7 | MaxZoneLevel: i32 8 | SpawnWeight: i32 9 | SummonedMonster_MonsterVarietiesKey: MonsterVarieties 10 | _: i32 11 | ModsKeys0: [Mods] 12 | ModsKeys1: [Mods] 13 | } 14 | -------------------------------------------------------------------------------- /dat-schema/2_00_The_Awakening.gql: -------------------------------------------------------------------------------- 1 | type DivinationCardArt @tags(list: ["item:def"]) { 2 | BaseItemTypesKey: BaseItemTypes 3 | VirtualFile: string 4 | Influences: [InfluenceTypes] 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/2_00_Warbands.gql: -------------------------------------------------------------------------------- 1 | type WarbandsGraph { 2 | WorldAreasKey: WorldAreas 3 | Connections: [i32] 4 | } 5 | 6 | type WarbandsMapGraph { 7 | WorldAreasKey: WorldAreas 8 | Connections: [i32] 9 | } 10 | 11 | type WarbandsPackMonsters { 12 | Id: string @unique 13 | _: i32 14 | _: bool 15 | _: bool 16 | _: bool 17 | _: bool 18 | _: i32 19 | Tier4_MonsterVarietiesKeys: [MonsterVarieties] 20 | Tier3_MonsterVarietiesKeys: [MonsterVarieties] 21 | Tier2_MonsterVarietiesKeys: [MonsterVarieties] 22 | Tier1_MonsterVarietiesKeys: [MonsterVarieties] 23 | Tier1Name: string @localized 24 | Tier2Name: string @localized 25 | Tier3Name: string @localized 26 | Tier4Name: string @localized 27 | Tier1Art: string 28 | Tier2Art: string 29 | Tier3Art: string 30 | Tier4Art: string 31 | } 32 | 33 | type WarbandsPackNumbers { 34 | Id: string @unique 35 | SpawnChance: i32 36 | MinLevel: i32 37 | MaxLevel: i32 38 | Tier4Number: i32 39 | _: i32 40 | Tier3Number: i32 41 | _: i32 42 | Tier2Number: i32 43 | _: i32 44 | Tier1Number: i32 45 | } 46 | -------------------------------------------------------------------------------- /dat-schema/2_01_Talisman.gql: -------------------------------------------------------------------------------- 1 | type TalismanMonsterMods { 2 | ModTypeKey: ModType 3 | ModsKey: Mods 4 | } 5 | 6 | type TalismanPacks { 7 | Id: string 8 | MonsterPacksKeys: [MonsterPacks] 9 | _: i32 10 | _: i32 11 | MonsterVarietiesKey: MonsterVarieties 12 | _: rid 13 | _: i32 14 | _: i32 15 | _: i32 16 | MonsterPacksKey: MonsterPacks 17 | } 18 | 19 | type Talismans @tags(list: ["item:def"]) { 20 | BaseItemTypesKey: BaseItemTypes @unique 21 | SpawnWeight: i32 22 | ModsKey: Mods 23 | Tier: i32 24 | _: bool 25 | _: bool 26 | _: rid 27 | _: rid 28 | _: i32 29 | } 30 | -------------------------------------------------------------------------------- /dat-schema/2_02_Ascendancy.gql: -------------------------------------------------------------------------------- 1 | type LabyrinthAreas { 2 | Id: string 3 | Normal_WorldAreasKeys: [WorldAreas] 4 | Cruel_WorldAreasKeys: [WorldAreas] 5 | Merciless_WorldAreasKeys: [WorldAreas] 6 | Endgame_WorldAreasKeys: [WorldAreas] 7 | _: i32 8 | } 9 | 10 | type LabyrinthBonusItems { 11 | BaseItemType: BaseItemTypes 12 | AreaLevel: i32 13 | LabyrinthName: string 14 | } 15 | 16 | type LabyrinthExclusionGroups { 17 | Id: string 18 | } 19 | 20 | type LabyrinthIzaroChests { 21 | Id: string @unique @files(ext: [".ot", ".otc"]) 22 | ChestsKey: Chests 23 | SpawnWeight: i32 24 | MinLabyrinthTier: i32 25 | MaxLabyrinthTier: i32 26 | _: i32 27 | } 28 | 29 | type LabyrinthNodeOverrides { 30 | Id1: string 31 | Id2: string 32 | _: [i32] 33 | _: [i32] 34 | } 35 | 36 | type LabyrinthRewardTypes { 37 | Id: string @unique 38 | ObjectPath: string @files(ext: [".ot", ".otc"]) 39 | } 40 | 41 | type Labyrinths @tags(list: ["item:droptable", "item:unique"]) { 42 | Tier: i32 43 | Name: string 44 | OfferingItem: BaseItemTypes 45 | QuestFlag: QuestFlags 46 | RequiredTrials: [LabyrinthTrials] 47 | AreaLevel: i32 48 | _: i32 49 | JewelReward: Words 50 | _: [i32] 51 | _: [i32] 52 | MinLevel: i32 53 | _: i32 54 | _: i32 55 | CraftingFontDescription: ClientStrings 56 | } 57 | 58 | type LabyrinthSecretEffects { 59 | Id: string 60 | MonsterVarietiesKey: MonsterVarieties 61 | Buff_BuffDefinitionsKey: BuffDefinitions 62 | Buff_StatValues: [i32] 63 | OTFile: string @file(ext: ".ot") 64 | _: [_] 65 | } 66 | 67 | enum LabyrinthSecretLocations @indexing(first: 0) { _ } 68 | 69 | type LabyrinthSecrets { 70 | Id: string 71 | Id2: string 72 | _: [i32] 73 | _: i32 74 | _: i32 75 | LabyrinthSecretEffectsKeys0: [LabyrinthSecretEffects] 76 | LabyrinthSecretEffectsKeys1: [LabyrinthSecretEffects] 77 | LabyrinthSecretEffectsKeys2: [LabyrinthSecretEffects] 78 | _: i32 79 | LabyrinthSecretEffectsKeys3: [LabyrinthSecretEffects] 80 | _: bool 81 | _: bool 82 | _: i32 83 | _: bool 84 | _: bool 85 | _: bool 86 | Name: string 87 | AchievementItemsKey: AchievementItems 88 | LabyrinthTierMinimum: i32 89 | LabyrinthTierMaximum: i32 90 | _: bool 91 | } 92 | 93 | type LabyrinthSection { 94 | Id: string 95 | ExclusionGroup: LabyrinthExclusionGroups 96 | _: i32 97 | _: i32 98 | _: i32 99 | _: i32 100 | } 101 | 102 | type LabyrinthSectionLayout { 103 | LabyrinthSectionKey: LabyrinthSection 104 | _: i32 105 | LabyrinthSectionLayoutKeys: [LabyrinthSectionLayout] 106 | LabyrinthSecretsKey0: LabyrinthSecrets 107 | LabyrinthSecretsKey1: LabyrinthSecrets 108 | LabyrinthAreasKey: LabyrinthAreas 109 | Float0: f32 110 | Float1: f32 111 | LabyrinthNodeOverridesKeys: [LabyrinthNodeOverrides] 112 | } 113 | 114 | type LabyrinthTrials { 115 | WorldAreas: WorldAreas 116 | _: i32 117 | _: i32 118 | _: i32 119 | NPCTextAudioKey: NPCTextAudio 120 | _: string 121 | _: string 122 | _: i32 123 | _: i32 # All rows empty 124 | _: i32 # All rows empty 125 | _: i32 # All rows empty 126 | } 127 | 128 | type LabyrinthTrinkets { 129 | BaseItemTypesKey: BaseItemTypes @unique 130 | LabyrinthSecretsKey: [LabyrinthSecrets] 131 | Buff_BuffDefinitionsKey: BuffDefinitions 132 | Buff_StatValues: [i32] 133 | } 134 | 135 | enum LabyrinthCraftOptionFamily @indexing(first: 0) { _ } 136 | 137 | type LabyrinthCraftOptions { 138 | Id: string 139 | CraftFamily: LabyrinthCraftOptionFamily 140 | Text: string 141 | Script: string 142 | ScriptArgument: string 143 | HASH16: i16 144 | _: bool 145 | Tier: LabyrinthCraftOptionTiers 146 | _: bool 147 | Achievement: [AchievementItems] 148 | _: bool 149 | _: rid 150 | _: i32 151 | } 152 | 153 | type LabyrinthCraftOptionTiers { 154 | Id: string 155 | CraftIcon: string 156 | } 157 | -------------------------------------------------------------------------------- /dat-schema/2_04_Atlas_of_Worlds.gql: -------------------------------------------------------------------------------- 1 | type ShaperGuardians { 2 | Id: string 3 | WorldArea: WorldAreas 4 | } 5 | -------------------------------------------------------------------------------- /dat-schema/2_04_Essence.gql: -------------------------------------------------------------------------------- 1 | type Essences @tags(list: ["item:def", "crafting"]) { 2 | BaseItemTypesKey: BaseItemTypes @unique 3 | _: rid 4 | _: rid 5 | _: rid 6 | _: rid 7 | _: rid 8 | _: rid 9 | _: rid 10 | _: rid 11 | _: rid 12 | _: rid 13 | _: rid 14 | Display_Wand_ModsKey: Mods 15 | Display_Bow_ModsKey: Mods 16 | Display_Quiver_ModsKey: Mods 17 | Display_Amulet_ModsKey: Mods 18 | Display_Ring_ModsKey: Mods 19 | Display_Belt_ModsKey: Mods 20 | Display_Gloves_ModsKey: Mods 21 | Display_Boots_ModsKey: Mods 22 | Display_BodyArmour_ModsKey: Mods 23 | Display_Helmet_ModsKey: Mods 24 | Display_Shield_ModsKey: Mods 25 | HASH32: i32 26 | DropLevel: [i32] 27 | Monster_ModsKeys: [Mods] 28 | EssenceTypeKey: EssenceType 29 | Level: i32 30 | _: [i32] 31 | Display_Weapon_ModsKey: Mods 32 | Display_MeleeWeapon_ModsKey: Mods 33 | Display_OneHandWeapon_ModsKey: Mods 34 | Display_TwoHandWeapon_ModsKey: Mods 35 | Display_TwoHandMeleeWeapon_ModsKey: Mods 36 | Display_Armour_ModsKey: Mods 37 | Display_RangedWeapon_ModsKey: Mods 38 | Helmet_ModsKey: Mods 39 | BodyArmour_ModsKey: Mods 40 | Boots_ModsKey: Mods 41 | Gloves_ModsKey: Mods 42 | Bow_ModsKey: Mods 43 | Wand_ModsKey: Mods 44 | Staff_ModsKey: Mods 45 | TwoHandSword_ModsKey: Mods 46 | TwoHandAxe_ModsKey: Mods 47 | TwoHandMace_ModsKey: Mods 48 | Claw_ModsKey: Mods 49 | Dagger_ModsKey: Mods 50 | OneHandSword_ModsKey: Mods 51 | OneHandThrustingSword_ModsKey: Mods 52 | OneHandAxe_ModsKey: Mods 53 | OneHandMace_ModsKey: Mods 54 | Sceptre_ModsKey: Mods 55 | Display_Monster_ModsKey: Mods 56 | ItemLevelRestriction: i32 57 | Belt_ModsKey: Mods 58 | Amulet_ModsKey: Mods 59 | Ring_ModsKey: Mods 60 | Display_Jewellery_ModsKey: Mods 61 | Shield_ModsKey: Mods 62 | Display_Items_ModsKey: Mods 63 | IsScreamingEssence: bool 64 | MemoryLines: [Mods] 65 | _: [i32] 66 | Level2: [i32] 67 | } 68 | 69 | type EssenceType { 70 | Id: string 71 | EssenceType: i32 72 | IsCorruptedEssence: bool 73 | WordsKey: Words 74 | _: rid 75 | } 76 | -------------------------------------------------------------------------------- /dat-schema/2_05_Breach.gql: -------------------------------------------------------------------------------- 1 | type BreachBossLifeScalingPerLevel { 2 | MonsterLevel: i32 3 | LifeMultiplier: i32 4 | } 5 | 6 | type BreachElement { 7 | Element: string 8 | _: rid 9 | BaseBreachstone: BaseItemTypes 10 | BossMapMod: Stats 11 | DuplicateBoss: Stats 12 | } 13 | -------------------------------------------------------------------------------- /dat-schema/3_00_Harbinger.gql: -------------------------------------------------------------------------------- 1 | type Harbingers { 2 | MonsterVarietiesKey: MonsterVarieties 3 | _: i32 4 | MinLevel: i32 5 | MaxLevel: i32 6 | _: i32 7 | } 8 | -------------------------------------------------------------------------------- /dat-schema/3_00_The_Fall_of_Oriath.gql: -------------------------------------------------------------------------------- 1 | type PantheonPanelLayout { 2 | Id: string @unique 3 | X: i32 4 | Y: i32 5 | IsMajorGod: bool 6 | CoverImage: string 7 | GodName2: string 8 | SelectionImage: string 9 | Effect1_StatsKeys: [Stats] 10 | Effect1_Values: [i32] 11 | Effect2_StatsKeys: [Stats] 12 | GodName3: string 13 | Effect3_Values: [i32] 14 | Effect3_StatsKeys: [Stats] 15 | GodName4: string 16 | Effect4_StatsKeys: [Stats] 17 | Effect4_Values: [i32] 18 | GodName1: string 19 | Effect2_Values: [i32] 20 | QuestFlag: QuestFlags 21 | IsDisabled: bool 22 | AchievementItems: [AchievementItems] 23 | LeagueQuestFlag1: i32 24 | LeagueQuestFlag2: i32 25 | LeagueQuestFlag3: i32 26 | DowngradeFlag1: QuestFlags 27 | DowngradeFlag2: QuestFlags 28 | DowngradeFlag3: QuestFlags 29 | } 30 | 31 | type PantheonSouls @tags(list: ["item:itemized"]) { 32 | WorldArea: WorldAreas 33 | CapturedVessel: BaseItemTypes 34 | QuestFlagUpgrade: QuestFlags 35 | CapturedMonster: [MonsterVarieties] 36 | PanelLayout: PantheonPanelLayout 37 | CapturedMonsterDescription: string 38 | _: i32 39 | QuestFlagDowngrade: QuestFlags 40 | } 41 | -------------------------------------------------------------------------------- /dat-schema/3_01_Abyss.gql: -------------------------------------------------------------------------------- 1 | type AbyssObjects { 2 | Id: string @unique 3 | MinLevel: i32 4 | MaxLevel: i32 5 | SpawnWeight: i32 6 | _: i32 7 | MetadataFile: string @files(ext: [".ot", ".otc"]) 8 | _: i32 9 | DaemonSpawners: [MonsterVarieties] 10 | _: i32 11 | _: i32 12 | AbyssalDepths: WorldAreas 13 | _: i32 14 | _: i32 15 | _: i32 16 | _: i32 17 | _: i32 18 | _: i32 19 | _: i32 20 | _: i32 21 | _: i32 22 | _: bool 23 | } 24 | 25 | enum AbyssRegions @indexing(first: 0) { _ } 26 | 27 | enum AbyssTheme @indexing(first: 0) { _ } 28 | -------------------------------------------------------------------------------- /dat-schema/3_01_War_for_the_Atlas.gql: -------------------------------------------------------------------------------- 1 | type ElderBossArenas { 2 | WorldAreasKey: WorldAreas @unique 3 | _: i32 4 | AchievementItemsKeys: [AchievementItems] 5 | } 6 | 7 | type ElderMapBossOverride { 8 | WorldAreasKey: WorldAreas @unique 9 | MonsterVarietiesKeys: [MonsterVarieties] 10 | TerrainMetadata: string @files(ext: [".ot", ".otc"]) 11 | } 12 | 13 | type ElderGuardians { 14 | Id: string 15 | MapIcon: string 16 | } 17 | -------------------------------------------------------------------------------- /dat-schema/3_02_Bestiary.gql: -------------------------------------------------------------------------------- 1 | type BestiaryCapturableMonsters @tags(list: ["item:itemized"]) { 2 | MonsterVarietiesKey: MonsterVarieties 3 | BestiaryGroupsKey: BestiaryGroups 4 | BestiaryEncountersKey: BestiaryEncounters 5 | _: bool 6 | IconSmall: string 7 | Icon: string 8 | Boss_MonsterVarietiesKey: MonsterVarieties 9 | BestiaryGenusKey: BestiaryGenus 10 | _: bool 11 | BestiaryCapturableMonstersKey: BestiaryCapturableMonsters 12 | IsDisabled: bool 13 | _: i32 14 | _: bool 15 | } 16 | 17 | type BestiaryEncounters { 18 | Id: string @unique 19 | MonsterPacksKey: MonsterPacks 20 | MonsterVarietiesKey: MonsterVarieties 21 | MonsterSpawnerId: string @files(ext: [".ot", ".otc"]) 22 | } 23 | 24 | type BestiaryFamilies { 25 | Id: string @unique 26 | Name: string 27 | Icon: string 28 | IconSmall: string 29 | Illustration: string 30 | PageArt: string 31 | FlavourText: string 32 | _: bool 33 | TagsKey: Tags 34 | _: i32 35 | ModsKeys: [Mods] 36 | CurrencyItemsKey: CurrencyItems 37 | } 38 | 39 | type BestiaryGenus { 40 | Id: string @unique 41 | Name: string 42 | BestiaryGroupsKey: BestiaryGroups 43 | Name2: string 44 | Icon: string 45 | } 46 | 47 | type BestiaryGroups { 48 | Id: string @unique 49 | Description: string 50 | Illustration: string 51 | Name: string 52 | Icon: string 53 | IconSmall: string 54 | BestiaryFamiliesKey: BestiaryFamilies 55 | AchievementItemsKeys: [AchievementItems] 56 | } 57 | 58 | type BestiaryNets { 59 | BaseItemTypesKey: BaseItemTypes 60 | _: i32 61 | CaptureMinLevel: i32 62 | CaptureMaxLevel: i32 63 | DropMinLevel: i32 64 | DropMaxLevel: i32 65 | _: i32 66 | IsEnabled: bool 67 | } 68 | 69 | type BestiaryRecipeComponent { 70 | Id: string @unique 71 | MinLevel: i32 72 | BestiaryFamiliesKey: BestiaryFamilies 73 | BestiaryGroupsKey: BestiaryGroups 74 | ModsKey: Mods 75 | BestiaryCapturableMonstersKey: BestiaryCapturableMonsters 76 | BeastRarity: Rarity 77 | BestiaryGenusKey: BestiaryGenus 78 | } 79 | 80 | type BestiaryRecipeCategories { 81 | Id: string 82 | Text: string 83 | } 84 | 85 | type BestiaryRecipes @tags(list: ["item:recipe", "crafting"]) { 86 | Id: string @unique 87 | Description: string 88 | BestiaryRecipeComponentKeys: [BestiaryRecipeComponent] 89 | Notes: string 90 | Category: BestiaryRecipeCategories 91 | _: bool 92 | Achievements: [AchievementItems] 93 | _: bool 94 | _: i32 95 | _: i32 96 | "0: All, 1: Normal, 2: Ruthless" 97 | GameMode: i32 98 | FlaskMod: Mods 99 | } 100 | 101 | type NetTiers { 102 | BaseItemTypesKey: BaseItemTypes 103 | Tier: i32 104 | } 105 | -------------------------------------------------------------------------------- /dat-schema/3_03_Incursion.gql: -------------------------------------------------------------------------------- 1 | type ArchitectLifeScalingPerLevel { 2 | Level: i32 3 | MoreLife: i32 4 | } 5 | 6 | type IncursionArchitect { 7 | MonsterVarietiesKey: MonsterVarieties 8 | MinLevel: i32 9 | } 10 | 11 | type IncursionBrackets { 12 | MinLevel: i32 13 | Incursion_WorldAreasKey: WorldAreas 14 | Template_WorldAreasKey: WorldAreas 15 | _: [f32] 16 | _: f32 17 | _: i32 18 | } 19 | 20 | type IncursionChestRewards @tags(list: ["item:droptable"]) { 21 | IncursionRoomsKey: IncursionRooms 22 | IncursionChestsKeys: [IncursionChests] 23 | ChestMarkerMetadata: string @files(ext: [".ot", ".otc"]) 24 | _: i32 25 | _: i32 26 | _: i32 27 | _: i32 28 | _: i32 29 | _: i32 30 | _: i32 31 | _: i32 32 | _: i32 33 | } 34 | 35 | type IncursionChests { 36 | Id: string @unique 37 | ChestsKey: Chests 38 | UniqueChestsKey: UniqueChests 39 | MinLevel: i32 40 | MaxLevel: i32 41 | Weight: i32 42 | _: i32 43 | } 44 | 45 | type IncursionRoomBossFightEvents { 46 | Room: IncursionRooms 47 | _: string 48 | _: string 49 | _: string 50 | _: string 51 | _: string 52 | _: rid 53 | } 54 | 55 | type IncursionRooms @tags(list: ["item:itemized"]) { 56 | Id: string @unique 57 | Name: string 58 | Tier: i32 59 | MinLevel: i32 60 | RoomUpgrade_IncursionRoomsKey: IncursionRooms 61 | Mods: [Mods] 62 | PresentARMFile: string @file(ext: ".arm") 63 | HASH16: i32 @unique 64 | IncursionArchitectKey: IncursionArchitect 65 | PastARMFile: string @file(ext: ".arm") 66 | TSIFile: string @file(ext: ".tsi") 67 | UIIcon: string 68 | FlavourText: string 69 | Description: string 70 | AchievementItemsKeys: [AchievementItems] 71 | _: i32 72 | _: i32 73 | RoomUpgradeFrom_IncursionRoomsKey: IncursionRooms 74 | ItemisedFlavourText: FlavourText 75 | _: string 76 | _: [Mods] 77 | } 78 | 79 | type IncursionUniqueUpgradeComponents @tags(list: ["item:recipe", "item:unique"]) { 80 | BaseUnique: Words 81 | UpgradeCurrency: BaseItemTypes 82 | } 83 | -------------------------------------------------------------------------------- /dat-schema/3_04_Delve.gql: -------------------------------------------------------------------------------- 1 | type DelveAzuriteShop { 2 | BaseItemTypesKey: BaseItemTypes 3 | SpawnWeight: i32 4 | Cost: i32 5 | MinDepth: i32 6 | IsResonator: bool 7 | _: i32 8 | _: i32 9 | } 10 | 11 | type DelveBiomes { 12 | Id: string @unique 13 | Name: string 14 | WorldAreasKeys: [WorldAreas] 15 | UIImage: string 16 | SpawnWeight_Depth: [i32] 17 | SpawnWeight_Values: [i32] 18 | _: [i32] 19 | _: [i32] 20 | Art2D: string @files(ext: [".dds"]) 21 | AchievementItemsKeys: [AchievementItems] 22 | _: bool 23 | _: [i32] 24 | } 25 | 26 | type DelveCatchupDepths { 27 | Level: i32 28 | Depth: i32 29 | } 30 | 31 | type DelveCraftingModifierDescriptions { 32 | Id: string @unique 33 | Description: string 34 | } 35 | 36 | type DelveCraftingModifiers @tags(list: ["crafting"]) { 37 | BaseItemTypesKey: BaseItemTypes 38 | AddedModsKeys: [Mods] 39 | NegativeWeight_TagsKeys: [Tags] 40 | NegativeWeight_Values: [i32] 41 | ForcedAddModsKeys: [Mods] 42 | ForbiddenDelveCraftingTagsKeys: [DelveCraftingTags] 43 | AllowedDelveCraftingTagsKeys: [DelveCraftingTags] 44 | CanMirrorItem: bool 45 | CorruptedEssenceChance: i32 46 | CanImproveQuality: bool 47 | HasLuckyRolls: bool 48 | SellPrice_ModsKeys: [Mods] 49 | CanRollWhiteSockets: bool 50 | Weight_TagsKeys: [Tags] 51 | Weight_Values: [i32] 52 | DelveCraftingModifierDescriptionsKeys: [DelveCraftingModifierDescriptions] 53 | BlockedDelveCraftingModifierDescriptionsKeys: [DelveCraftingModifierDescriptions] 54 | _: bool 55 | _: bool 56 | _: [i32] 57 | _: [i32] 58 | _: bool 59 | } 60 | 61 | type DelveCraftingTags { 62 | TagsKey: Tags 63 | ItemClass: string 64 | } 65 | 66 | type DelveDynamite { 67 | _: i32 68 | ProjectilesKey: Projectiles 69 | _: rid 70 | Dynamite_MiscObjectsKey: MiscObjects 71 | _: i32 72 | _: i32 73 | _: i32 74 | _: i32 75 | _: i32 76 | _: i32 77 | _: i32 78 | MiscAnimatedKey: MiscAnimated 79 | _: i32 80 | } 81 | 82 | type DelveFeatures { 83 | Id: string @unique 84 | Name: string 85 | SpawnWeight: [i32] 86 | WorldAreasKey: WorldAreas 87 | Image: string 88 | AchievementItemsKeys: [AchievementItems] 89 | _: [i32] 90 | MinDepth: [i32] 91 | Description: string 92 | _: i32 93 | _: [i32] 94 | _: [i32] 95 | _: [i32] 96 | _: [_] 97 | } 98 | 99 | type DelveFlares { 100 | _: i32 101 | _: rid 102 | _: rid 103 | _: i32 104 | _: rid 105 | _: i32 106 | _: i32 107 | } 108 | 109 | type DelveLevelScaling { 110 | Depth: i32 111 | MonsterLevel: i32 112 | _: i32 113 | SulphiteCost: i32 114 | MonsterLevel2: i32 115 | MoreMonsterDamage: i32 116 | MoreMonsterLife: i32 117 | DarknessResistance: i32 118 | LightRadius: i32 119 | _: i32 120 | _: i32 121 | _: i32 122 | _: i32 123 | _: i32 124 | _: i32 125 | } 126 | 127 | type DelveMonsterSpawners { 128 | BaseMetadata: string 129 | _: i32 130 | _: [rid] 131 | _: i32 132 | _: i32 133 | _: i32 134 | _: i32 135 | _: i32 136 | _: i32 137 | _: i32 138 | _: i32 139 | _: bool 140 | _: bool 141 | _: bool 142 | _: bool 143 | _: bool 144 | _: bool 145 | _: bool 146 | _: bool 147 | _: bool 148 | _: bool 149 | _: i32 150 | _: i32 151 | _: i32 152 | _: i32 153 | _: rid 154 | _: bool 155 | _: bool 156 | _: i32 157 | Script: string 158 | _: bool 159 | } 160 | 161 | type DelveResourcePerLevel { 162 | AreaLevel: i32 163 | Sulphite: i32 164 | } 165 | 166 | type DelveRewardTierConstants { 167 | _: i32 168 | _: i32 169 | _: i32 170 | _: i32 171 | _: i32 172 | } 173 | 174 | type DelveRooms { 175 | DelveBiomesKey: DelveBiomes 176 | DelveFeaturesKey: DelveFeatures 177 | ARMFile: string @file(ext: ".arm") 178 | } 179 | 180 | type DelveUpgrades { 181 | DelveUpgradeTypeKey: i32 182 | UpgradeLevel: i32 183 | StatsKeys: [Stats] 184 | StatValues: [i32] 185 | Cost: i32 186 | _: i32 187 | AchievementItemsKey: AchievementItems 188 | _: i32 189 | } 190 | 191 | enum DelveUpgradeType @indexing(first: 0) { 192 | SULPHITE_CAPACITY 193 | FLARE_CAPACITY 194 | DYNAMITE_CAPACITY 195 | CART_LIGHT_RADIUS 196 | FLARE_LIGHT_RADIUS 197 | DYNAMITE_RADIUS 198 | _ 199 | DYNAMITE_DAMAGE 200 | DARKNESS_RESISTANCE 201 | FLARE_DURATION 202 | } 203 | -------------------------------------------------------------------------------- /dat-schema/3_05_Betrayal.gql: -------------------------------------------------------------------------------- 1 | type BetrayalChoiceActions { 2 | Id: string 3 | BetrayalChoicesKey: BetrayalChoices 4 | ClientStringsKey: ClientStrings 5 | } 6 | 7 | type BetrayalChoices { 8 | Id: string 9 | Text: string 10 | _: i32 11 | Achievements: [AchievementItems] 12 | } 13 | 14 | type BetrayalDialogue { 15 | _: rid 16 | _: i32 17 | _: i32 18 | _: [i32] 19 | BetrayalTargetsKey: BetrayalTargets 20 | _: i32 21 | _: rid 22 | _: [rid] 23 | BetrayalUpgradesKey: BetrayalUpgrades 24 | _: bool 25 | _: [i32] 26 | _: [rid] 27 | _: bool 28 | _: [i32] 29 | NPCTextAudioKey: NPCTextAudio 30 | _: [i32] 31 | } 32 | 33 | enum BetrayalDialogueCue @indexing(first: 0) { _ } 34 | 35 | enum BetrayalFlags @indexing(first: 0) { _ } 36 | 37 | type BetrayalForts { 38 | Id: string @unique 39 | _: i32 40 | _: i32 41 | _: i32 42 | ExtraTerrainFeaturesKey: ExtraTerrainFeatures 43 | } 44 | 45 | type BetrayalJobs { 46 | Id: string 47 | Text: string 48 | ExtraTerrainFeaturesKey: ExtraTerrainFeatures 49 | Art: string 50 | _: i32 51 | _: i32 52 | WorldAreasKey: WorldAreas 53 | Completion_AchievementItemsKey: [AchievementItems] 54 | OpenChests_AchievementItemsKey: [AchievementItems] 55 | MissionCompletion_AcheivementItemsKey: [AchievementItems] 56 | } 57 | 58 | type BetrayalRanks { 59 | Id: string 60 | Text: string 61 | Level: i32 62 | RankImage: string 63 | } 64 | 65 | type BetrayalRelationshipState { 66 | Id: string 67 | Text: string 68 | } 69 | 70 | enum BetrayalTargetFlags @indexing(first: 0) { _ } 71 | 72 | type BetrayalTargetJobAchievements { 73 | BetrayalTargetsKey: BetrayalTargets 74 | BetrayalJobsKey: BetrayalJobs 75 | AchievementItemsKey: AchievementItems 76 | } 77 | 78 | type BetrayalTargetLifeScalingPerLevel { 79 | Level: i32 80 | MoreLife: i32 81 | } 82 | 83 | type BetrayalTargets { 84 | Id: string 85 | BetrayalRanksKey: BetrayalRanks 86 | MonsterVarietiesKey: MonsterVarieties 87 | BetrayalJobsKey: BetrayalJobs 88 | Art: string 89 | _: bool 90 | ItemClasses: ItemClasses 91 | FullName: string 92 | Safehouse_ARMFile: string @file(ext: ".arm") 93 | ShortName: string 94 | _: i32 95 | SafehouseLeader_AcheivementItemsKey: AchievementItems 96 | Level3_AchievementItemsKey: AchievementItems 97 | _: i32 98 | _: i32 99 | _: i32 100 | _: rid 101 | ScriptArgument: string 102 | } 103 | 104 | type BetrayalTraitorRewards @tags(list: ["item:droptable"]) { 105 | BetrayalJobsKey: BetrayalJobs 106 | BetrayalTargetsKey: BetrayalTargets 107 | BetrayalRanksKey: BetrayalRanks 108 | Description: string 109 | Description2: string 110 | } 111 | 112 | type BetrayalUpgrades { 113 | Id: string @unique 114 | Name: string 115 | Description: string 116 | ModsKey: [Mods] 117 | ArtFile: string 118 | BetrayalUpgradeSlotsKey: i32 119 | _: [i32] 120 | ItemVisualIdentityKey0: ItemVisualIdentity 121 | ItemVisualIdentityKey1: ItemVisualIdentity 122 | GrantedEffectsKey: GrantedEffects 123 | _: i32 124 | ItemClassesKey: ItemClasses 125 | } 126 | 127 | enum BetrayalUpgradeSlots @indexing(first: 0) { _ } 128 | 129 | type BetrayalWallLifeScalingPerLevel { 130 | Level: i32 131 | MoreLife: i32 132 | } 133 | 134 | type SafehouseBYOCrafting @tags(list: ["crafting"]) { 135 | BetrayalJobsKey: BetrayalJobs 136 | BetrayalTargetsKey: BetrayalTargets 137 | Rank: i32 138 | Description: string 139 | ServerCommand: string 140 | _: [rid] 141 | Description2: string 142 | ServerCommand2: string 143 | } 144 | 145 | type SafehouseCraftingSpreeType { 146 | Id: string 147 | Currencies: [SafehouseCraftingSpreeCurrencies] 148 | CurrencyCount: [i32] 149 | _: [rid] 150 | Disabled: bool 151 | ItemClassText: string 152 | _: i32 153 | } 154 | 155 | type SafehouseCraftingSpreeCurrencies { 156 | Id: string @unique 157 | BaseItemTypesKey: BaseItemTypes 158 | HasSpecificBaseItem: bool 159 | } 160 | 161 | type Scarabs { 162 | Type: ScarabTypes 163 | Items: [BaseItemTypes] 164 | } 165 | 166 | type ScarabTypes { 167 | Id: string 168 | Tag: Tags 169 | DisableDrops: Stats 170 | MoreLikely: Stats 171 | Count: Stats 172 | } 173 | -------------------------------------------------------------------------------- /dat-schema/3_06_Synthesis.gql: -------------------------------------------------------------------------------- 1 | type SynthesisAreas { 2 | Id: string @unique 3 | MinLevel: i32 4 | MaxLevel: i32 5 | Weight: i32 6 | TopologiesKey: Topologies 7 | MonsterPacksKeys: [MonsterPacks] 8 | ArtFile: string 9 | Name: string 10 | SynthesisAreaSizeKey: SynthesisAreaSize 11 | AchievementItemsKey: AchievementItems 12 | } 13 | 14 | type SynthesisAreaSize { 15 | Id: string @unique 16 | _: i32 17 | _: i32 18 | _: i32 19 | } 20 | 21 | type SynthesisBonuses { 22 | ModsKey: Mods 23 | _: i32 24 | _: i32 25 | _: i32 26 | _: i32 27 | _: i32 28 | _: bool 29 | _: bool 30 | } 31 | 32 | type SynthesisBrackets { 33 | WorldAreasKey1: WorldAreas 34 | MinLevel: i32 35 | MaxLevel: i32 36 | WorldAreasKey2: WorldAreas 37 | _: i32 38 | _: i32 39 | _: i32 40 | _: i32 41 | } 42 | 43 | type SynthesisFragmentDialogue { 44 | _: rid 45 | NPCTextAudioKey1: NPCTextAudio 46 | NPCTextAudioKey2: NPCTextAudio 47 | NPCTextAudioKey3: NPCTextAudio 48 | NPCTextAudioKey4: NPCTextAudio 49 | NPCTextAudioKey5: NPCTextAudio 50 | NPCTextAudioKey6: NPCTextAudio 51 | } 52 | 53 | type SynthesisGlobalMods { 54 | ModsKey: Mods 55 | Weight: i32 56 | MinLevel: i32 57 | MaxLevel: i32 58 | } 59 | 60 | type SynthesisMonsterExperiencePerLevel { 61 | Level: i32 62 | ExperienceBonus: i32 63 | } 64 | 65 | type SynthesisRewardCategories { 66 | Id: string 67 | } 68 | 69 | type SynthesisRewardTypes { 70 | Id: string @unique 71 | Description: string 72 | ArtFile: string 73 | AchievementItemsKey: AchievementItems 74 | } 75 | -------------------------------------------------------------------------------- /dat-schema/3_07_Legion.gql: -------------------------------------------------------------------------------- 1 | type Incubators @tags(list: ["item:def"]) { 2 | BaseItemTypesKey: BaseItemTypes @unique 3 | _: i32 4 | Description: string 5 | HASH16: i32 6 | AchievementItemsKeys: [AchievementItems] 7 | } 8 | 9 | type LegionBalancePerLevel { 10 | MinLevel: i32 11 | _: i32 12 | _: i32 13 | _: i32 14 | _: i32 15 | _: i32 16 | _: i32 17 | _: i32 18 | _: i32 19 | _: i32 20 | _: i32 21 | _: i32 22 | _: i32 23 | _: f32 24 | _: i32 25 | _: i32 26 | } 27 | 28 | type LegionChestTypes { 29 | _: MonsterVarieties 30 | Chest: Chests 31 | HardmodeChest: Chests 32 | _: i32 33 | Faction: LegionFactions 34 | } 35 | 36 | type LegionChestCounts { 37 | LegionFactionsKey: LegionFactions 38 | LegionRanksKey: LegionRanks 39 | _: i32 40 | _: i32 41 | _: i32 42 | _: i32 43 | MinLevel: i32 44 | _: i32 45 | } 46 | 47 | type LegionFactions { 48 | Id: string @unique 49 | SpawnWeight: i32 50 | LegionBalancePerLevelKey: LegionBalancePerLevel 51 | _: f32 52 | _: f32 53 | BuffVisualsKey: BuffVisuals 54 | MiscAnimatedKey1: MiscAnimated 55 | MiscAnimatedKey2: MiscAnimated 56 | MiscAnimatedKey3: MiscAnimated 57 | AchievementItemsKeys1: [AchievementItems] 58 | MiscAnimatedKey4: MiscAnimated 59 | MiscAnimatedKey5: MiscAnimated 60 | _: f32 61 | _: f32 62 | AchievementItemsKeys2: [AchievementItems] 63 | StatsKey: Stats 64 | Shard: string 65 | RewardJewelArt: string 66 | } 67 | 68 | type LegionMonsterCounts { 69 | LegionFactionsKey: LegionFactions 70 | LegionRanksKey: LegionRanks 71 | _: i32 72 | _: i32 73 | _: i32 74 | _: i32 75 | _: i32 76 | _: i32 77 | } 78 | 79 | enum LegionMonsterTypes @indexing(first: 0) { _ } 80 | 81 | type LegionMonsterVarieties { 82 | MonsterVarietiesKey: MonsterVarieties 83 | LegionFactionsKey: LegionFactions 84 | LegionRanksKey: LegionRanks 85 | _: i32 86 | MiscAnimatedKey: [MiscAnimated] 87 | _: i32 88 | _: i32 89 | _: [i32] 90 | _: [i32] 91 | _: [i32] 92 | _: [i32] 93 | _: [i32] 94 | _: [i32] 95 | _: i32 96 | _: i32 97 | _: [rid] 98 | MonsterVarietiesKey2: MonsterVarieties 99 | } 100 | 101 | type LegionRanks { 102 | _: i32 103 | _: i32 104 | _: i32 105 | _: i32 106 | _: i32 107 | LegionBalancePerLevelKey: LegionBalancePerLevel 108 | _: i32 109 | _: i32 110 | _: i32 111 | } 112 | 113 | enum LegionRankTypes @indexing(first: 0) { _ } 114 | 115 | enum LegionRewardTypes @indexing(first: 0) { _ } 116 | 117 | type LegionRewardTypeVisuals { 118 | IntId: i32 @unique 119 | MinimapIconsKey: MinimapIcons 120 | _: string 121 | MiscAnimatedKey: MiscAnimated 122 | _: f32 123 | Id: string 124 | } 125 | -------------------------------------------------------------------------------- /dat-schema/3_08_Blight.gql: -------------------------------------------------------------------------------- 1 | type BlightBalancePerLevel { 2 | Level: i32 3 | _: i32 4 | _: [i32] 5 | _: i32 6 | _: i32 7 | _: i32 8 | _: i32 9 | _: i32 10 | _: i32 11 | } 12 | 13 | type BlightBossLifeScalingPerLevel { 14 | Level: i32 15 | MoreLife: i32 16 | } 17 | 18 | type BlightChestTypes { 19 | ChestsKey: Chests 20 | } 21 | 22 | type BlightCraftingItems @tags(list: ["item:def"]) { 23 | Oil: BaseItemTypes @unique 24 | Tier: i32 25 | Achievements: [AchievementItems] 26 | UseType: i32 27 | NameShort: string 28 | } 29 | 30 | type BlightCraftingRecipes @tags(list: ["crafting"]) { 31 | Id: string @unique 32 | BlightCraftingItemsKeys: [BlightCraftingItems] 33 | BlightCraftingResultsKey: BlightCraftingResults 34 | BlightCraftingTypesKey: BlightCraftingTypes 35 | } 36 | 37 | type BlightCraftingResults { 38 | Id: string @unique 39 | Mod: Mods 40 | PassiveSkill: PassiveSkills 41 | } 42 | 43 | type BlightCraftingTypes { 44 | Id: string @unique 45 | _: i32 46 | _: bool 47 | } 48 | 49 | type BlightCraftingUniques @tags(list: ["crafting", "item:unique"]) { 50 | WordsKey: Words 51 | } 52 | 53 | type BlightedSporeAuras { 54 | BuffDefinitionsKey: BuffDefinitions 55 | BuffStatValues: [i32] 56 | _: i32 57 | _: [i32] 58 | _: i32 59 | } 60 | 61 | type BlightEncounterTypes { 62 | Id: string @unique 63 | Icon: string 64 | IsGeneric: bool 65 | Weight: i32 66 | } 67 | 68 | type BlightEncounterWaves { 69 | MonsterSpawnerId: string 70 | EncounterType: BlightEncounterTypes 71 | _: i32 72 | _: i32 73 | _: i32 74 | Wave: i32 75 | } 76 | 77 | type BlightRewardTypes { 78 | Id: string @unique 79 | Icon: string 80 | } 81 | 82 | type BlightTopologies { 83 | Id: string @unique 84 | BlightTopologyNodesKey: BlightTopologyNodes 85 | _: i32 86 | _: i32 87 | _: i32 88 | _: i32 89 | _: i32 90 | _: i32 91 | _: i32 92 | } 93 | 94 | type BlightTopologyNodes { 95 | Id: string @unique 96 | _: [i32] 97 | Size: i32 98 | Angle: i32 99 | _: [i32] 100 | _: [i32] 101 | _: [i32] 102 | _: [i32] 103 | _: [i32] 104 | _: [i32] 105 | _: i32 106 | } 107 | 108 | type BlightTowerAuras { 109 | Id: i32 @unique 110 | BuffDefinitionsKey: BuffDefinitions 111 | _: i32 112 | MiscAnimatedKey: MiscAnimated 113 | } 114 | 115 | type BlightTowers { 116 | Id: string @unique 117 | Name: string 118 | Description: string 119 | Icon: string 120 | NextUpgradeOptions: [BlightTowers] 121 | _: i32 122 | Tier: string 123 | Radius: i32 124 | _: i32 125 | SpendResourceAchievement: AchievementItems 126 | StatsKey: Stats 127 | StatsKeys: [Stats] 128 | StatsKeys2: [Stats] 129 | _: bool 130 | } 131 | 132 | type BlightTowersPerLevel { 133 | BlightTowersKey: BlightTowers 134 | _: i32 135 | MonsterVarietiesKey: MonsterVarieties 136 | Cost: i32 137 | _: i32 138 | } 139 | -------------------------------------------------------------------------------- /dat-schema/3_09_Conquerors_of_the_Atlas.gql: -------------------------------------------------------------------------------- 1 | type AtlasExileBossArenas { 2 | Conqueror: AtlasExiles 3 | WorldArea: WorldAreas 4 | } 5 | 6 | type AtlasExileInfluence { 7 | Conqueror: AtlasExiles 8 | Sets: [AtlasInfluenceSets] 9 | } 10 | 11 | type AtlasExiles { 12 | Id: string 13 | _: i32 14 | InfluencedItemIncrStat: Stats 15 | MapIcon: string @file(ext: ".dds") 16 | MapIcon2: string @file(ext: ".dds") 17 | } 18 | -------------------------------------------------------------------------------- /dat-schema/3_09_Metamorph.gql: -------------------------------------------------------------------------------- 1 | type AlternateQualityTypes @tags(list: ["item:def"]) { 2 | Id: string 3 | Description: string 4 | Item: BaseItemTypes 5 | _: rid 6 | MapStats: [Stats] 7 | _: i32 8 | IsCatalyst: bool 9 | HASH16: i16 10 | CatalystMod: Mods 11 | } 12 | -------------------------------------------------------------------------------- /dat-schema/3_10_Delirium.gql: -------------------------------------------------------------------------------- 1 | type AfflictionBalancePerLevel { 2 | _: i32 3 | _: f32 4 | _: f32 5 | _: f32 6 | _: f32 7 | _: i32 8 | _: i32 9 | _: i32 10 | _: i32 11 | _: i32 12 | _: i32 13 | _: i32 14 | _: i32 15 | _: f32 16 | _: f32 17 | } 18 | 19 | type AfflictionEndgameWaveMods { 20 | ModsKey: Mods 21 | _: i32 22 | _: i32 23 | _: i32 24 | } 25 | 26 | type AfflictionFixedMods { 27 | Rarity: i32 28 | Mod: Mods 29 | _: rid 30 | } 31 | 32 | type AfflictionRandomModCategories { 33 | Id: string @unique 34 | _: bool 35 | } 36 | 37 | type AfflictionRewardMapMods { 38 | ModsKey: Mods 39 | _: bool 40 | } 41 | 42 | enum AfflictionRewardTypes @indexing(first: 0) { _ } 43 | 44 | type AfflictionRewardTypeVisuals { 45 | AfflictionRewardTypes: AfflictionRewardTypes 46 | Id: string 47 | Name: string 48 | } 49 | 50 | type AfflictionSplitDemons { 51 | _: i32 52 | MonsterVarietiesKey: MonsterVarieties 53 | AfflictionRandomModCategoriesKey: AfflictionRandomModCategories 54 | } 55 | 56 | type AfflictionStartDialogue { 57 | WorldAreasKey: WorldAreas 58 | NPCTextAudioKey: NPCTextAudio 59 | _: [rid] 60 | } 61 | -------------------------------------------------------------------------------- /dat-schema/3_11_Harvest.gql: -------------------------------------------------------------------------------- 1 | enum HarvestColours @indexing(first: 0) { _ } 2 | 3 | type HarvestCraftOptionIcons { 4 | Id: string @unique 5 | DDSFile: string @file(ext: ".dds") 6 | } 7 | 8 | type HarvestCraftOptions @tags(list: ["crafting"]) { 9 | Id: string @unique 10 | Text: string 11 | Tier: HarvestCraftTiers 12 | Command: string 13 | Parameters: string 14 | _: [_] 15 | HASH16: i16 16 | Description: string 17 | IsEnchant: bool 18 | LifeforceType: i32 19 | LifeforceCost: i32 20 | SacredCost: i32 21 | _: bool 22 | Achievements: [AchievementItems] 23 | _: i32 24 | } 25 | 26 | type HarvestCraftTiers { 27 | Id: string @unique 28 | FrameImage: string 29 | FrameHighlight: string 30 | } 31 | 32 | type HarvestCraftFilters { 33 | Id: string 34 | BaseItem: BaseItemTypes 35 | Name: string 36 | } 37 | 38 | type HarvestInfrastructure { 39 | Object: string 40 | _: i32 41 | ClientStringsKey: ClientStrings 42 | } 43 | 44 | type HarvestPerLevelValues { 45 | Level: i32 46 | _: i32 47 | _: i32 48 | _: i32 49 | _: i32 50 | _: i32 51 | _: i32 52 | _: i32 53 | _: i32 54 | _: i32 55 | _: i32 56 | _: i32 57 | } 58 | 59 | type HarvestLifeScalingPerLevel { 60 | Level: i32 61 | Life: i32 62 | } 63 | 64 | type HarvestSeeds { 65 | Id: string 66 | Monster: MonsterVarieties 67 | Tier: i32 68 | _: i32 69 | _: [i32] 70 | Achievements: [AchievementItems] 71 | SeedAnimation: string @file(ext: ".ao") 72 | _: i32 73 | HatchAnimation: string @file(ext: ".ao") 74 | SeedType: i32 75 | } 76 | 77 | type HarvestSeedItems @tags(list: ["item:def"]) { 78 | Id: i32 79 | BaseItem: BaseItemTypes 80 | DropStat: Stats 81 | } 82 | -------------------------------------------------------------------------------- /dat-schema/3_12_Heist.gql: -------------------------------------------------------------------------------- 1 | type HeistAreaFormationLayout { 2 | HeistAreasKey: HeistAreas 3 | _: i32 4 | _: i32 5 | _: i32 6 | _: i32 7 | _: i32 8 | _: i32 9 | _: i32 10 | _: i32 11 | _: i32 12 | _: bool 13 | _: i32 14 | _: i32 15 | } 16 | 17 | type HeistAreas @tags(list: ["item:droptable"]) { 18 | Id: string @unique 19 | WorldAreasKeys: [WorldAreas] 20 | _: i32 21 | EnvironmentsKey1: Environments 22 | EnvironmentsKey2: Environments 23 | HeistJobsKeys: [HeistJobs] 24 | Contract_BaseItemTypesKey: BaseItemTypes 25 | Blueprint_BaseItemTypesKey: BaseItemTypes 26 | DGRFile: string @file(ext: ".dgr") 27 | _: i32 28 | _: i32 29 | _: bool 30 | _: bool 31 | Blueprint_DDSFile: string @file(ext: ".dds") 32 | Achievements1: [AchievementItems] 33 | Achievements2: [AchievementItems] 34 | Reward: ClientStrings 35 | Achievements3: [AchievementItems] 36 | RewardHardmode: ClientStrings 37 | } 38 | 39 | type HeistBalancePerLevel { 40 | Level: i32 41 | _: f32 42 | _: f32 43 | _: i32 44 | _: i32 45 | _: f32 46 | _: f32 47 | HeistValueScalingKey1: HeistValueScaling 48 | HeistValueScalingKey2: HeistValueScaling 49 | HeistValueScalingKey3: HeistValueScaling 50 | HeistValueScalingKey4: HeistValueScaling 51 | HeistValueScalingKey5: HeistValueScaling 52 | _: f32 53 | _: f32 54 | _: f32 55 | _: f32 56 | HeistValueScalingKey6: HeistValueScaling 57 | HeistValueScalingKey7: HeistValueScaling 58 | _: f32 59 | _: f32 60 | _: i32 61 | } 62 | 63 | enum HeistBlueprintWindowTypes @indexing(first: 0) { _ } 64 | 65 | type HeistChestRewardTypes { 66 | Id: string @unique 67 | Art: string 68 | RewardTypeName: string 69 | _: HeistChestRewardTypes 70 | RewardRoomName: string 71 | MinLevel: i32 72 | MaxLevel: i32 73 | Weight: i32 74 | RewardRoomName2: string 75 | HeistJobsKey: [HeistJobs] 76 | _: i32 77 | _: i32 78 | } 79 | 80 | type HeistChests { 81 | ChestsKey: Chests 82 | Weight: i32 83 | HeistAreasKey: [HeistAreas] 84 | HeistChestTypesKey: HeistChestTypes 85 | } 86 | 87 | enum HeistChestTypes @indexing(first: 0) { _ } 88 | 89 | type HeistChokepointFormation { 90 | _: MonsterVarieties 91 | _: i32 92 | _: [i32] 93 | _: [GrantedEffects] 94 | _: GrantedEffects 95 | _: i32 96 | _: bool 97 | _: i32 98 | _: i32 99 | _: i32 100 | _: i32 101 | } 102 | 103 | type HeistConstants { 104 | Id: string @unique 105 | Value: f32 106 | } 107 | 108 | type HeistContracts { 109 | BaseItemTypesKey: BaseItemTypes @unique 110 | HeistAreasKey: HeistAreas 111 | _: i32 112 | } 113 | 114 | type HeistDoodadNPCs { 115 | NPCsKey: NPCs 116 | _: rid 117 | _: rid 118 | _: i32 119 | _: i32 120 | _: i32 121 | AOFile: string @file(ext: ".ao") 122 | Stance: string 123 | BetrayalTargetsKey: BetrayalTargets 124 | } 125 | 126 | type HeistDoors { 127 | Id: string 128 | _: string 129 | HeistJobsKey1: HeistJobs 130 | HeistJobsKey2: HeistJobs 131 | _: string 132 | _: [string] 133 | _: [string] 134 | _: i32 135 | HeistAreasKey: HeistAreas 136 | } 137 | 138 | type HeistEquipment @tags(list: ["item:def"]) { 139 | BaseItemTypesKey: BaseItemTypes @unique 140 | RequiredJob_HeistJobsKey: HeistJobs 141 | RequiredLevel: i32 142 | } 143 | 144 | enum HeistFormationMarkerType @indexing(first: 0) { _ } 145 | 146 | type HeistGeneration { 147 | Level: i32 148 | _: i32 149 | _: i32 150 | _: i32 151 | _: i32 152 | _: i32 153 | _: i32 154 | _: i32 155 | _: i32 156 | _: i32 157 | _: i32 158 | _: i32 159 | _: i32 160 | _: i32 161 | _: i32 162 | _: i32 163 | _: i32 164 | _: i32 165 | _: i32 166 | _: i32 167 | _: i32 168 | } 169 | 170 | type HeistIntroAreas { 171 | Id: string @unique 172 | HeistAreasKey: HeistAreas 173 | _: i32 174 | _: i32 175 | DGRFile: string @file(ext: ".dgr") 176 | _: i32 177 | _: i32 178 | _: bool 179 | _: i32 180 | _: i32 181 | _: i32 182 | } 183 | 184 | type HeistJobs { 185 | Id: string @unique 186 | Name: string 187 | RequiredSkillIcon: string 188 | SkillIcon: string 189 | _: f32 190 | _: i32 191 | MapIcon: string 192 | Level_StatsKey: Stats 193 | Alert_StatsKey: Stats 194 | Alarm_StatsKey: Stats 195 | Cost_StatsKey: Stats 196 | ExperienceGain_StatsKey: Stats 197 | ConsoleBlueprintLegend: string 198 | Description: string 199 | } 200 | 201 | type HeistJobsExperiencePerLevel { 202 | HeistJobsKey: HeistJobs 203 | Tier: i32 204 | Experience: i32 205 | MinLevel: i32 206 | AchievementItemsKey: [AchievementItems] 207 | } 208 | 209 | type HeistLockType { 210 | Id: string @unique 211 | HeistJobsKey: HeistJobs 212 | SkillIcon: string 213 | } 214 | 215 | type HeistNPCAuras { 216 | Stat: Stats 217 | GrantedEffect: GrantedEffects 218 | } 219 | 220 | type HeistNPCBlueprintTypes { 221 | NPCsKey: NPCs 222 | _: i32 223 | } 224 | 225 | type HeistNPCDialogue { 226 | DialogueEventKey: DialogueEvent 227 | HeistNPCsKey: HeistNPCs 228 | AudioNormal: [NPCTextAudio] 229 | AudioLoud: [NPCTextAudio] 230 | _: i32 231 | } 232 | 233 | type HeistNPCs { 234 | NPCsKey: NPCs 235 | MonsterVarietiesKey: MonsterVarieties 236 | SkillLevel_HeistJobsKeys: [HeistJobs] 237 | PortraitFile: string 238 | HeistNPCStatsKeys: [HeistNPCStats] 239 | StatValues: [f32] 240 | _: f32 241 | SkillLevel_Values: [i32] 242 | Name: string 243 | SilhouetteFile: string 244 | _: i32 245 | _: i32 246 | HeistNPCsKey: HeistNPCs 247 | StatValues2: [f32] 248 | Ally_NPCsKey: NPCs 249 | ActiveNPCIcon: string 250 | HeistJobsKey: HeistJobs 251 | Equip_AchievementItemsKeys: [AchievementItems] 252 | AOFile: string @file(ext: ".ao") 253 | _: rid 254 | } 255 | 256 | type HeistNPCStats { 257 | StatsKey: Stats 258 | _: bool 259 | _: bool 260 | _: bool 261 | _: bool 262 | } 263 | 264 | type HeistObjectives { 265 | BaseItemType: BaseItemTypes @unique 266 | Scaling: f32 267 | Name: string @localized 268 | } 269 | 270 | type HeistObjectiveValueDescriptions { 271 | Tier: i32 272 | MarkersMultiply: f32 273 | Description: string 274 | } 275 | 276 | type HeistPatrolPacks { 277 | MonsterPacksKey: MonsterPacks 278 | _: i32 279 | _: i32 280 | _: i32 281 | _: i32 282 | _: i32 283 | _: bool 284 | } 285 | 286 | type HeistQuestContracts { 287 | HeistContractsKey: HeistContracts 288 | HeistObjectivesKey: HeistObjectives 289 | HeistNPCsKey: [HeistNPCs] 290 | HeistJobsKey: HeistJobs 291 | _: i32 292 | _: i32 293 | _: i32 294 | _: bool 295 | HeistRoomsKey1: HeistRooms 296 | WorldAreasKey: WorldAreas 297 | _: bool 298 | _: bool 299 | _: i32 300 | _: i32 301 | _: bool 302 | _: bool 303 | HaveObjective: QuestFlags 304 | _: bool 305 | QuestActive: QuestFlags 306 | HaveQuest: QuestFlags 307 | HaveObjective2: QuestFlags 308 | _: bool 309 | _: bool 310 | Objective: string @localized 311 | _: bool 312 | BaseItemTypesKey: BaseItemTypes 313 | _: bool 314 | HeistIntroAreasKey: HeistIntroAreas 315 | _: i32 316 | HeistRoomsKey2: HeistRooms 317 | _: string 318 | } 319 | 320 | type HeistRevealingNPCs { 321 | NPCsKey: NPCs 322 | PortraitFile: string 323 | NPCAudioKey: [NPCAudio] 324 | _: i32 325 | } 326 | 327 | type HeistRooms { 328 | HeistAreasKey: HeistAreas 329 | Id: i32 330 | ARMFile: string @file(ext: ".arm") 331 | HeistJobsKey1: HeistJobs 332 | HeistJobsKey2: HeistJobs 333 | _: i32 334 | _: i32 335 | _: i32 336 | _: string 337 | _: f32 338 | _: bool 339 | _: bool 340 | } 341 | 342 | enum HeistRoomTypes @indexing(first: 0) { _ } 343 | 344 | type HeistValueScaling { 345 | Id: string @unique 346 | _: f32 347 | _: f32 348 | } 349 | -------------------------------------------------------------------------------- /dat-schema/3_13_Echoes_of_the_Atlas.gql: -------------------------------------------------------------------------------- 1 | type InfluenceModUpgrades @tags(list: ["crafting"]) { 2 | InfluenceMod: Mods 3 | UpgradedMod: Mods 4 | HighestTier: bool 5 | } 6 | 7 | type MavenDialog { 8 | Id: string 9 | TextAudioT1: NPCTextAudio 10 | TextAudioT2: NPCTextAudio 11 | TextAudioT3: NPCTextAudio 12 | TextAudioT4: NPCTextAudio 13 | TextAudioT5: NPCTextAudio 14 | _: bool 15 | TextAudioT6: NPCTextAudio 16 | } 17 | 18 | type MavenFights { 19 | Id: string 20 | WitnessesRequired: i32 21 | AreaLevel: i32 22 | _: i32 23 | _: i32 24 | BaseItemType: BaseItemTypes 25 | _: i32 26 | MinMapTier: i32 27 | _: QuestFlags 28 | _: i32 29 | WitnessAreas: [WorldAreas] 30 | _: QuestFlags 31 | _: bool 32 | _: [_] # All rows empty 33 | Achievements1: [AchievementItems] 34 | Achievements2: [AchievementItems] 35 | } 36 | 37 | type MavenJewelRadiusKeystones { 38 | Keystone: PassiveSkills 39 | } 40 | -------------------------------------------------------------------------------- /dat-schema/3_13_Ritual.gql: -------------------------------------------------------------------------------- 1 | type RitualBalancePerLevel { 2 | MinLevel: i32 3 | _: i32 4 | _: i32 5 | _: i32 6 | _: i32 7 | _: i32 8 | _: i32 9 | _: i32 10 | _: f32 11 | _: i32 12 | _: i32 13 | _: i32 14 | _: i32 15 | _: i32 16 | } 17 | 18 | type RitualConstants { 19 | Id: string @unique 20 | Value: f32 21 | } 22 | 23 | type RitualRuneTypes { 24 | Id: string @unique 25 | MiscAnimatedKey1: MiscAnimated 26 | SpawnWeight: i32 27 | LevelMin: i32 28 | LevelMax: i32 29 | BuffDefinitionsKey: BuffDefinitions 30 | BuffStatValues: [i32] 31 | SpawnPatterns: [RitualSpawnPatterns] 32 | ModsKey: [Mods] 33 | _: [i32] 34 | _: [i32] 35 | MiscAnimatedKey2: MiscAnimated 36 | EnvironmentsKey: Environments 37 | _: i32 38 | Achievements: [AchievementItems] 39 | Type: string 40 | Description: string 41 | DaemonSpawningDataKey: DaemonSpawningData 42 | _: bool 43 | } 44 | 45 | type RitualSetKillAchievements { 46 | Achievement: AchievementItems 47 | KillBosses: [MonsterVarieties] 48 | } 49 | 50 | type RitualSpawnPatterns { 51 | Id: string @unique 52 | _: i32 53 | SpawnOrder: [string] 54 | _: bool 55 | } 56 | -------------------------------------------------------------------------------- /dat-schema/3_14_Ultimatum.gql: -------------------------------------------------------------------------------- 1 | type UltimatumEncounters { 2 | Id: string @unique 3 | Description: string 4 | ModTypes: [UltimatumModifierTypes] 5 | BossARMFile: string 6 | Type: UltimatumEncounterTypes 7 | Icon: string 8 | HASH16: i32 9 | _: bool 10 | _: i32 11 | _: bool 12 | } 13 | 14 | type UltimatumEncounterTypes { 15 | Id: string @unique 16 | Name: string 17 | ProgressBarText: string 18 | _: bool 19 | _: bool 20 | NormalAchievements: [AchievementItems] 21 | InscribedAchievement: AchievementItems 22 | _: rid 23 | } 24 | 25 | type UltimatumItemisedRewards { 26 | Id: string @unique 27 | HASH16: i32 28 | RewardText: string 29 | ItemVisualIdentityKey: ItemVisualIdentity 30 | RewardType: i32 31 | SacrificeItem: BaseItemTypes 32 | SacrificeAmount: i32 33 | SacrificeText: string 34 | _: bool 35 | TrialMods: [Mods] 36 | } 37 | 38 | type UltimatumMapModifiers { 39 | Stat: Stats 40 | Mods: [UltimatumModifiers] 41 | } 42 | 43 | type UltimatumModifiers { 44 | Id: string @unique 45 | Types: [UltimatumModifierTypes] 46 | ExtraMods: [Mods] 47 | TypesFiltered: [UltimatumModifierTypes] 48 | DaemonSpawningData: DaemonSpawningData 49 | PreviousTier: UltimatumModifiers 50 | _: bool 51 | Radius: i32 52 | Name: string 53 | Icon: string 54 | HASH16: i32 55 | TypesExtra: [UltimatumModifierTypes] 56 | MonsterTypesApplyingRuin: i32 57 | MiscAnimated: MiscAnimated 58 | BuffTemplates: [BuffTemplates] 59 | Tier: i32 60 | _: i32 61 | Description: string 62 | MonsterSpawners: [string] 63 | _: bool 64 | Achievements: [AchievementItems] 65 | TextAudio: NPCTextAudio 66 | UniqueMapMod: Mods 67 | } 68 | 69 | type UltimatumModifierTypes { 70 | Id: string @unique 71 | _: bool 72 | } 73 | 74 | type UltimatumTrialMasterAudio { 75 | Id: string 76 | Variant: i32 77 | _: i32 78 | _: i32 79 | TextAudio: NPCTextAudio 80 | RoundsMin: i32 81 | RoundsMax: i32 82 | } 83 | -------------------------------------------------------------------------------- /dat-schema/3_15_Expedition.gql: -------------------------------------------------------------------------------- 1 | type ExpeditionAreas { 2 | Area: WorldAreas 3 | PosX: i32 4 | PosY: i32 5 | Tags: [Tags] 6 | _: [i32] 7 | _: bool 8 | TextAudio: NPCTextAudio 9 | CompletionAchievements: [AchievementItems] 10 | } 11 | 12 | type ExpeditionBalancePerLevel { 13 | Level: i32 14 | _: bool 15 | _: i32 16 | _: i32 17 | _: i32 18 | _: i32 19 | _: i32 20 | _: i32 21 | _: i32 22 | _: i32 23 | _: i32 24 | _: i32 25 | _: i32 26 | _: i32 27 | _: i32 28 | } 29 | 30 | type ExpeditionCurrency @tags(list: ["item:def"]) { 31 | BaseItemType: BaseItemTypes 32 | Tier: i32 33 | NPC: ExpeditionNPCs 34 | LootSound: SoundEffects 35 | } 36 | 37 | enum ExpeditionDealFamilies @indexing(first: 1) { 38 | REROLL_PREFIXES_BEST 39 | REROLL_SUFFIXES_BEST 40 | VALUES_AFFIXES_LUCKY 41 | VALUES_PREFIXES_LUCKY 42 | VALUES_SUFFIXES_LUCKY 43 | VALUES_IMPLICITS_LUCKY 44 | UPGRADE_HIGHEST_TIER 45 | UPGRADE_ONE_TIER 46 | REMOVE_LOWEST_LEVEL 47 | ADD_PREFIX_BEST 48 | ADD_SUFFIX_BEST 49 | FILL_EMPTY_MODS 50 | REFORGE_SOCKETS 51 | REFORGE_LINKS 52 | APPLY_INCUBATOR 53 | APPLY_RANDOM_QUALITY 54 | SET_QUALITY 55 | APPLY_ANOINTMENT 56 | CORRUPT 57 | ADD_INFLUENCE 58 | REMOVE_ALL_PREFIXES 59 | REMOVE_ALL_SUFFIXES 60 | } 61 | 62 | type ExpeditionDeals { 63 | Id: i32 @unique 64 | Function: string 65 | Arguments: string 66 | TextAudio: NPCTextAudio 67 | Description: string @localized 68 | BuyAchievements: [AchievementItems] 69 | _: rid 70 | DealFamily: ExpeditionDealFamilies 71 | } 72 | 73 | type ExpeditionFactions { 74 | Id: string @unique 75 | Name: string 76 | FactionFlag: string 77 | _: i32 78 | FactionIcon: string 79 | MonsterVarieties: MonsterVarieties 80 | Progress1: NPCTextAudio 81 | Progress2Vaal: NPCTextAudio 82 | Progress3Final: NPCTextAudio 83 | Tags: Tags 84 | } 85 | 86 | type ExpeditionMarkersCommon { 87 | Id: string @unique 88 | AOFile: string 89 | } 90 | 91 | type ExpeditionNPCs { 92 | Id: string 93 | NPCs: [NPCs] 94 | RerollItem: BaseItemTypes 95 | _: i32 96 | _: i32 97 | _: QuestFlags 98 | Faction: ExpeditionFactions 99 | Reroll: NPCTextAudio 100 | AllBombsPlaced: NPCTextAudio 101 | BombPlacedRemnant: NPCTextAudio 102 | BombPlacedTreasure: NPCTextAudio 103 | BombPlacedMonsters: NPCTextAudio 104 | BombPlacedGeneric: NPCTextAudio 105 | EncounterComplete: NPCTextAudio 106 | _: i32 107 | _: i32 108 | } 109 | 110 | enum ExpeditionRelicModCategories @indexing(first: 0) { 111 | GENERIC 112 | RUNIC 113 | REWARD_CHEST 114 | REWARD_PACK_SIZE 115 | } 116 | 117 | type ExpeditionRelicMods { 118 | Mod: Mods 119 | Categories: [ExpeditionRelicModCategories] 120 | DestroyAchievements: [AchievementItems] 121 | } 122 | 123 | type ExpeditionRelics { 124 | Id: string @unique 125 | Name: string 126 | ItemTag: Tags 127 | AOFile: string 128 | MinLevel: i32 129 | MaxLevel: i32 130 | } 131 | 132 | type ExpeditionStorageLayout { 133 | Id: string 134 | StoredItem: BaseItemTypes 135 | XOffset: i32 136 | YOffset: i32 137 | _: i32 138 | _: i32 139 | Width: i32 140 | Height: i32 141 | _: i32 142 | _: bool 143 | _: rid 144 | } 145 | 146 | type ExpeditionTerrainFeatures { 147 | Id: string @unique 148 | ExtraFeature: ExtraTerrainFeatures 149 | ExpeditionFaction: ExpeditionFactions 150 | MinLevel: i32 151 | MaxLevel: i32 152 | _: i32 153 | Area: WorldAreas 154 | ExpeditionAreas: [ExpeditionAreas] 155 | _: i32 156 | _: bool 157 | UnearthAchievements: [AchievementItems] 158 | } 159 | -------------------------------------------------------------------------------- /dat-schema/3_16_Scourge.gql: -------------------------------------------------------------------------------- 1 | type HellscapeAOReplacements { 2 | Original: string @file(ext: ".ao") 3 | HASH32: i32 4 | Replacement: string @file(ext: ".ao") 5 | } 6 | 7 | type HellscapeAreaPacks { 8 | WorldArea: WorldAreas 9 | MonsterPacks: [MonsterPacks] 10 | _: i32 11 | _: i32 12 | } 13 | 14 | type HellscapeExperienceLevels { 15 | Level: i32 16 | Experience: i32 17 | } 18 | 19 | type HellscapeFactions { 20 | Id: string @unique 21 | _: Environments 22 | _: Environments 23 | _: [Environments] 24 | _: i32 25 | _: [MonsterVarieties] 26 | _: string @file(ext: ".ao") 27 | Boss: MonsterVarieties 28 | } 29 | 30 | type HellscapeImmuneMonsters { 31 | Monster: MonsterVarieties 32 | } 33 | 34 | type HellscapeItemModificationTiers { 35 | Tier: i32 36 | IsMap: bool 37 | _: i32 38 | MinItemLvl: i32 39 | } 40 | 41 | type HellscapeLifeScalingPerLevel { 42 | AreaLevel: i32 43 | Scale: i32 44 | } 45 | 46 | type HellscapeModificationInventoryLayout { 47 | Id: string @unique 48 | Column: i32 49 | Row: i32 50 | IsMapSlot: bool 51 | _: i32 52 | Width: i32 53 | Height: i32 54 | Stat: Stats 55 | StatValue: i32 56 | UnlockedWith: HellscapePassives 57 | Quest: Quest 58 | } 59 | 60 | type HellscapeMods { 61 | Mod: Mods 62 | TiersWhitelist: [i32] 63 | TransformAchievement: AchievementItems 64 | ModFamilies: [ModFamily] 65 | } 66 | 67 | type HellscapeMonsterPacks { 68 | Id: string @unique 69 | MonsterPack: MonsterPacks 70 | Faction: HellscapeFactions 71 | IsDonutPack: bool 72 | IsElite: bool 73 | MinLevel: i32 74 | MaxLevel: i32 75 | } 76 | 77 | type HellscapePassives { 78 | Id: string @unique 79 | Name: string @localized 80 | Stats: [Stats] 81 | StatsValues: [i32] 82 | Points: i32 83 | HASH16: i32 84 | Icon: string 85 | IconMaxed: string 86 | SoundEffect: SoundEffects 87 | _: i32 88 | Quest: Quest 89 | } 90 | 91 | type HellscapePassiveTree { 92 | Id: string @unique 93 | AllocationsRequired: i32 94 | Passives: [HellscapePassives] 95 | } 96 | -------------------------------------------------------------------------------- /dat-schema/3_17_Archnemesis.gql: -------------------------------------------------------------------------------- 1 | type ArchnemesisMetaRewards { 2 | Id: string 3 | RewardText: string @localized 4 | RewardGroup: i32 5 | ScriptArgument: string 6 | MinLevel: i32 7 | MaxLevel: i32 8 | } 9 | 10 | type ArchnemesisModComboAchievements { 11 | Achievement: AchievementItems 12 | Mods: [ArchnemesisMods] 13 | } 14 | 15 | type ArchnemesisMods { 16 | Mod: Mods 17 | Name: string @localized 18 | Visual: ArchnemesisModVisuals 19 | TextStyles: [string] 20 | _: bool 21 | _: bool 22 | } 23 | 24 | type ArchnemesisModVisuals { 25 | Id: string 26 | _: MiscAnimated 27 | _: rid 28 | _: rid 29 | _: [BuffVisuals] 30 | _: [MonsterVarieties] 31 | _: [MiscAnimated] 32 | _: [rid] 33 | } 34 | 35 | type ArchnemesisRecipes { 36 | Result: ArchnemesisMods 37 | Recipe: [ArchnemesisMods] 38 | _: i32 39 | } 40 | -------------------------------------------------------------------------------- /dat-schema/3_17_Siege_of_the_Atlas.gql: -------------------------------------------------------------------------------- 1 | type AtlasPrimordialAltarChoices { 2 | Mod: Mods 3 | Type: AtlasPrimordialAltarChoiceTypes 4 | _: bool 5 | } 6 | 7 | type AtlasPrimordialAltarChoiceTypes { 8 | Id: string 9 | TopIconEater: string 10 | BottomIconEater: string 11 | TopIconExarch: string 12 | BottomIconExarch: string 13 | Text: string @localized 14 | } 15 | 16 | type AtlasPrimordialBosses { 17 | Id: string 18 | _: i32 19 | _: i32 20 | _: i32 21 | _: i32 22 | InfluenceComplete: MiscAnimated 23 | MiniBossInvitation: BaseItemTypes 24 | BossInvitation: BaseItemTypes 25 | PickUpKey: QuestFlags 26 | _: rid 27 | _: rid 28 | Tag: Tags 29 | Altar: MiscObjects 30 | AltarActivated: MiscAnimated 31 | } 32 | 33 | type AtlasPrimordialBossInfluence { 34 | Boss: AtlasPrimordialBosses 35 | Progress: i32 36 | MinMapTier: i32 37 | _: i32 38 | _: i32 39 | _: rid 40 | _: f32 41 | _: QuestFlags 42 | } 43 | 44 | type AtlasPrimordialBossOptions { 45 | _: i32 46 | _: i32 47 | DefaultIcon: string 48 | HoverIcon: string 49 | HighlightIcon: string 50 | EmptyIcon: string 51 | Description: ClientStrings 52 | DescriptionActive: ClientStrings 53 | ProgressTracker: string 54 | ProgressTrackerFill: string 55 | Name: string @localized 56 | MapDeviceTrackerFill: string 57 | } 58 | 59 | type PrimordialBossLifeScalingPerLevel { 60 | AreaLevel: i32 61 | Scale: i32 62 | } 63 | 64 | type AtlasUpgradesInventoryLayout { 65 | Id: string 66 | _: i32 67 | Voidstone: BaseItemTypes 68 | _: i32 69 | Objective: string 70 | GrantAtlasUpgrade: QuestFlags 71 | _: rid 72 | } 73 | 74 | type AtlasPassiveSkillTreeGroupType { 75 | Id: string @unique 76 | } 77 | 78 | type KiracLevels { 79 | AreaLevel: i32 80 | _: i32 81 | } 82 | 83 | type ScoutingReports @tags(list: ["item:def"]) { 84 | Id: string 85 | BaseItemType: BaseItemTypes 86 | MinMapTier: i32 87 | } 88 | -------------------------------------------------------------------------------- /dat-schema/3_18_Sentinel.gql: -------------------------------------------------------------------------------- 1 | type DroneBaseTypes { 2 | BaseType: BaseItemTypes @unique 3 | Type: DroneTypes 4 | Charges: i32 5 | Duration: i32 6 | EnemyLimit: i32 7 | Visual: BuffVisuals 8 | Empowerment: i32 9 | UseAchievement: AchievementItems 10 | CreatedViaPowerCore: bool 11 | } 12 | 13 | type DroneTypes { 14 | Id: string 15 | _: QuestFlags 16 | _: MonsterVarieties 17 | DeployText: string 18 | _: string 19 | UnlockedStat: Stats 20 | SocketableText: string 21 | NotPoweredText: string 22 | } 23 | 24 | type SentinelCraftingCurrency { 25 | Currency: BaseItemTypes 26 | Type: i32 27 | } 28 | 29 | type SentinelDroneInventoryLayout { 30 | DroneType: DroneTypes 31 | _: i32 32 | _: i32 33 | _: i32 34 | _: i32 35 | } 36 | 37 | type SentinelPassives { 38 | Id: string 39 | HASH16: i32 40 | _: string 41 | _: [rid] 42 | _: [i32] 43 | _: i32 44 | _: i32 45 | _: rid 46 | _: i32 47 | _: i32 48 | _: i32 49 | } 50 | 51 | type SentinelPassiveStats { 52 | _: Stats 53 | _: Stats 54 | _: i32 55 | } 56 | 57 | type SentinelPassiveTypes { 58 | Id: string 59 | DefaultIcon: string 60 | ActiveIcon: string 61 | DroneType: DroneTypes 62 | _: i32 63 | } 64 | 65 | type SentinelPowerExpLevels { 66 | _: i32 67 | _: i32 68 | } 69 | 70 | type SentinelStorageLayout { 71 | Id: string 72 | StoredItem: BaseItemTypes 73 | DroneType: DroneTypes 74 | _: bool 75 | TabIcon: string 76 | XOffset: i32 77 | YOffset: i32 78 | _: i32 79 | _: i32 80 | Width: i32 81 | Height: i32 82 | SlotSize: i32 83 | _: ItemClasses 84 | } 85 | 86 | type SentinelTaggedMonsterStats { 87 | TaggedStat: Stats 88 | _: Stats 89 | _: [rid] 90 | _: rid 91 | _: rid 92 | } 93 | -------------------------------------------------------------------------------- /dat-schema/3_19_Lake_of_Kalandra.gql: -------------------------------------------------------------------------------- 1 | type ClientLakeDifficulty { 2 | Id: i32 3 | Scaling: f32 4 | _: i32 5 | _: i32 6 | } 7 | 8 | type LakeBossLifeScalingPerLevel { 9 | Level: i32 10 | Scaling: i32 11 | } 12 | 13 | type LakeMetaOptions { 14 | Id: string 15 | _: [i32] 16 | } 17 | 18 | type LakeMetaOptionsUnlockText { 19 | Id: i32 20 | Text: string @localized 21 | } 22 | 23 | type LakeRoomCompletion { 24 | Room: LakeRooms 25 | _: i32 26 | _: i32 27 | Achievements: [AchievementItems] 28 | _: [i32] 29 | _: [_] # All rows empty 30 | _: i32 31 | } 32 | 33 | type LakeRooms @tags(list: ["item:itemized"]) { 34 | Id: string 35 | ARMFiles: [string] @file(ext: ".arm") 36 | Script: string 37 | _: [_] # All rows empty 38 | Stats: [Stats] 39 | StatsValues: [i32] 40 | Description: string @localized 41 | Name: string @localized 42 | Type: i32 43 | WorldArea: WorldAreas 44 | Icon: string 45 | _: i32 46 | MinLevel: i32 47 | _: rid 48 | _: bool 49 | ExtraStats: [Stats] 50 | ExtraStatsValues: [i32] 51 | ReminderText: string @localized 52 | TextAudio: NPCTextAudio 53 | _: rid 54 | _: bool 55 | } 56 | 57 | type StampChoice { 58 | Id: string @unique 59 | _: rid 60 | _: i32 61 | Effect: string 62 | Icon: string 63 | _: rid 64 | _: [_] 65 | _: i32 66 | } 67 | 68 | type StampFamily { 69 | Id: string @unique 70 | _: i32 71 | } 72 | -------------------------------------------------------------------------------- /dat-schema/3_20_Sanctum.gql: -------------------------------------------------------------------------------- 1 | type SanctumAirlocks { 2 | Floor: SanctumFloors 3 | _: i32 4 | _: [i32] 5 | Area1: WorldAreas 6 | Area2: WorldAreas 7 | } 8 | 9 | type SanctumDefenceIcons { 10 | Id: string 11 | Stat: Stats 12 | DefenceIcon: string 13 | DefenceBrokenIcon: string 14 | BrokenStat: Stats 15 | Description: string 16 | } 17 | 18 | type SanctumDeferredRewardCategories { 19 | Item: BaseItemTypes 20 | NamePlural: string 21 | ScriptReward: string 22 | } 23 | 24 | type SanctumDeferredRewards { 25 | Id: string 26 | DeferralIcon: string 27 | DeferralCategory: SanctumPersistentEffectCategories 28 | RewardCategory: SanctumDeferredRewardCategories 29 | Count: i32 30 | } 31 | 32 | type SanctumFloors { 33 | Id: string 34 | Area: WorldAreas 35 | Title: ClientStrings 36 | RoomIcon: string 37 | BossIcon: string 38 | Description: string 39 | Summary: ClientStrings 40 | Itemised: BaseItemTypes 41 | } 42 | 43 | type SanctumFodderLifeScalingPerLevel { 44 | Level: i32 45 | _: i32 46 | } 47 | 48 | type SanctumLifeScalingPerLevel { 49 | Level: i32 50 | _: i32 51 | } 52 | 53 | type SanctumPersistentEffectCategories { 54 | Id: string 55 | Frame: string 56 | Popup: string 57 | Glow: string 58 | Curse: bool 59 | Boon: bool 60 | Icon: string 61 | Name: string 62 | Deferral: bool 63 | } 64 | 65 | type SanctumPersistentEffects { 66 | Id: string 67 | Stats: [Stats] 68 | StatValues: [i32] 69 | Name: string 70 | Icon: string 71 | _: i32 72 | _: bool 73 | EffectCategory: SanctumPersistentEffectCategories 74 | NextEffect: SanctumPersistentEffects 75 | _: string 76 | BoonDesc: string 77 | CurseDesc: string 78 | _: i32 79 | _: i32 80 | _: bool 81 | _: [rid] 82 | Guard: [MonsterVarieties] 83 | FirstEffect: SanctumPersistentEffects 84 | _: i32 85 | _: i32 86 | _: bool 87 | _: bool 88 | HASH16: i32 89 | } 90 | 91 | type SanctumRooms { 92 | Id: string 93 | ArmFile: string 94 | RoomType: SanctumRoomTypes 95 | Script: string 96 | Floor: SanctumFloors 97 | Area: WorldAreas 98 | } 99 | 100 | type SanctumRoomTypes { 101 | Id: string 102 | _: bool 103 | _: bool 104 | _: rid 105 | _: rid 106 | _: bool 107 | Icon: string 108 | _: bool 109 | Description: string 110 | _: [string] 111 | Rooms: [SanctumRooms] 112 | _: string 113 | _: bool 114 | } 115 | 116 | type SanctumSelectionDisplayOverride { 117 | Id: string 118 | Reward: string 119 | Icon: string 120 | Downside: string 121 | Item: BaseItemTypes 122 | Count: i32 123 | RewardCategory: SanctumDeferredRewardCategories 124 | } 125 | -------------------------------------------------------------------------------- /dat-schema/3_21_Crucible.gql: -------------------------------------------------------------------------------- 1 | type WeaponPassiveSkillTypes { 2 | Id: string 3 | _: i32 4 | } 5 | 6 | type WeaponPassiveTreeBalancePerItemLevel { 7 | Level: i32 8 | Bar1: i32 9 | Bar2: i32 10 | Bar3: i32 11 | Bar4: i32 12 | Bar5: i32 13 | } 14 | 15 | type WeaponPassiveTreeUniqueBaseTypes { 16 | UniqueBase: BaseItemTypes 17 | _: i32 18 | } 19 | 20 | type WeaponPassiveSkills { 21 | Id: string 22 | Tier: i32 23 | Mod: Mods 24 | _: [_] 25 | _: [_] 26 | Icon: string 27 | Type: WeaponPassiveSkillTypes 28 | Achievements: [AchievementItems] 29 | } 30 | 31 | type CrucibleDifficulty { 32 | Number: string @unique 33 | Name: string @unique 34 | _: i32 35 | _: i32 36 | _: i32 37 | _: i32 38 | } 39 | 40 | type CrucibleEndgameMonsterPacks { 41 | Tier: string @unique 42 | _: [_] 43 | _: i32 44 | _: i32 45 | _: bool 46 | } 47 | 48 | type CrucibleLifeScalingPerLevel { 49 | Level: i32 50 | Life: i32 51 | } 52 | 53 | type CruciblePlayerClassOffsets { 54 | _: rid @unique 55 | _: i32 56 | _: i32 57 | } 58 | 59 | type CrucibleTags { 60 | Tag: string @unique 61 | _: bool 62 | } 63 | -------------------------------------------------------------------------------- /dat-schema/3_22_Trial_of_the_Ancestors.gql: -------------------------------------------------------------------------------- 1 | type AncestralEmbraceVariations { 2 | Id: string 3 | Minion: MonsterVarieties 4 | _: rid 5 | } 6 | 7 | type AncestralLifeScalingPerLevel { 8 | Level: i32 9 | _: i32 10 | } 11 | 12 | type AncestralTrialChieftains { 13 | _: rid 14 | _: rid 15 | } 16 | 17 | type AncestralTrialDialogue { 18 | _: rid 19 | _: rid 20 | _: i32 21 | TextAudio: [NPCTextAudio] 22 | _: rid 23 | _: i32 24 | _: i32 25 | _: i32 26 | _: i32 27 | _: i32 28 | _: i32 29 | _: i32 30 | _: i32 31 | _: bool 32 | _: bool 33 | _: bool 34 | } 35 | 36 | type AncestralTrialDialogueEvents { 37 | Id: string 38 | _: i32 39 | } 40 | 41 | type AncestralTrialFieldItems { 42 | _: rid 43 | _: rid 44 | HASH32: i32 45 | Description: string 46 | Achievement: [AchievementItems] 47 | _: rid 48 | _: rid 49 | } 50 | 51 | type AncestralTrialItems { 52 | Id: string 53 | HASH16: i32 54 | Name: string 55 | Image: string 56 | _: rid 57 | _: i32 58 | Mods: [Mods] 59 | FlavorText: string 60 | _: i32 61 | _: [_] # All rows empty 62 | _: rid 63 | _: rid 64 | } 65 | 66 | type AncestralTrialMonsters { 67 | _: rid 68 | Monster: MonsterVarieties 69 | _: rid 70 | _: i32 71 | Achievement: [AchievementItems] 72 | _: bool 73 | _: bool 74 | _: bool 75 | _: bool 76 | } 77 | 78 | type AncestralTrialPositionType { 79 | Id: string 80 | PlayerTotemIcon: string 81 | Name: string 82 | EnemyTotemIcon: string 83 | PlayerTotemSmallIcon: string 84 | EnemyTotemSmallIcon: string 85 | } 86 | 87 | type AncestralTrialShopSlotEntries { 88 | _: i32 89 | _: i32 90 | _: i32 91 | _: bool 92 | _: bool 93 | _: i32 94 | _: bool 95 | } 96 | 97 | type AncestralTrialTribeOpinions { 98 | SourceTribe: AncestralTrialTribes 99 | TargetTribe: AncestralTrialTribes 100 | Opinion: AncestralTrialOpinionTypes 101 | } 102 | 103 | type AncestralTrialTribes { 104 | Id: string @unique 105 | _: rid 106 | Portrait: string 107 | TribeIcon: string 108 | TribeName: string @unique 109 | FavourTracker: string 110 | _: [rid] 111 | Name: string 112 | _: rid 113 | _: rid 114 | _: rid 115 | _: rid 116 | _: [rid] 117 | _: rid 118 | _: [rid] 119 | _: i32 120 | _: i32 121 | _: i32 122 | _: i32 123 | _: rid 124 | } 125 | 126 | type AncestralTrialUnitPositions { 127 | Id: string 128 | _: i32 129 | _: i32 130 | _: i32 131 | _: i32 132 | } 133 | 134 | type AncestralTrialUnits { 135 | Id: string 136 | Name: string 137 | Tribe: AncestralTrialTribes 138 | Image: string 139 | TotemImage: string 140 | HASH16: i32 141 | _: i32 142 | Description: string 143 | _: i32 144 | _: i32 145 | Position: AncestralTrialUnitPositions 146 | } 147 | 148 | type ChieftainLifeScalingPerLevel { 149 | Level: i32 150 | _: i32 151 | } 152 | 153 | type PassiveSkillTattoos { 154 | Tattoo: BaseItemTypes 155 | Override: PassiveSkillOverrides 156 | Set: PassiveSkillTattooTargetSets 157 | Tribe: i32 158 | OverrideType: PassiveSkillOverrideTypes 159 | } 160 | 161 | type PassiveSkillTattooTargetSets { 162 | Id: string 163 | Set: [i32] 164 | Name: string 165 | Qualifier: string 166 | } 167 | -------------------------------------------------------------------------------- /dat-schema/3_23_Affliction.gql: -------------------------------------------------------------------------------- 1 | type AfflictionDustedMonsterCurrencyDropWeightingByItemRarity { 2 | _: rid 3 | _: i32 4 | } 5 | 6 | type AzmeriCounterQuests { 7 | _: string 8 | _: rid 9 | _: rid 10 | _: rid 11 | _: i32 12 | } 13 | 14 | type AzmeriFeatureRooms { 15 | _: i32 16 | _: i32 17 | _: string 18 | _: string 19 | _: [_] 20 | _: bool 21 | } 22 | 23 | type AzmeriLifeScalingPerLevel { 24 | _: i32 25 | _: i32 26 | } 27 | 28 | type AzmeriWoodsDustType { 29 | _: string 30 | _: rid 31 | _: string 32 | _: string 33 | _: rid 34 | _: rid 35 | _: rid 36 | _: string 37 | _: i32 38 | _: rid 39 | _: i32 40 | _: string 41 | } 42 | 43 | type CorpseTypeTags { 44 | Tag: Tags 45 | Name: string @localized 46 | RavenousBuff: BuffDefinitions 47 | Icon: string 48 | _: i32 49 | } 50 | 51 | type Descendancy { 52 | _: string 53 | _: string 54 | _: string 55 | _: string 56 | _: string 57 | _: string 58 | _: string 59 | _: rid 60 | _: rid 61 | } 62 | 63 | type ItemisedCorpse { 64 | BaseItem: BaseItemTypes @unique 65 | MonsterVariety: MonsterVarieties 66 | MonsterAbilities: string @localized 67 | MonsterCategory: CorpseTypeTags 68 | } 69 | 70 | type Tinctures { 71 | BaseItem: BaseItemTypes @unique 72 | "1 stack of Mana Burn is applied every x milliseconds" 73 | DebuffInterval: i32 74 | Cooldown: i32 75 | } 76 | -------------------------------------------------------------------------------- /dat-schema/3_24_Necropolis.gql: -------------------------------------------------------------------------------- 1 | type ItemisedNecropolisPacks { 2 | Item: BaseItemTypes @unique 3 | Pack: NecropolisPacks 4 | Description: string 5 | } 6 | 7 | type NecropolisCraftBases { 8 | Id: string 9 | BaseItem: BaseItemTypes 10 | UniqueCraft: NecropolisUniqueCrafts 11 | _: bool 12 | _: i32 13 | CraftItemType: NecropolisCraftItemTypes 14 | Name: string 15 | CraftTag: Stats 16 | _: bool 17 | } 18 | 19 | type NecropolisCraftingMods { 20 | Id: string 21 | _: i32 22 | Stats: [Stats] 23 | StatsValues: [i32] 24 | CraftingItemType: NecropolisCraftItemTypes 25 | _: i32 26 | CorpsesNotConsumed: bool 27 | CraftingItemTypes: [NecropolisCraftItemTypes] 28 | Achievements: [AchievementItems] 29 | MatchingMonsters: i32 30 | } 31 | 32 | type NecropolisCraftingModsFromStats { 33 | Stat: Stats 34 | CraftingMod: NecropolisCraftingMods 35 | } 36 | 37 | type NecropolisCraftItemTypes { 38 | Id: string 39 | ExorciseIcon: string 40 | Name: string 41 | _: i32 42 | IllustratuionIcon: string 43 | TextAudioLong: NPCTextAudio 44 | Achievements: AchievementItems 45 | TextAudioShort: NPCTextAudio 46 | _: rid 47 | } 48 | 49 | type NecropolisPackAdditionalPacks { 50 | _: rid 51 | _: rid 52 | } 53 | 54 | type NecropolisPackImplicitClass { 55 | Id: string 56 | MoreImplicit: NecropolisPackImplicits 57 | LessImplicit: NecropolisPackImplicits 58 | } 59 | 60 | type NecropolisPackImplicits { 61 | Id: string 62 | Text: string 63 | Icon: string 64 | } 65 | 66 | type NecropolisPackMods { 67 | Mod: Mods 68 | Tier: NecropolisPackModTiers 69 | NextTier: NecropolisPackMods 70 | PrevTier: NecropolisPackMods 71 | } 72 | 73 | type NecropolisPackModTiers { 74 | Id: string 75 | Icon: string 76 | Name: string 77 | TextColours: [string] 78 | SpecialTier: bool 79 | } 80 | 81 | type NecropolisPacks { 82 | Id: string 83 | Name: string 84 | Icon: string 85 | Description: string 86 | PackLeader1: string 87 | PackLeader2: string 88 | Mod: Mods 89 | } 90 | 91 | type NecropolisPacksPerArea { 92 | _: rid 93 | _: [rid] 94 | _: [i32] 95 | } 96 | 97 | type NecropolisUniqueCrafts { 98 | Id: string 99 | Stats: [Stats] 100 | } 101 | 102 | type PackFrequencyNames { 103 | Id: string 104 | Frequency: f32 105 | Text: ClientStrings 106 | } 107 | -------------------------------------------------------------------------------- /dat-schema/3_25_Settlers_of_Kalguur.gql: -------------------------------------------------------------------------------- 1 | type CurrencyExchange { 2 | Item: BaseItemTypes 3 | Category: CurrencyExchangeCategories 4 | SubCategory: CurrencyExchangeCategories 5 | _: bool 6 | EnabledInChallengeLeague: bool 7 | GoldPurchaseFee: i32 8 | _: bool 9 | } 10 | 11 | type CurrencyExchangeCategories { 12 | Id: string 13 | Name: string 14 | } 15 | 16 | type VillageAssignWorkerTextAudio { 17 | _: rid 18 | _: NPCTextAudio 19 | _: NPCTextAudio 20 | _: NPCTextAudio 21 | _: NPCTextAudio 22 | _: NPCTextAudio 23 | _: NPCTextAudio 24 | _: NPCTextAudio 25 | _: NPCTextAudio 26 | _: NPCTextAudio 27 | _: NPCTextAudio 28 | _: NPCTextAudio 29 | _: NPCTextAudio 30 | } 31 | 32 | type VillageExports { 33 | Id: string 34 | Name: string 35 | _: i32 36 | Icon: string 37 | _: i32 38 | _: i32 39 | Icon2: string 40 | Name2: string 41 | IconCombined: string 42 | Result: VillageExports 43 | _: i32 44 | } 45 | 46 | type VillageFarmAdjacency { 47 | _: i32 48 | _: [i32] 49 | } 50 | 51 | type VillageJobs { 52 | _: rid 53 | _: i32 54 | Status: string 55 | Stat: Stats 56 | StatValue: i32 57 | } 58 | 59 | type VillageJobTypes { 60 | Id: string 61 | Icon: string 62 | StateText: string 63 | MaxWorkersStat: Stats 64 | _: bool 65 | JobSpeedStat: Stats 66 | } 67 | 68 | type VillageResources { 69 | Id: string 70 | _: rid 71 | _: i32 72 | } 73 | 74 | type VillageSharedConstants { 75 | Id: string 76 | Value: i32 77 | } 78 | 79 | type VillageUniqueDisenchantValues @tags(list: ["item:droptable"]) { 80 | UniqueName: Words @unique 81 | Value: f32 82 | } 83 | 84 | type VillageUpgradeCategories { 85 | Id: string 86 | ScriptArgs: string 87 | Name: string 88 | Icon: string 89 | Text: string 90 | _: rid 91 | } 92 | 93 | type VillageUpgrades { 94 | _: rid 95 | Tier: i32 96 | Text: string 97 | _: i32 98 | _: [rid] 99 | _: [i32] 100 | _: i32 101 | RuneItem: [BaseItemTypes] 102 | _: [i32] 103 | Stats: [Stats] 104 | StatsValues: [i32] 105 | UpgradeTextAudio: NPCTextAudio 106 | } 107 | -------------------------------------------------------------------------------- /dat-schema/poe2/ActionTypes.gql: -------------------------------------------------------------------------------- 1 | type ActionTypes { 2 | Id: string @unique 3 | _: u16 4 | _: bool 5 | _: bool 6 | _: bool 7 | _: bool 8 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ActiveSkillWeaponRequirement.gql: -------------------------------------------------------------------------------- 1 | type ActiveSkillWeaponRequirement { 2 | Id: string @unique 3 | WieldableClasses: [WieldableClasses] 4 | String: ClientStrings 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ActiveSkills.gql: -------------------------------------------------------------------------------- 1 | type ActiveSkills { 2 | Id: string @unique 3 | DisplayedName: string 4 | Description: string 5 | ActionType: ActionTypes 6 | Icon_DDSFile: string @file(ext: ".dds") 7 | ActiveSkillTargetTypes: [ActiveSkillTargetTypes] 8 | ActiveSkillTypes: [ActiveSkillType] 9 | WebsiteDescription: string 10 | WebsiteImage: string 11 | HideOnWebsite: bool 12 | GrantedEffect: string 13 | _: bool 14 | SkillTotemId: SkillTotems 15 | IsManuallyCasted: bool 16 | Input_Stats: [Stats] 17 | Output_Stats: [Stats] 18 | MinionActiveSkillTypes: [ActiveSkillType] 19 | _: bool 20 | IsGem: bool 21 | SecondarySkillSpecificStats: [Stats] 22 | SkillMine: i32 23 | AlternateSkillTargetingBehaviour: AlternateSkillTargetingBehaviours 24 | _: bool 25 | AIFile: string @file(ext: ".ai") 26 | StatContextFlags: [VirtualStatContextFlags] 27 | _: bool 28 | _: bool 29 | _: bool 30 | ShapeShiftForm: ShapeShiftForms 31 | VideoClip: string @file(ext: ".bk2") 32 | CharacterAudioEvent: CharacterAudioEvents 33 | AiScript: string @file(ext: ".ais") 34 | MinionType: MinionType 35 | _: rid 36 | _: bool 37 | _: string 38 | StatDescriptionType: StatDescriptionTypes 39 | StatDescription: string 40 | WeaponRequirements: ActiveSkillWeaponRequirement 41 | } 42 | -------------------------------------------------------------------------------- /dat-schema/poe2/Acts.gql: -------------------------------------------------------------------------------- 1 | type Acts { 2 | Id: string @unique 3 | UI_Title: string 4 | ActNumber: i32 5 | _: string 6 | _: string 7 | _: i32 8 | IsEndGame: bool 9 | _: i32 10 | _: [rid] 11 | _: [rid] 12 | _: [rid] 13 | _: rid 14 | _: [rid] 15 | Description: string 16 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AddBuffToTargetVarieties.gql: -------------------------------------------------------------------------------- 1 | type AddBuffToTargetVarieties { 2 | BuffDefinitions: BuffDefinitions 3 | _: [i32] 4 | StatsKeys: [Stats] 5 | _: i32 6 | } 7 | -------------------------------------------------------------------------------- /dat-schema/poe2/AdditionalLifeScaling.gql: -------------------------------------------------------------------------------- 1 | type AdditionalLifeScaling { 2 | IntId: i32 3 | ID: string 4 | DatFile: string @file(ext: ".dat") 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/poe2/AegisVariations.gql: -------------------------------------------------------------------------------- 1 | type AegisVariations { 2 | Id: string @unique 3 | DefendsAgainstPhysical: bool 4 | DefendsAgainstFire: bool 5 | DefendsAgainstCold: bool 6 | DefendsAgainstLightning: bool 7 | DefendsAgainstChaos: bool 8 | _: rid 9 | _: rid 10 | _: rid 11 | _: bool 12 | _: [string] 13 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AlternatePassiveAdditions.gql: -------------------------------------------------------------------------------- 1 | type AlternatePassiveAdditions { 2 | Id: string @unique 3 | AlternateTreeVersion: AlternateTreeVersions 4 | SpawnWeight: i32 5 | Stats: [Stats] 6 | Stat1: i32 @interval 7 | Stat2: i32 @interval 8 | Stat3: i32 @interval 9 | PassiveType: [i32] 10 | _: i32 11 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AlternatePassiveSkills.gql: -------------------------------------------------------------------------------- 1 | type AlternatePassiveSkills { 2 | Id: string @unique 3 | AlternateTreeVersion: AlternateTreeVersions 4 | Name: string 5 | PassiveType: [i32] 6 | Stats: [Stats] 7 | Stat1: i32 @interval 8 | Stat2: i32 @interval 9 | Stat3: i32 @interval 10 | Stat4: i32 @interval 11 | Stat5: i32 @interval 12 | Stat6: i32 @interval 13 | SpawnWeight: i32 14 | ConquerorIndex: i32 15 | Random: i32 @interval 16 | FlavourText: string 17 | DDSIcon: string @file(ext: ".dds") 18 | AchievementItems: [AchievementItems] 19 | ConquerorVersion: i32 20 | ConquerorSpawnWeight: i32 21 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AlternateQualityTypes.gql: -------------------------------------------------------------------------------- 1 | type AlternateQualityTypes @tags(list: ["item:def"]) { 2 | Id: string 3 | Description: string 4 | Item: BaseItemTypes 5 | _: rid 6 | HASH16: u16 7 | } 8 | -------------------------------------------------------------------------------- /dat-schema/poe2/AlternateTreeVersions.gql: -------------------------------------------------------------------------------- 1 | type AlternateTreeVersions { 2 | ConquerorType: string @unique 3 | SmallAttributeReplaced: bool 4 | SmallNormalPassiveReplaced: bool 5 | SmallAttributePassiveSkillAdditions: i32 @interval 6 | NotableAdditions: i32 @interval 7 | SmallNormalPassiveSkillAdditions: i32 @interval 8 | NotableReplacementSpawnWeight: i32 9 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AnimateWeaponUniques.gql: -------------------------------------------------------------------------------- 1 | type AnimateWeaponUniques { 2 | Id: string @unique 3 | ItemVisualIdentity: ItemVisualIdentity 4 | ItemClass: ItemClasses 5 | MinLevelReq: i32 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ArmourTypes.gql: -------------------------------------------------------------------------------- 1 | type ArmourTypes @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Armour: i32 4 | Evasion: i32 5 | EnergyShield: i32 6 | IncreasedMovementSpeed: i32 7 | Ward: i32 8 | _: i32 9 | } 10 | -------------------------------------------------------------------------------- /dat-schema/poe2/Ascendancy.gql: -------------------------------------------------------------------------------- 1 | type Ascendancy { 2 | Id: string @unique 3 | ClassNo: i32 4 | Characters: [Characters] 5 | "Coordinates in 'x1, y1, x2, y2' format" 6 | CoordinateRect: string 7 | RGBFlavourTextColour: string 8 | Name: string @localized 9 | FlavourText: string @localized 10 | OGGFile: string @file(ext: ".ogg") 11 | PassiveTreeImage: string @file(ext: ".dds") 12 | TreeRegionVector: i32 13 | TreeRegionAngle: i32 14 | BackgroundImage: i32 15 | _: i32 16 | Disabled: bool 17 | } 18 | -------------------------------------------------------------------------------- /dat-schema/poe2/AtlasPassiveSkillSubTrees.gql: -------------------------------------------------------------------------------- 1 | type AtlasPassiveSkillSubTrees { 2 | Id: string @unique 3 | UI_Image: string 4 | UI_Background: string 5 | IllustrationX: i32 6 | IllustrationY: i32 7 | CounterX: i32 8 | CounterY: i32 9 | _: rid 10 | _: rid 11 | } -------------------------------------------------------------------------------- /dat-schema/poe2/AttributeRequirements.gql: -------------------------------------------------------------------------------- 1 | type AttributeRequirements { 2 | BaseItemType: BaseItemTypes @unique 3 | ReqStr: i32 4 | ReqInt: i32 5 | ReqDex: i32 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/BaseItemTypes.gql: -------------------------------------------------------------------------------- 1 | type BaseItemTypes @tags(list: ["item:def", "item:droptable"]) { 2 | Id: string @unique 3 | ItemClass: ItemClasses 4 | Width: i32 5 | Height: i32 6 | Name: string @localized 7 | InheritsFrom: string @files(ext: [".ot", ".otc"]) 8 | DropLevel: i32 9 | FlavourText: FlavourText 10 | Implicit_Mods: [Mods] 11 | SizeOnGround: i32 12 | SoundEffect: SoundEffects 13 | Tags: [Tags] 14 | ModDomain: ModDomains 15 | SiteVisibility: i32 16 | ItemVisualIdentity: ItemVisualIdentity 17 | HASH32: u32 @unique 18 | VendorRecipe_AchievementItems: [AchievementItems] 19 | "the inflection identifier used for i18n in related fields" 20 | Inflection: string 21 | Equip_AchievementItem: AchievementItems 22 | IsCorrupted: bool 23 | Identify_AchievementItems: [AchievementItems] 24 | IdentifyMagic_AchievementItems: [AchievementItems] 25 | "the item which represents this item in the fragment stash tab" 26 | FragmentBaseItemType: BaseItemTypes 27 | _: bool 28 | UncutGemSoundEffect: SoundEffects 29 | _: rid 30 | _: bool 31 | TradeMarketCategory: TradeMarketCategory 32 | Unmodifiable: bool 33 | Achievement: [AchievementItems] 34 | ShopTag: ShopTag 35 | _: rid # all nulls 36 | } 37 | -------------------------------------------------------------------------------- /dat-schema/poe2/BlightCraftingItems.gql: -------------------------------------------------------------------------------- 1 | type BlightCraftingItems @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Tier: i32 4 | Achievements: [AchievementItems] 5 | UseType: i32 6 | NameShort: string @unique 7 | EnchantedMod: Mods 8 | } 9 | -------------------------------------------------------------------------------- /dat-schema/poe2/BlightCraftingRecipes.gql: -------------------------------------------------------------------------------- 1 | type BlightCraftingRecipes @tags(list: ["crafting"]) { 2 | Id: string @unique 3 | BlightCraftingResult: BlightCraftingResults 4 | BlightCraftingItems: [BlightCraftingItems] 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/poe2/BuffDefinitions.gql: -------------------------------------------------------------------------------- 1 | type BuffDefinitions { 2 | Id: string @unique 3 | Description: string 4 | Invisible: bool 5 | Removable: bool 6 | Name: string 7 | Stats: [Stats] 8 | CancelOnDeath: bool 9 | MergeMode: BuffMergeModes 10 | ShowCount: bool 11 | Maximum_Stat: Stats 12 | Current_Stat: Stats 13 | _: bool 14 | _: i32 15 | BuffVisual: BuffVisuals 16 | _: bool 17 | _: bool 18 | BuffCategory: i32 19 | _: bool 20 | _: bool 21 | _: bool 22 | _: bool 23 | BuffLimit: i32 24 | _: bool 25 | Implementation: string 26 | IsRecovery: bool 27 | _: bool 28 | MinStat: Stats 29 | _: bool 30 | UIStackMode: i32 31 | _: bool 32 | IsSkillBuff: bool 33 | _: i32 34 | _: [i32] 35 | _: bool 36 | _: bool 37 | _: [rid] 38 | _: bool 39 | Stats2: [Stats] 40 | GrantedFlags: [Stats] 41 | GrantedStats: [Stats] 42 | ConditionStats: [Stats] 43 | _: bool 44 | _: bool 45 | _: bool 46 | _: bool 47 | _: Stats 48 | _: [i32] 49 | _: string 50 | _: [Stats] 51 | _: [i32] 52 | _: i32 53 | _: [rid] 54 | } -------------------------------------------------------------------------------- /dat-schema/poe2/BuffTemplates.gql: -------------------------------------------------------------------------------- 1 | type BuffTemplates { 2 | Id: string @unique 3 | BuffDefinition: BuffDefinitions 4 | Buff_StatValues: [i32] 5 | AuraRadius: i32 6 | _: [i32] 7 | _: [i32] 8 | BuffVisual: BuffVisuals 9 | _: f32 10 | _: bool 11 | Stats: [Stats] 12 | _: i32 13 | _: i32 14 | _: bool 15 | _: Stats 16 | _: bool 17 | } -------------------------------------------------------------------------------- /dat-schema/poe2/BuffVisualOrbTypes.gql: -------------------------------------------------------------------------------- 1 | type BuffVisualOrbTypes { 2 | Id: string @unique 3 | _: f32 4 | _: f32 5 | _: f32 6 | _: f32 7 | _: i32 8 | _: bool 9 | RadiusStat: Stats 10 | HeightStat: Stats 11 | _: i32 12 | _: bool 13 | _: f32 14 | _: i32 15 | _: f32 16 | _: bool 17 | _: f32 18 | } -------------------------------------------------------------------------------- /dat-schema/poe2/BuffVisualsArtVariations.gql: -------------------------------------------------------------------------------- 1 | type BuffVisualsArtVariations { 2 | Buff: string 3 | Visuals: [BuffVisuals] 4 | _: i32 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Chanceableitemclasses.gql: -------------------------------------------------------------------------------- 1 | type Chanceableitemclasses { 2 | ItemClass: ItemClasses 3 | _: i32 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CharacterCreationButton.gql: -------------------------------------------------------------------------------- 1 | type CharacterCreationButton { 2 | _: rid 3 | _: string 4 | _: string 5 | _: string 6 | _: string 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CharacterCreationDialogue.gql: -------------------------------------------------------------------------------- 1 | type CharacterCreationDialogue { 2 | _: rid 3 | _: rid 4 | _: rid 5 | _: rid 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CharacterMeleeSkills.gql: -------------------------------------------------------------------------------- 1 | type CharacterMeleeSkills { 2 | _: rid 3 | _: rid 4 | SkillGem: SkillGems 5 | _: bool 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Characters.gql: -------------------------------------------------------------------------------- 1 | type Characters { 2 | Id: string @unique 3 | Name: string @unique @localized 4 | AOFile: string @file(ext: ".ao") 5 | ACTFile: string @file(ext: ".act") 6 | BaseMaxLife: i32 7 | BaseMaxMana: i32 8 | "Attack Speed in milliseconds" 9 | WeaponSpeed: i32 10 | MinDamage: i32 11 | MaxDamage: i32 12 | MaxAttackDistance: i32 13 | Icon: string 14 | IntegerId: i32 @unique 15 | BaseStrength: i32 16 | BaseDexterity: i32 17 | BaseIntelligence: i32 18 | _: [rid] 19 | Description: string @localized 20 | StartSkillGem: BaseItemTypes 21 | _: rid 22 | _: i32 23 | _: i32 24 | CharacterSize: i32 25 | _: i32 26 | _: i32 27 | _: i32 28 | IntroSoundFile: string @file(ext: ".ogg") 29 | StartWeapons: [BaseItemTypes] 30 | Gender: string 31 | TraitDescription: string @localized 32 | _: rid 33 | _: rid 34 | _: [rid] 35 | _: rid 36 | _: rid 37 | _: i32 38 | PassiveTreeImage: string @file(ext: ".dds") 39 | _: i32 40 | _: i32 41 | AttrsAsId: string 42 | LoginScreen: string @file(ext: ".ao") 43 | PlayerCritter: string 44 | PlayerEffect: string 45 | AfterImage: string 46 | Mirage: MonsterVarieties 47 | CloneImmobile: MonsterVarieties 48 | ReplicateClone: MonsterVarieties 49 | LightningClone: MonsterVarieties 50 | _: f32 51 | _: f32 52 | SkillTreeBackground: string 53 | Clone: MonsterVarieties 54 | _: [_] 55 | MirageWarrior: MonsterVarieties 56 | DoubleTwo: MonsterVarieties 57 | DarkExile: MonsterVarieties 58 | Attr: string 59 | AttrLowercase: string 60 | Script: string 61 | _: rid 62 | _: i32 63 | _: f32 64 | _: f32 65 | _: f32 66 | BaseClass: string 67 | _: rid 68 | _: rid 69 | _: [rid] 70 | _: f32 71 | GemCuttingIcon: string 72 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Chests.gql: -------------------------------------------------------------------------------- 1 | type Chests { 2 | Id: string @unique 3 | _: bool 4 | _: i32 5 | Name: string 6 | AOFiles: [string] @file(ext: ".ao") 7 | _: bool 8 | } 9 | -------------------------------------------------------------------------------- /dat-schema/poe2/ClassPassiveSkillOverrides.gql: -------------------------------------------------------------------------------- 1 | type ClassPassiveSkillOverrides { 2 | CharacterToOverrideFor: Characters 3 | SkillToOverride: PassiveSkills 4 | Override: PassiveSkills 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ClientStrings.gql: -------------------------------------------------------------------------------- 1 | type ClientStrings { 2 | Id: string @unique 3 | Text: string 4 | XBoxText: string 5 | XBoxText2: string 6 | HASH32: u32 7 | PlaystationText: string 8 | _: string 9 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CostTypes.gql: -------------------------------------------------------------------------------- 1 | type CostTypes { 2 | Id: string @unique 3 | Stat: Stats 4 | FormatText: string 5 | Divisor: i32 6 | PerMinute: bool 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CraftableModTypes.gql: -------------------------------------------------------------------------------- 1 | type CraftableModTypes { 2 | ModType: ModType 3 | HASH16: u16 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CraftingBenchOptions.gql: -------------------------------------------------------------------------------- 1 | type CraftingBenchOptions @tags(list: ["crafting"]) { 2 | HideoutNPC: HideoutNPCs 3 | Order: i32 4 | AddMod: Mods 5 | Cost_BaseItemTypes: [BaseItemTypes] 6 | Cost_Values: [i32] 7 | RequiredLevel: i32 8 | Name: string 9 | CraftingBenchCustomAction: CraftingBenchCustomActions 10 | ItemClasses: [ItemClasses] 11 | Links: i32 12 | SocketColours: string 13 | Sockets: i32 14 | ItemQuantity: i32 15 | _: [i32] 16 | Description: string 17 | IsDisabled: bool 18 | IsAreaOption: bool 19 | RecipeIds: [RecipeUnlockDisplay] @ref(column: "RecipeId") 20 | Tier: i32 21 | CraftingItemClassCategories: [CraftingItemClassCategories] 22 | _: i32 23 | UnlockCategory: CraftingBenchUnlockCategories 24 | UnveilsRequired: i32 25 | UnveilsRequired2: i32 26 | _: [rid] 27 | KalandraAchievement: [AchievementItems] 28 | _: i32 29 | _: i32 30 | VeiledMod: Mods 31 | AddEnchantment: Mods 32 | SortCategory: CraftingBenchSortCategories 33 | ModType: ModType 34 | _: bool 35 | _: i32 36 | Stat1: Stats 37 | Stat2: Stats 38 | Stat3: Stats 39 | } 40 | -------------------------------------------------------------------------------- /dat-schema/poe2/CraftingItemClassCategories.gql: -------------------------------------------------------------------------------- 1 | type CraftingItemClassCategories { 2 | Id: string @unique 3 | ItemClasses: [ItemClasses] 4 | _: string 5 | Text: string 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/CurrencyItems.gql: -------------------------------------------------------------------------------- 1 | type CurrencyItems @tags(list: ["item:def", "item:recipe"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | StackSize: i32 4 | CurrencyUseType: i32 5 | Action: string 6 | Directions: string 7 | "Full stack transforms into this item" 8 | FullStack_BaseItemType: BaseItemTypes 9 | Description: string 10 | Usage_AchievementItems: [AchievementItems] 11 | Scroll: bool 12 | Possession_AchievementItem: AchievementItems 13 | _: [rid] 14 | _: [i32] 15 | CurrencyTab_StackSize: i32 16 | XBoxDirections: string 17 | _: i32 18 | ModifyMapsAchievements: [AchievementItems] 19 | ModifyContractsAchievements: [AchievementItems] 20 | CombineAchievements: [AchievementItems] 21 | ChangedForHardmode: bool 22 | DescriptionHardmode: string 23 | IsGold: bool 24 | UsageHint: string 25 | _: bool 26 | _: bool 27 | } 28 | -------------------------------------------------------------------------------- /dat-schema/poe2/DefaultMonsterStats.gql: -------------------------------------------------------------------------------- 1 | type DefaultMonsterStats { 2 | DisplayLevel: string 3 | Damage: f32 4 | Evasion: i32 5 | Accuracy: i32 6 | Life: i32 7 | Experience: i32 8 | AllyLife: i32 9 | Armour: i32 10 | Difficulty: i32 11 | MinionDamage: f32 12 | AltLife1: i32 13 | AltDamage1: f32 14 | AltDamage2: f32 15 | AltLife2: i32 16 | EvasiveEvasion: i32 17 | AilmentThreshold: i32 18 | StunThreshold: i32 19 | _: i32 20 | } -------------------------------------------------------------------------------- /dat-schema/poe2/DelveCraftingModifiers.gql: -------------------------------------------------------------------------------- 1 | type DelveCraftingModifiers @tags(list: ["crafting"]) { 2 | BaseItemType: BaseItemTypes 3 | AddedMods: [Mods] 4 | NegativeWeight_Tags: [Tags] 5 | NegativeWeight_Values: [i32] 6 | ForcedAddMods: [Mods] 7 | ForbiddenDelveCraftingTags: [DelveCraftingTags] 8 | AllowedDelveCraftingTags: [DelveCraftingTags] 9 | CanMirrorItem: bool 10 | CorruptedEssenceChance: i32 11 | CanImproveQuality: bool 12 | HasLuckyRolls: bool 13 | _: bool 14 | SellPrice_Mods: [Mods] 15 | CanRollWhiteSockets: bool 16 | Weight_Tags: [Tags] 17 | Weight_Values: [i32] 18 | DelveCraftingModifierDescriptions: [DelveCraftingModifierDescriptions] 19 | BlockedDelveCraftingModifierDescriptions: [DelveCraftingModifierDescriptions] 20 | _: bool 21 | _: bool 22 | _: [i32] 23 | _: [i32] 24 | } 25 | -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameCorruptionMods.gql: -------------------------------------------------------------------------------- 1 | type EndgameCorruptionMods { 2 | CorruptionMod: Mods 3 | SpawnWeight: [i32] 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapBiomes.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapBiomes { 2 | Id: string @unique 3 | _: f32 4 | _: f32 5 | GroundType1: string @file(ext: ".gt") 6 | _: f32 7 | _: f32 8 | _: f32 9 | _: f32 10 | GroundType2: string @file(ext: ".gt") 11 | _: [i32] 12 | _: f32 13 | _: i32 14 | _: i32 15 | _: i32 16 | _: i32 17 | GroundTypeCorrupted1: string @file(ext: ".gt") 18 | GroundTypeCorrupted2: string @file(ext: ".gt") 19 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapCompletionQuests.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapCompletionQuests { 2 | Id: string @unique 3 | RequiredTier: i32 4 | RequiredCount: i32 5 | _: i32 6 | _: i32 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapContent.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapContent { 2 | Id: string @unique 3 | SpawnChance: [i32] 4 | _: i32 5 | _: i32 6 | _: i32 7 | _: i32 8 | InherentStat: [Stats] 9 | _: [i32] 10 | Icon: string @file(ext: ".dds") 11 | PrecursorTabletStat: Stats 12 | Stats: [Stats] 13 | StatsValues: [i32] 14 | Description: string 15 | Name: string 16 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapContentSet.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapContentSet { 2 | Id: string @unique 3 | Content: [EndgameMapContent] 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapDecorations.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapDecorations { 2 | Id: string @unique 3 | AnimatedObject: string @file(ext: ".ao") 4 | AdditionalAnimatedObjects: [string] @file(ext: ".ao") 5 | _: i32 6 | _: i32 7 | _: i32 8 | _: i32 9 | _: i32 10 | _: i32 11 | _: bool 12 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMapPins.gql: -------------------------------------------------------------------------------- 1 | type EndgameMapPins { 2 | Id: string @unique 3 | UnavailablePin: MiscAnimated 4 | AvailablePin: MiscAnimated 5 | ActivePin: MiscAnimated 6 | FailedPin: MiscAnimated 7 | CompletePin: MiscAnimated 8 | } -------------------------------------------------------------------------------- /dat-schema/poe2/EndgameMaps.gql: -------------------------------------------------------------------------------- 1 | type EndgameMaps { 2 | _: i32 3 | Biomes: [EndgameMapBiomes] 4 | AdjacentBiomes: [EndgameMapBiomes] 5 | WorldAreaBoss: WorldAreas 6 | WorldArea: WorldAreas 7 | NaturalSpawnWeight: [i32] 8 | NativePacks: [MonsterPacks] 9 | FlavourText: string 10 | MinWatchstoneTier: i32 11 | _: i32 12 | MapPin: EndgameMapPins 13 | MapDecoration: EndgameMapDecorations 14 | _: rid 15 | CorruptedMapPin: EndgameMapPins 16 | _: i32 17 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Essences.gql: -------------------------------------------------------------------------------- 1 | type Essences { 2 | BaseItemType: BaseItemTypes @unique 3 | HASH32: u32 4 | _: i32 5 | _: i32 6 | _: [rid] 7 | _: i32 8 | MonsterMod: Mods 9 | _: bool 10 | CraftTag: Tags 11 | UpgradeResult: Essences 12 | Tier: i32 13 | Stats: Stats 14 | CraftedMod: Mods 15 | ItemClasses: [ItemClasses] 16 | _: i32 17 | } 18 | -------------------------------------------------------------------------------- /dat-schema/poe2/ExpeditionCurrency.gql: -------------------------------------------------------------------------------- 1 | type ExpeditionCurrency { 2 | BaseItemType: BaseItemTypes 3 | } 4 | -------------------------------------------------------------------------------- /dat-schema/poe2/Flasks.gql: -------------------------------------------------------------------------------- 1 | type Flasks @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Name: string 4 | Type: FlaskType 5 | LifePerUse: i32 6 | ManaPerUse: i32 7 | "in 1/10 s" 8 | RecoveryTime: i32 9 | RecoveryTime2: i32 10 | BuffDefinition: BuffDefinitions 11 | _: i32 12 | UtilityBuff: [UtilityFlaskBuffs] 13 | } 14 | -------------------------------------------------------------------------------- /dat-schema/poe2/FlavourText.gql: -------------------------------------------------------------------------------- 1 | type FlavourText { 2 | Id: string @unique 3 | HASH16: u16 4 | Text: string 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GemEffects.gql: -------------------------------------------------------------------------------- 1 | type GemEffects { 2 | Id: string @unique 3 | Name: string 4 | GrantedEffect: GrantedEffects 5 | SupportText: string 6 | SupportName: string 7 | GemTags: [GemTags] 8 | Consumed_Mod: Mods 9 | "Used by gem icon shader https://gist.github.com/zao/08878df57aba605e5fa1e6373f2dce02" 10 | ItemColor: i32 11 | _: [rid] 12 | AdditionalGrantedEffects: [GrantedEffects] 13 | _: bool 14 | _: bool 15 | _: [i32] 16 | _: i32 17 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GemTags.gql: -------------------------------------------------------------------------------- 1 | type GemTags { 2 | Id: string @unique 3 | Name: string 4 | LocalLevelStat: Stats 5 | LocalQualityStat: Stats 6 | GlobalSpellLevelStat: Stats 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GoldModPrices.gql: -------------------------------------------------------------------------------- 1 | type GoldModPrices { 2 | Mod: Mods 3 | Value: i32 4 | _: i32 5 | _: i32 6 | _: i32 7 | Tags: [Tags] 8 | SpawnWeight: [i32] 9 | CraftableType: CraftableModTypes 10 | _: [rid] 11 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffectLabels.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffectLabels { 2 | Id: string 3 | Text: string 4 | _: bool 5 | _: bool 6 | _: bool 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffectQualityStats.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffectQualityStats @tags(list: ["item:droptable"]) { 2 | GrantedEffect: GrantedEffects 3 | Stats: [Stats] 4 | StatsValuesPermille: [i32] 5 | AddTypes: [ActiveSkillType] 6 | AddMinionTypes: [ActiveSkillType] 7 | _: [i32] 8 | } 9 | -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffectStatSets.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffectStatSets { 2 | Id: string @unique 3 | Label: GrantedEffectLabels 4 | ImplicitStats: [Stats] 5 | ConstantStats: [Stats] 6 | ConstantStatsValues: [i32] 7 | BaseEffectiveness: f32 8 | IncrementalEffectiveness: f32 9 | DamageIncrementalEffectiveness: f32 10 | "Values for these stats are NOT copied from the base StatSet of the GrantedEffect" 11 | IgnoredStats: [Stats] 12 | _: bool 13 | } 14 | -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffectStatSetsPerLevel.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffectStatSetsPerLevel { 2 | StatSet: GrantedEffectStatSets 3 | GemLevel: i32 4 | SpellCritChance: i32 5 | AttackCritChance: i32 6 | BaseResolvedValues: [i32] 7 | AdditionalStatsValues: [i32] 8 | GrantedEffects: [GrantedEffects] 9 | _: bool 10 | _: i32 11 | AdditionalFlags: [Stats] 12 | FloatStats: [Stats] 13 | InterpolationBases: [Stats] 14 | AdditionalStats: [Stats] 15 | StatInterpolations: [StatInterpolationTypes] 16 | FloatStatsValues: [f32] 17 | ActorLevel: f32 18 | BaseMultiplier: i32 19 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffects.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffects { 2 | Id: string @unique 3 | IsSupport: bool 4 | "This support gem only supports active skills with at least one of these types" 5 | AllowedActiveSkillTypes: [ActiveSkillType] 6 | SupportGemLetter: string 7 | "This support gem adds these types to supported active skills" 8 | AddedActiveSkillTypes: [ActiveSkillType] 9 | "This support gem does not support active skills with one of these types" 10 | ExcludedActiveSkillTypes: [ActiveSkillType] 11 | "This support gem only supports active skills that come from gem items" 12 | SupportsGemsOnly: bool 13 | HASH32: u32 14 | CannotBeSupported: bool 15 | LifeLeech: i32 16 | CastTime: i32 17 | ActiveSkill: ActiveSkills 18 | IgnoreMinionTypes: bool 19 | CooldownNotRecoverDuringActive: bool 20 | AddedMinionActiveSkillTypes: [ActiveSkillType] 21 | Animation: Animation 22 | MultiPartAchievement: MultiPartAchievements 23 | _: bool 24 | RegularVariant: GrantedEffects 25 | _: bool 26 | _: i32 27 | _: i32 28 | _: i32 29 | _: bool 30 | StatSet: GrantedEffectStatSets 31 | AdditionalStatSets: [GrantedEffectStatSets] 32 | Audio: string 33 | CostTypes: [CostTypes] 34 | _: bool 35 | _: [i32] 36 | _: i32 37 | SupportWeaponRestrictions: [ItemClasses] 38 | } -------------------------------------------------------------------------------- /dat-schema/poe2/GrantedEffectsPerLevel.gql: -------------------------------------------------------------------------------- 1 | type GrantedEffectsPerLevel { 2 | GrantedEffect: GrantedEffects 3 | Level: i32 4 | CostMultiplier: i32 5 | StoredUses: i32 6 | Cooldown: i32 7 | CooldownBypassType: CooldownBypassTypes 8 | VaalSouls: i32 9 | VaalStoredUses: i32 10 | CooldownGroup: i32 11 | PvPDamageMultiplier: i32 12 | SoulGainPreventionDuration: i32 13 | AttackSpeedMultiplier: i32 14 | _: i32 15 | _: i32 16 | _: i32 17 | _: i32 18 | _: i32 19 | AttackTime: i32 20 | Reservation: i32 21 | _: i32 22 | CostAmounts: [i32] 23 | ActorLevel: f32 24 | EffectOnPlayer: i32 25 | } 26 | -------------------------------------------------------------------------------- /dat-schema/poe2/HideoutNPCs.gql: -------------------------------------------------------------------------------- 1 | type HideoutNPCs { 2 | Hideout_NPC: NPCs 3 | Regular_NPCs: [NPCs] 4 | HideoutDoodad: HideoutDoodads 5 | NPCMaster: i32 6 | _: rid 7 | _: rid 8 | _: i32 9 | _: rid 10 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemClasses.gql: -------------------------------------------------------------------------------- 1 | type ItemClasses @tags(list: ["crafting"]) { 2 | Id: string @unique 3 | Name: string 4 | TradeMarketCategory: TradeMarketCategory 5 | ItemClassCategory: ItemClassCategories 6 | RemovedIfLeavesArea: bool 7 | _: [_] # All rows empty 8 | IdentifyAchievements: [AchievementItems] 9 | AllocateToMapOwner: bool 10 | AlwaysAllocate: bool 11 | CanHaveVeiledMods: bool 12 | PickedUpQuest: QuestFlags 13 | _: i32 14 | AlwaysShow: bool 15 | CanBeCorrupted: bool 16 | CanHaveIncubators: bool 17 | CanHaveInfluence: bool 18 | CanBeDoubleCorrupted: bool 19 | CanHaveAspects: bool 20 | CanTransferSkin: bool 21 | ItemStance: ItemStances 22 | CanScourge: bool 23 | CanUpgradeRarity: bool 24 | _: bool 25 | InventoryDimensions: [i32] 26 | ItemClassFlags: [i32] 27 | Unmodfiable: bool 28 | CanBeFractured: bool 29 | EquipAchievement: AchievementItems 30 | UsableInMapDevice: bool 31 | _: bool 32 | } 33 | -------------------------------------------------------------------------------- /dat-schema/poe2/ItemExperiencePerLevel.gql: -------------------------------------------------------------------------------- 1 | type ItemExperiencePerLevel { 2 | ItemExperienceType: ItemExperienceTypes 3 | ItemCurrentLevel: i32 4 | Experience: i32 5 | Level: i32 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemFrameType.gql: -------------------------------------------------------------------------------- 1 | type ItemFrameType { 2 | Id: string 3 | _: bool 4 | DoubleLine: bool 5 | HeaderSingle: string 6 | HeaderDouble: string 7 | HardmodeHeaderSingle: string 8 | HardmodeHeaderDouble: string 9 | Color: [i32] 10 | Separator: string 11 | _: bool 12 | Rarity: Rarity 13 | DisplayString: ClientStrings 14 | ColorMarkup: string 15 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemInherentSkills.gql: -------------------------------------------------------------------------------- 1 | type ItemInherentSkills { 2 | BaseItemType: BaseItemTypes @unique 3 | SkillsGranted: [SkillGems] 4 | IsWeapon: bool 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemSpirit.gql: -------------------------------------------------------------------------------- 1 | type ItemSpirit { 2 | BaseItemType: BaseItemTypes @unique 3 | SpiritGranted: i32 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemStances.gql: -------------------------------------------------------------------------------- 1 | type ItemStances { 2 | Id: string @unique 3 | _: bool 4 | _: ItemStances 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ItemVisualEffect.gql: -------------------------------------------------------------------------------- 1 | type ItemVisualEffect { 2 | Id: string @unique 3 | DaggerEPKFile: string @file(ext: ".epk") 4 | BowEPKFile: string @file(ext: ".epk") 5 | OneHandedMaceEPKFile: string @file(ext: ".epk") 6 | OneHandedSwordEPKFile: string @file(ext: ".epk") 7 | _: string 8 | TwoHandedSwordEPKFile: string @file(ext: ".epk") 9 | TwoHandedStaffEPKFile: string @file(ext: ".epk") 10 | HASH16: i16 @unique 11 | _: bool 12 | _: bool 13 | TwoHandedMaceEPKFile: string @file(ext: ".epk") 14 | OneHandedAxeEPKFile: string @file(ext: ".epk") 15 | TwoHandedAxeEPKFile: string @file(ext: ".epk") 16 | ClawEPKFile: string @file(ext: ".epk") 17 | PETFile: string @file(ext: ".pet") 18 | Shield: string @file(ext: ".epk") 19 | OnHitEffect: string @file(ext: ".epk") 20 | _: string @file(ext: ".epk") 21 | _: string @file(ext: ".epk") 22 | _: string @file(ext: ".epk") 23 | } 24 | -------------------------------------------------------------------------------- /dat-schema/poe2/ItemVisualIdentity.gql: -------------------------------------------------------------------------------- 1 | type ItemVisualIdentity { 2 | Id: string @unique 3 | DDSFile: string @file(ext: ".dds") 4 | AOFile: string @file(ext: ".ao") 5 | InventorySoundEffect: SoundEffects 6 | HASH16: u16 @unique 7 | AOFile2: string @file(ext: ".ao") 8 | MarauderSMFiles: [string] @file(ext: ".sm") 9 | RangerSMFiles: [string] @file(ext: ".sm") 10 | WitchSMFiles: [string] @file(ext: ".sm") 11 | DuelistDexSMFiles: [string] @file(ext: ".sm") 12 | TemplarSMFiles: [string] @file(ext: ".sm") 13 | ShadowSMFiles: [string] @file(ext: ".sm") 14 | ScionSMFiles: [string] @file(ext: ".sm") 15 | MarauderShape: string 16 | RangerShape: string 17 | WitchShape: string 18 | DuelistShape: string 19 | TemplarShape: string 20 | ShadowShape: string 21 | ScionShape: string 22 | _: rid 23 | _: i32 24 | Pickup_AchievementItems: [AchievementItems] 25 | SMFiles: [string] @file(ext: ".sm") 26 | Identify_AchievementItems: [AchievementItems] 27 | EPKFile: string @file(ext: ".epk") 28 | Corrupt_AchievementItems: [AchievementItems] 29 | IsAlternateArt: bool 30 | _: bool 31 | CreateCorruptedJewelAchievementItem: AchievementItems 32 | AnimationLocation: string 33 | _: string 34 | _: string 35 | _: string 36 | _: string 37 | _: string 38 | _: string 39 | _: string 40 | _: string 41 | _: string 42 | _: string 43 | _: string 44 | _: string 45 | IsAtlasOfWorldsMapIcon: bool 46 | IsTier16Icon: bool 47 | _: [i32] 48 | _: bool 49 | _: [rid] 50 | _: [string] 51 | _: [string] 52 | _: [string] 53 | _: [string] 54 | _: [string] 55 | _: [string] 56 | _: [string] 57 | _: string 58 | _: string 59 | _: string 60 | _: string 61 | _: string 62 | _: string 63 | _: string 64 | _: string 65 | _: string 66 | "0: Standard, 1: Flask, 2: Divination Card, 3: Gem" 67 | Composition: i32 68 | _: rid 69 | _: rid 70 | _: rid 71 | _: rid 72 | _: [string] 73 | _: [string] 74 | _: [string] 75 | _: [string] 76 | _: [string] 77 | _: [string] 78 | _: rid 79 | _: string 80 | _: string 81 | _: string 82 | _: string 83 | _: string 84 | _: string 85 | _: string 86 | _: rid 87 | _: rid 88 | } -------------------------------------------------------------------------------- /dat-schema/poe2/KeywordPopups.gql: -------------------------------------------------------------------------------- 1 | type KeywordPopups { 2 | Id: string @unique 3 | Term: string 4 | Definition: string 5 | _: string 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/MapSeries.gql: -------------------------------------------------------------------------------- 1 | type MapSeries { 2 | Id: string @unique 3 | Name: string 4 | BaseIcon_DDSFile: string @file(ext: ".dds") 5 | Infected_DDSFile: string @file(ext: ".dds") 6 | Shaper_DDSFile: string @file(ext: ".dds") 7 | Elder_DDSFile: string @file(ext: ".dds") 8 | Drawn_DDSFile: string @file(ext: ".dds") 9 | Delirious_DDSFile: string @file(ext: ".dds") 10 | UberBlight_DDSFile: string @file(ext: ".dds") 11 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Maps.gql: -------------------------------------------------------------------------------- 1 | type Maps @tags(list: ["item:def", "item:recipe"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Regular_WorldArea: WorldAreas 4 | MonsterPacks: [MonsterPacks] 5 | AchievementItem: AchievementItems 6 | _: string 7 | Tier: i32 8 | MapSeries: i32 9 | _: bool 10 | _: bool 11 | _: bool 12 | } 13 | -------------------------------------------------------------------------------- /dat-schema/poe2/ModGrantedSkills.gql: -------------------------------------------------------------------------------- 1 | type ModGrantedSkills { 2 | Mod: Mods 3 | Skill: SkillGems 4 | } 5 | -------------------------------------------------------------------------------- /dat-schema/poe2/Mods.gql: -------------------------------------------------------------------------------- 1 | type Mods @tags(list: ["crafting"]) { 2 | Id: string @unique 3 | HASH16: u16 4 | ModType: ModType 5 | Level: i32 6 | Stat1: Stats 7 | Stat2: Stats 8 | Stat3: Stats 9 | Stat4: Stats 10 | Domain: ModDomains 11 | Name: string 12 | GenerationType: ModGenerationType 13 | Families: [ModFamily] 14 | Stat1Value: i32 @interval 15 | Stat2Value: i32 @interval 16 | Stat3Value: i32 @interval 17 | Stat4Value: i32 @interval 18 | SpawnWeight_Tags: [Tags] 19 | SpawnWeight_Values: [i32] 20 | Tags: [Tags] 21 | GrantedEffectsPerLevel: [GrantedEffectsPerLevel] 22 | AuraFlags: [ModAuraFlags] 23 | MonsterMetadata: string 24 | MonsterKillAchievements: [AchievementItems] 25 | ChestModType: [ModType] 26 | Stat5Value: i32 @interval 27 | Stat5: Stats 28 | FullAreaClear_AchievementItems: [AchievementItems] 29 | AchievementItems: [AchievementItems] 30 | GenerationWeight_Tags: [Tags] 31 | GenerationWeight_Values: [i32] 32 | ModifyMapsAchievements: [AchievementItems] 33 | Stat6Value: i32 @interval 34 | Stat6: Stats 35 | MaxLevel: i32 36 | _: bool 37 | CraftingItemClassRestrictions: [ItemClasses] 38 | MonsterOnDeath: string 39 | _: i32 40 | HeistAchievements: [AchievementItems] 41 | Heist_SubStatValue1: i32 42 | Heist_SubStatValue2: i32 43 | Heist_Stat0: Stats 44 | Heist_Stat1: Stats 45 | Heist_AddStatValue1: i32 46 | Heist_AddStatValue2: i32 47 | InfluenceType: InfluenceTypes 48 | ImplicitTags: [Tags] 49 | _: bool 50 | _: i32 51 | _: i32 52 | _: i32 53 | _: i32 54 | _: i32 55 | _: i32 56 | _: i32 57 | _: i32 58 | _: i32 59 | _: i32 60 | _: i32 61 | _: i32 62 | _: i32 63 | _: i32 64 | _: i32 65 | _: i32 66 | BuffTemplate: BuffTemplates 67 | ArchnemesisMinionMod: Mods 68 | HASH32: u32 69 | _: [rid] 70 | _: i32 71 | _: [GrantedEffectsPerLevel] 72 | RadiusJewelType: i32 73 | IsEssenceOnlyModifier: bool 74 | } 75 | -------------------------------------------------------------------------------- /dat-schema/poe2/MonsterPacks.gql: -------------------------------------------------------------------------------- 1 | type MonsterPacks { 2 | Id: string 3 | WorldAreas: [WorldAreas] 4 | MinCount: i32 5 | MaxCount: i32 6 | BossMonsterSpawnChance: i32 7 | BossCount: i32 8 | BossMonsters: [MonsterVarieties] 9 | _: bool 10 | _: [i32] 11 | Grounds: [string] 12 | Tags: [Tags] 13 | MinLevel: i32 14 | MaxLevel: i32 15 | _: [_] 16 | Formation: PackFormation 17 | _: i32 18 | _: bool 19 | _: [string] 20 | _: bool 21 | _: bool 22 | _: string 23 | _: bool 24 | _: bool 25 | AdditionalMonsters: [MonsterVarieties] 26 | AdditionalCounts: [i32] 27 | } 28 | -------------------------------------------------------------------------------- /dat-schema/poe2/MonsterVarieties.gql: -------------------------------------------------------------------------------- 1 | type MonsterVarieties { 2 | Id: string @unique 3 | MonsterType: MonsterTypes 4 | MovementSpeed: i32 5 | ObjectSize: i32 6 | MinimumAttackDistance: i32 7 | MaximumAttackDistance: i32 8 | ACTFiles: [string] @file(ext: ".act") 9 | AOFiles: [string] @file(ext: ".ao") 10 | BaseMonsterTypeIndex: string @files(ext: [".ot", ".otc"]) 11 | Mods: [Mods] 12 | _: i32 13 | _: string 14 | _: string 15 | "in percent" 16 | ModelSizeMultiplier: i32 17 | _: i32 18 | _: i32 19 | _: rid 20 | _: i32 21 | _: i32 22 | Tags: [Tags] 23 | "in percent" 24 | ExperienceMultiplier: i32 25 | _: [i32] 26 | MinAgroRange: i32 27 | MaxAgroRange: i32 28 | SpotlightColour1: i32 29 | SpotlightColour2: i32 30 | SpotlightColour3: i32 31 | GrantedEffects: [GrantedEffects] 32 | AISFile: string @file(ext: ".ais") 33 | Mods2: [Mods] 34 | Stance: string 35 | _: rid 36 | Name: string 37 | "in percent" 38 | DamageMultiplier: i32 39 | "in percent" 40 | LifeMultiplier: i32 41 | "in ms" 42 | AttackSpeed: i32 43 | Weapon1_ItemVisualIdentity: [ItemVisualIdentity] 44 | Weapon2_ItemVisualIdentity: [ItemVisualIdentity] 45 | Back_ItemVisualIdentity: ItemVisualIdentity 46 | MainHand_ItemClass: ItemClasses 47 | OffHand_ItemClass: ItemClasses 48 | Helmet_ItemVisualIdentity: ItemVisualIdentity 49 | _: i32 50 | KillSpecificMonsterCount_AchievementItems: [AchievementItems] 51 | Special_Mods: [Mods] 52 | KillRare_AchievementItems: [AchievementItems] 53 | _: bool 54 | _: i32 55 | _: i32 56 | _: i32 57 | _: i32 58 | _: i32 59 | _: i32 60 | HASH16: u16 61 | _: bool 62 | _: string 63 | KillWhileOnslaughtIsActive_AchievementItem: AchievementItems 64 | MonsterSegment: MonsterSegments 65 | MonsterArmour: MonsterArmours 66 | KillWhileTalismanIsActive_AchievementItem: AchievementItems 67 | Part1_Mods: [Mods] 68 | Part2_Mods: [Mods] 69 | Endgame_Mods: [Mods] 70 | _: rid 71 | _: i32 72 | _: i32 73 | _: [rid] 74 | MultiPartAchievements: [MultiPartAchievements] 75 | _: i32 76 | SinkAnimation_AOFile: string @file(ext: ".ao") 77 | _: bool 78 | _: [rid] 79 | _: bool 80 | _: bool 81 | _: bool 82 | _: i32 83 | _: i32 84 | _: f32 85 | AilmentThreshold: i32 86 | SinkEffect: i32 87 | _: i32 88 | MonsterConditionalEffectPack: MonsterConditionalEffectPacks 89 | _: bool 90 | _: bool 91 | _: i32 92 | _: bool 93 | _: i32 94 | _: i32 95 | _: i32 96 | _: i32 97 | _: i32 98 | _: i32 99 | _: i32 100 | _: i32 101 | _: i32 102 | _: i32 103 | _: i32 104 | _: i32 105 | BossHealthBar: bool 106 | _: rid 107 | _: i32 108 | _: bool 109 | _: i32 110 | _: i32 111 | _: i32 112 | _: i32 113 | _: bool 114 | _: rid 115 | _: f32 116 | _: f32 117 | _: bool 118 | _: [_] 119 | _: rid 120 | _: i32 121 | _: i32 122 | _: f32 123 | _: rid 124 | _: bool 125 | _: i32 126 | _: bool 127 | _: i32 128 | } 129 | -------------------------------------------------------------------------------- /dat-schema/poe2/NPCTextAudio.gql: -------------------------------------------------------------------------------- 1 | type NPCTextAudio { 2 | Id: string 3 | Characters: [Characters] 4 | Text: string 5 | AudioFiles: [string] 6 | _: i32 7 | _: i32 8 | _: bool 9 | _: bool 10 | _: i32 11 | _: i32 12 | _: i32 13 | _: i32 14 | _: i32 15 | NPCs: [NPCs] 16 | } 17 | -------------------------------------------------------------------------------- /dat-schema/poe2/NPCs.gql: -------------------------------------------------------------------------------- 1 | type NPCs { 2 | Id: string @unique 3 | Name: string 4 | Metadata: string @files(ext: [".ot", ".otc"]) 5 | _: rid 6 | NPCMasterKey: NPCMaster 7 | ShortName: string 8 | _: i32 9 | NPCAudios1: [NPCAudio] 10 | NPCAudios2: [NPCAudio] 11 | HASH16: i16 12 | _: NPCs 13 | Portrait: NPCPortraits 14 | DialogueStyle: NPCDialogueStyles 15 | _: rid 16 | Gender: string 17 | _: bool 18 | _: string 19 | _: rid 20 | } -------------------------------------------------------------------------------- /dat-schema/poe2/PantheonPanelLayout.gql: -------------------------------------------------------------------------------- 1 | type PantheonPanelLayout { 2 | Id: string @unique 3 | X: i32 4 | Y: i32 5 | IsMajorGod: bool 6 | CoverImage: string 7 | GodName2: string 8 | SelectionImage: string 9 | Effect1_Stats: [Stats] 10 | Effect1_Values: [i32] 11 | Effect2_Stats: [Stats] 12 | GodName3: string 13 | Effect3_Values: [i32] 14 | Effect3_Stats: [Stats] 15 | GodName4: string 16 | Effect4_Stats: [Stats] 17 | Effect4_Values: [i32] 18 | GodName1: string 19 | Effect2_Values: [i32] 20 | QuestFlag: QuestFlags 21 | AchievementItems: [AchievementItems] 22 | LeagueQuestFlag1: i32 23 | LeagueQuestFlag2: i32 24 | LeagueQuestFlag3: i32 25 | LeagueQuestFlag4: i32 26 | _: rid 27 | _: bool 28 | DowngradeFlags: [QuestFlags] 29 | } 30 | -------------------------------------------------------------------------------- /dat-schema/poe2/PassiveJewelSlots.gql: -------------------------------------------------------------------------------- 1 | type PassiveJewelSlots { 2 | Slot: PassiveSkills 3 | ClusterJewelSize: PassiveTreeExpansionJewelSizes 4 | ClusterIndex: i32 5 | ReplacesSlot: PassiveJewelSlots 6 | ProxySlot: PassiveSkills 7 | StartIndices: [i32] 8 | _: rid 9 | } -------------------------------------------------------------------------------- /dat-schema/poe2/PassiveSkillMasteryEffects.gql: -------------------------------------------------------------------------------- 1 | type PassiveSkillMasteryEffects { 2 | Id: string @unique 3 | HASH16: u16 @unique 4 | Stats: [Stats] 5 | Stat1Value: i32 6 | Stat2Value: i32 7 | Stat3Value: i32 8 | AchievementItem: AchievementItems 9 | } -------------------------------------------------------------------------------- /dat-schema/poe2/PassiveSkills.gql: -------------------------------------------------------------------------------- 1 | type PassiveSkills { 2 | Id: string @unique 3 | Icon_DDSFile: string @file(ext: ".dds") 4 | Stats: [Stats] 5 | Stat1Value: i32 6 | Stat2Value: i32 7 | Stat3Value: i32 8 | Stat4Value: i32 9 | "Id used by PassiveSkillGraph.psg" 10 | PassiveSkillGraphId: u16 @unique 11 | Name: string 12 | Characters: [Characters] 13 | IsKeystone: bool 14 | IsNotable: bool 15 | FlavourText: string 16 | IsJustIcon: bool 17 | AchievementItem: AchievementItems 18 | IsJewelSocket: bool 19 | Ascendancy: Ascendancy 20 | IsAscendancyStartingNode: bool 21 | ReminderStrings: [ReminderText] 22 | SkillPointsGranted: i32 23 | IsMultipleChoice: bool 24 | IsMultipleChoiceOption: bool 25 | Stat5Value: i32 26 | PassiveSkillBuffs: [BuffTemplates] 27 | IsAnointmentOnly: bool 28 | _: i32 29 | IsExpansion: bool 30 | IsProxyPassive: bool 31 | SkillType: PassiveSkillTypes 32 | MasteryGroup: PassiveSkillMasteryGroups 33 | Group: AtlasPassiveSkillTreeGroupType 34 | SoundEffect: SoundEffects 35 | AtlasnodeGroup: string 36 | _: i32 37 | _: i32 38 | _: i32 39 | _: i32 40 | _: i32 41 | _: bool 42 | _: [rid] 43 | _: i32 44 | _: [rid] 45 | _: bool 46 | KeystoneId: rid 47 | _: bool 48 | IsAttribute: bool 49 | AtlasSubTree: AtlasPassiveSkillSubTrees 50 | IsRootOfAtlasTree: bool 51 | GrantedSkill: SkillGems 52 | WeaponPointsGranted: i32 53 | _: bool 54 | _: bool 55 | } -------------------------------------------------------------------------------- /dat-schema/poe2/QuestItems.gql: -------------------------------------------------------------------------------- 1 | type QuestItems { 2 | BaseItemType: BaseItemTypes @unique 3 | TriggeredQuestFlag: QuestFlags 4 | _: QuestFlags 5 | _: i32 6 | _: [_] # All rows empty 7 | _: bool 8 | _: bool 9 | HelpText: ClientStrings 10 | Description: ClientStrings 11 | Script: string 12 | _: rid 13 | _: rid 14 | _: i32 15 | } 16 | -------------------------------------------------------------------------------- /dat-schema/poe2/Rarity.gql: -------------------------------------------------------------------------------- 1 | type Rarity { 2 | Id: string 3 | MinMods: i32 4 | MaxMods: i32 5 | _: i32 6 | MaxPrefix: i32 7 | _: i32 8 | MaxSuffix: i32 9 | Color: string 10 | } -------------------------------------------------------------------------------- /dat-schema/poe2/RitualStashTabLayout.gql: -------------------------------------------------------------------------------- 1 | type RitualStashTabLayout { 2 | Id: string @unique 3 | StoredItem: BaseItemTypes 4 | XOffset: i32 5 | YOffset: i32 6 | FirstSlotIndex: i32 @unique 7 | Width: i32 8 | Height: i32 9 | _: bool 10 | } -------------------------------------------------------------------------------- /dat-schema/poe2/ShapeShiftForms.gql: -------------------------------------------------------------------------------- 1 | type ShapeShiftForms { 2 | Id: string @unique 3 | AOFile: string @file(ext: ".ao") 4 | ACTFile: string @file(ext: ".act") 5 | Source: MiscEffectPacks 6 | Destination: MiscEffectPacks 7 | StatsKeys: [Stats] 8 | StatsValues: [i32] 9 | _: rid 10 | _: i32 11 | _: string 12 | _: i32 13 | _: f32 14 | _: f32 15 | _: f32 16 | SkillStat: Stats 17 | _: i32 18 | _: bool 19 | Status: string 20 | } 21 | -------------------------------------------------------------------------------- /dat-schema/poe2/ShieldTypes.gql: -------------------------------------------------------------------------------- 1 | type ShieldTypes @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Block: i32 4 | _: i32 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/poe2/ShopTag.gql: -------------------------------------------------------------------------------- 1 | type ShopTag { 2 | Id: string 3 | Name: string @localized 4 | IsCategory: bool 5 | Category: ShopTag 6 | _: bool 7 | SubFlagArt: string 8 | IsGuild: bool 9 | Parent: ShopTag 10 | CategoryArt: string 11 | } 12 | -------------------------------------------------------------------------------- /dat-schema/poe2/SkillCraftingData.gql: -------------------------------------------------------------------------------- 1 | type SkillCraftingData { 2 | Id: string 3 | Character: Characters 4 | ListBackground: string 5 | Icon: string 6 | ConsoleIcon: string 7 | Name: string 8 | } -------------------------------------------------------------------------------- /dat-schema/poe2/SkillGemSupports.gql: -------------------------------------------------------------------------------- 1 | type SkillGemSupports { 2 | SkillGem: SkillGems 3 | Supports: [SkillGems] 4 | } -------------------------------------------------------------------------------- /dat-schema/poe2/SkillGems.gql: -------------------------------------------------------------------------------- 1 | type SkillGems @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | StrengthRequirementPercent: i32 4 | DexterityRequirementPercent: i32 5 | IntelligenceRequirementPercent: i32 6 | VaalVariant_BaseItemType: BaseItemTypes 7 | IsVaalVariant: bool 8 | MinionGlobalSkillLevelStat: Stats 9 | GemType: i32 10 | _: bool 11 | _: bool 12 | Awakened: rid 13 | GemColour: i32 14 | MinLevelReq: i32 15 | ItemExperienceType: ItemExperienceTypes 16 | CraftingTypes: [SkillCraftingData] 17 | MtxSlotTypes: [MicrotransactionSkillGemEffectSlotTypes] 18 | _: bool 19 | GemEffects: [GemEffects] 20 | _: bool 21 | TutorialVideo: string @file(ext: ".bk2") 22 | UI_Image: string @file(ext: ".dds") 23 | _: i32 24 | CraftingLevel: i32 25 | _: bool 26 | _: i32 27 | _: bool 28 | _: [rid] 29 | } 30 | -------------------------------------------------------------------------------- /dat-schema/poe2/SkillGemsForUniqueStat.gql: -------------------------------------------------------------------------------- 1 | type SkillGemsForUniqueStat { 2 | Index: i32 3 | SkillGems: [SkillGems] 4 | _: bool 5 | } 6 | -------------------------------------------------------------------------------- /dat-schema/poe2/SocketableStashTabLayout.gql: -------------------------------------------------------------------------------- 1 | type SocketableStashTabLayout { 2 | Id: string @unique 3 | StoredItem: BaseItemTypes 4 | XOffset: i32 5 | YOffset: i32 6 | FirstSlotIndex: i32 @unique 7 | Width: i32 8 | Height: i32 9 | _: bool 10 | # _: something here 11 | # IsUpgradable: bool 12 | } -------------------------------------------------------------------------------- /dat-schema/poe2/SoulCores.gql: -------------------------------------------------------------------------------- 1 | type SoulCores { 2 | BaseItemType: BaseItemTypes @unique 3 | StatsMartialWeapon: [Stats] 4 | StatsValuesMartialWeapon: [i32] 5 | StatsArmour: [Stats] 6 | StatsValuesArmour: [i32] 7 | Rank: i32 8 | StatsCasterWeapon: [Stats] 9 | StatsValuesCasterWeapon: [i32] 10 | StatsAllEquipment: [Stats] 11 | StatsValuesAllEquipment: [i32] 12 | } -------------------------------------------------------------------------------- /dat-schema/poe2/SoulCoresPerClass.gql: -------------------------------------------------------------------------------- 1 | type SoulCoresPerClass { 2 | BaseItemType: BaseItemTypes 3 | ItemClass: ItemClasses 4 | Stats: [Stats] 5 | StatsValues: [i32] 6 | } 7 | -------------------------------------------------------------------------------- /dat-schema/poe2/Stats.gql: -------------------------------------------------------------------------------- 1 | type Stats @tags(list: ["crafting"]) { 2 | Id: string @unique 3 | _: bool 4 | IsLocal: bool 5 | IsWeaponLocal: bool 6 | Semantic: StatSemantics 7 | Text: string 8 | _: bool 9 | IsVirtual: bool 10 | MainHandAlias_Stat: Stats 11 | OffHandAlias_Stat: Stats 12 | _: bool 13 | HASH32: u32 14 | BelongsActiveSkills: [ActiveSkills] @ref(column: "Id") 15 | Category: PassiveSkillStatCategories 16 | _: bool 17 | _: bool 18 | """ 19 | If not, displayed in advanced mod description as " — Unscalable Value" 20 | """ 21 | IsScalable: bool 22 | ContextFlags: [VirtualStatContextFlags] 23 | DotFlag: [VirtualStatContextFlags] 24 | WeaponHandCheck: bool 25 | } 26 | -------------------------------------------------------------------------------- /dat-schema/poe2/StatsFromSkillStats.gql: -------------------------------------------------------------------------------- 1 | type StatsFromSkillStats { 2 | SkillCondition: Stats 3 | GrantedFlag: Stats 4 | FlagValue: bool 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/SupportGems.gql: -------------------------------------------------------------------------------- 1 | type SupportGems { 2 | SkillGem: SkillGems 3 | _: i32 4 | Icon: string @file(ext: ".dds") 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Tags.gql: -------------------------------------------------------------------------------- 1 | type Tags { 2 | Id: string @unique 3 | HASH32: u32 4 | DisplayString: string 5 | _: [rid] 6 | UiHints: string 7 | } -------------------------------------------------------------------------------- /dat-schema/poe2/Topologies.gql: -------------------------------------------------------------------------------- 1 | type Topologies { 2 | Id: string @unique 3 | DGRFile: string @file(ext: ".dgr") 4 | _: i32 5 | _: i32 6 | _: i32 7 | _: [_] 8 | _: [_] 9 | } 10 | -------------------------------------------------------------------------------- /dat-schema/poe2/UltimatumModifiers.gql: -------------------------------------------------------------------------------- 1 | 2 | type UltimatumModifiers { 3 | Id: string @unique 4 | Types: [UltimatumModifierTypes] 5 | ExtraMods: [Mods] 6 | TypesFiltered: [UltimatumModifierTypes] 7 | PreviousTier: [UltimatumModifiers] 8 | _: bool 9 | Name: string 10 | Icon: string 11 | HASH16: u16 12 | _: i16 13 | _: [string] 14 | BuffTemplates: [BuffTemplates] 15 | Tier: i32 16 | Description: string 17 | _: [_] 18 | TextAudio: NPCTextAudio 19 | _: rid 20 | MapStats: [Stats] 21 | MapStatValues: [i32] 22 | MapMods: [Mods] 23 | } 24 | -------------------------------------------------------------------------------- /dat-schema/poe2/UltimatumTrialLength.gql: -------------------------------------------------------------------------------- 1 | type UltimatumTrialLength { 2 | MinAreaLevel: i32 3 | Length: i32 4 | } 5 | -------------------------------------------------------------------------------- /dat-schema/poe2/UltimatumWagerTypes.gql: -------------------------------------------------------------------------------- 1 | type UltimatumWagerTypes { 2 | Id: string @unique 3 | HASH16: u16 4 | CurrencyItem: CurrencyItems 5 | Count: i32 6 | DisplayText: string @localized 7 | } 8 | -------------------------------------------------------------------------------- /dat-schema/poe2/UncutGemAdditionalTiers.gql: -------------------------------------------------------------------------------- 1 | type UncutGemAdditionalTiers { 2 | BaseItemType: BaseItemTypes 3 | AreaLevel: i32 4 | Tier: i32 5 | Odds: i32 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/UncutGemTiers.gql: -------------------------------------------------------------------------------- 1 | type UncutGemTiers { 2 | BaseItemType: BaseItemTypes 3 | Tier: i32 4 | AreaLevel: i32 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/UtilityFlaskBuffs.gql: -------------------------------------------------------------------------------- 1 | type UtilityFlaskBuffs { 2 | BuffDefinition: BuffDefinitions 3 | StatValues: [i32] 4 | StatValues2: [i32] 5 | _: rid 6 | } -------------------------------------------------------------------------------- /dat-schema/poe2/WeaponClasses.gql: -------------------------------------------------------------------------------- 1 | type WeaponClasses { 2 | ItemClass: ItemClasses 3 | RangeMax: i32 4 | _: rid 5 | } -------------------------------------------------------------------------------- /dat-schema/poe2/WeaponTypes.gql: -------------------------------------------------------------------------------- 1 | type WeaponTypes @tags(list: ["item:def"]) { 2 | BaseItemType: BaseItemTypes @unique 3 | Critical: i32 4 | _: rid 5 | "1000 / speed -> attacks per second" 6 | Speed: i32 7 | DamageMin: i32 8 | DamageMax: i32 9 | RangeMax: i32 10 | ReloadTime: i32 11 | } 12 | -------------------------------------------------------------------------------- /dat-schema/poe2/WieldableClasses.gql: -------------------------------------------------------------------------------- 1 | type WieldableClasses { 2 | ItemClass: ItemClasses 3 | _: bool 4 | _: bool 5 | _: rid 6 | _: rid 7 | _: rid 8 | _: rid 9 | _: rid 10 | _: rid 11 | _: rid 12 | _: rid 13 | _: rid 14 | _: rid 15 | _: rid 16 | _: rid 17 | _: rid 18 | _: rid 19 | _: rid 20 | _: rid 21 | _: rid 22 | _: rid 23 | _: rid 24 | _: rid 25 | _: rid 26 | _: rid 27 | _: rid 28 | _: rid 29 | _: i32 30 | } -------------------------------------------------------------------------------- /dat-schema/poe2/WorldAreas.gql: -------------------------------------------------------------------------------- 1 | type WorldAreas { 2 | Id: string 3 | Name: string 4 | Act: i32 5 | IsTown: bool 6 | HasWaypoint: bool 7 | Connections: [WorldAreas] 8 | AreaLevel: i32 9 | HASH16: i16 10 | _: i32 11 | _: i32 12 | LoadingScreens: [string] 13 | FlagOnEntered: [QuestFlags] 14 | RequiredFlags: [QuestFlags] 15 | _: i32 16 | Topologies: [Topologies] 17 | ParentTown: WorldAreas 18 | _: i32 19 | _: rid 20 | _: rid 21 | Bosses: [MonsterVarieties] 22 | _: [_] 23 | _: [_] 24 | _: [_] 25 | _: bool 26 | _: [_] 27 | _: rid 28 | _: rid 29 | AreaMods: [Mods] 30 | _: i32 31 | _: bool 32 | _: i32 33 | _: i32 34 | _: bool 35 | _: i32 36 | _: i32 37 | Tags: [Tags] 38 | _: rid 39 | _: rid 40 | _: i32 41 | _: i32 42 | _: rid 43 | _: [string] 44 | _: bool 45 | _: rid 46 | _: rid 47 | _: i32 48 | _: i32 49 | _: i32 50 | Environment: Environments 51 | _: i32 52 | TerrainPlugins: TerrainPlugins 53 | } 54 | -------------------------------------------------------------------------------- /graphql.config.yml: -------------------------------------------------------------------------------- 1 | projects: 2 | poe1: 3 | schema: 4 | - 'dat-schema/*.gql' 5 | - 'meta.gql' 6 | documents: 'dat-schema/*.gql' 7 | poe2: 8 | schema: 9 | - 'dat-schema/poe2/**/*.gql' 10 | - 'meta.gql' 11 | documents: 'dat-schema/poe2/**/*.gql' 12 | -------------------------------------------------------------------------------- /meta.gql: -------------------------------------------------------------------------------- 1 | scalar i16 2 | scalar i32 3 | 4 | scalar u16 5 | scalar u32 6 | 7 | scalar f32 8 | 9 | scalar string 10 | scalar bool 11 | scalar rid 12 | scalar _ 13 | 14 | directive @unique on FIELD_DEFINITION 15 | directive @localized on FIELD_DEFINITION 16 | directive @interval on FIELD_DEFINITION 17 | 18 | directive @file( 19 | ext: String 20 | ) on FIELD_DEFINITION 21 | 22 | directive @tags( 23 | list: [String] 24 | ) repeatable on FIELD_DEFINITION | OBJECT 25 | 26 | directive @files( 27 | ext: [String] 28 | ) on FIELD_DEFINITION 29 | 30 | directive @ref( 31 | column: String 32 | ) on FIELD_DEFINITION 33 | 34 | directive @indexing( 35 | first: Int 36 | ) on ENUM 37 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pathofexile-dat-schema", 3 | "version": "8.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "pathofexile-dat-schema", 9 | "version": "8.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@parcel/watcher": "^2.5.0", 13 | "@types/node": "^22.0.0", 14 | "graphql": "^16.7.1", 15 | "typescript": "^5.1.6" 16 | } 17 | }, 18 | "node_modules/@parcel/watcher": { 19 | "version": "2.5.0", 20 | "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", 21 | "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", 22 | "dev": true, 23 | "hasInstallScript": true, 24 | "license": "MIT", 25 | "dependencies": { 26 | "detect-libc": "^1.0.3", 27 | "is-glob": "^4.0.3", 28 | "micromatch": "^4.0.5", 29 | "node-addon-api": "^7.0.0" 30 | }, 31 | "engines": { 32 | "node": ">= 10.0.0" 33 | }, 34 | "funding": { 35 | "type": "opencollective", 36 | "url": "https://opencollective.com/parcel" 37 | }, 38 | "optionalDependencies": { 39 | "@parcel/watcher-android-arm64": "2.5.0", 40 | "@parcel/watcher-darwin-arm64": "2.5.0", 41 | "@parcel/watcher-darwin-x64": "2.5.0", 42 | "@parcel/watcher-freebsd-x64": "2.5.0", 43 | "@parcel/watcher-linux-arm-glibc": "2.5.0", 44 | "@parcel/watcher-linux-arm-musl": "2.5.0", 45 | "@parcel/watcher-linux-arm64-glibc": "2.5.0", 46 | "@parcel/watcher-linux-arm64-musl": "2.5.0", 47 | "@parcel/watcher-linux-x64-glibc": "2.5.0", 48 | "@parcel/watcher-linux-x64-musl": "2.5.0", 49 | "@parcel/watcher-win32-arm64": "2.5.0", 50 | "@parcel/watcher-win32-ia32": "2.5.0", 51 | "@parcel/watcher-win32-x64": "2.5.0" 52 | } 53 | }, 54 | "node_modules/@parcel/watcher-android-arm64": { 55 | "version": "2.5.0", 56 | "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", 57 | "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", 58 | "cpu": [ 59 | "arm64" 60 | ], 61 | "dev": true, 62 | "license": "MIT", 63 | "optional": true, 64 | "os": [ 65 | "android" 66 | ], 67 | "engines": { 68 | "node": ">= 10.0.0" 69 | }, 70 | "funding": { 71 | "type": "opencollective", 72 | "url": "https://opencollective.com/parcel" 73 | } 74 | }, 75 | "node_modules/@parcel/watcher-darwin-arm64": { 76 | "version": "2.5.0", 77 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", 78 | "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", 79 | "cpu": [ 80 | "arm64" 81 | ], 82 | "dev": true, 83 | "license": "MIT", 84 | "optional": true, 85 | "os": [ 86 | "darwin" 87 | ], 88 | "engines": { 89 | "node": ">= 10.0.0" 90 | }, 91 | "funding": { 92 | "type": "opencollective", 93 | "url": "https://opencollective.com/parcel" 94 | } 95 | }, 96 | "node_modules/@parcel/watcher-darwin-x64": { 97 | "version": "2.5.0", 98 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", 99 | "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", 100 | "cpu": [ 101 | "x64" 102 | ], 103 | "dev": true, 104 | "license": "MIT", 105 | "optional": true, 106 | "os": [ 107 | "darwin" 108 | ], 109 | "engines": { 110 | "node": ">= 10.0.0" 111 | }, 112 | "funding": { 113 | "type": "opencollective", 114 | "url": "https://opencollective.com/parcel" 115 | } 116 | }, 117 | "node_modules/@parcel/watcher-freebsd-x64": { 118 | "version": "2.5.0", 119 | "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", 120 | "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", 121 | "cpu": [ 122 | "x64" 123 | ], 124 | "dev": true, 125 | "license": "MIT", 126 | "optional": true, 127 | "os": [ 128 | "freebsd" 129 | ], 130 | "engines": { 131 | "node": ">= 10.0.0" 132 | }, 133 | "funding": { 134 | "type": "opencollective", 135 | "url": "https://opencollective.com/parcel" 136 | } 137 | }, 138 | "node_modules/@parcel/watcher-linux-arm-glibc": { 139 | "version": "2.5.0", 140 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", 141 | "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", 142 | "cpu": [ 143 | "arm" 144 | ], 145 | "dev": true, 146 | "license": "MIT", 147 | "optional": true, 148 | "os": [ 149 | "linux" 150 | ], 151 | "engines": { 152 | "node": ">= 10.0.0" 153 | }, 154 | "funding": { 155 | "type": "opencollective", 156 | "url": "https://opencollective.com/parcel" 157 | } 158 | }, 159 | "node_modules/@parcel/watcher-linux-arm-musl": { 160 | "version": "2.5.0", 161 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", 162 | "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", 163 | "cpu": [ 164 | "arm" 165 | ], 166 | "dev": true, 167 | "license": "MIT", 168 | "optional": true, 169 | "os": [ 170 | "linux" 171 | ], 172 | "engines": { 173 | "node": ">= 10.0.0" 174 | }, 175 | "funding": { 176 | "type": "opencollective", 177 | "url": "https://opencollective.com/parcel" 178 | } 179 | }, 180 | "node_modules/@parcel/watcher-linux-arm64-glibc": { 181 | "version": "2.5.0", 182 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", 183 | "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", 184 | "cpu": [ 185 | "arm64" 186 | ], 187 | "dev": true, 188 | "license": "MIT", 189 | "optional": true, 190 | "os": [ 191 | "linux" 192 | ], 193 | "engines": { 194 | "node": ">= 10.0.0" 195 | }, 196 | "funding": { 197 | "type": "opencollective", 198 | "url": "https://opencollective.com/parcel" 199 | } 200 | }, 201 | "node_modules/@parcel/watcher-linux-arm64-musl": { 202 | "version": "2.5.0", 203 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", 204 | "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", 205 | "cpu": [ 206 | "arm64" 207 | ], 208 | "dev": true, 209 | "license": "MIT", 210 | "optional": true, 211 | "os": [ 212 | "linux" 213 | ], 214 | "engines": { 215 | "node": ">= 10.0.0" 216 | }, 217 | "funding": { 218 | "type": "opencollective", 219 | "url": "https://opencollective.com/parcel" 220 | } 221 | }, 222 | "node_modules/@parcel/watcher-linux-x64-glibc": { 223 | "version": "2.5.0", 224 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", 225 | "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", 226 | "cpu": [ 227 | "x64" 228 | ], 229 | "dev": true, 230 | "license": "MIT", 231 | "optional": true, 232 | "os": [ 233 | "linux" 234 | ], 235 | "engines": { 236 | "node": ">= 10.0.0" 237 | }, 238 | "funding": { 239 | "type": "opencollective", 240 | "url": "https://opencollective.com/parcel" 241 | } 242 | }, 243 | "node_modules/@parcel/watcher-linux-x64-musl": { 244 | "version": "2.5.0", 245 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", 246 | "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", 247 | "cpu": [ 248 | "x64" 249 | ], 250 | "dev": true, 251 | "license": "MIT", 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">= 10.0.0" 258 | }, 259 | "funding": { 260 | "type": "opencollective", 261 | "url": "https://opencollective.com/parcel" 262 | } 263 | }, 264 | "node_modules/@parcel/watcher-win32-arm64": { 265 | "version": "2.5.0", 266 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", 267 | "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", 268 | "cpu": [ 269 | "arm64" 270 | ], 271 | "dev": true, 272 | "license": "MIT", 273 | "optional": true, 274 | "os": [ 275 | "win32" 276 | ], 277 | "engines": { 278 | "node": ">= 10.0.0" 279 | }, 280 | "funding": { 281 | "type": "opencollective", 282 | "url": "https://opencollective.com/parcel" 283 | } 284 | }, 285 | "node_modules/@parcel/watcher-win32-ia32": { 286 | "version": "2.5.0", 287 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", 288 | "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", 289 | "cpu": [ 290 | "ia32" 291 | ], 292 | "dev": true, 293 | "license": "MIT", 294 | "optional": true, 295 | "os": [ 296 | "win32" 297 | ], 298 | "engines": { 299 | "node": ">= 10.0.0" 300 | }, 301 | "funding": { 302 | "type": "opencollective", 303 | "url": "https://opencollective.com/parcel" 304 | } 305 | }, 306 | "node_modules/@parcel/watcher-win32-x64": { 307 | "version": "2.5.0", 308 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", 309 | "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "license": "MIT", 315 | "optional": true, 316 | "os": [ 317 | "win32" 318 | ], 319 | "engines": { 320 | "node": ">= 10.0.0" 321 | }, 322 | "funding": { 323 | "type": "opencollective", 324 | "url": "https://opencollective.com/parcel" 325 | } 326 | }, 327 | "node_modules/@types/node": { 328 | "version": "22.10.2", 329 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", 330 | "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", 331 | "dev": true, 332 | "license": "MIT", 333 | "dependencies": { 334 | "undici-types": "~6.20.0" 335 | } 336 | }, 337 | "node_modules/braces": { 338 | "version": "3.0.3", 339 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 340 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 341 | "dev": true, 342 | "license": "MIT", 343 | "dependencies": { 344 | "fill-range": "^7.1.1" 345 | }, 346 | "engines": { 347 | "node": ">=8" 348 | } 349 | }, 350 | "node_modules/detect-libc": { 351 | "version": "1.0.3", 352 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 353 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 354 | "dev": true, 355 | "license": "Apache-2.0", 356 | "bin": { 357 | "detect-libc": "bin/detect-libc.js" 358 | }, 359 | "engines": { 360 | "node": ">=0.10" 361 | } 362 | }, 363 | "node_modules/fill-range": { 364 | "version": "7.1.1", 365 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 366 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 367 | "dev": true, 368 | "license": "MIT", 369 | "dependencies": { 370 | "to-regex-range": "^5.0.1" 371 | }, 372 | "engines": { 373 | "node": ">=8" 374 | } 375 | }, 376 | "node_modules/graphql": { 377 | "version": "16.10.0", 378 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", 379 | "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", 380 | "dev": true, 381 | "license": "MIT", 382 | "engines": { 383 | "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" 384 | } 385 | }, 386 | "node_modules/is-extglob": { 387 | "version": "2.1.1", 388 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 389 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 390 | "dev": true, 391 | "license": "MIT", 392 | "engines": { 393 | "node": ">=0.10.0" 394 | } 395 | }, 396 | "node_modules/is-glob": { 397 | "version": "4.0.3", 398 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 399 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 400 | "dev": true, 401 | "license": "MIT", 402 | "dependencies": { 403 | "is-extglob": "^2.1.1" 404 | }, 405 | "engines": { 406 | "node": ">=0.10.0" 407 | } 408 | }, 409 | "node_modules/is-number": { 410 | "version": "7.0.0", 411 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 412 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 413 | "dev": true, 414 | "license": "MIT", 415 | "engines": { 416 | "node": ">=0.12.0" 417 | } 418 | }, 419 | "node_modules/micromatch": { 420 | "version": "4.0.8", 421 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 422 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 423 | "dev": true, 424 | "license": "MIT", 425 | "dependencies": { 426 | "braces": "^3.0.3", 427 | "picomatch": "^2.3.1" 428 | }, 429 | "engines": { 430 | "node": ">=8.6" 431 | } 432 | }, 433 | "node_modules/node-addon-api": { 434 | "version": "7.1.1", 435 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 436 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 437 | "dev": true, 438 | "license": "MIT" 439 | }, 440 | "node_modules/picomatch": { 441 | "version": "2.3.1", 442 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 443 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 444 | "dev": true, 445 | "license": "MIT", 446 | "engines": { 447 | "node": ">=8.6" 448 | }, 449 | "funding": { 450 | "url": "https://github.com/sponsors/jonschlinkert" 451 | } 452 | }, 453 | "node_modules/to-regex-range": { 454 | "version": "5.0.1", 455 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 456 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 457 | "dev": true, 458 | "license": "MIT", 459 | "dependencies": { 460 | "is-number": "^7.0.0" 461 | }, 462 | "engines": { 463 | "node": ">=8.0" 464 | } 465 | }, 466 | "node_modules/typescript": { 467 | "version": "5.7.2", 468 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", 469 | "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", 470 | "dev": true, 471 | "license": "Apache-2.0", 472 | "bin": { 473 | "tsc": "bin/tsc", 474 | "tsserver": "bin/tsserver" 475 | }, 476 | "engines": { 477 | "node": ">=14.17" 478 | } 479 | }, 480 | "node_modules/undici-types": { 481 | "version": "6.20.0", 482 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 483 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 484 | "dev": true, 485 | "license": "MIT" 486 | } 487 | } 488 | } 489 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pathofexile-dat-schema", 3 | "version": "8.0.0", 4 | "license": "MIT", 5 | "type": "module", 6 | "exports": "./dist/index.js", 7 | "scripts": { 8 | "generate": "tsc --noCheck && node dist/cli.js", 9 | "generate:watch": "tsc --noCheck && node dist/cli.js --watch" 10 | }, 11 | "files": [ 12 | "dist/index.*", 13 | "dist/types.*" 14 | ], 15 | "devDependencies": { 16 | "@parcel/watcher": "^2.5.0", 17 | "@types/node": "^22.0.0", 18 | "graphql": "^16.7.1", 19 | "typescript": "^5.1.6" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'node:path'; 2 | import { fileURLToPath } from 'node:url'; 3 | import * as process from 'node:process'; 4 | import * as fs from 'node:fs'; 5 | import { Source, GraphQLError } from 'graphql'; 6 | import { readSchemaSources } from './reader.js'; 7 | import { 8 | SchemaFile, 9 | SchemaLine, 10 | SchemaMetadata, 11 | SCHEMA_VERSION, 12 | } from './types.js'; 13 | 14 | const __dirname = path.dirname(fileURLToPath(import.meta.url)); 15 | 16 | const WATCH_MODE = process.argv.includes('--watch'); 17 | 18 | const SCHEMA_PATH = 19 | process.argv 20 | .slice(2) 21 | .filter((arg) => arg !== '--watch') 22 | .at(0) || path.join(__dirname, '../dat-schema'); 23 | 24 | function read() { 25 | const sources = fs.readdirSync(SCHEMA_PATH, { recursive: true, withFileTypes: true }) 26 | .filter(entry => entry.isFile()) 27 | .map((entry) => { 28 | const contents = fs.readFileSync(path.join(entry.parentPath, entry.name), { 29 | encoding: 'utf-8', 30 | }); 31 | return new Source(contents, path.relative(SCHEMA_PATH, path.join(entry.parentPath, entry.name))); 32 | }); 33 | 34 | try { 35 | return readSchemaSources(sources); 36 | } catch (e) { 37 | if (e instanceof GraphQLError) { 38 | console.error(e.toString()); 39 | if (e.originalError instanceof GraphQLError) { 40 | console.error('\n-----\n' + e.originalError.toString()); 41 | } 42 | return null; 43 | } else { 44 | throw e; 45 | } 46 | } 47 | } 48 | 49 | function runOnce(): boolean { 50 | const readResult = read(); 51 | if (!readResult) return false; 52 | 53 | const metadata: SchemaMetadata = { 54 | version: SCHEMA_VERSION, 55 | createdAt: Math.floor(Date.now() / 1000), 56 | }; 57 | 58 | fs.writeFileSync( 59 | path.join(process.cwd(), './schema.min.json'), 60 | JSON.stringify({ ...metadata, ...readResult } satisfies SchemaFile) 61 | ); 62 | 63 | fs.writeFileSync( 64 | path.join(process.cwd(), './schema.jsonl'), 65 | [metadata, ...readResult.tables, ...readResult.enumerations] 66 | .map((line: SchemaLine) => JSON.stringify(line)) 67 | .join('\n') + '\n' 68 | ); 69 | 70 | console.log(`[${new Date().toISOString()}] Done.`); 71 | return true; 72 | } 73 | 74 | const ok = runOnce(); 75 | if (!ok && !WATCH_MODE) { 76 | process.exit(1); 77 | } 78 | 79 | if (WATCH_MODE) { 80 | const watcher = await import('@parcel/watcher'); 81 | watcher.subscribe(SCHEMA_PATH, () => { 82 | console.clear(); 83 | runOnce(); 84 | }); 85 | } 86 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './types.js'; 2 | 3 | export const SCHEMA_URL = 4 | 'https://github.com/poe-tool-dev/dat-schema/releases/download/latest/schema.min.json'; 5 | -------------------------------------------------------------------------------- /src/reader.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'node:assert'; 2 | import { 3 | parse, 4 | Source, 5 | TypeDefinitionNode, 6 | ObjectTypeDefinitionNode, 7 | FieldDefinitionNode, 8 | DirectiveNode, 9 | EnumTypeDefinitionNode, 10 | GraphQLError, 11 | } from 'graphql'; 12 | import { 13 | SchemaTable, 14 | TableColumn, 15 | ColumnType, 16 | RefUsingColumn, 17 | SchemaEnumeration, 18 | SchemaFile, 19 | ValidFor, 20 | } from './types.js'; 21 | 22 | // prettier-ignore 23 | const ScalarTypes: ReadonlySet = new Set([ 24 | 'bool', 25 | 'string', 26 | 'i16', 27 | 'u16', 28 | 'i32', 29 | 'u32', 30 | 'f32', 31 | ]); 32 | 33 | const DIRECTIVE_REF = { 34 | NAME: 'ref', 35 | ARGS: { 36 | COLUMN: 'column', 37 | }, 38 | validate(directive: DirectiveNode) { 39 | if (!directive.arguments?.length) { 40 | throw new GraphQLError('Missing referenced column name.', { 41 | nodes: directive, 42 | }); 43 | } 44 | for (const arg of directive.arguments) { 45 | if (arg.name.value === DIRECTIVE_REF.ARGS.COLUMN) { 46 | if (arg.value.kind !== 'StringValue') { 47 | throw new GraphQLError(`String expected.`, { nodes: arg.value }); 48 | } 49 | } else { 50 | throw new GraphQLError(`Unknown argument "${arg.name.value}".`, { 51 | nodes: arg.name, 52 | }); 53 | } 54 | } 55 | }, 56 | }; 57 | 58 | const DIRECTIVE_UNIQUE = { 59 | NAME: 'unique', 60 | validate(directive: DirectiveNode) { 61 | if (directive.arguments?.length) { 62 | throw new GraphQLError(`Directive doesn't accept arguments.`, { 63 | nodes: directive.arguments, 64 | }); 65 | } 66 | }, 67 | }; 68 | 69 | const DIRECTIVE_LOCALIZED = { 70 | NAME: 'localized', 71 | validate(directive: DirectiveNode) { 72 | if (directive.arguments?.length) { 73 | throw new GraphQLError(`Directive doesn't accept arguments.`, { 74 | nodes: directive.arguments, 75 | }); 76 | } 77 | }, 78 | }; 79 | 80 | const DIRECTIVE_FILE = { 81 | NAME: 'file', 82 | ARGS: { 83 | EXTENSION: 'ext', 84 | }, 85 | validate(directive: DirectiveNode) { 86 | if (!directive.arguments?.length) { 87 | throw new GraphQLError('Missing file extension.', { nodes: directive }); 88 | } 89 | for (const arg of directive.arguments) { 90 | if (arg.name.value === DIRECTIVE_FILE.ARGS.EXTENSION) { 91 | if (arg.value.kind !== 'StringValue') { 92 | throw new GraphQLError(`String expected.`, { nodes: arg.value }); 93 | } 94 | } else { 95 | throw new GraphQLError(`Unknown argument "${arg.name.value}".`, { 96 | nodes: arg.name, 97 | }); 98 | } 99 | } 100 | }, 101 | }; 102 | 103 | const DIRECTIVE_FILES_GROUP = { 104 | NAME: 'files', 105 | ARGS: { 106 | EXTENSION: 'ext', 107 | }, 108 | validate(directive: DirectiveNode) { 109 | if (!directive.arguments?.length) { 110 | throw new GraphQLError('Missing file extensions.', { nodes: directive }); 111 | } 112 | for (const arg of directive.arguments) { 113 | if (arg.name.value === DIRECTIVE_FILES_GROUP.ARGS.EXTENSION) { 114 | if (arg.value.kind !== 'ListValue') { 115 | throw new GraphQLError(`List of extensions expected.`, { 116 | nodes: arg.value, 117 | }); 118 | } 119 | // NOTE allow empty list 120 | // if (!arg.value.values.length) { 121 | // throw new GraphQLError(`List of extensions cannot be empty.`, arg.value); 122 | // } 123 | for (const listValue of arg.value.values) { 124 | if (listValue.kind !== 'StringValue') { 125 | throw new GraphQLError(`String expected.`, { nodes: listValue }); 126 | } 127 | } 128 | } else { 129 | throw new GraphQLError(`Unknown argument "${arg.name.value}".`, { 130 | nodes: arg.name, 131 | }); 132 | } 133 | } 134 | }, 135 | }; 136 | 137 | const DIRECTIVE_ENUM_INDEXING = { 138 | NAME: 'indexing', 139 | ARGS: { 140 | FIRST: 'first', 141 | }, 142 | validate(directive: DirectiveNode) { 143 | if (!directive.arguments?.length) { 144 | throw new GraphQLError('Missing first enumerator index.', { 145 | nodes: directive, 146 | }); 147 | } 148 | for (const arg of directive.arguments) { 149 | if (arg.name.value === DIRECTIVE_ENUM_INDEXING.ARGS.FIRST) { 150 | if ( 151 | arg.value.kind !== 'IntValue' || 152 | (Number(arg.value.value) !== 0 && Number(arg.value.value) !== 1) 153 | ) { 154 | throw new GraphQLError(`Integer 0 or 1 expected.`, { 155 | nodes: arg.value, 156 | }); 157 | } 158 | } else { 159 | throw new GraphQLError(`Unknown argument "${arg.name.value}".`, { 160 | nodes: arg.name, 161 | }); 162 | } 163 | } 164 | }, 165 | }; 166 | 167 | const DIRECTIVE_TABLE_TAGS = { 168 | NAME: 'tags', 169 | ARGS: { 170 | LIST: 'list', 171 | }, 172 | validate(directive: DirectiveNode) { 173 | if (!directive.arguments?.length) { 174 | throw new GraphQLError('Missing list of tags.', { nodes: directive }); 175 | } 176 | for (const arg of directive.arguments) { 177 | if (arg.name.value === DIRECTIVE_TABLE_TAGS.ARGS.LIST) { 178 | if (arg.value.kind !== 'ListValue') { 179 | throw new GraphQLError(`List of tags expected.`, { 180 | nodes: arg.value, 181 | }); 182 | } 183 | if (!arg.value.values.length) { 184 | throw new GraphQLError(`At least one tag should be in the list.`, { 185 | nodes: arg.value, 186 | }); 187 | } 188 | for (const listValue of arg.value.values) { 189 | if (listValue.kind !== 'StringValue') { 190 | throw new GraphQLError(`String expected.`, { nodes: listValue }); 191 | } 192 | } 193 | } else { 194 | throw new GraphQLError(`Unknown argument "${arg.name.value}".`, { 195 | nodes: arg.name, 196 | }); 197 | } 198 | } 199 | }, 200 | }; 201 | 202 | const DIRECTIVE_INTERVAL = { 203 | NAME: 'interval', 204 | validate(directive: DirectiveNode) { 205 | if (directive.arguments?.length) { 206 | throw new GraphQLError(`Interval doesn't accept arguments.`, { 207 | nodes: directive.arguments, 208 | }); 209 | } 210 | }, 211 | }; 212 | 213 | class VersionedTypedefNode implements Iterable<[ValidFor, T]> { 214 | constructor ( 215 | public vBase?: T, 216 | public vOverride?: T, 217 | ) {} 218 | 219 | *[Symbol.iterator](): Iterator<[ValidFor, T]> { 220 | if (this.vBase != null && this.vOverride != null) { 221 | yield [ValidFor.PoE1, this.vBase]; 222 | yield [ValidFor.PoE2, this.vOverride]; 223 | } else if (this.vOverride != null) { 224 | yield [ValidFor.PoE2, this.vOverride]; 225 | } else if (this.vBase != null) { 226 | yield [ValidFor.Common, this.vBase]; 227 | } 228 | } 229 | } 230 | 231 | class VersionedTypedefMap { 232 | readonly data = new Map>(); 233 | 234 | add(typeNode: T, override: boolean): boolean { 235 | const existingNode = this.data.get(typeNode.name.value); 236 | if (!existingNode) { 237 | this.data.set(typeNode.name.value, new VersionedTypedefNode( 238 | !override ? typeNode : undefined, 239 | override ? typeNode : undefined, 240 | )); 241 | } else if (override) { 242 | if (existingNode.vOverride != null) return false; 243 | existingNode.vOverride = typeNode; 244 | } else { 245 | if (existingNode.vBase != null) return false; 246 | existingNode.vBase = typeNode; 247 | } 248 | return true; 249 | } 250 | } 251 | 252 | class ScopedTypedefMap { 253 | constructor ( 254 | private data: ReadonlyMap>, 255 | private ver: ValidFor 256 | ) { 257 | if (ver === ValidFor.Common) { 258 | this.ver = ValidFor.PoE1; 259 | } 260 | } 261 | 262 | get(name: string): T | undefined { 263 | const node = this.data.get(name); 264 | if (node != null) { 265 | if (this.ver === ValidFor.PoE1) { 266 | return node.vBase; 267 | } else { 268 | return node.vOverride ?? node.vBase; 269 | } 270 | } 271 | } 272 | 273 | has(name: string): boolean { 274 | return this.get(name) != null; 275 | } 276 | } 277 | 278 | interface Context { 279 | typeDefsMap: ScopedTypedefMap; 280 | enumDefsMap: ScopedTypedefMap; 281 | } 282 | 283 | export function readSchemaSources( 284 | sources: readonly Source[] 285 | ): Pick { 286 | const typeDefsMap = new VersionedTypedefMap(); 287 | const enumDefsMap = new VersionedTypedefMap(); 288 | 289 | for (const source of sources) { 290 | const doc = parse(source, { noLocation: false }); 291 | 292 | for (const typeNode of doc.definitions) { 293 | if (typeNode.kind !== 'EnumTypeDefinition' && typeNode.kind !== 'ObjectTypeDefinition') { 294 | throw new GraphQLError('Unsupported definition.', { nodes: typeNode }); 295 | } 296 | 297 | const override = source.name.startsWith('poe2'); 298 | if (typeNode.kind === 'EnumTypeDefinition') { 299 | if (!enumDefsMap.add(typeNode, override)) { 300 | throw new GraphQLError( 301 | 'Enum with this name has already been defined.', 302 | { nodes: typeNode.name } 303 | ); 304 | } 305 | } else if (typeNode.kind === 'ObjectTypeDefinition') { 306 | if (!typeDefsMap.add(typeNode, override)) { 307 | throw new GraphQLError( 308 | 'Table with this name has already been defined.', 309 | { nodes: typeNode.name } 310 | ); 311 | } 312 | } 313 | } 314 | } 315 | 316 | const tables: SchemaTable[] = []; 317 | for (const verNode of typeDefsMap.data.values()) { 318 | for (const [validFor, typeNode] of verNode) { 319 | const table: SchemaTable = { 320 | validFor: validFor, 321 | name: typeNode.name.value, 322 | columns: [], 323 | tags: [], 324 | }; 325 | 326 | validateDirectives(typeNode, [DIRECTIVE_TABLE_TAGS]); 327 | table.tags = getTags(typeNode); 328 | 329 | const ctx: Context = { 330 | typeDefsMap: new ScopedTypedefMap(typeDefsMap.data, validFor), 331 | enumDefsMap: new ScopedTypedefMap(enumDefsMap.data, validFor), 332 | }; 333 | assert.ok(typeNode.fields != null); 334 | for (const fieldNode of typeNode.fields) { 335 | const column = parseFieldNode( 336 | ctx, 337 | table.name, 338 | fieldNode 339 | ); 340 | if ( 341 | column.name != null && 342 | table.columns.some((col) => col.name === column.name) 343 | ) { 344 | throw new GraphQLError(`Duplicate column name "${column.name}".`, { 345 | nodes: fieldNode.name, 346 | }); 347 | } 348 | table.columns.push(column); 349 | } 350 | 351 | tables.push(table); 352 | } 353 | } 354 | 355 | const enumerations: SchemaEnumeration[] = []; 356 | for (const verNode of enumDefsMap.data.values()) { 357 | for (const [validFor, enumNode] of verNode) { 358 | const enum_ = parseEnumNode(enumNode, validFor); 359 | enumerations.push(enum_); 360 | } 361 | } 362 | 363 | return { tables, enumerations }; 364 | } 365 | 366 | function parseEnumNode(enumNode: EnumTypeDefinitionNode, validFor: ValidFor) { 367 | const schemaEnum: SchemaEnumeration = { 368 | validFor: validFor, 369 | name: enumNode.name.value, 370 | indexing: 0, 371 | enumerators: [], 372 | }; 373 | 374 | validateDirectives(enumNode, [DIRECTIVE_ENUM_INDEXING]); 375 | { 376 | const indexingDirective = findDirective( 377 | enumNode, 378 | DIRECTIVE_ENUM_INDEXING.NAME 379 | ); 380 | if (!indexingDirective) { 381 | throw new GraphQLError('`indexing` directive is required for enums.', { 382 | nodes: enumNode, 383 | }); 384 | } 385 | schemaEnum.indexing = getIndexingBase(enumNode); 386 | } 387 | 388 | assert.ok(enumNode.values != null); 389 | for (const valueNode of enumNode.values) { 390 | if (valueNode.name.value === '_') { 391 | schemaEnum.enumerators.push(null); 392 | } else { 393 | if (schemaEnum.enumerators.includes(valueNode.name.value)) { 394 | throw new GraphQLError( 395 | `Duplicate enumerator "${valueNode.name.value}".`, 396 | { nodes: valueNode.name } 397 | ); 398 | } 399 | schemaEnum.enumerators.push(valueNode.name.value); 400 | } 401 | } 402 | 403 | if ( 404 | schemaEnum.enumerators.length === 1 && 405 | schemaEnum.enumerators[0] === null 406 | ) { 407 | schemaEnum.enumerators = []; 408 | } 409 | 410 | return schemaEnum; 411 | } 412 | 413 | function parseFieldNode( 414 | ctx: Context, 415 | tableName: string, 416 | fieldNode: FieldDefinitionNode 417 | ): TableColumn { 418 | validateDirectives(fieldNode, [ 419 | DIRECTIVE_REF, 420 | DIRECTIVE_UNIQUE, 421 | DIRECTIVE_LOCALIZED, 422 | DIRECTIVE_FILE, 423 | DIRECTIVE_FILES_GROUP, 424 | DIRECTIVE_INTERVAL, 425 | ]); 426 | 427 | const unique = isUnique(fieldNode); 428 | const localized = isLocalized(fieldNode); 429 | const refFieldName = referencesField(fieldNode); 430 | const fieldType = unwrapType(fieldNode); 431 | const interval = isInterval(fieldNode); 432 | let references: TableColumn['references'] = null; 433 | 434 | if (fieldType.name === tableName) { 435 | references = { table: tableName }; 436 | fieldType.name = 'row' as ColumnType; 437 | } else if (fieldType.name === 'rid') { 438 | fieldType.name = 'foreignrow' as ColumnType; 439 | } else if (fieldType.name === '_' && fieldType.array) { 440 | fieldType.name = 'array' as ColumnType; 441 | } else if (!ScalarTypes.has(fieldType.name)) { 442 | if (ctx.typeDefsMap.has(fieldType.name)) { 443 | references = { table: fieldType.name }; 444 | fieldType.name = 'foreignrow' as ColumnType; 445 | } else if (ctx.enumDefsMap.has(fieldType.name)) { 446 | references = { table: fieldType.name }; 447 | fieldType.name = 'enumrow' as ColumnType; 448 | } else { 449 | throw new GraphQLError( 450 | `Can't find referenced table/enum "${fieldType.name}".`, 451 | { nodes: fieldNode.type } 452 | ); 453 | } 454 | } 455 | 456 | if (refFieldName) { 457 | assert.ok(references?.table); 458 | (references as RefUsingColumn).column = refFieldName; 459 | const refDefNode = ctx.typeDefsMap.get(references.table); 460 | assert.ok(refDefNode); 461 | 462 | let refFieldType: string | undefined; 463 | try { 464 | refFieldType = findReferencedField(refDefNode, refFieldName); 465 | } catch (e) { 466 | throw new GraphQLError( 467 | 'An error occurred while validating the referenced column.', 468 | { 469 | nodes: findDirective(fieldNode, DIRECTIVE_REF.NAME), 470 | originalError: e as Error, 471 | } 472 | ); 473 | } 474 | 475 | if (!refFieldType) { 476 | throw new GraphQLError( 477 | `Can't find column "${refFieldName}" in table "${references.table}".`, 478 | { nodes: findDirective(fieldNode, DIRECTIVE_REF.NAME) } 479 | ); 480 | } 481 | fieldType.name = refFieldType; 482 | } 483 | 484 | assert.ok( 485 | ScalarTypes.has(fieldType.name) || 486 | fieldType.name === 'array' || 487 | fieldType.name === 'row' || 488 | fieldType.name === 'foreignrow' || 489 | fieldType.name === 'enumrow' 490 | ); 491 | 492 | const column: TableColumn = { 493 | name: fieldNode.name.value === '_' ? null : fieldNode.name.value, 494 | description: fieldNode.description?.value ?? null, 495 | array: fieldType.array, 496 | type: fieldType.name as ColumnType, 497 | unique: unique, 498 | localized: localized, 499 | references: references, 500 | until: null, // TODO 501 | file: getFileExtension(fieldNode), 502 | files: getFileGroupExtensions(fieldNode), 503 | interval: interval, 504 | }; 505 | 506 | return column; 507 | } 508 | 509 | function isUnique(field: FieldDefinitionNode): boolean { 510 | return findDirective(field, DIRECTIVE_UNIQUE.NAME) != null; 511 | } 512 | 513 | function isInterval(field: FieldDefinitionNode): boolean { 514 | return findDirective(field, DIRECTIVE_INTERVAL.NAME) != null; 515 | } 516 | 517 | function isLocalized(field: FieldDefinitionNode): boolean { 518 | return findDirective(field, DIRECTIVE_LOCALIZED.NAME) != null; 519 | } 520 | 521 | function getIndexingBase( 522 | node: EnumTypeDefinitionNode 523 | ): SchemaEnumeration['indexing'] { 524 | const directive = findDirective(node, DIRECTIVE_ENUM_INDEXING.NAME); 525 | assert.ok(directive); 526 | 527 | const { arguments: args } = directive; 528 | assert.ok( 529 | args?.length === 1 && 530 | args[0].name.value === DIRECTIVE_ENUM_INDEXING.ARGS.FIRST && 531 | args[0].value.kind === 'IntValue' 532 | ); 533 | const first = Number(args[0].value.value); 534 | assert.ok(first === 0 || first === 1); 535 | 536 | return first; 537 | } 538 | 539 | function getTags(node: ObjectTypeDefinitionNode): SchemaTable['tags'] { 540 | const directive = findDirective(node, DIRECTIVE_TABLE_TAGS.NAME); 541 | if (!directive) return []; 542 | 543 | const { arguments: args } = directive; 544 | assert.ok( 545 | args?.length === 1 && 546 | args[0].name.value === DIRECTIVE_TABLE_TAGS.ARGS.LIST && 547 | args[0].value.kind === 'ListValue' 548 | ); 549 | return args[0].value.values.map((listValue) => { 550 | assert.ok(listValue.kind === 'StringValue'); 551 | return listValue.value; 552 | }); 553 | } 554 | 555 | function referencesField(field: FieldDefinitionNode): string | undefined { 556 | const directive = findDirective(field, DIRECTIVE_REF.NAME); 557 | 558 | if (directive) { 559 | const { arguments: args } = directive; 560 | assert.ok( 561 | args?.length === 1 && 562 | args[0].name.value === DIRECTIVE_REF.ARGS.COLUMN && 563 | args[0].value.kind === 'StringValue' 564 | ); 565 | return args[0].value.value; 566 | } 567 | } 568 | 569 | function unwrapType(field: FieldDefinitionNode): { 570 | array: boolean; 571 | name: string; 572 | } { 573 | let array = false; 574 | 575 | let { type } = field; 576 | if (type.kind === 'ListType') { 577 | array = true; 578 | type = type.type; 579 | } 580 | 581 | if (type.kind !== 'NamedType') { 582 | throw new GraphQLError('Valid type expected.', { nodes: field.type }); 583 | } 584 | if (type.name.value === '_' && !array) { 585 | throw new GraphQLError('Unknown type is only allowed inside an array.', { 586 | nodes: field.type, 587 | }); 588 | } 589 | 590 | return { 591 | array, 592 | name: type.name.value, 593 | }; 594 | } 595 | 596 | function getFileExtension(field: FieldDefinitionNode): string | null { 597 | const directive = findDirective(field, DIRECTIVE_FILE.NAME); 598 | 599 | if (directive) { 600 | const { arguments: args } = directive; 601 | assert.ok( 602 | args?.length === 1 && 603 | args[0].name.value === DIRECTIVE_FILE.ARGS.EXTENSION && 604 | args[0].value.kind === 'StringValue' 605 | ); 606 | return args[0].value.value; 607 | } 608 | 609 | return null; 610 | } 611 | 612 | function getFileGroupExtensions(field: FieldDefinitionNode): string[] | null { 613 | const directive = findDirective(field, DIRECTIVE_FILES_GROUP.NAME); 614 | 615 | if (directive) { 616 | const { arguments: args } = directive; 617 | assert.ok( 618 | args?.length === 1 && 619 | args[0].name.value === DIRECTIVE_FILES_GROUP.ARGS.EXTENSION && 620 | args[0].value.kind === 'ListValue' 621 | ); 622 | return args[0].value.values.map((listValue) => { 623 | assert.ok(listValue.kind === 'StringValue'); 624 | return listValue.value; 625 | }); 626 | } 627 | 628 | return null; 629 | } 630 | 631 | function findReferencedField( 632 | typeNode: ObjectTypeDefinitionNode, 633 | name: string 634 | ): string | undefined { 635 | assert.ok(typeNode.fields != null); 636 | const fieldNode = typeNode.fields.find((field) => field.name.value === name); 637 | 638 | if (fieldNode) { 639 | const typeInfo = unwrapType(fieldNode); 640 | if (typeInfo.array) { 641 | throw new GraphQLError('Сannot refer to a column with an array type.', { 642 | nodes: fieldNode.type, 643 | }); 644 | } 645 | if (!isUnique(fieldNode)) { 646 | throw new GraphQLError( 647 | 'Values in the referenced column must be unique.', 648 | { nodes: fieldNode } 649 | ); 650 | } 651 | if (!ScalarTypes.has(typeInfo.name)) { 652 | throw new GraphQLError( 653 | 'Сannot refer to a column with a non-scalar type.', 654 | { nodes: fieldNode.type } 655 | ); 656 | } 657 | 658 | return typeInfo.name; 659 | } 660 | } 661 | 662 | function validateDirectives( 663 | node: FieldDefinitionNode | EnumTypeDefinitionNode | ObjectTypeDefinitionNode, 664 | specs: Array<{ NAME: string; validate: (directive: DirectiveNode) => void }> 665 | ): void { 666 | for (const directive of node.directives ?? []) { 667 | const spec = specs.find((spec) => spec.NAME === directive.name.value); 668 | if (spec) { 669 | spec.validate(directive); 670 | } else { 671 | throw new GraphQLError(`Unknown directive "${directive.name.value}".`, { 672 | nodes: directive.name, 673 | }); 674 | } 675 | } 676 | } 677 | 678 | function findDirective( 679 | node: FieldDefinitionNode | EnumTypeDefinitionNode | ObjectTypeDefinitionNode, 680 | name: string 681 | ): DirectiveNode | undefined { 682 | return (node.directives ?? []).find( 683 | (directive) => directive.name.value === name 684 | ); 685 | } 686 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | // incremented only when breaking changes are made 2 | export const SCHEMA_VERSION = 7; 3 | 4 | export type ScalarType = 5 | | 'bool' 6 | | 'string' 7 | | 'i16' 8 | | 'u16' 9 | | 'i32' 10 | | 'u32' 11 | | 'f32'; 12 | 13 | export type ColumnType = 14 | | ScalarType 15 | // column is an array of unknown type 16 | | 'array' 17 | // row index (references column in same table) 18 | | 'row' 19 | // row index (references column in foreign table) 20 | | 'foreignrow' 21 | // row index (references foreign table with no columns) 22 | | 'enumrow'; 23 | 24 | export interface RefUsingRowIndex { 25 | table: string; 26 | } 27 | 28 | export interface RefUsingColumn { 29 | table: string; 30 | column: string; 31 | } 32 | 33 | export type FileExtension = string; 34 | 35 | // Bitmask 36 | export enum ValidFor { 37 | PoE1 = 0x01, 38 | PoE2 = 0x02, 39 | Common = 0x03, 40 | }; 41 | 42 | export interface TableColumn { 43 | name: string | null; 44 | description: string | null; 45 | array: boolean; 46 | type: ColumnType; 47 | unique: boolean; 48 | localized: boolean; 49 | until: string | null; 50 | references: RefUsingRowIndex | RefUsingColumn | null; 51 | file: FileExtension | null; 52 | files: FileExtension[] | null; 53 | interval: boolean; 54 | } 55 | 56 | export interface SchemaTable { 57 | validFor: ValidFor; 58 | name: string; 59 | columns: TableColumn[]; 60 | tags: string[]; 61 | } 62 | 63 | export interface SchemaEnumeration { 64 | validFor: ValidFor; 65 | name: string; 66 | indexing: 0 | 1; 67 | enumerators: Array; 68 | } 69 | 70 | export interface SchemaMetadata { 71 | version: number; 72 | createdAt: number; 73 | } 74 | 75 | // exported as "schema.min.json" 76 | export interface SchemaFile extends SchemaMetadata { 77 | tables: SchemaTable[]; 78 | enumerations: SchemaEnumeration[]; 79 | } 80 | 81 | // exported as "schema.jsonl" 82 | export type SchemaLine = 83 | | SchemaMetadata 84 | | SchemaTable 85 | | SchemaEnumeration; 86 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2021", 4 | "module": "NodeNext", 5 | "moduleResolution": "NodeNext", 6 | "strict": true, 7 | "declaration": true, 8 | "sourceMap": true, 9 | "outDir": "dist", 10 | "rootDir": "src" 11 | } 12 | } 13 | --------------------------------------------------------------------------------