From b7ccc448b469a085f61d68fd289b10a6845096b9 Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Sat, 26 Sep 2026 05:20:08 +0000 Subject: [PATCH] fix(items): strictly align item names & stat descriptions with 1.13c .tbl across inventory, stash, and ground (fixes #480) --- scripts/pack-canonical-tbl.ts | 229 + src/data/canonical-tbl-strings.ts | 7394 +++++++++++++++++++++++ src/game/class-starter-profiles.ts | 130 +- src/game/drop-pipeline.ts | 44 + src/game/ground-items.ts | 2 +- src/game/item-names.ts | 93 +- src/game/item-tooltip.ts | 216 +- src/game/items.ts | 2 + src/game/tooltip-i18n.ts | 177 +- src/ui/ground-labels.ts | 21 +- src/ui/inventory.ts | 14 +- src/ui/item-bridge.ts | 4 +- tests/issue-480-tbl-item-parity.test.ts | 272 + 13 files changed, 8500 insertions(+), 98 deletions(-) create mode 100644 scripts/pack-canonical-tbl.ts create mode 100644 src/data/canonical-tbl-strings.ts create mode 100644 tests/issue-480-tbl-item-parity.test.ts diff --git a/scripts/pack-canonical-tbl.ts b/scripts/pack-canonical-tbl.ts new file mode 100644 index 0000000..b95b822 --- /dev/null +++ b/scripts/pack-canonical-tbl.ts @@ -0,0 +1,229 @@ +/** + * scripts/pack-canonical-tbl.ts + * + * Extracts canonical Diablo II v1.13c `.tbl` string table entries (ENG & CHI) + * and `ItemStatCost.txt` tooltip formatting metadata (`descfunc`, `descval`, + * `descstrpos`, `descstrneg`, `descstr2`, `dgrp*`) from `samples/d2/` MPQ archives + * (`d2data.mpq`, `d2exp.mpq`, `Patch_D2.mpq`) into `src/data/canonical-tbl-strings.ts`. + * + * Ground Truth References: + * - D2MOO `source/D2Common/src/DataTbls/ItemsTbls.cpp` (`0x6FD55280` .. `0x6FD5E020`) + * - D2Client.dll `sub_6FB23F80` (`descfunc` 1..28 & `dgrp` 1..2) + */ + +import * as fs from 'node:fs' +import * as path from 'node:path' +import { MpqArchive } from '../src/mpq/archive.ts' +import { fileSource } from '../src/mpq/file-source.ts' +import { MountedArchives } from '../src/mpq/mount.ts' +import { loadStringTableChain } from '../src/game/item-names.ts' +import { parseTable } from '../src/game/tables.ts' + +async function main() { + const archives = new MountedArchives() + for (const m of ['d2data.mpq', 'd2exp.mpq', 'Patch_D2.mpq']) { + archives.add(m, await MpqArchive.open(await fileSource(`samples/d2/${m}`))) + } + + const eng = await loadStringTableChain(archives, 'ENG') + const chi = await loadStringTableChain(archives, 'CHI') + + const readTxt = async (name: string) => + parseTable(new TextDecoder().decode(await archives.read(`data/global/excel/${name}`))) + + const keys = new Set() + const addKey = (k?: string) => { + const t = k?.trim() + if (t && t !== 'Expansion' && !t.startsWith('*')) { + keys.add(t) + } + } + + // 1. Base items (weapons.txt, armor.txt, misc.txt) + for (const fn of ['weapons.txt', 'armor.txt', 'misc.txt']) { + const t = await readTxt(fn) + for (const r of t.rows) { + addKey(r['namestr']) + addKey(r['code']) + } + } + + // 2. Uniques, SetItems, Sets, Runes, Gems, LowQualityItems + for (const fn of ['UniqueItems.txt', 'SetItems.txt']) { + const t = await readTxt(fn) + for (const r of t.rows) addKey(r['index']) + } + for (const r of (await readTxt('Sets.txt')).rows) { + addKey(r['name']) + addKey(r['index']) + } + for (const r of (await readTxt('Runes.txt')).rows) { + addKey(r['Name']) + } + for (const r of (await readTxt('Gems.txt')).rows) { + addKey(r['name']) + addKey(r['code']) + } + for (const r of (await readTxt('LowQualityItems.txt')).rows) { + addKey(r['Name']) + } + + // 3. MagicPrefix, MagicSuffix, AutoMagic, RarePrefix, RareSuffix + for (const fn of ['MagicPrefix.txt', 'MagicSuffix.txt', 'AutoMagic.txt']) { + const t = await readTxt(fn) + for (const r of t.rows) addKey(r['Name']) + } + for (const fn of ['RarePrefix.txt', 'RareSuffix.txt']) { + const t = await readTxt(fn) + for (const r of t.rows) addKey(r['name']) + } + + // 4. ItemStatCost.txt description & display group keys + const isc = await readTxt('ItemStatCost.txt') + interface IscDescMeta { + id: number + stat: string + descPriority: number + descFunc: number + descVal: number + descStrPos: string + descStrNeg: string + descStr2: string + dgrp: number + dgrpFunc: number + dgrpVal: number + dgrpStrPos: string + dgrpStrNeg: string + dgrpStr2: string + } + const iscMeta: Record = {} + + for (const r of isc.rows) { + const stat = r['Stat']?.trim() + if (!stat) continue + for (const col of ['descstrpos', 'descstrneg', 'descstr2', 'dgrpstrpos', 'dgrpstrneg', 'dgrpstr2']) { + addKey(r[col]) + } + const descFunc = Number(r['descfunc']?.trim() || 0) + const dgrp = Number(r['dgrp']?.trim() || 0) + if (descFunc > 0 || dgrp > 0) { + iscMeta[stat] = { + id: Number(r['ID']?.trim() || 0), + stat, + descPriority: Number(r['descpriority']?.trim() || 0), + descFunc, + descVal: Number(r['descval']?.trim() || 0), + descStrPos: r['descstrpos']?.trim() || '', + descStrNeg: r['descstrneg']?.trim() || '', + descStr2: r['descstr2']?.trim() || '', + dgrp, + dgrpFunc: Number(r['dgrpfunc']?.trim() || 0), + dgrpVal: Number(r['dgrpval']?.trim() || 0), + dgrpStrPos: r['dgrpstrpos']?.trim() || '', + dgrpStrNeg: r['dgrpstrneg']?.trim() || '', + dgrpStr2: r['dgrpstr2']?.trim() || '', + } + } + } + + // 5. CharStats.txt & SkillDesc.txt + for (const r of (await readTxt('CharStats.txt')).rows) { + for (const col of ['StrAllSkills', 'StrSkillTab1', 'StrSkillTab2', 'StrSkillTab3', 'StrClassOnly', 'class']) { + addKey(r[col]) + } + } + for (const r of (await readTxt('SkillDesc.txt')).rows) { + addKey(r['str name']) + } + + // 6. All ModStr*, strMod*, ItemStats*, Weapon*, StrGem*, GemXp*, ExInsert*, Socketable, quality/gold keys + for (const [k] of eng.dict.entries()) { + if ( + k.startsWith('ModStr') || + k.startsWith('strMod') || + k.startsWith('ItemStats') || + k.startsWith('Weapon') || + k.startsWith('StrGem') || + k.startsWith('GemXp') || + k.startsWith('ExInsert') || + k === 'Socketable' || + k === 'gld' || + k === 'Gold' || + k === 'Hiquality' || + k === 'Cracked' || + k === 'Crude' || + k === 'Damaged' || + k === 'Low Quality' || + k === 'Gemmed' || + k === 'GemmedNormalName' + ) { + keys.add(k) + } + } + + const sortedKeys = Array.from(keys).sort() + const engOut: Record = {} + const chiOut: Record = {} + + for (const k of sortedKeys) { + const ev = eng.get(k) + if (ev !== undefined) { + engOut[k] = ev + } + const cv = chi.get(k) + if (cv !== undefined) { + chiOut[k] = cv + } + } + + // Also include expansionstring.tbl index 2745 ("Ethereal (Cannot be Repaired)") under canonical key 'strethereal' + const expTbl = eng.tables[1] + if (expTbl && expTbl[2745]) { + engOut['strethereal'] = expTbl[2745]! + } + + const outPath = path.join(process.cwd(), 'src/data/canonical-tbl-strings.ts') + const fileContent = `/** + * AUTO-GENERATED by \`scripts/pack-canonical-tbl.ts\` from authoritative 1.13c MPQ archives: + * - \`d2data.mpq\` (\`string.tbl\`) + * - \`d2exp.mpq\` (\`expansionstring.tbl\`) + * - \`Patch_D2.mpq\` (\`patchstring.tbl\`) + * - \`data/global/excel/ItemStatCost.txt\` + * + * DO NOT EDIT MANUALLY. + */ + +export interface CanonicalIscDescEntry { + readonly id: number + readonly stat: string + readonly descPriority: number + readonly descFunc: number + readonly descVal: number + readonly descStrPos: string + readonly descStrNeg: string + readonly descStr2: string + readonly dgrp: number + readonly dgrpFunc: number + readonly dgrpVal: number + readonly dgrpStrPos: string + readonly dgrpStrNeg: string + readonly dgrpStr2: string +} + +export const CANONICAL_ENG_TBL_DICT: Readonly> = ${JSON.stringify(engOut, null, 2)} + +export const CANONICAL_CHI_TBL_DICT: Readonly> = ${JSON.stringify(chiOut, null, 2)} + +export const CANONICAL_ISC_DESC_TABLE: Readonly> = ${JSON.stringify(iscMeta, null, 2)} +` + + fs.writeFileSync(outPath, fileContent, 'utf8') + console.log( + `Wrote ${outPath}: ${Object.keys(engOut).length} ENG keys, ${Object.keys(chiOut).length} CHI keys, ${Object.keys(iscMeta).length} ISC entries.`, + ) +} + +main().catch((err) => { + console.error(err) + process.exit(1) +}) diff --git a/src/data/canonical-tbl-strings.ts b/src/data/canonical-tbl-strings.ts new file mode 100644 index 0000000..f3a1321 --- /dev/null +++ b/src/data/canonical-tbl-strings.ts @@ -0,0 +1,7394 @@ +/** + * AUTO-GENERATED by `scripts/pack-canonical-tbl.ts` from authoritative 1.13c MPQ archives: + * - `d2data.mpq` (`string.tbl`) + * - `d2exp.mpq` (`expansionstring.tbl`) + * - `Patch_D2.mpq` (`patchstring.tbl`) + * - `data/global/excel/ItemStatCost.txt` + * + * DO NOT EDIT MANUALLY. + */ + +export interface CanonicalIscDescEntry { + readonly id: number + readonly stat: string + readonly descPriority: number + readonly descFunc: number + readonly descVal: number + readonly descStrPos: string + readonly descStrNeg: string + readonly descStr2: string + readonly dgrp: number + readonly dgrpFunc: number + readonly dgrpVal: number + readonly dgrpStrPos: string + readonly dgrpStrNeg: string + readonly dgrpStr2: string +} + +export const CANONICAL_ENG_TBL_DICT: Readonly> = { + "0sc": "Scroll of Knowledge", + "2ax": "Double Axe", + "2hs": "Two-Handed Sword", + "6bs": "Shillelagh", + "6cb": "Great Bow", + "6cs": "Elder Staff", + "6hb": "Blade Bow", + "6hx": "Colossus Crossbow", + "6l7": "Crusader Bow", + "6lb": "Shadow Bow", + "6ls": "Stalagmite", + "6lw": "Hydra Bow", + "6lx": "Pellet Bow", + "6mx": "Gorgon Crossbow", + "6rx": "Demon Crossbow", + "6s7": "Diamond Bow", + "6sb": "Spider Bow", + "6ss": "Walking Stick", + "6sw": "Ward Bow", + "6ws": "Archon Staff", + "72a": "Ettin Axe", + "72h": "Legend Sword", + "7ar": "Suwayyah", + "7ax": "Small Crescent", + "7b7": "Champion Sword", + "7b8": "Winged Axe", + "7ba": "Silver-edged Axe", + "7bk": "Winged Knife", + "7bl": "Legend Spike", + "7br": "Mancatcher", + "7bs": "Conquest Sword", + "7bt": "Decapitator", + "7bw": "Lich Wand", + "7cl": "Truncheon", + "7cm": "Highland Blade", + "7cr": "Phase Blade", + "7cs": "Battle Cestus", + "7dg": "Bone Knife", + "7di": "Mithril Point", + "7fb": "Colossus Sword", + "7fc": "Hydra Edge", + "7fl": "Scourge", + "7ga": "Champion Axe", + "7gd": "Colossus Blade", + "7gi": "Glorious Axe", + "7gl": "Ghost Glaive", + "7gm": "Thunder Maul", + "7gs": "Balrog Blade", + "7gw": "Unearthed Wand", + "7h7": "Great Poleaxe", + "7ha": "Tomahawk", + "7ja": "Hyperion Javelin", + "7kr": "Fanged Knife", + "7la": "Feral Axe", + "7ls": "Cryptic Sword", + "7lw": "Feral Claws", + "7m7": "Ogre Maul", + "7ma": "Reinforced Mace", + "7mp": "War Spike", + "7mt": "Devil Star", + "7o7": "Ogre Axe", + "7p7": "War Pike", + "7pa": "Cryptic Axe", + "7pi": "Stygian Pilum", + "7qr": "Scissors Suwayyah", + "7qs": "Seraph Rod", + "7s7": "Balrog Spear", + "7s8": "Thresher", + "7sb": "Elegant Blade", + "7sc": "Mighty Scepter", + "7sm": "Ataghan", + "7sp": "Tyrant Club", + "7sr": "Hyperion Spear", + "7ss": "Falcata", + "7st": "Ghost Spear", + "7ta": "Flying Axe", + "7tk": "Flying Knife", + "7tr": "Stygian Pike", + "7ts": "Winged Harpoon", + "7tw": "Runic Talons", + "7vo": "Colossus Voulge", + "7wa": "Berserker Axe", + "7wb": "Wrist Sword", + "7wc": "Giant Thresher", + "7wd": "Mythical Sword", + "7wh": "Legendary Mallet", + "7wn": "Polished Wand", + "7ws": "Caduceus", + "7xf": "War Fist", + "7yw": "Ghost Wand", + "8bs": "Gothic Staff", + "8cb": "Double Bow", + "8cs": "Cedar Staff", + "8hb": "Razor Bow", + "8hx": "Ballista", + "8l8": "Large Siege Bow", + "8lb": "Cedar Bow", + "8ls": "Quarterstaff", + "8lw": "Gothic Bow", + "8lx": "Arbalest", + "8mx": "Siege Crossbow", + "8rx": "Chu-Ko-Nu", + "8s8": "Short Siege Bow", + "8sb": "Edge Bow", + "8ss": "Jo Staff", + "8sw": "Rune Bow", + "8ws": "Rune Staff", + "92a": "Twin Axe", + "92h": "Espandon", + "9ar": "Quhab", + "9ax": "Cleaver", + "9b7": "Lochaber Axe", + "9b8": "Hurlbat", + "9b9": "Gothic Sword", + "9ba": "Bearded Axe", + "9bk": "War Dart", + "9bl": "Stiletto", + "9br": "War Fork", + "9bs": "Battle Sword", + "9bt": "Tabar", + "9bw": "Tomb Wand", + "9cl": "Cudgel", + "9cm": "Dacian Falx", + "9cr": "Dimensional Blade", + "9cs": "Hand Scythe", + "9dg": "Poignard", + "9di": "Rondel", + "9fb": "Zweihander", + "9fc": "Tulwar", + "9fl": "Knout", + "9ga": "Gothic Axe", + "9gd": "Executioner Sword", + "9gi": "Ancient Axe", + "9gl": "Spiculum", + "9gm": "Martel de Fer", + "9gs": "Tusk Sword", + "9gw": "Grave Wand", + "9h9": "Bec-de-Corbin", + "9ha": "Hatchet", + "9ja": "War Javelin", + "9kr": "Cinquedeas", + "9la": "Military Axe", + "9ls": "Rune Sword", + "9lw": "Greater Claws", + "9m9": "War Club", + "9ma": "Flanged Mace", + "9mp": "Crowbill", + "9mt": "Jagged Star", + "9p9": "Lance", + "9pa": "Partizan", + "9pi": "Great Pilum", + "9qr": "Scissors Quhab", + "9qs": "Holy Water Sprinkler", + "9s8": "Battle Scythe", + "9s9": "Simbilan", + "9sb": "Shamshir", + "9sc": "Rune Scepter", + "9sm": "Cutlass", + "9sp": "Barbed Club", + "9sr": "War Spear", + "9ss": "Gladius", + "9st": "Yari", + "9ta": "Francisca", + "9tk": "Battle Dart", + "9tr": "Fuscina", + "9ts": "Harpoon", + "9tw": "Greater Talons", + "9vo": "Bill", + "9wa": "Naga", + "9wb": "Wrist Spike", + "9wc": "Grim Scythe", + "9wd": "Ancient Sword", + "9wh": "Battle Hammer", + "9wn": "Burnt Wand", + "9ws": "Divine Scepter", + "9xf": "Fascia", + "9yw": "Petrified Wand", + "Accursed": "Cursing", + "Acrobat's": "Acrobatic", + "Aldur's Advance": "Aldur's Advance", + "Aldur's Deception": "Aldur's Deception", + "Aldur's Gauntlet": "Aldur's Rhythm", + "Aldur's Stony Gaze": "Aldur's Stony Gaze", + "Aldur's Watchtower": "Aldur's Watchtower", + "Alma Negra": "Alma Negra", + "AmaOnly": "(Amazon Only)", + "Amazon": "Amazon", + "Amber": "Amber", + "Ambergris": "Ambergris", + "Amulet of the Viper": "Amulet of the Viper", + "Andariel's Visage": "Andariel's Visage", + "Angel's": "Angel's", + "Angelic Halo": "Angelic Halo", + "Angelic Mantle": "Angelic Mantle", + "Angelic Sickle": "Angelic Sickle", + "Angelic Wings": "Angelic Wings", + "Angelical Raiment": "Angelic Raiment", + "Annihilus": "Annihilus", + "Antimagic": "Antimagic", + "Arachnid Mesh": "Arachnid Mesh", + "Arcadian": "Arcadian", + "Arcanna's Deathwand": "Arcanna's Deathwand", + "Arcanna's Flesh": "Arcanna's Flesh", + "Arcanna's Head": "Arcanna's Head", + "Arcanna's Sign": "Arcanna's Sign", + "Arcanna's Tricks": "Arcanna's Tricks", + "Arch-Angel's": "Arch-Angel's", + "Archer's": "Archer's", + "Arcing": "Arcing", + "Arctic Binding": "Arctic Binding", + "Arctic Furs": "Arctic Furs", + "Arctic Gear": "Arctic Gear", + "Arctic Horn": "Arctic Horn", + "Arctic Mitts": "Arctic Mitts", + "Argent": "Argent", + "Arioc's Needle": "Arioc's Needle", + "Arkaine's Valor": "Arkaine's Valor", + "Arm of King Leoric": "Arm of King Leoric", + "Armor": "Armor", + "Arreat's Face": "Arreat's Face", + "Artificer's": "Artisan's", + "AssOnly": "(Assassin Only)", + "Assamic": "Lunar", + "Assassin": "Assassin", + "Astral": "Astral", + "Athena's Wrath": "Athena's Wrath", + "Athlete's": "Athletic", + "Atma's Scarab": "Atma's Scarab", + "Atma's Wail": "Atma's Wail", + "Aureolin": "Aureolic", + "Azure": "Azure", + "Azurewrath": "Azurewrath", + "Baezil's Vortex": "Baezil's Vortex", + "Bahamut's": "Bahamut's", + "Bane": "Bane", + "Bane Ash": "Bane Ash", + "BarOnly": "(Barbarian Only)", + "Baranar's Star": "Baranar's Star", + "Barbarian": "Barbarian", + "Beast": "Beast", + "Berserker's": "Berserker's", + "Berserker's Garb": "Berserker's Arsenal", + "Berserker's Hatchet": "Berserker's Hatchet", + "Berserker's Hauberk": "Berserker's Hauberk", + "Berserker's Headgear": "Berserker's Headgear", + "Beryl": "Beryl", + "Bing Sz Wang": "Bing Sz Wang", + "Bitter": "Bitter", + "Black Hades": "Black Hades", + "Blackbog's Sharp": "Blackbog's Sharp", + "Blackhand Key": "Blackhand Key", + "Blackhorn's Face": "Blackhorn's Face", + "Blackleach Blade": "Blackleach Blade", + "Blackoak Shield": "Blackoak Shield", + "Blacktongue": "Blacktongue", + "Blade of Ali Baba": "Blade of Ali Baba", + "Bladebone": "Bladebone", + "Bladebuckle": "Bladebuckle", + "Blanched": "Blanched", + "Blank": "Void", + "Blastbark": "Blastbark", + "Blazing": "Blazing", + "Blessed": "Blessed", + "Blighting": "Blighting", + "Blinkbats Form": "Blinkbat's Form", + "Blood": "Blood", + "Blood Crescent": "Blood Crescent", + "Bloodfist": "Bloodfist", + "Bloodletter": "Bloodletter", + "Bloodmoon": "Bloodmoon", + "Bloodraven's Charge": "Blood Raven's Charge", + "Bloodrise": "Bloodrise", + "Bloodthief": "Bloodthief", + "Bloodtree Stump": "Bloodtree Stump", + "Bloody": "Bloody", + "Bone": "Bone", + "Boneflame": "Boneflame", + "Boneflesh": "Boneflesh", + "Bonehew": "Bonehew", + "Boneshade": "Boneshade", + "Boneslayer Blade": "Boneslayer Blade", + "Bonesob": "Bonesnap", + "Boreal": "Boreal", + "Bowyer's": "Bowyer's", + "Brainhew": "Brainhew", + "Bramble": "Bramble", + "Bright": "Bright", + "Brimstone": "Brimstone", + "Brogues": "Brogues", + "Bronze": "Bronze", + "Brown": "Brown", + "Brutal": "Brutal", + "Bul Katho's Wedding Band": "Bul-Kathos' Wedding Band", + "Bul-Kathos' Children": "Bul-Kathos' Children", + "Bul-Kathos' Sacred Charge": "Bul-Kathos' Sacred Charge", + "Bul-Kathos' Tribal Guardian": "Bul-Kathos' Tribal Guardian", + "Burgundy": "Burgundy", + "Buriza-Do Kyanon": "Buriza-Do Kyanon", + "Burly": "Burly", + "Burning": "Burning", + "Butcher's Pupil": "Butcher's Pupil", + "Buzzing": "Buzzing", + "Bverrit Keep": "Bverrit Keep", + "Calling": "Calling", + "Camphor": "Camphor", + "Captain's": "Captain's", + "Carbuncle": "Carbuncle", + "Caretaker's": "Caretaker's", + "Carin Shard": "Carin Shard", + "Carmine": "Carmine", + "Carrion": "Carrion", + "Carrion Wind": "Carrion Wind", + "Cathan's Mesh": "Cathan's Mesh", + "Cathan's Rule": "Cathan's Rule", + "Cathan's Seal": "Cathan's Seal", + "Cathan's Sigil": "Cathan's Sigil", + "Cathan's Traps": "Cathan's Traps", + "Cathan's Visage": "Cathan's Visage", + "Celestial": "Celestial", + "Cerebus": "Cerebus' Bite", + "Chance Guards": "Chance Guards", + "Chaos": "Chaos", + "Charged": "Charged", + "Chestnut": "Chestnut", + "Chilling": "Chilling", + "Chromatic": "Chromatic", + "Chromatic Ire": "Chromatic Ire", + "Cinnabar": "Cinnabar", + "Civerb's Cudgel": "Civerb's Cudgel", + "Civerb's Icon": "Civerb's Icon", + "Civerb's Vestments": "Civerb's Vestments", + "Civerb's Ward": "Civerb's Ward", + "Class Specific": "Class-specific", + "Cleglaw's Brace": "Cleglaw's Brace", + "Cleglaw's Claw": "Cleglaw's Claw", + "Cleglaw's Pincers": "Cleglaw's Pincers", + "Cleglaw's Tooth": "Cleglaw's Tooth", + "Cliffkiller": "Cliffkiller", + "Cloudcrack": "Cloudcrack", + "Cobalt": "Cobalt", + "Coif of Glory": "Coif of Glory", + "Coldkill": "Coldkill", + "Coldsteel Eye": "Coldsteel Eye", + "Commander's": "Commander's", + "Communal": "Communal", + "Compact": "Compact", + "Consecrated": "Consecrated", + "Constricting Ring": "Constricting Ring", + "Coral": "Coral", + "Corosive": "Corrosive", + "Corpse": "Corpse", + "Corpsemourn": "Corpsemourn", + "Corruption": "Corruption", + "Cow King's Hide": "Cow King's Hide", + "Cow King's Hoofs": "Cow King's Hooves", + "Cow King's Horns": "Cow King's Horns", + "Cow King's Leathers": "Cow King's Leathers", + "Cracked": "Cracked", + "Crainte Vomir": "Crainte Vomir", + "Cranebeak": "Cranebeak", + "Credendum": "Credendum", + "Crescent Moon": "Crescent Moon", + "Crimson": "Crimson", + "Crow Caw": "Crow Caw", + "Crown of Ages": "Crown of Ages", + "Crown of Thieves": "Crown of Thieves", + "Crude": "Crude", + "Cruel": "Cruel", + "Crushflange": "Crushflange", + "Culwens Point": "Culwen's Point", + "Cunning": "Cunning", + "Cutthroat1": "Bartuc's Cut-Throat", + "Damaged": "Damaged", + "Dangoon's Teaching": "Dangoon's Teaching", + "Dark Clan Crusher": "Dark Clan Crusher", + "Darkfear": "Darkfear", + "Darkforge Spawn": "Darkforce Spawn", + "Darkglow": "Darkglow", + "Darksight Helm": "Darksight Helm", + "Deadly": "Deadly", + "Death": "Death", + "Death's Disguise": "Death's Disguise", + "Death's Guard": "Death's Guard", + "Death's Hand": "Death's Hand", + "Death's Touch": "Death's Touch", + "Deathbit": "Deathbit", + "Deathcleaver": "Death Cleaver", + "Deaths's Web": "Death's Web", + "Deathspade": "Deathspade", + "Demon": "Demon", + "Demon Machine": "Demon Machine", + "Demon's Arch": "Demon's Arch", + "Demonhorn's Edge": "Demonhorn's Edge", + "Demonlimb": "Demon Limb", + "Dense": "Dense", + "Devious": "Devious", + "Diamond": "Diamond", + "Dimoaks Hew": "Dimoak's Hew", + "Dire": "Dire", + "Divine": "Divine", + "Djinnslayer": "Djinn Slayer", + "Doom": "Doom", + "Doombringer": "Doombringer", + "Doomspittle": "Doomslinger", + "Dracul's Grasp": "Dracul's Grasp", + "Dragon's": "Dragon's", + "Dragonscale": "Dragonscale", + "Drake's": "Drake's", + "Dread": "Dread", + "DruOnly": "(Druid Only)", + "Druid": "Druid", + "Dun": "Dun", + "Duriel's Shell": "Duriel's Shell", + "Duskdeep": "Duskdeep", + "Dwarf Star": "Dwarf Star", + "Eagle": "Eagle", + "Eagleeye": "Eagleeye", + "Eaglehorn": "Eaglehorn", + "Earthshaker": "Earthshaker", + "Earthshifter": "Earth Shifter", + "Eburin": "Eburine", + "Echoing": "Echoing", + "Elysian": "Elysian", + "Ember": "Fiery", + "Emerald": "Emerald", + "Empyrion": "Empyrian", + "Endlesshail": "Endlesshail", + "Entrapping": "Entrapping", + "Entropy": "Entropy", + "Envenomed": "Foul", + "Eocene": "Righteous", + "Eschuta's temper": "Eschuta's Temper", + "Ethereal Edge": "Ethereal Edge", + "ExInsertSockets": "Can be Inserted into Socketed Items", + "ExInsertSocketsX": "Can be Inserted into Socketed Items", + "Executioner's Justice": "Executioner's Justice", + "Expert's": "Expert's", + "Falconeye": "Falconeye", + "Fanatic": "Fanatic", + "Fathom": "Death's Fathom", + "Fechmars Axe": "Axe of Fechmar", + "Felicitous": "Felicitous", + "Felloak": "Felloak", + "Feral": "Feral", + "Ferocious": "Ferocious", + "Fiendra": "Fiend", + "Fine": "Fine", + "Firelizard's Talons": "Firelizard's Talons", + "Flamebellow": "Flamebellow", + "Flaming": "Flaming", + "Fleshrender": "Fleshrender", + "Fleshripper": "Fleshripper", + "Fletcher's": "Fletcher's", + "Forked": "Forked", + "Fortified": "Fortified", + "Fortuitous": "Fortuitous", + "Freezing": "Freezing", + "Frostburn": "Frostburn", + "Frostwind": "Frostwind", + "Fungal": "Fungal", + "Furious": "Furious", + "Gaea's": "Gaean", + "Gale": "Gale", + "Gargoyle's Bite": "Gargoyle's Bite", + "Garnet": "Garnet", + "GemXp1": "Helms:", + "GemXp2": "Shields:", + "GemXp3": "Weapons:", + "GemXp4": "Armor:", + "Gemmed": "Gemmed", + "GemmedNormalName": "%0 %1", + "Gheed's Fortune": "Gheed's Fortune", + "Ghostflame": "Ghostflame", + "GhoulRI": "Ghoul", + "Ghoulhide": "Ghoulhide", + "Giantmaimer": "Giant Maimer", + "Giantskull": "Giant Skull", + "Gimmershred": "Gimmershred", + "Ginther's Rift": "Ginther's Rift", + "Glacial": "Glacial", + "Gleamscythe": "Gleamscythe", + "Glimmering": "Glimmering", + "Gloomstrap": "Gloom's Trap", + "Glorious": "Glorious", + "Glowing": "Glowing", + "Glyph": "Glyph", + "Goblin Toe": "Goblin Toe", + "Godly": "Godly", + "Godstrike Arch": "Goldstrike Arch", + "Gold": "Gold", + "Goldskin": "Goldskin", + "Goldwrap": "Goldwrap", + "Golemlord's": "Golemlord's", + "Gore Ripper": "Gore Ripper", + "Gorefoot": "Gorefoot", + "Gorerider": "Gore Rider", + "Goreshovel": "Goreshovel", + "Grandmaster's": "Grandmaster's", + "Gravenspine": "Gravenspine", + "Gravepalm": "Gravepalm", + "Graverobber's": "Graverobber's", + "Great Wyrm's": "Great Wyrm's", + "Greyform": "Greyform", + "Griffon's Eye": "Griffon's Eye", + "Grim": "Grim", + "Grim's Burning Dead": "Grim's Burning Dead", + "Griswold's Heart": "Griswold's Heart", + "Griswold's Honor": "Griswold's Honor", + "Griswold's Legacy": "Griswold's Legacy", + "Griswold's Valor": "Griswold's Valor", + "Griswolds Edge": "Griswold's Edge", + "Griswolds's Redemption": "Griswold's Redemption", + "Gritty": "Grinding", + "Guardian Angel": "Guardian Angel", + "Guardian Naga": "Guardian Naga", + "Guardian's": "Guardian's", + "Guillaume's Face": "Guillaume's Face", + "Gull": "Gull", + "Gutsiphon": "Gut Siphon", + "Gymnast's": "Gymnastic", + "Haemosu's Adament": "Haemosu's Adamant", + "Hailstone": "Hailstone", + "Halaberd's Reign": "Halaberd's Reign", + "Hallowed": "Hallowed", + "Hand of Blessed Light": "Hand of Blessed Light", + "Harlequin Crest": "Harlequin Crest", + "Harpoonist's": "Harpoonist's", + "Havoc": "Havoc", + "Hawk Branded": "Hawk Branded", + "Hawkeye": "Hawkeye", + "Hawkmail": "Hawkmail", + "Headhunter's Glory": "Head Hunter's Glory", + "Headstriker": "Headstriker", + "Heart Carver": "Heart Carver", + "Heaven's Brethren": "Heaven's Brethren", + "Heaven's Light": "Heaven's Light", + "Heaven's Taebaek": "Taebaek's Glory", + "Heavenly Garb": "Heavenly Garb", + "Hell Forge Hammer": "Hell Forge Hammer", + "Hellcast": "Hellcast", + "Hellclap": "Hellclap", + "Hellfire Torch": "Hellfire Torch", + "Hellmouth": "Hellmouth", + "Hellplague": "Hellplague", + "Hellrack": "Hellrack", + "Hellslayer": "Hellslayer", + "Herald of Zakarum": "Herald of Zakarum", + "Hexfire": "Hexfire", + "Hexing": "Hexing", + "Hibernal": "Hibernal", + "Hierophant's": "Hierophant's", + "Highlord's Wrath": "Highlord's Wrath", + "Hiquality": "Superior", + "Holocaust": "Armageddon", + "Holy": "Holy", + "Homunculus": "Homunculus", + "Hone Sundan": "Hone Sundan", + "Horadric Staff": "Horadric Staff", + "Horizon's Tornado": "Horizon's Tornado", + "Hotspur": "Hotspur", + "Howling": "Howling", + "Howltusk": "Howltusk", + "Hsarus' Defense": "Hsarus' Defense", + "Hsarus' Iron Fist": "Hsarus' Iron Fist", + "Hsarus' Iron Heel": "Hsarus' Iron Heel", + "Hsarus' Iron Stay": "Hsarus' Iron Stay", + "Husoldal Evo": "Husoldal Evo", + "Hwanin's Justice": "Hwanin's Justice", + "Hwanin's Majesty": "Hwanin's Majesty", + "Hwanin's Refuge": "Hwanin's Refuge", + "Hwanin's Seal": "Hwanin's Blessing", + "Hwanin's Splendor": "Hwanin's Splendor", + "Iceblink": "Iceblink", + "Ichorsting": "Ichorsting", + "Immortal King": "Immortal King", + "Immortal King's Detail": "Immortal King's Detail", + "Immortal King's Forge": "Immortal King's Forge", + "Immortal King's Pillar": "Immortal King's Pillar", + "Immortal King's Stone Crusher": "Immortal King's Stone Crusher", + "Immortal King's Will": "Immortal King's Will", + "Imp": "Imp", + "Infernal Cranium": "Infernal Cranium", + "Infernal Sign": "Infernal Sign", + "Infernal Tools": "Infernal Tools", + "Infernal Torch": "Infernal Torch", + "Infernostride": "Infernostride", + "Iratha's Coil": "Iratha's Coil", + "Iratha's Collar": "Iratha's Collar", + "Iratha's Cord": "Iratha's Cord", + "Iratha's Cuff": "Iratha's Cuff", + "Iratha's Finery": "Iratha's Finery", + "Irices Shard": "Spectral Shard", + "Iron": "Iron", + "Ironpelt": "Iron Pelt", + "Ironstone": "Ironstone", + "Ironward": "Astreon's Iron Ward", + "Iros Torch": "Torch of Iro", + "Isenhart's Armory": "Isenhart's Armory", + "Isenhart's Case": "Isenhart's Case", + "Isenhart's Horns": "Isenhart's Horns", + "Isenhart's Lightbrand": "Isenhart's Lightbrand", + "Isenhart's Parry": "Isenhart's Parry", + "Islestrike": "Islestrike", + "ItemExpansiveChanc1": "%d%% Chance to cast level %d %s on striking", + "ItemExpansiveChanc2": "%d%% Chance to cast level %d %s when struck", + "ItemExpansiveChancX": "%d%% Chance to cast level %d %s on attack", + "ItemStats1a": "Requirements not met", + "ItemStats1b": "Unidentified", + "ItemStats1c": "Charges:", + "ItemStats1d": "Durability:", + "ItemStats1e": "Required Strength:", + "ItemStats1f": "Required Dexterity:", + "ItemStats1g": "Damage:", + "ItemStats1h": "Defense:", + "ItemStats1i": "Quantity:", + "ItemStats1j": "of", + "ItemStats1l": "One-Hand Damage:", + "ItemStats1m": "Two-Hand Damage:", + "ItemStats1n": "Throw Damage:", + "ItemStats1o": "Smite Damage:", + "ItemStats1p": "Required Level:", + "ItemStats1q": "Points:", + "ItemStats1r": "Chance to Block: ", + "ItemStatsrejuv1": "Heals 35% Life and Mana", + "ItemStatsrejuv2": "Heals 100% Life and Mana", + "Ivory": "Ivory", + "Jacinth": "Jacinth", + "Jack's": "Jack's", + "Jade": "Jade", + "Jadetalon": "Jade Talon", + "Jagged": "Jagged", + "Jalal's Mane": "Jalal's Mane", + "Jester's": "Jester's", + "Jeweler's": "Jeweler's", + "Joker's": "Joker's", + "Keeper's": "Keeper's", + "Kelpie Snare": "Kelpie Snare", + "Kenshi's": "Kenshi's", + "Kerke's Sanctuary": "Gerke's Sanctuary", + "KhalimFlail": "Khalim's Flail", + "Kinemils Awl": "Kinemil's Awl", + "King's": "King's", + "Kira's Guardian": "Kira's Guardian", + "Knave's": "Knave's", + "Knell Striker": "Knell Striker", + "Knight's": "Knight's", + "Krintizs Skewer": "Skewer of Krintiz", + "Kuko Shakaku": "Kuko Shakaku", + "Lacerator": "Lacerator", + "Lance Guard": "Lance Guard", + "Lance of Yaggai": "Lance of Yaggai", + "Lancer's": "Lancer's", + "Langer Briser": "Langer Briser", + "Lapis": "Lapis", + "Lapis Lazuli": "Lapis Lazuli", + "Larzuk's Champion": "Larzuk's Champion", + "Lavagout": "Lava Gout", + "Laying of Hands": "Laying of Hands", + "Lazarus Spire": "Spire of Lazarus", + "Leadcrow": "Leadcrow", + "Lenyms Cord": "Lenymo", + "Leviathan": "Leviathan", + "Lidless Wall": "Lidless Wall", + "Lightsabre": "Lightsabre", + "Lion Branded": "Lion Branded", + "Lizard's": "Lizard's", + "Loath": "Loath", + "Lord's": "Lord's", + "Loud": "Alarming", + "Low Quality": "Low Quality", + "Lucky": "Lucky", + "Lycander's Aim": "Lycander's Aim", + "Lycander's Flank": "Lycander's Flank", + "M'avina's Battle Hymn": "M'avina's Battle Hymn", + "M'avina's Caster": "M'avina's Caster", + "M'avina's Embrace": "M'avina's Embrace", + "M'avina's Icy Clutch": "M'avina's Icy Clutch", + "M'avina's Tenet": "M'avina's Tenet", + "M'avina's True Sight": "M'avina's True Sight", + "Maelstromwrath": "Maelstrom", + "Magefist": "Magefist", + "Magekiller's": "Magekiller's", + "Magewrath": "Magewrath", + "Magnus' Skin": "Magnus' Skin", + "Maiden's": "Maiden's", + "Manald Heal": "Manald Heal", + "Mang Song's Lesson": "Mang Song's Lesson", + "Mara's Kaleidoscope": "Mara's Kaleidoscope", + "Maroon": "Maroon", + "Marrowwalk": "Marrowwalk", + "Marshal's": "Marshal's", + "Massive": "Massive", + "Master's": "Master's", + "McAuley's Folly": "Sander's Folly", + "McAuley's Paragon": "Sander's Paragon", + "McAuley's Riprap": "Sander's Riprap", + "McAuley's Superstition": "Sander's Superstition", + "McAuley's Taboo": "Sander's Taboo", + "Mechanist's": "Mechanic's", + "Medusa's Gaze": "Medusa's Gaze", + "Mentalist's": "Mentalist's", + "Merciless": "Merciless", + "Merman's Speed": "Merman's Sprocket", + "Messerschmidt's Reaver": "Messerschmidt's Reaver", + "Metalgrid": "Metalgrid", + "Meteoric": "Meteoric", + "Milabrega's Diadem": "Milabrega's Diadem", + "Milabrega's Orb": "Milabrega's Orb", + "Milabrega's Regalia": "Milabrega's Regalia", + "Milabrega's Robe": "Milabrega's Robe", + "Milabrega's Rod": "Milabrega's Rod", + "Mindrend": "Skull Splitter", + "Miocene": "Enlightened", + "Mnemonic": "Mnemonic", + "ModStr1a": "to Strength", + "ModStr1b": "to Dexterity", + "ModStr1c": "to Vitality", + "ModStr1d": "to Energy", + "ModStr1e": "to Mana", + "ModStr1f": "to Maximum Damage", + "ModStr1g": "to Minimum Damage", + "ModStr1h": "to Attack Rating", + "ModStr1i": "Defense", + "ModStr1j": "Fire Resist", + "ModStr1k": "Cold Resist", + "ModStr1l": "Lightning Resist", + "ModStr1m": "Magic Resist", + "ModStr1n": "Poison Resist", + "ModStr1o": "to Maximum Fire Damage", + "ModStr1p": "to Minimum Fire Damage", + "ModStr1q": "to Maximum Lightning Damage", + "ModStr1r": "to Minimum Lightning Damage", + "ModStr1s": "to Maximum Cold Damage", + "ModStr1t": "to Minimum Cold Damage", + "ModStr1u": "to Life", + "ModStr1v": "Attacker Takes Damage of", + "ModStr1w": "Extra Gold from Monsters", + "ModStr1x": "Better Chance of Getting Magic Items", + "ModStr1y": "Knockback", + "ModStr1z": "Elixir of Strength", + "ModStr2a": "Elixir of Dexterity", + "ModStr2b": "Elixir of Energy", + "ModStr2c": "Elixir of Vitality", + "ModStr2d": "Elixir of Mana", + "ModStr2e": "Elixir of Life", + "ModStr2f": "Sec. Duration", + "ModStr2g": "Increase Maximum Life", + "ModStr2h": "Increase Maximum Mana", + "ModStr2i": "Increase Maximum Durability", + "ModStr2j": "Enhanced Maximum Damage", + "ModStr2k": "Enhanced Minimum Damage", + "ModStr2l": "Replenish Life", + "ModStr2m": "Replenish Mana", + "ModStr2n": "Heal 1/4 Life", + "ModStr2o": "Heal 1/2 Life", + "ModStr2p": "Restore Full Life", + "ModStr2q": "Replenish 1/4 Mana", + "ModStr2r": "Replenish 1/2 Life", + "ModStr2s": "Restore Full Mana", + "ModStr2t": "Magic Damage Reduced by", + "ModStr2u": "Damage Reduced by", + "ModStr2w": "Drain Life", + "ModStr2x": "Drain Mana", + "ModStr2y": "Mana stolen per hit", + "ModStr2z": "Life stolen per hit", + "ModStr3a": "to Amazon Skill Levels", + "ModStr3b": "to Paladin Skill Levels", + "ModStr3c": "to Necromancer Skill Levels", + "ModStr3d": "to Sorceress Skill Levels", + "ModStr3e": "to Barbarian Skill Levels", + "ModStr3f": "to Light Radius", + "ModStr3g": "Increased Chance of Blocking", + "ModStr3h": "Requirements", + "ModStr3i": "to Fire Skills", + "ModStr3j": "Attacker Takes Lightning Damage of", + "ModStr3k": "to All Skills", + "ModStr3l": "Freezes target", + "ModStr3m": "Chance of Open Wounds", + "ModStr3n": "Invisibility", + "ModStr3o": "Neutral Invisibility", + "ModStr3p": "No Mana Healing", + "ModStr3q": "No Life Healing", + "ModStr3r": "Poison Length Reduced by", + "ModStr3u": "Hit Causes Monster to Flee", + "ModStr3v": "Heal Stamina Plus", + "ModStr3w": "Damage Taken Goes To Mana", + "ModStr3x": "Heal Life Plus", + "ModStr3y": "Ignore Target's Defense", + "ModStr3z": "Half Poison Duration", + "ModStr4a": "Prevent Monster Heal", + "ModStr4b": "Half Freeze Duration", + "ModStr4c": "Bonus to Attack Rating", + "ModStr4d": "to Monster Defense Per Hit", + "ModStr4e": "Damage to Demons", + "ModStr4f": "Damage to Undead", + "ModStr4g": "Regenerate Mana", + "ModStr4h": "to Maximum Poison Damage", + "ModStr4i": "to Minimum Poison Damage", + "ModStr4j": "to Attack Rating against Demons", + "ModStr4k": "to Attack Rating against Undead", + "ModStr4l": "Slightly Increased Attack Speed", + "ModStr4m": "Increased Attack Speed", + "ModStr4n": "Greatly Increased Attack Speed", + "ModStr4o": "Fast Hit Recovery", + "ModStr4p": "Faster Hit Recovery", + "ModStr4q": "Fastest Hit Recovery", + "ModStr4r": "Fast Run/Walk", + "ModStr4s": "Faster Run/Walk", + "ModStr4t": "Fastest Run/Walk", + "ModStr4u": "Fast Cast Rate", + "ModStr4v": "Faster Cast Rate", + "ModStr4w": "Fastest Cast Rate", + "ModStr4x": "Fast Block Rate", + "ModStr4y": "Faster Block Rate", + "ModStr4z": "Fastest Block Rate", + "ModStr5a": "Throwable", + "ModStr5b": "Damage", + "ModStr5c": "Chance of Crushing Blow", + "ModStr5d": "Maximum Stamina", + "ModStr5e": "Kick Damage", + "ModStr5f": "to Mana after each Kill", + "ModStr5g": "Fire Absorb", + "ModStr5h": "Fire Absorb", + "ModStr5i": "Lightning Absorb", + "ModStr5j": "Lightning Absorb", + "ModStr5k": "Magic Absorb", + "ModStr5l": "Magic Absorb", + "ModStr5m": "Cold Absorb", + "ModStr5n": "Cold Absorb", + "ModStr5o": "Target Defense", + "ModStr5p": "Extra Bloody", + "ModStr5q": "Deadly Strike", + "ModStr5r": "Slows Target by", + "ModStr5s": "Blessed Aim", + "ModStr5t": "Defiance", + "ModStr5u": "to Maximum Fire Resist", + "ModStr5v": "to Maximum Cold Resist", + "ModStr5w": "to Maximum Lightning Resist", + "ModStr5x": "to Maximum Magic Resist", + "ModStr5y": "to Maximum Poison Resist", + "ModStr5z": "Cannot Be Frozen", + "ModStr6a": "Defense vs. Missile", + "ModStr6b": "Defense vs. Melee", + "ModStr6c": "Life after each Demon Kill", + "ModStr6d": "Hit Blinds Target", + "ModStr6e": "Slower Stamina Drain", + "ModStr6f": "Chance to Reanimate Target", + "ModStr6g": "Piercing Attack", + "ModStr6h": "Fires Magic Arrows", + "ModStr6i": "Fires Explosive Arrows or Bolts", + "ModStre10L": "Percent Chance to Cast", + "ModStre10a": "Charges", + "ModStre10b": "Level", + "ModStre10c": "Per Level", + "ModStre10d": "(%d/%d Charges)", + "ModStre10e": "(", + "ModStre10f": ")", + "ModStre10g": "Stealth", + "ModStre10h": "Immunity to Poison", + "ModStre10i": "Cursed", + "ModStre10j": "Per Player in Party", + "ModStre10k": "Kick Damage:", + "ModStre8a": "to Druid Skills", + "ModStre8b": "to Assassin Skills", + "ModStre8c": " Sockets", + "ModStre8d": " to Attack Rating vs. Demons", + "ModStre8e": " to Attack Rating vs. Undead", + "ModStre8f": " to Damage vs. Demons", + "ModStre8g": " percent to Attack Rating", + "ModStre8h": " to Javelin and Spear Skills", + "ModStre8i": " to Passive and Magic Skills", + "ModStre8j": " to Bow and Crossbow Skills", + "ModStre8k": " to Defensive Aura Skills", + "ModStre8l": " to Offensive Aura Skills", + "ModStre8m": " to Combat Skills", + "ModStre8n": " to Summoning Skills", + "ModStre8o": " to Poison and Bone Skills", + "ModStre8p": " to Curses", + "ModStre8q": " to Warcry Skills", + "ModStre8r": " to Combat Skills", + "ModStre8s": " to Masteries Skills", + "ModStre8t": " to Cold Skills", + "ModStre8u": " to Lightning Skills", + "ModStre8v": " to Fire Skills", + "ModStre8w": " to Summoning Skills", + "ModStre8x": " to Shape-Shifting Skills", + "ModStre8y": " to Elemental Skills", + "ModStre8z": " to Trap Skills", + "ModStre9a": " to Shadow Discipline Skills", + "ModStre9b": " to Martial Art Skills", + "ModStre9c": "(Based on Character Level)", + "ModStre9d": "(Increases During Nighttime)", + "ModStre9e": "(Increases During Daytime)", + "ModStre9f": "(Increases Near Dawn)", + "ModStre9g": "(Increases Near Dusk)", + "ModStre9h": " Charges of", + "ModStre9i": "Increased Stack Size", + "ModStre9j": "Fire Damage Reduced by", + "ModStre9k": "Cold Damage Reduced by", + "ModStre9l": "Lightning Damage Reduced by", + "ModStre9m": "Poison Damage Reduced by", + "ModStre9n": "Absorbs Magic Damage", + "ModStre9o": "Absorbs Fire Damage", + "ModStre9p": "Absorbs Cold Damage", + "ModStre9q": "Absorbs Lightning Damage", + "ModStre9r": "Absorbs Poison Damage", + "ModStre9s": "Indestructible", + "ModStre9t": "Repairs %d durability per second", + "ModStre9u": "Repairs %d durability in %d seconds", + "ModStre9v": "Replenishes quantity", + "ModStre9w": "Cast a Level %d", + "ModStre9x": "When You Swing", + "ModStre9y": "When You Get Hit", + "ModStre9z": "When You Hit an Enemy", + "Moditem2ExpG": "to Experience Gained", + "Moditem2allattrib": "to all Attributes", + "ModitemAttratvsM": "to Attack Rating versus", + "ModitemAura": "Level %d %s Aura When Equipped", + "ModitemHPaK": "Life after each Kill", + "ModitemRedVendP": "Reduces all Vendor Prices", + "ModitemSMRIP": "Slain Monsters Rest in Peace", + "ModitemdamColdsk": "to Cold Skill Damage", + "ModitemdamFiresk": "to Fire Skill Damage", + "ModitemdamLtngsk": "to Lightning Skill Damage", + "ModitemdamPoissk": "to Poison Skill Damage", + "Moditemdamvsm": "to Damage versus", + "Moditemenrescoldsk": "to Enemy Cold Resistance", + "Moditemenresfiresk": "to Enemy Fire Resistance", + "Moditemenresltngsk": "to Enemy Lightning Resistance", + "Moditemenrespoissk": "to Enemy Poison Resistance", + "Moditemreanimas": "Reanimate as:", + "ModitemskonKill": "%d%% Chance to cast level %d %s when you Kill an Enemy", + "ModitemskonLevel": "%d%% Chance to cast level %d %s when you Level-Up", + "Moditemskondeath": "%d%% Chance to cast level %d %s when you Die", + "Modstr2v": "Enhanced Defense", + "Monk's": "Monk's", + "Moonfall": "Moonfall", + "Mosers Blessed Circle": "Moser's Blessed Circle", + "Nagelring": "Nagelring", + "Naj's Ancient Set": "Naj's Ancient Vestige", + "Naj's Circlet": "Naj's Circlet", + "Naj's Light Plate": "Naj's Light Plate", + "Naj's Puzzler": "Naj's Puzzler", + "Natalya's Mark": "Natalya's Mark", + "Natalya's Odium": "Natalya's Odium", + "Natalya's Shadow": "Natalya's Shadow", + "Natalya's Soul": "Natalya's Soul", + "Natalya's Totem": "Natalya's Totem", + "Nature's": "Natural", + "Nature's Peace": "Nature's Peace", + "NecOnly": "(Necromancer Only)", + "Necromancer": "Necromancer", + "Necromancer's": "Necromancer's", + "Nethercrow": "Nethercrow", + "Nickel": "Nickel", + "Nightsmoke": "Nightsmoke", + "Nightwing's Veil": "Nightwing's Veil", + "Nokozan Relic": "Nokozan Relic", + "Nord's Tenderizer": "Nord's Tenderizer", + "Nosferatu's Coil": "Nosferatu's Coil", + "Noxious": "Noxious", + "Null": "Null", + "Ocher": "Ocher", + "Odium": "Odium", + "Oligocene": "Honorable", + "Ondal's Almighty": "Ondal's Almighty", + "Ondal's Wisdom": "Ondal's Wisdom", + "Order": "Order", + "Ormus' Robes": "Ormus' Robes", + "Orphan's Call": "Orphan's Call", + "Pain": "Pain", + "PalOnly": "(Paladin Only)", + "Paladin": "Paladin", + "Paleocene": "Faithful", + "Paradox": "Paradox", + "Pearl": "Pearl", + "Peasent Crown": "Peasant Crown", + "Pelt": "Pelt", + "Pelta Lunata": "Pelta Lunata", + "Pestilent": "Pestilent", + "Piercerib": "Rogue's Bow", + "Pierre Tombale Couant": "Pierre Tombale Couant", + "Plague Bearer": "Plague Bearer", + "PlagueRI": "Plague", + "Platinum": "Platinum", + "Pluckeye": "Pluckeye", + "Pompe's Wrath": "Pompeii's Wrath", + "Powered": "Powered", + "Preserver's": "Preserver's", + "Priest's": "Priest's", + "Prismatic": "Prismatic", + "Psychic": "Psychic", + "Pullspite": "Stormstrike", + "Pure": "Pure", + "Pus Spiter": "Pus Spitter", + "Que-Hegan's Wisdon": "Que-Hegan's Wisdom", + "Radimant's Sphere": "Radament's Sphere", + "Raging": "Raging", + "Rainbow": "Rainbow", + "Rainbow Facet": "Rainbow Facet", + "Rakescar": "Rakescar", + "Rattlecage": "Rattlecage", + "Raven": "Raven", + "Raven Frost": "Raven Frost", + "Ravenlore": "Ravenlore", + "Razoredge": "Razor's Edge", + "Razorswitch": "Razorswitch", + "Razortail": "Razortail", + "Razortine": "Razortine", + "Realgar": "Realgar", + "Red": "Red", + "Resonant": "Resonant", + "Ribcracker": "Ribcracker", + "Rift": "Rift", + "Rimeraven": "Raven Claw", + "Rings": "Rings", + "Riphook": "Riphook", + "Ripsaw": "Ripsaw", + "Rite of Passage": "Rite of Passage", + "Rixots Keen": "Rixot's Keen", + "Robineye": "Robineye", + "Rockfleece": "Rockfleece", + "Rockstopper": "Rockstopper", + "Rose Branded": "Rose Branded", + "Ruby": "Ruby", + "Rugged": "Rugged", + "Rule": "Rule", + "Rune": "Rune", + "Runemaster": "Rune Master", + "Runeword1": "Ancients' Pledge", + "Runeword10": "Brand", + "Runeword100": "Penitence", + "Runeword101": "Peril", + "Runeword102": "Pestilence", + "Runeword103": "Phoenix", + "Runeword104": "Piety", + "Runeword105": "Pillar of Faith", + "Runeword106": "Plague", + "Runeword107": "Praise", + "Runeword108": "Prayer", + "Runeword109": "Pride", + "Runeword11": "Breath of the Dying", + "Runeword110": "Principle", + "Runeword111": "Prowess in Battle", + "Runeword112": "Prudence", + "Runeword113": "Punishment", + "Runeword114": "Purity", + "Runeword115": "Question", + "Runeword116": "Radiance", + "Runeword117": "Rain", + "Runeword118": "Reason", + "Runeword119": "Red", + "Runeword12": "Broken Promise", + "Runeword120": "Rhyme", + "Runeword121": "Rift", + "Runeword122": "Sanctuary", + "Runeword123": "Serendipity", + "Runeword124": "Shadow", + "Runeword125": "Shadow of Doubt", + "Runeword126": "Silence", + "Runeword127": "Siren's Song", + "Runeword128": "Smoke", + "Runeword129": "Sorrow", + "Runeword13": "Call to Arms", + "Runeword130": "Spirit", + "Runeword131": "Splendor", + "Runeword132": "Starlight", + "Runeword133": "Stealth", + "Runeword134": "Steel", + "Runeword135": "Still Water", + "Runeword136": "Sting", + "Runeword137": "Stone", + "Runeword138": "Storm", + "Runeword139": "Strength", + "Runeword14": "Chains of Honor", + "Runeword140": "Tempest", + "Runeword141": "Temptation", + "Runeword142": "Terror", + "Runeword143": "Thirst", + "Runeword144": "Thought", + "Runeword145": "Thunder", + "Runeword146": "Time", + "Runeword147": "Tradition", + "Runeword148": "Treachery", + "Runeword149": "Trust", + "Runeword15": "Chance", + "Runeword150": "Truth", + "Runeword151": "Unbending Will", + "Runeword152": "Valor", + "Runeword153": "Vengeance", + "Runeword154": "Venom", + "Runeword155": "Victory", + "Runeword156": "Voice", + "Runeword157": "Void", + "Runeword158": "War", + "Runeword159": "Water", + "Runeword16": "Chaos", + "Runeword160": "Wealth", + "Runeword161": "Whisper", + "Runeword162": "White", + "Runeword163": "Wind", + "Runeword164": "Wings of Hope", + "Runeword165": "Wisdom", + "Runeword166": "Woe", + "Runeword167": "Wonder", + "Runeword168": "Wrath", + "Runeword169": "Youth", + "Runeword17": "Crescent Moon", + "Runeword170": "Zephyr", + "Runeword18": "Darkness", + "Runeword19": "Daylight", + "Runeword2": "Armageddon", + "Runeword20": "Death", + "Runeword21": "Deception", + "Runeword22": "Delirium", + "Runeword23": "Desire", + "Runeword24": "Despair", + "Runeword25": "Destruction", + "Runeword26": "Doom", + "Runeword27": "Dragon", + "Runeword28": "Dread", + "Runeword29": "Dream", + "Runeword3": "Authority", + "Runeword30": "Duress", + "Runeword31": "Edge", + "Runeword32": "Elation", + "Runeword33": "Enigma", + "Runeword34": "Enlightenment", + "Runeword35": "Envy", + "Runeword36": "Eternity", + "Runeword37": "Exile", + "Runeword38": "Faith", + "Runeword39": "Famine", + "Runeword4": "Beast", + "Runeword40": "Flame", + "Runeword41": "Fortitude", + "Runeword42": "Fortune", + "Runeword43": "Friendship", + "Runeword44": "Fury", + "Runeword45": "Gloom", + "Runeword46": "Glory", + "Runeword47": "Grief", + "Runeword48": "Hand of Justice", + "Runeword49": "Harmony", + "Runeword5": "Beauty", + "Runeword50": "Hatred", + "Runeword51": "Heart of the Oak", + "Runeword52": "Heaven's Will", + "Runeword53": "Holy Tears", + "Runeword54": "Holy Thunder", + "Runeword55": "Honor", + "Runeword56": "Revenge", + "Runeword57": "Humility", + "Runeword58": "Hunger", + "Runeword59": "Ice", + "Runeword6": "Black", + "Runeword60": "Infinity", + "Runeword61": "Innocence", + "Runeword62": "Insight", + "Runeword63": "Jealousy", + "Runeword64": "Judgement", + "Runeword65": "King's Grace", + "Runeword66": "Kingslayer", + "Runeword67": "Knight's Vigil", + "Runeword68": "Knowledge", + "Runeword69": "Last Wish", + "Runeword7": "Blood", + "Runeword70": "Law", + "Runeword71": "Lawbringer", + "Runeword72": "Leaf", + "Runeword73": "Lightning", + "Runeword74": "Lionheart", + "Runeword75": "Lore", + "Runeword76": "Love", + "Runeword77": "Loyalty", + "Runeword78": "Lust", + "Runeword79": "Madness", + "Runeword8": "Bone", + "Runeword81": "Malice", + "Runeword82": "Melody", + "Runeword83": "Memory", + "Runeword84": "Mist", + "Runeword85": "Morning", + "Runeword86": "Mystery", + "Runeword87": "Myth", + "Runeword88": "Nadir", + "Runeword89": "Nature's Kingdom", + "Runeword9": "Bramble", + "Runeword90": "Night", + "Runeword91": "Oath", + "Runeword92": "Obedience", + "Runeword93": "Oblivion", + "Runeword94": "Obsession", + "Runeword95": "Passion", + "Runeword97": "Patter", + "Runeword98": "Peace", + "Runeword99": "Voice of Reason", + "Russet": "Russet", + "Rusthandle": "Rusthandle", + "Rusty": "Rusty", + "Sacred": "Sacred", + "Saintly": "Saintly", + "Sandstorm Trek": "Sandstorm Trek", + "Sanguinary": "Sanguinary", + "Sapphire": "Sapphire", + "Saracen's Chance": "Saracen's Chance", + "Savage": "Savage", + "Sazabi's Cobalt Redeemer": "Sazabi's Cobalt Redeemer", + "Sazabi's Ghost Liberator": "Sazabi's Ghost Liberator", + "Sazabi's Grand Tribute": "Sazabi's Grand Tribute", + "Sazabi's Mental Sheath": "Sazabi's Mental Sheath", + "Scarlet": "Scarlet", + "Schaefer's Hammer": "Schaefer's Hammer", + "Scintillating": "Scintillating", + "Scorching": "Condensing", + "Screaming": "Screaming", + "Sensei's": "Sensei's", + "Septic": "Septic", + "Seraph's Hymn": "Seraph's Hymn", + "Serpent Lord": "Serpent Lord", + "Serpent's": "Serpent's", + "Serrated": "Serrated", + "Shadow": "Shadow", + "Shadowdancer": "Shadow Dancer", + "Shadowfang": "Shadowfang", + "Shadowkiller": "Shadow Killer", + "Shaftstop": "Shaftstop", + "Shaman's": "Shaman's", + "Sharp": "Sharp", + "Shimmering": "Shimmering", + "Shivering": "Shivering", + "Shocking": "Shocking", + "Shogukusha's": "Shogukusha's", + "Shouting": "Howling", + "Sigon's Complete Steel": "Sigon's Complete Steel", + "Sigon's Gage": "Sigon's Gage", + "Sigon's Guard": "Sigon's Guard", + "Sigon's Sabot": "Sigon's Sabot", + "Sigon's Shelter": "Sigon's Shelter", + "Sigon's Visor": "Sigon's Visor", + "Sigon's Wrap": "Sigon's Wrap", + "Sigurd's Staunch": "Siggard's Stealth", + "Silkweave": "Silkweave", + "Silver": "Silver", + "Skillname222": "Raven", + "Skillname223": "Poison Creeper", + "Skillname224": "Werewolf", + "Skillname225": "Lycanthropy", + "Skillname226": "Firestorm", + "Skillname227": "Oak Sage", + "Skillname228": "Summon Spirit Wolf", + "Skillname229": "Werebear", + "Skillname230": "Molten Boulder", + "Skillname231": "Arctic Blast", + "Skillname232": "Carrion Vine", + "Skillname233": "Feral Rage", + "Skillname234": "Maul", + "Skillname235": "Fissure", + "Skillname236": "Cyclone Armor", + "Skillname237": "Heart of Wolverine", + "Skillname238": "Summon Dire Wolf", + "Skillname239": "Rabies", + "Skillname240": "Fire Claws", + "Skillname241": "Twister", + "Skillname242": "Solar Creeper", + "Skillname243": "Hunger", + "Skillname244": "Shock Wave", + "Skillname245": "Volcano", + "Skillname246": "Tornado", + "Skillname247": "Spirit of Barbs", + "Skillname248": "Summon Grizzly", + "Skillname249": "Fury", + "Skillname250": "Armageddon", + "Skillname251": "Hurricane", + "Skillname252": "Fire Blast", + "Skillname253": "Claw Mastery", + "Skillname254": "Psychic Hammer", + "Skillname255": "Tiger Strike", + "Skillname256": "Dragon Talon", + "Skillname257": "Shock Web", + "Skillname258": "Blade Sentinel", + "Skillname259": "Burst of Speed", + "Skillname260": "Fists of Fire", + "Skillname261": "Dragon Claw", + "Skillname262": "Charged Bolt Sentry", + "Skillname263": "Wake of Fire", + "Skillname264": "Weapon Block", + "Skillname265": "Cloak of Shadows", + "Skillname266": "Cobra Strike", + "Skillname267": "Blade Fury", + "Skillname268": "Fade", + "Skillname269": "Shadow Warrior", + "Skillname270": "Claws of Thunder", + "Skillname271": "Dragon Tail", + "Skillname272": "Lightning Sentry", + "Skillname273": "Wake of Inferno", + "Skillname274": "Mind Blast", + "Skillname275": "Blades of Ice", + "Skillname276": "Dragon Flight", + "Skillname277": "Death Sentry", + "Skillname278": "Blade Shield", + "Skillname279": "Venom", + "Skillname280": "Shadow Master", + "Skillname281": "Phoenix Strike", + "Skin of the Flayerd One": "Skin of the Flayed One", + "Skin of the Vipermagi": "Skin of the Vipermagi", + "Skull": "Skull", + "Skullcollector": "Skull Collector", + "Skullder's Ire": "Skullder's Ire", + "Skystrike": "Skystrike", + "Slayer's": "Slayer's", + "Smoking": "Smoking", + "Smoldering": "Smoldering", + "Snake's": "Snake's", + "Snakecord": "Snakecord", + "Snowclash": "Snowclash", + "Snowflake": "Snowy", + "Socketable": "Socketed", + "Soldier's": "Soldier's", + "SorOnly": "(Sorceress Only)", + "Sorceress": "Sorceress", + "Soul": "Soul", + "Soul Harvest": "Soul Harvest", + "Souldrain": "Soul Drainer", + "Soulfeast Tine": "Soulfeast Tine", + "Soulflay": "Soulflay", + "Sounding": "Sounding", + "Sparking": "Sparking", + "Sparking Mail": "Sparking Mail", + "Sparroweye": "Sparroweye", + "Spearmaiden's": "Spearmaiden's", + "Spellsteel": "Spellsteel", + "Spike Thorn": "Spike Thorn", + "Spineripper": "Spineripper", + "Spire of Honor": "Spire of Honor", + "Spirit": "Spirit", + "Spirit Ward": "Spirit Ward", + "Spiritforge": "Spirit Forge", + "Spiritkeeper": "Spirit Keeper", + "Spiritual": "Spiritual", + "Spiritual Custodian": "Dark Adherent", + "Staff of Kings": "Staff of Kings", + "Stalwart": "Stalwart", + "Static": "Static", + "Stealskull": "Stealskull", + "Steel": "Steel", + "Steel Carapice": "Steel Carapace", + "Steelclash": "Steelclash", + "Steeldriver": "Steeldriver", + "Steelgoad": "Steelgoad", + "Steelpillar": "Steel Pillar", + "Steelrend": "Steelrend", + "Steelshade": "Steel Shade", + "Stone": "Stone", + "Stone Crusher": "Stone Crusher", + "Stoneraven": "Stoneraven", + "Storm": "Storm", + "Stormchaser": "Stormchaser", + "Stormeye": "Stormeye", + "Stormguild": "Stormguild", + "Stormlash": "Stormlash", + "Stormrider": "Stormrider", + "Stormshield": "Stormshield", + "Stormspike": "Stormspike", + "Stormspire": "Stormspire", + "Stout": "Stout", + "Stoutnail": "Stoutnail", + "StrGemX1": "Helms:", + "StrGemX2": "Shields:", + "StrGemX3": "Weapons:", + "StrGemX4": "Armor:", + "StrSklTabItem1": "+%d to Javelin and Spear Skills", + "StrSklTabItem10": "+%d to Warcries", + "StrSklTabItem11": "+%d to Combat Skills", + "StrSklTabItem12": "+%d to Masteries", + "StrSklTabItem13": "+%d to Cold Skills", + "StrSklTabItem14": "+%d to Lightning Skills", + "StrSklTabItem15": "+%d to Fire Skills", + "StrSklTabItem16": "+%d to Summoning Skills", + "StrSklTabItem17": "+%d to Shape Shifting Skills", + "StrSklTabItem18": "+%d to Elemental Skills", + "StrSklTabItem19": "+%d to Traps", + "StrSklTabItem2": "+%d to Passive and Magic Skills", + "StrSklTabItem20": "+%d to Shadow Disciplines", + "StrSklTabItem21": "+%d to Martial Arts", + "StrSklTabItem3": "+%d to Bow and Crossbow Skills", + "StrSklTabItem4": "+%d to Defensive Auras", + "StrSklTabItem5": "+%d to Offensive Auras", + "StrSklTabItem6": "+%d to Combat Skills", + "StrSklTabItem7": "+%d to Poison and Bone Skills", + "StrSklTabItem8": "+%d to Curses", + "StrSklTabItem9": "+%d to Summoning Skills", + "Strange": "Strange", + "String of Ears": "String of Ears", + "Strong": "Strong", + "Sturdy": "Sturdy", + "Suicide Branch": "Suicide Branch", + "Summoner's": "Summoner's", + "SuperKhalimFlail": "Khalim's Will", + "Sureshrill Frost": "Sureshrill Frost", + "Swordback Hold": "Swordback Hold", + "Swordguard": "Swordguard", + "Tal Rasha's Adjudication": "Tal Rasha's Adjudication", + "Tal Rasha's Fire-Spun Cloth": "Tal Rasha's Fine-Spun Cloth", + "Tal Rasha's Horadric Crest": "Tal Rasha's Horadric Crest", + "Tal Rasha's Howling Wind": "Tal Rasha's Guardianship", + "Tal Rasha's Lidless Eye": "Tal Rasha's Lidless Eye", + "Tal Rasha's Wrappings": "Tal Rasha's Wrappings", + "Tancred's Battlegear": "Tancred's Battlegear", + "Tancred's Crowbill": "Tancred's Crowbill", + "Tancred's Hobnails": "Tancred's Hobnails", + "Tancred's Skull": "Tancred's Skull", + "Tancred's Spine": "Tancred's Spine", + "Tancred's Weird": "Tancred's Weird", + "Tangerine": "Tangerine", + "Tarnhelm": "Tarnhelm", + "Tearhaunch": "Tearhaunch", + "Telling of Beads": "Telling of Beads", + "Templar's Might": "Templar's Might", + "Terra's": "Terrene", + "The Atlantian": "The Atlantean", + "The Battlebranch": "The Battlebranch", + "The Cat's Eye": "The Cat's Eye", + "The Centurion": "The Centurion", + "The Chieftan": "The Chieftain", + "The Cranium Basher": "The Cranium Basher", + "The Diggler": "The Diggler", + "The Disciple": "The Disciple", + "The Dragon Chang": "The Dragon Chang", + "The Eye of Etlich": "The Eye of Etlich", + "The Face of Horror": "The Face of Horror", + "The Fetid Sprinkler": "The Fetid Sprinkler", + "The Gavel of Pain": "The Gavel of Pain", + "The Generals Tan Do Li Ga": "The General's Tan Do Li Ga", + "The Gladiator's Bane": "The Gladiator's Bane", + "The Gnasher": "The Gnasher", + "The Grandfather": "The Grandfather", + "The Grim Reaper": "The Grim Reaper", + "The Hand of Broc": "The Hand of Broc", + "The Humongous": "Humongous", + "The Impaler": "The Impaler", + "The Iron Jang Bong": "The Iron Jang Bong", + "The Jade Tan Do": "The Jade Tan Do", + "The Mahim-Oak Curio": "The Mahim-Oak Curio", + "The Meat Scraper": "The Meat Scraper", + "The Minataur": "The Minotaur", + "The Oculus": "The Oculus", + "The Patriarch": "The Patriarch", + "The Reaper's Toll": "The Reaper's Toll", + "The Reedeemer": "The Redeemer", + "The Rising Sun": "The Rising Sun", + "The Salamander": "The Salamander", + "The Scalper": "The Scalper", + "The Spirit Shroud": "The Spirit Shroud", + "The Stone of Jordan": "The Stone of Jordan", + "The Tannr Gorerod": "The Tannr Gorerod", + "The Vile Husk": "The Vile Husk", + "The Ward": "The Ward", + "Thin": "Thin", + "Thudergod's Vigor": "Thundergod's Vigor", + "Thunderstroke": "Thunderstroke", + "Tiamat's Rebuke": "Tiamat's Rebuke", + "Tin": "Tin", + "Tireless": "Tireless", + "Titan's Revenge": "Titan's Revenge", + "Todesfaelle Flamme": "Todesfaelle Flamme", + "Tomb Reaver": "Tomb Reaver", + "Toothrow": "Toothrow", + "Toxic": "Toxic", + "Trainer's": "Trainer's", + "Trang-Oul's Avatar": "Trang-Oul's Avatar", + "Trang-Oul's Claws": "Trang-Oul's Claws", + "Trang-Oul's Girth": "Trang-Oul's Girth", + "Trang-Oul's Guise": "Trang-Oul's Guise", + "Trang-Oul's Scales": "Trang-Oul's Scales", + "Trang-Oul's Wing": "Trang-Oul's Wing", + "Treads of Cthon": "Treads of Cthon", + "Trickster's": "Trickster's", + "Triumphant": "Triumphant", + "Trump": "Fool's", + "Turquoise": "Turquoise", + "Twitchthroe": "Twitchthroe", + "Tyrael's Might": "Tyrael's Might", + "Umbral Disk": "Umbral Disk", + "Umes Lament": "Ume's Lament", + "Undead Crown": "Undead Crown", + "Unearthly": "Unearthly", + "Valkiry Wing": "Valkyrie Wing", + "Valkyrie's": "Valkyrie's", + "Vampiregaze": "Vampire Gaze", + "Veil of Steel": "Veil of Steel", + "Venom Grip": "Venom Grip", + "Venomous": "Venomous", + "Venomsward": "Venom Ward", + "Verdugo's Hearty Cord": "Verdungo's Hearty Cord", + "Vermillion": "Vermilion", + "Veteran's": "Veteran's", + "Vicious": "Vicious", + "Victorious": "Victorious", + "Victors Silk": "Silks of the Victor", + "Vidala's Ambush": "Vidala's Ambush", + "Vidala's Barb": "Vidala's Barb", + "Vidala's Fetlock": "Vidala's Fetlock", + "Vidala's Rig": "Vidala's Rig", + "Vidala's Snare": "Vidala's Snare", + "Vigorous": "Vigorous", + "Viper": "Viper", + "Viperfork": "Viperfork", + "Viridian": "Viridian", + "Visceratuant": "Visceratuant", + "Visionary": "Visionary", + "Vodoun": "Mojo", + "Volcanic": "Volcanic", + "Vulpine": "Vulpine", + "Wailing": "Wailing", + "Wall of the Eyeless": "Wall of the Eyeless", + "War Bonnet": "Biggin's Bonnet", + "Warder's": "Warden's", + "Warlord's Trust": "Warlord's Trust", + "Warp": "Warp", + "Warpspear": "Warpspear", + "Warrior's": "Warrior's", + "Warriv's Warder": "Warriv's Warder", + "Warshrike": "Warshrike", + "Wartraveler": "War Traveler", + "Waterwalk": "Waterwalk", + "WeaponAttackFast": "Fast Attack Speed", + "WeaponAttackFastest": "Fastest Attack Speed", + "WeaponAttackNormal": "Normal Attack Speed", + "WeaponAttackSlow": "Slow Attack Speed", + "WeaponAttackSlowest": "Slowest Attack Speed", + "WeaponAttackVeryFast": "Very Fast Attack Speed", + "WeaponAttackVerySlow": "Very Slow Attack Speed", + "WeaponDescAxe": "Axe Class", + "WeaponDescBow": "Bow Class", + "WeaponDescCrossBow": "Crossbow Class", + "WeaponDescDagger": "Dagger Class", + "WeaponDescH2H": "Claw Class", + "WeaponDescJavelin": "Javelin Class", + "WeaponDescMace": "Mace Class", + "WeaponDescOrb": "Orb Class", + "WeaponDescPoleArm": "Polearm Class", + "WeaponDescSpear": "Spear Class", + "WeaponDescStaff": "Staff Class", + "WeaponDescSword": "Sword Class", + "WeaponDescThrownPotion": "Equip to Throw", + "WeaponRack": "Weapon Rack", + "Weird": "Weird", + "Whichwild String": "Witchwild String", + "Widowmaker": "Widowmaker", + "Wihtstan's Guard": "Whitstan's Guard", + "Wilhelm's Pride": "Wilhelm's Pride", + "Windforce": "Windforce", + "Windhammer": "Windhammer", + "Wisp": "Wisp Projector", + "Witch-hunter's": "Witch-hunter's", + "Witherstring": "Witherstring", + "Wizardspike": "Wizardspike", + "Wizendraw": "Wizendraw", + "Woestave": "Woestave", + "Wolfhowl": "Wolfhowl", + "Wormskull": "Wormskull", + "Wraithflight": "Wraith Flight", + "Wraithra": "Wraith", + "Wyrm's": "Wyrm's", + "Yelling": "Yelling", + "Zakarum's Hand": "Zakarum's Hand", + "Zakarum's Salvation": "Zakarum's Salvation", + "Zircon": "Zircon", + "aar": "Ancient Armor", + "aegis": "Aegis", + "am1": "Stag Bow", + "am2": "Reflex Bow", + "am3": "Maiden Spear", + "am4": "Maiden Pike", + "am5": "Maiden Javelin", + "am6": "Ashwood Bow", + "am7": "Ceremonial Bow", + "am8": "Ceremonial Spear", + "am9": "Ceremonial Pike", + "ama": "Ceremonial Javelin", + "amb": "Matriarchal Bow", + "amc": "Grand Matron Bow", + "amd": "Matriarchal Spear", + "ame": "Matriarchal Pike", + "amf": "Matriarchal Javelin", + "amu": "Amulet", + "aqv": "Arrows", + "ass": "Right Click to learn skill of your choice\nBook of Skill", + "axe": "Axe", + "axf": "Hatchet Hands", + "ba1": "Jawbone Cap", + "ba2": "Fanged Helm", + "ba3": "Horned Helm", + "ba4": "Assault Helmet", + "ba5": "Avenger Guard", + "ba6": "Jawbone Visor", + "ba7": "Lion Helm", + "ba8": "Rage Mask", + "ba9": "Savage Helmet", + "baa": "Slayer Guard", + "bab": "Carnage Helm", + "bac": "Fury Visor", + "bad": "Destroyer Helm", + "badge": "Badge", + "bae": "Conqueror Crown", + "baf": "Guardian Crown", + "bal": "Balanced Axe", + "band": "Band", + "bar": "Bardiche", + "barRI": "Bar", + "barb": "Barb", + "bax": "Broad Axe", + "bbb": "Lam Esen's Tome", + "beads": "Beads", + "bet": "Burning Essence of Terror", + "bey": "Baal's Eye", + "bhm": "Bone Helm", + "bite": "Bite", + "bkd": "Key to the Cairn Stones", + "bkf": "Balanced Knife", + "bks": "Scroll of Inifuss", + "blazer": "Blazer", + "bld": "Blade", + "blow": "Blow", + "bludgeon": "Bludgeon", + "bolt": "Bolt", + "box": "Horadric Cube", + "branch": "Branch", + "brand": "Brand", + "breaker": "Breaker", + "brn": "Brandistock", + "brow": "Brow", + "brs": "Breast Plate", + "brz": "Brain", + "bsd": "Broad Sword", + "bsh": "Bone Shield", + "bst": "Battle Staff", + "bsw": "Bastard Sword", + "btl": "Blade Talons", + "btx": "Battle Axe", + "buc": "Buckler", + "buckle": "Buckle", + "bwn": "Bone Wand", + "call": "Call", + "cap": "Cap", + "carapace": "Carapace", + "casque": "Casque", + "cbw": "Composite Bow", + "ceh": "Charged Essence of Hatred", + "ces": "Cestus", + "chain": "Chain", + "chant": "Chant", + "chn": "Chain Mail", + "ci0": "Circlet", + "ci1": "Coronet", + "ci2": "Tiara", + "ci3": "Diadem", + "circle": "Circle", + "circlet": "Circlet", + "clasp": "Clasp", + "claw": "Claw", + "clb": "Club", + "cleaver": "Cleaver", + "clm": "Claymore", + "cloak": "Cloak", + "clutches": "Clutches", + "clw": "Claws", + "cm1": "Small Charm", + "cm2": "Large Charm", + "cm3": "Grand Charm", + "coat": "Coat", + "coil": "Coil", + "collar": "Collar", + "cord": "Cord", + "cowl": "Cowl", + "cqv": "Bolts", + "crack": "Crack", + "crest": "Crest", + "crn": "Crown", + "crook": "Crook", + "crs": "Crystal Sword", + "crusher": "Crusher", + "cry": "Cry", + "cst": "Gnarled Staff", + "cudgel": "Cudgel", + "d33": "Decoy Gidbinn", + "dart": "Dart", + "dgr": "Dagger", + "dhn": "Diablo's Horn", + "dir": "Dirk", + "dr1": "Wolf Head", + "dr2": "Hawk Helm", + "dr3": "Antlers", + "dr4": "Falcon Mask", + "dr5": "Spirit Mask", + "dr6": "Alpha Helm", + "dr7": "Griffon Headdress", + "dr8": "Hunter's Guise", + "dr9": "Sacred Feathers", + "dra": "Totemic Mask", + "drb": "Blood Spirit", + "drc": "Sun Spirit", + "drd": "Earth Spirit", + "dre": "Sky Spirit", + "drf": "Dream Spirit", + "ear": "Ear", + "edge": "Edge", + "elx": "Elixir", + "emblem": "Emblem", + "eye": "Eye", + "eyz": "Eye", + "fang": "Fang", + "fed": "Festering Essence of Destruction", + "fhl": "Full Helm", + "finger": "Finger", + "fist": "Fist", + "fla": "Flail", + "flange": "Flange", + "flb": "Flamberge", + "flc": "Falchion", + "fld": "Field Plate", + "fletch": "Fletch", + "flg": "Flag", + "flight": "Flight", + "fng": "Fang", + "fringe": "Fringe", + "ful": "Full Plate Mail", + "g33": "The Gidbinn", + "g34": "The Golden Bird", + "gax": "Great Axe", + "gcb": "Chipped Sapphire", + "gcg": "Chipped Emerald", + "gcr": "Chipped Ruby", + "gcv": "Chipped Amethyst", + "gcw": "Chipped Diamond", + "gcy": "Chipped Topaz", + "gfb": "Flawed Sapphire", + "gfg": "Flawed Emerald", + "gfr": "Flawed Ruby", + "gfv": "Flawed Amethyst", + "gfw": "Flawed Diamond", + "gfy": "Flawed Topaz", + "ghm": "Great Helm", + "gis": "Giant Sword", + "gix": "Giant Axe", + "glb": "Flawless Sapphire", + "gld": "Gold", + "glg": "Flawless Emerald", + "glr": "Flawless Ruby", + "glv": "Glaive", + "glw": "Flawless Diamond", + "gly": "Flawless Topaz", + "gma": "Great Maul", + "gnarl": "Gnarl", + "gnash": "Gnash", + "goad": "Goad", + "gorget": "Gorget", + "gpb": "Perfect Sapphire", + "gpg": "Perfect Emerald", + "gpl": "Strangling Gas Potion", + "gpm": "Choking Gas Potion", + "gpr": "Perfect Ruby", + "gps": "Rancid Gas Potion", + "gpv": "Perfect Amethyst", + "gpw": "Perfect Diamond", + "gpy": "Perfect Topaz", + "grasp": "Grasp", + "greave": "Greaves", + "grinder": "Grinder", + "grip": "Grip", + "gsb": "Sapphire", + "gsc": "Grand Scepter", + "gsd": "Great Sword", + "gsg": "Emerald", + "gsr": "Ruby", + "gsv": "Amethyst", + "gsw": "Diamond", + "gsy": "Topaz", + "gth": "Gothic Plate", + "gts": "Gothic Shield", + "guard": "Guard", + "gutter": "Gutter", + "gwn": "Grim Wand", + "gyre": "Gyre", + "gzv": "Flawless Amethyst", + "hal": "Halberd", + "hand": "Hand", + "harness": "Harness", + "harp": "Harp", + "hax": "Hand Axe", + "hbl": "Plated Belt", + "hbt": "Greaves", + "hbw": "Hunter's Bow", + "hdm": "Horadric Malus", + "heart": "Heart", + "hew": "Hew", + "hfh": "Hell Forge Hammer", + "hgl": "Gauntlets", + "hide": "Hide", + "hla": "Hard Leather Armor", + "hlm": "Helm", + "hold": "Hold", + "hood": "Hood", + "horn": "Horn", + "hp1": "Minor Healing Potion", + "hp2": "Light Healing Potion", + "hp3": "Healing Potion", + "hp4": "Greater Healing Potion", + "hp5": "Super Healing Potion", + "hrb": "Herb", + "hrn": "Horn", + "hrt": "Heart", + "hst": "Horadric Staff", + "hxb": "Heavy Crossbow", + "ibk": "Tome of Identify", + "ice": "Keep it to thaw Anya\nMalah's Potion", + "impaler": "Impaler", + "increaseswithplaylevelX": "(Based on Character Level)", + "isc": "Scroll of Identify", + "j34": "A Jade Figurine", + "jack": "Jack", + "jav": "Javelin", + "jaw": "Jawbone", + "jew": "Jewel", + "key": "Key", + "kit": "Kite Shield", + "knell": "Knell", + "knot": "Knot", + "knuckle": "Knuckle", + "kri": "Kris", + "ktr": "Katar", + "lance": "Lance", + "lash": "Lash", + "lax": "Large Axe", + "lbb": "Long Battle Bow", + "lbl": "Sash", + "lbt": "Boots", + "lbw": "Long Bow", + "lea": "Leather Armor", + "leg": "Wirt's Leg", + "lgl": "Leather Gloves", + "lock": "Lock", + "loom": "Loom", + "loop": "Loop", + "lrg": "Large Shield", + "lsd": "Long Sword", + "lst": "Long Staff", + "ltp": "Light Plate", + "luv": "The Black Tower Key", + "lwb": "Long War Bow", + "lxb": "Light Crossbow", + "mac": "Mace", + "mallet": "Mallet", + "mangler": "Mangler", + "mantle": "Mantle", + "mar": "Mar", + "mark": "Mark", + "mask": "Mask", + "master": "Master", + "mau": "Maul", + "mbl": "Belt", + "mbr": "Mephisto's Brain", + "mbt": "Chain Boots", + "mgl": "Chain Gloves", + "mp1": "Minor Mana Potion", + "mp2": "Light Mana Potion", + "mp3": "Mana Potion", + "mp4": "Greater Mana Potion", + "mp5": "Super Mana Potion", + "mpi": "Military Pick", + "msf": "Shaft of the Horadric Staff", + "msk": "Mask", + "mss": "Mephisto's Soulstone", + "mst": "Morning Star", + "mxb": "Crossbow", + "nails": "Nails", + "ne1": "Preserved Head", + "ne2": "Zombie Head", + "ne3": "Unraveller Head", + "ne4": "Gargoyle Head", + "ne5": "Demon Head", + "ne6": "Mummified Trophy", + "ne7": "Fetish Trophy", + "ne8": "Sexton Trophy", + "ne9": "Cantor Trophy", + "nea": "Hierophant Trophy", + "neb": "Minion Skull", + "necklace": "Necklace", + "ned": "Overseer Skull", + "nee": "Succubus Skull", + "needle": "Needle", + "nef": "Bloodlord Skull", + "neg": "Hellspawn Skull", + "nock": "Nock", + "noose": "Noose", + "ob1": "Eagle Orb", + "ob2": "Sacred Globe", + "ob3": "Smoked Sphere", + "ob4": "Clasped Orb", + "ob5": "Jared's Stone", + "ob6": "Glowing Orb", + "ob7": "Crystalline Globe", + "ob8": "Cloudy Sphere", + "ob9": "Sparkling Ball", + "oba": "Swirling Crystal", + "obb": "Heavenly Stone", + "obc": "Eldritch Orb", + "obd": "Demon Heart", + "obe": "Vortex Orb", + "obf": "Dimensional Shard", + "of Absorption": "of Absorption", + "of Acceleration": "of Acceleration", + "of Accuracy": "of Accuracy", + "of Ages": "of Ages", + "of Alacrity": "of Alacrity", + "of Amelioration": "of Amelioration", + "of Amianthus": "of Amianthus", + "of Amplify Damage": "of Amplify Damage", + "of Anima": "of Amicae", + "of Anthrax": "of Anthrax", + "of Armageddon": "of Armageddon", + "of Atlus": "of Atlas", + "of Attraction": "of Attract", + "of Avarice": "of Avarice", + "of Balance": "of Balance", + "of Bashing": "of Bashing", + "of Battle Command": "of Battle Command", + "of Battle Cry": "of Battle Cry", + "of Battle Orders": "of Battle Orders", + "of Blaze": "of Blaze", + "of Blazing": "of Blazing", + "of Blessed Hammers": "of Blessed Hammer", + "of Blight": "of Blight", + "of Bliss": "of Bliss", + "of Blizzard": "of Blizzard", + "of Blizzards": "of Blizzard", + "of Blocking": "of Blocking", + "of Blood Golem Summoning": "of Blood Golem", + "of Bone Armor": "of Bone Armor", + "of Bone Imprisonment": "of Bone Prison", + "of Bone Spears": "of Bone Spear", + "of Bone Spirits": "of Bone Spirit", + "of Bone Walls": "of Bone Wall", + "of Brilliance": "of Brilliance", + "of Burning": "of Burning", + "of Butchery": "of Butchery", + "of Carnage": "of Carnage", + "of Chain Lightning": "of Chain Lightning", + "of Chance": "of Chance", + "of Charged Bolts": "of Charged Bolt", + "of Charged Shield": "of Charged Bolt", + "of Charged Strike": "of Charged Strike", + "of Chilling Armor": "of Chilling Armor", + "of Clay Golem Summoning": "of Clay Golem", + "of Cold Arrows": "of Cold Arrow", + "of Concentration": "of Concentration", + "of Confusion": "of Confusion", + "of Conversion": "of Conversion", + "of Coolness": "of Coolness", + "of Corpse Explosions": "of Corpse Explosion", + "of Craftsmanship": "of Craftmanship", + "of Cyclone Armor": "of Cyclone Armor", + "of Damage Amplification": "of Amplify Damage", + "of Daring": "of Daring", + "of Dawn": "of Dawn", + "of Decrepification": "of Decrepify", + "of Defiance": "of Defiance", + "of Deflecting": "of Deflecting", + "of Desire": "of Desire", + "of Dexterity": "of Dexterity", + "of Dim Vision": "of Dim Vision", + "of Ease": "of Ease", + "of Enchant": "of Enchant", + "of Enchantment": "of Enchantment", + "of Energy": "of Energy", + "of Energy Shield": "of Energy Shield", + "of Enlightenment": "of Enlightenment", + "of Ennui": "of Ennui", + "of Envy": "of Envy", + "of Equilibrium": "of Equilibrium", + "of Eruption": "of Fissure", + "of Evisceration": "of Evisceration", + "of Excellence": "of Excellence", + "of Exploding Arrows": "of Exploding Arrow", + "of Faith": "of Faith", + "of Fast Repair": "of Restoration", + "of Fending": "of Fending", + "of Fervor": "of Fervor", + "of Fire": "of Fire", + "of Fire Arrows": "of Fire Arrow", + "of Fire Ball": "of Fire Ball", + "of Fire Balls": "of Fire Ball", + "of Fire Bolts": "of Fire Bolt", + "of Fire Golem Summoning": "of Fire Golem", + "of Fire Quenching": "of Quenching", + "of Fire Wall": "of Fire Wall", + "of Fire Walls": "of Fire Wall", + "of Firebolts": "of Firebolts", + "of Firestorms": "of Firestorms", + "of Fist of the Heavens": "of Fist of the Heavens", + "of Flame": "of Flame", + "of Fortune": "of Fortune", + "of Freedom": "of Freedom", + "of Freezing Arrows": "of Freezing Arrow", + "of Frigidity": "of Frigidity", + "of Frost": "of Frost", + "of Frost Novas": "of Frost Nova", + "of Frost Shield": "of Frost Shield", + "of Frozen Armor": "of Frozen Armor", + "of Frozen Orb": "of Frozen Orb", + "of Frozen Orbs": "of Frozen Orb", + "of Glacial Spike": "of Glacial Spike", + "of Glacial Spikes": "of Glacial Spike", + "of Good Luck": "of Good Luck", + "of Gore": "of Gore", + "of Grace": "of Grace", + "of Grace and Power": "of Grace and Power", + "of Greed": "of Greed", + "of Grim Ward": "of Grim Ward", + "of Grounding": "of Grounding", + "of Guarding": "of Guarding", + "of Guided Arrows": "of Guided Arrow", + "of Haste": "of Haste", + "of Health": "of Health", + "of Holy Bolts": "of Holy Bolt", + "of Honor": "of Honor", + "of Hope": "of Hope", + "of Howling": "of Howl", + "of Hurricane": "of Hurricane", + "of Hydra Shield": "of Hydra Shield", + "of Hydras": "of Hydra", + "of Ice Arrows": "of Ice Arrow", + "of Ice Blast": "of Ice Blast", + "of Ice Blasts": "of Ice Blast", + "of Ice Bolts": "of Ice Bolt", + "of Icebolt": "of Icebolt", + "of Immolating Arrows": "of Immolating Arrow", + "of Impaling Strike": "of Impaling Strike", + "of Incineration": "of Incineration", + "of Incombustibility": "of Inflammability", + "of Inertia": "of Inertia", + "of Inner Sight": "of Inner Sight", + "of Insulation": "of Insulation", + "of Ire": "of Ire", + "of Iron Golem Creation": "of Iron Golem", + "of Iron Maiden": "of Iron Maiden", + "of Item Finding": "of Find Item", + "of Jabbing": "of Jab", + "of Joyfulness": "of Joyfulness", + "of Knowledge": "of Knowledge", + "of Life": "of Life", + "of Life Everlasting": "of Life Everlasting", + "of Life Tap": "of Life Tap", + "of Light": "of Light", + "of Lightning": "of Lightning", + "of Lightning Fury": "of Lightning Fury", + "of Lightning Javelin": "of Lightning Javelin", + "of Lightning Strike": "of Lightning Strike", + "of Lower Resistance": "of Lower Resistance", + "of Luck": "of Luck", + "of Magic Arrows": "of Magic Arrow", + "of Maiming": "of Maiming", + "of Malice": "of Malice", + "of Measure": "of Measure", + "of Memory": "of Memory", + "of Meteor": "of Meteor", + "of Meteors": "of Meteor", + "of Might": "of Might", + "of Molten Boulders": "of Molten Boulder", + "of Multiple Shot": "of Multiple Shot", + "of Negation": "of Negation", + "of Nirvana": "of Nirvana", + "of Nova": "of Nova", + "of Nova Shield": "of Nova Shield", + "of Novas": "of Nova", + "of Pacing": "of Pacing", + "of Passion": "of Passion", + "of Perfection": "of Perfection", + "of Performance": "of Performance", + "of Pestilence": "of Pestilence", + "of Piercing": "of Piercing", + "of Plague Jab": "of Plague Jab", + "of Poison Dagger": "of Poison Dagger", + "of Poison Explosion": "of Poison Explosion", + "of Poison Jab": "of Poison Jab", + "of Poison Novas": "of Poison Nova", + "of Potion Finding": "of Find Potion", + "of Power": "of Power", + "of Power Strike": "of Power Strike", + "of Precision": "of Precision", + "of Propogation": "of Propogation", + "of Prosperity": "of Prosperity", + "of Protection": "of Protection", + "of Puncturing": "of Puncturing", + "of Quality": "of Quality", + "of Quickness": "of Quickness", + "of Radiance": "of Radiance", + "of Raise Skeletal Mages": "of Skeletal Mages", + "of Raise Skeletons": "of Raise Skeleton", + "of Razors": "of Razors", + "of Readiness": "of Readiness", + "of Regeneration": "of Regeneration", + "of Regrowth": "of Regrowth", + "of Remedy": "of Remedy", + "of Replenishing": "of Replenishing", + "of Resistance": "of Resistance", + "of Revivification": "of Revivification", + "of Sacrifice": "of Sacrifice", + "of Self-Repair": "of Self-Repair", + "of Shiver Armor": "of Shiver Armor", + "of Shock": "of Shock", + "of Shouting": "of Shout", + "of Simplicity": "of Simplicity", + "of Skill": "of Skill", + "of Slaughter": "of Slaughter", + "of Slaying": "of Slaying", + "of Slow Missiles": "of Slow Missile", + "of Sorcery": "of Sorcery", + "of Speed": "of Speed", + "of Spikes": "of Spikes", + "of Spirit": "of Spirit", + "of Stability": "of Stability", + "of Static Field": "of Static Field", + "of Stoicism": "of Stoicism", + "of Storms": "of Storms", + "of Strength": "of Strength", + "of Stunning": "of Stun", + "of Substinence": "of Sustenance", + "of Sunlight": "of Sunlight", + "of Swiftness": "of Swiftness", + "of Swords": "of Swords", + "of Taunting": "of Taunt", + "of Teeth": "of Teeth", + "of Telekinesis": "of Telekinesis", + "of Teleport Shield": "of Teleport Shield", + "of Teleportation": "of Teleportation", + "of Terror": "of Terror", + "of Thawing": "of Thawing", + "of Thorns": "of Thorns", + "of Thunder": "of Thunder", + "of Thunder Storm": "of Thunder Storm", + "of Tornado": "of Tornado", + "of Transcendence": "of Transcendence", + "of Traveling": "of Transportation", + "of Truth": "of Truth", + "of Twister": "of Twister", + "of Vengeance": "of Vengeance", + "of Venom": "of Venom", + "of Vileness": "of Vileness", + "of Virility": "of Virility", + "of Vita": "of Vita", + "of Volcano": "of Volcano", + "of War Cry": "of War Cry", + "of Warding": "of Warding", + "of Warming": "of Warming", + "of Warmth": "of Thawing", + "of Weaken": "of Weaken", + "of Wealth": "of Wealth", + "of Winter": "of Winter", + "of Wizardry": "of Wizardry", + "of Worth": "of Worth", + "of Wrath": "of Wrath", + "of Zeal": "of Zeal", + "of the Apprentice": "of the Apprentice", + "of the Bat": "of the Bat", + "of the Bear": "of the Bear", + "of the Cobra": "of the Cobra", + "of the Colossus": "of the Gargantuan", + "of the Colosuss": "of the Colossus", + "of the Dunes": "of the Dunes", + "of the Dynamo": "of the Dynamo", + "of the Efreeti": "of the Efreeti", + "of the Elements": "of the Elements", + "of the Elephant": "of the Elephant", + "of the Fox": "of the Fox", + "of the Giant": "of the Giant", + "of the Glacier": "of the Glacier", + "of the Icicle": "of the Icicle", + "of the Jackal": "of the Jackal", + "of the Kraken": "of the Centaur", + "of the Lamprey": "of the Lamprey", + "of the Leech": "of the Leech", + "of the Locust": "of the Locust", + "of the Magus": "of the Magus", + "of the Mammoth": "of the Mammoth", + "of the Mind": "of the Mind", + "of the Ox": "of the Ox", + "of the Phoenix": "of the Phoenix", + "of the Sentinel": "of the Sentinel", + "of the Sirocco": "of the Scirocco", + "of the Squid": "of the Squid", + "of the Sun": "of the Sun", + "of the Tiger": "of the Tiger", + "of the Titan": "of the Titan", + "of the Vampire": "of the Vampire", + "of the Whale": "of the Whale", + "of the Wolf": "of the Wolf", + "of the Wraith": "of the Wraith", + "of the Yeti": "of the Yeti", + "opl": "Fulminating Potion", + "opm": "Exploding Potion", + "ops": "Oil Potion", + "pa1": "Targe", + "pa2": "Rondache", + "pa3": "Heraldic Shield", + "pa4": "Aerin Shield", + "pa5": "Crown Shield", + "pa6": "Akaran Targe", + "pa7": "Akaran Rondache", + "pa8": "Protector Shield", + "pa9": "Gilded Shield", + "paa": "Royal Shield", + "pab": "Sacred Targe", + "pac": "Sacred Rondache", + "pad": "Kurast Shield", + "pae": "Zakarum Shield", + "paf": "Vortex Shield", + "pale": "Pale", + "pax": "Poleaxe", + "picket": "Picket", + "pik": "Pike", + "pil": "Pilum", + "pk1": "Key of Terror", + "pk2": "Key of Hate", + "pk3": "Key of Destruction", + "plt": "Plate Mail", + "prod": "Prod", + "qbr": "Khalim's Brain", + "qey": "Khalim's Eye", + "qf1": "Khalim's Flail", + "qf2": "Khalim's Will", + "qhr": "Khalim's Heart", + "qll": "Quill", + "quarrel": "Quarrel", + "qui": "Quilted Armor", + "quill": "Quill", + "r01": "El Rune", + "r02": "Eld Rune", + "r03": "Tir Rune", + "r04": "Nef Rune", + "r05": "Eth Rune", + "r06": "Ith Rune", + "r07": "Tal Rune", + "r08": "Ral Rune", + "r09": "Ort Rune", + "r10": "Thul Rune", + "r11": "Amn Rune", + "r12": "Sol Rune", + "r13": "Shael Rune", + "r14": "Dol Rune", + "r15": "Hel Rune", + "r16": "Io Rune", + "r17": "Lum Rune", + "r18": "Ko Rune", + "r19": "Fal Rune", + "r20": "Lem Rune", + "r21": "Pul Rune", + "r22": "Um Rune", + "r23": "Mal Rune", + "r24": "Ist Rune", + "r25": "Gul Rune", + "r26": "Vex Rune", + "r27": "Ohm Rune", + "r28": "Lo Rune", + "r29": "Sur Rune", + "r30": "Ber Rune", + "r31": "Jah Rune", + "r32": "Cham Rune", + "r33": "Zod Rune", + "razor": "Razor", + "reaver": "Reaver", + "rend": "Rend", + "rin": "Ring", + "rng": "Ring Mail", + "rock": "Rock", + "rvl": "Full Rejuvenation Potion", + "rvs": "Rejuvenation Potion", + "rxb": "Repeating Crossbow", + "saw": "Saw", + "sbb": "Short Battle Bow", + "sbr": "Sabre", + "sbw": "Short Bow", + "scalpel": "Scalpel", + "scarab": "Scarab", + "scl": "Scale Mail", + "scm": "Scimitar", + "scourge": "Scourge", + "scp": "Scepter", + "scratch": "Scratch", + "scy": "Scythe", + "scythe": "Scythe", + "scz": "Scalp", + "sever": "Sever", + "shank": "Shank", + "shell": "Shell", + "shield": "Shield", + "shroud": "Shroud", + "skc": "Chipped Skull", + "skewer": "Skewer", + "skf": "Flawed Skull", + "skillname0": "Attack", + "skillname1": "Kick", + "skillname10": "Jab", + "skillname100": "Resist Fire", + "skillname101": "Holy Bolt", + "skillname102": "Holy Fire", + "skillname103": "Thorns", + "skillname104": "Defiance", + "skillname105": "Resist Cold", + "skillname106": "Zeal", + "skillname107": "Charge", + "skillname108": "Blessed Aim", + "skillname109": "Cleansing", + "skillname11": "Cold Arrow", + "skillname110": "Resist Lightning", + "skillname111": "Vengeance", + "skillname112": "Blessed Hammer", + "skillname113": "Concentration", + "skillname114": "Holy Freeze", + "skillname115": "Vigor", + "skillname116": "Conversion", + "skillname117": "Holy Shield", + "skillname118": "Holy Shock", + "skillname119": "Sanctuary", + "skillname12": "Multiple Shot", + "skillname120": "Meditation", + "skillname121": "Fist of the Heavens", + "skillname122": "Fanaticism", + "skillname123": "Conviction", + "skillname124": "Redemption", + "skillname125": "Salvation", + "skillname126": "Bash", + "skillname127": "Sword Mastery", + "skillname128": "Axe Mastery", + "skillname129": "Mace Mastery", + "skillname13": "Dodge", + "skillname130": "Howl", + "skillname131": "Find Potion", + "skillname132": "Leap", + "skillname133": "Double Swing", + "skillname134": "Pole Arm Mastery", + "skillname135": "Throwing Mastery", + "skillname136": "Spear Mastery", + "skillname137": "Taunt", + "skillname138": "Shout", + "skillname139": "Stun", + "skillname14": "Power Strike", + "skillname140": "Double Throw", + "skillname141": "Increased Stamina", + "skillname142": "Find Item", + "skillname143": "Leap Attack", + "skillname144": "Concentrate", + "skillname145": "Iron Skin", + "skillname146": "Battle Cry", + "skillname147": "Frenzy", + "skillname148": "Increased Speed", + "skillname149": "Battle Orders", + "skillname15": "Poison Javelin", + "skillname150": "Grim Ward", + "skillname151": "Whirlwind", + "skillname152": "Berserk", + "skillname153": "Natural Resistance", + "skillname154": "War Cry", + "skillname155": "Battle Command", + "skillname16": "Exploding Arrow", + "skillname17": "Slow Missiles", + "skillname18": "Avoid", + "skillname19": "Impale", + "skillname2": "Throw", + "skillname20": "Lightning Bolt", + "skillname21": "Ice Arrow", + "skillname217": "Scroll of Identify", + "skillname218": "Tome of Identify", + "skillname219": "Scroll of Townportal", + "skillname22": "Guided Arrow", + "skillname220": "Tome of Townportal", + "skillname23": "Penetrate", + "skillname24": "Charged Strike", + "skillname25": "Plague Javelin", + "skillname26": "Strafe", + "skillname27": "Immolation Arrow", + "skillname28": "Decoy", + "skillname29": "Evade", + "skillname3": "Unsummon", + "skillname30": "Fend", + "skillname31": "Freezing Arrow", + "skillname32": "Valkyrie", + "skillname33": "Pierce", + "skillname34": "Lightning Strike", + "skillname35": "Lightning Fury", + "skillname36": "Fire Bolt", + "skillname37": "Warmth", + "skillname38": "Charged Bolt", + "skillname39": "Ice Bolt", + "skillname4": "Left Hand Throw", + "skillname40": "Frozen Armor", + "skillname41": "Inferno", + "skillname42": "Static Field", + "skillname43": "Telekinesis", + "skillname44": "Frost Nova", + "skillname45": "Ice Blast", + "skillname46": "Blaze", + "skillname47": "Fire Ball", + "skillname48": "Nova", + "skillname49": "Lightning", + "skillname5": "Left Hand Swing", + "skillname50": "Shiver Armor", + "skillname51": "Fire Wall", + "skillname52": "Enchant", + "skillname53": "Chain Lightning", + "skillname54": "Teleport", + "skillname55": "Glacial Spike", + "skillname56": "Meteor", + "skillname57": "Thunder Storm", + "skillname58": "Energy Shield", + "skillname59": "Blizzard", + "skillname6": "Magic Arrow", + "skillname60": "Chilling Armor", + "skillname62": "Hydra", + "skillname63": "Lightning Mastery", + "skillname64": "Frozen Orb", + "skillname65": "Cold Mastery", + "skillname66": "Amplify Damage", + "skillname67": "Teeth", + "skillname68": "Bone Armor", + "skillname69": "Skeleton Mastery", + "skillname7": "Fire Arrow", + "skillname70": "Raise Skeleton", + "skillname71": "Dim Vision", + "skillname72": "Weaken", + "skillname73": "Poison Dagger", + "skillname74": "Corpse Explosion", + "skillname75": "Clay Golem", + "skillname76": "Iron Maiden", + "skillname77": "Terror", + "skillname78": "Bone Wall", + "skillname79": "Golem Mastery", + "skillname8": "Inner Sight", + "skillname80": "Raise Skeletal Mage", + "skillname81": "Confuse", + "skillname82": "Life Tap", + "skillname83": "Poison Explosion", + "skillname84": "Bone Spear", + "skillname85": "Blood Golem", + "skillname86": "Attract", + "skillname87": "Decrepify", + "skillname88": "Bone Prison", + "skillname89": "Summon Resist", + "skillname9": "Critical Strike", + "skillname90": "Iron Golem", + "skillname91": "Lower Resist", + "skillname92": "Poison Nova", + "skillname93": "Bone Spirit", + "skillname94": "Fire Golem", + "skillname95": "Revive", + "skillname96": "Sacrifice", + "skillname97": "Smite", + "skillname98": "Might", + "skillname99": "Prayer", + "skillsname61": "Fire Mastery", + "skl": "Flawless Skull", + "skp": "Skull Cap", + "skr": "Scissors Katar", + "sku": "Skull", + "skz": "Perfect Skull", + "slayer": "Slayer", + "slippers": "Slippers", + "smasher": "Smasher", + "sml": "Small Shield", + "sol": "Soul", + "song": "Song", + "spawn": "Spawn", + "spc": "Spiked Club", + "spe": "Spleen", + "spell": "Spell", + "spike": "Spike", + "spiral": "Spiral", + "spire": "Spire", + "spk": "Spiked Shield", + "spl": "Splint Mail", + "splitter": "Splitter", + "spr": "Spear", + "spt": "Spetum", + "spur": "Spur", + "ssd": "Short Sword", + "ssp": "Short Spear", + "sst": "Short Staff", + "stake": "Stake", + "stalker": "Stalker", + "star": "Star", + "std": "Standard of Heroes", + "stinger": "Stinger", + "strModAllResistances": "All Resistances +%d", + "strModAllSkillLevels": "+%d to All Skill Levels", + "strModColdDamage": "+%d cold damage", + "strModColdDamageRange": "Adds %d-%d cold damage", + "strModEnhancedDamage": "Enhanced Damage\n", + "strModFireDamage": "+%d fire damage", + "strModFireDamageRange": "Adds %d-%d fire damage", + "strModLightningDamage": "+%d lightning damage", + "strModLightningDamageRange": "Adds %d-%d lightning damage", + "strModMagicDamage": "+%d magic damage", + "strModMagicDamageRange": "Adds %d-%d magic damage", + "strModMinDamage": "+%d damage", + "strModMinDamageRange": "Adds %d-%d damage", + "strModPoisonDamage": "+%d poison damage over %d seconds", + "strModPoisonDamageRange": "Adds %d-%d poison damage over %d seconds", + "strap": "Strap", + "stu": "Studded Leather", + "suit": "Suit", + "sunder": "Sunder", + "swb": "Short War Bow", + "tal": "Tail", + "talisman": "Talisman", + "tax": "Throwing Axe", + "tbk": "Tome of Town Portal", + "tbl": "Heavy Belt", + "tbt": "Light Plated Boots", + "tch": "Torch", + "tes": "Twisted Essence of Suffering", + "tgl": "Light Gauntlets", + "thirst": "Thirst", + "tkf": "Throwing Knife", + "toa": "Right-click to reset Stat/Skill Points\nToken of Absolution", + "torc": "Torc", + "touch": "Touch", + "tow": "Tower Shield", + "tower": "Tower", + "tr1": "Horadric Scroll", + "tr2": "Right Click to Cast\nScroll of Resistance", + "track": "Track", + "trample": "Trample", + "tread": "Tread", + "tri": "Trident", + "tsc": "Scroll of Town Portal", + "tsp": "Throwing Spear", + "turn": "Turn", + "uap": "Shako", + "uar": "Sacred Armor", + "ucl": "Loricated Mail", + "uea": "Wyrmhide", + "uh9": "Bone Visage", + "uhb": "Myrmidon Greaves", + "uhc": "Colossus Girdle", + "uhg": "Ogre Gauntlets", + "uhl": "Giant Conch", + "uhm": "Spired Helm", + "uhn": "Boneweave", + "uit": "Monarch", + "ukp": "Hydraskull", + "ula": "Scarab Husk", + "ulb": "Wyrmhide Boots", + "ulc": "Spiderweb Sash", + "uld": "Kraken Shell", + "ulg": "Bramble Mitts", + "ulm": "Armet", + "ult": "Hellforge Plate", + "umb": "Boneweave Boots", + "umc": "Mithril Coil", + "umg": "Vambraces", + "uml": "Luna", + "ung": "Diamond Mail", + "uow": "Aegis", + "upk": "Blade Barrier", + "upl": "Balrog Skin", + "urg": "Hyperion", + "urn": "Corona", + "urs": "Great Hauberk", + "ush": "Troll Nest", + "usk": "Demonhead", + "utb": "Mirrored Boots", + "utc": "Troll Belt", + "utg": "Crusader Gauntlets", + "uth": "Lacquered Plate", + "utp": "Archon Plate", + "uts": "Ward", + "utu": "Wire Fleece", + "uuc": "Heater", + "uui": "Dusk Shroud", + "uul": "Shadow Plate", + "uvb": "Scarabshell Boots", + "uvc": "Vampirefang Belt", + "uvg": "Vampirebone Gloves", + "vbl": "Light Belt", + "vbt": "Heavy Boots", + "veil": "Veil", + "vgl": "Heavy Gloves", + "vip": "Top of the Horadric Staff", + "visage": "Visage", + "visor": "Visor", + "vou": "Voulge", + "vps": "Stamina Potion", + "wand": "Wand", + "ward": "Ward", + "wax": "War Axe", + "weaver": "Weaver", + "whm": "War Hammer", + "whorl": "Whorl", + "winding": "Winding", + "wing": "Wing", + "wms": "Thawing Potion", + "wnd": "Wand", + "wood": "Wood", + "wrack": "Wrack", + "wrap": "Wrap", + "wrb": "Wrist Blade", + "wsc": "War Scythe", + "wsd": "War Sword", + "wsp": "War Scepter", + "wst": "War Staff", + "xap": "War Hat", + "xar": "Ornate Plate", + "xcl": "Tigulated Mail", + "xea": "Serpentskin Armor", + "xh9": "Grim Helm", + "xhb": "War Boots", + "xhg": "War Gauntlets", + "xhl": "Basinet", + "xhm": "Winged Helm", + "xhn": "Mesh Armor", + "xit": "Dragon Shield", + "xkp": "Sallet", + "xla": "Demonhide Armor", + "xlb": "Demonhide Boots", + "xld": "Sharktooth Armor", + "xlg": "Demonhide Gloves", + "xlm": "Casque", + "xlt": "Templar Coat", + "xmb": "Mesh Boots", + "xmg": "Heavy Bracers", + "xml": "Round Shield", + "xng": "Linked Mail", + "xow": "Pavise", + "xpk": "Barbed Shield", + "xpl": "Russet Armor", + "xrg": "Scutum", + "xrn": "Grand Crown", + "xrs": "Cuirass", + "xsh": "Grim Shield", + "xsk": "Death Mask", + "xtb": "Battle Boots", + "xtg": "Battle Gauntlets", + "xth": "Embossed Plate", + "xtp": "Mage Plate", + "xts": "Ancient Shield", + "xtu": "Trellised Armor", + "xuc": "Defender", + "xui": "Ghost Armor", + "xul": "Chaos Armor", + "xvb": "Sharkskin Boots", + "xvg": "Sharkskin Gloves", + "xyz": "Right Click to permanently add 20 to Life\nPotion of Life", + "yps": "Antidote Potion", + "ywn": "Yew Wand", + "zhb": "War Belt", + "zlb": "Demonhide Sash", + "zmb": "Mesh Belt", + "ztb": "Battle Belt", + "zvb": "Sharkskin Belt", + "strethereal": "Ethereal (Cannot be Repaired)" +} + +export const CANONICAL_CHI_TBL_DICT: Readonly> = { + "2ax": "雙刃斧", + "2hs": "雙手劍", + "7wa": "狂戰士斧", + "8bs": "哥德之棍", + "8cb": "雙弓", + "8cs": "杉木之棍", + "8hb": "剃刀之弓", + "8hx": "弩弓", + "8l8": "長攻城弓", + "8lb": "杉木弓", + "8ls": "六尺棍", + "8lw": "哥德弓", + "8lx": "石弓", + "8mx": "攻城十字弓", + "8rx": "巧工弩", + "8s8": "短攻城弓", + "8sb": "鋒銳之弓", + "8ss": "喬木棒", + "8sw": "符文之弓", + "8ws": "符文之棍", + "92a": "強化雙斧", + "92h": "斬鐵劍", + "9ax": "切肉斧", + "9b7": "羅佳柏斧", + "9b8": "戟", + "9b9": "哥德劍", + "9ba": "鉤斧", + "9bk": "巨戰飛標", + "9bl": "小劍", + "9br": "巨戰之叉", + "9bs": "戰鬥劍", + "9bt": "鬥戰斧", + "9bw": "古墓之杖", + "9cl": "棍棒", + "9cm": "雙刃鐮", + "9cr": "空間之刃", + "9dg": "銳匕", + "9di": "詩歌匕首", + "9fb": "瑞韓德", + "9fc": "圓月彎刀", + "9fl": "皮鞭", + "9ga": "哥德之斧", + "9gd": "死刑之劍", + "9gi": "古代之斧", + "9gl": "闊針劍", + "9gm": "戰槌", + "9gs": "長牙劍", + "9gw": "墓地之杖", + "9h9": "雙鋒戰戟", + "9ha": "小斧", + "9ja": "巨戰標槍", + "9kr": "強波刀", + "9la": "軍斧", + "9ls": "符文劍", + "9m9": "巨戰木棍", + "9ma": "凸緣釘頭錘", + "9mp": "喙鉗", + "9mt": "鋸齒流星鎚", + "9p9": "長槍", + "9pa": "戰戟", + "9pi": "卓越標槍", + "9qs": "聖水噴杖", + "9s8": "戰鬥鐮刀", + "9s9": "銳矛", + "9sb": "虛偽之刃", + "9sc": "符文權杖", + "9sm": "微彎劍", + "9sp": "倒鉤鎚", + "9sr": "巨戰長矛", + "9ss": "羅馬短劍", + "9st": "亞利", + "9ta": "法蘭飛斧", + "9tk": "戰鬥飛鏢", + "9tr": "弗斯西那", + "9ts": "魚叉", + "9vo": "比爾", + "9wa": "納卡", + "9wc": "殘酷鐮刀", + "9wd": "古代之劍", + "9wh": "戰鬥鐵鎚", + "9wn": "燒焦之杖", + "9ws": "神屬權杖", + "9yw": "淨化之杖", + "AmaOnly": "(限亞馬遜使用)", + "Amazon": "亞馬遜", + "Amber": "琥珀之", + "Amulet of the Viper": "蝮蛇護符", + "Angel's": "天使之", + "Angelic Halo": "天使之光", + "Angelic Mantle": "天使的披風", + "Angelic Sickle": "天使的鐮刀", + "Angelic Wings": "天使之翼", + "Angelical Raiment": "天上的衣服", + "Arcanna's Deathwand": "阿卡娜的死亡之杖", + "Arcanna's Flesh": "阿卡娜的血肉", + "Arcanna's Head": "阿卡娜的頭", + "Arcanna's Sign": "阿卡娜的符號", + "Arcanna's Tricks": "卡阿娜的詭計", + "Arch-Angel's": "大天使之", + "Archer's": "弓箭手之", + "Arctic Binding": "北極捆縛", + "Arctic Furs": "北極毛皮", + "Arctic Gear": "北極裝置", + "Arctic Horn": "北極號角", + "Arctic Mitts": "北極手套", + "AssOnly": "(限刺客使用)", + "Assassin": "刺客", + "Azure": "天青之", + "Azurewrath": "青色忿怒", + "Bane": "剋星", + "Bane Ash": "禍根之灰", + "BarOnly": "(限野蠻人使用)", + "Barbarian": "野蠻人", + "Beast": "野獸之", + "Berserker's": "狂戰士之", + "Berserker's Garb": "狂戰士的軍火庫", + "Berserker's Hatchet": "狂戰士的手斧", + "Berserker's Hauberk": "狂戰士的鎖子甲", + "Berserker's Headgear": "狂戰士的頭戴", + "Beryl": "海藍之", + "Bitter": "受難之", + "Blacktongue": "黑色之舌", + "Bladebone": "肩胛骨", + "Bladebuckle": "鋒利扣帶", + "Blank": "虛無之", + "Blastbark": "爆裂的吠叫", + "Blessed": "祝福之", + "Blinkbats Form": "眨眼蝙蝠的外觀", + "Blood": "血之", + "Blood Crescent": "血紅新月", + "Bloodfist": "血拳", + "Bloodrise": "血昇", + "Bloodthief": "血之偷", + "Bone": "白骨之", + "Boneflesh": "骨肉", + "Bonesob": "碎骨", + "Brainhew": "腦袋", + "Bramble": "野薔薇之", + "Bright": "光明之", + "Brimstone": "硫磺之", + "Brogues": "粗皮鞋", + "Bronze": "青銅之", + "Brutal": "殘忍之", + "Burgundy": "紅棕之", + "Bverrit Keep": "貝弗提的紀念", + "Carrion": "腐屍之", + "Cathan's Mesh": "卡珊之網", + "Cathan's Rule": "卡珊之尺", + "Cathan's Seal": "卡珊的封印", + "Cathan's Sigil": "卡珊的魔咒", + "Cathan's Traps": "卡珊的陷阱", + "Cathan's Visage": "卡珊的容貌", + "Chance Guards": "運氣守護", + "Chaos": "混沌之", + "Civerb's Cudgel": "希弗伯的短棍", + "Civerb's Icon": "希弗伯的圖案", + "Civerb's Vestments": "希弗伯的法衣", + "Civerb's Ward": "希弗柏的防護", + "Cleglaw's Brace": "克雷得勞的支柱", + "Cleglaw's Claw": "克雷得勞之爪", + "Cleglaw's Pincers": "克雷得勞之鉗", + "Cleglaw's Tooth": "克雷得勞之牙", + "Cobalt": "鈷之", + "Coif of Glory": "光榮布帽", + "Coral": "珊瑚之", + "Corpse": "屍體之", + "Corruption": "毀滅之", + "Cracked": "破碎的", + "Crimson": "棗紅之", + "Crude": "粗製的", + "Cruel": "殘忍之", + "Crushflange": "壓碎的凸邊", + "Culwens Point": "庫爾溫的尖端", + "Cutthroat1": "巴特克的猛擊", + "Damaged": "損壞的", + "Darkglow": "擴散黑暗", + "Deadly": "致命之", + "Death": "死亡之", + "Death's Disguise": "死亡的偽裝", + "Death's Guard": "死亡的守護", + "Death's Hand": "死亡之手", + "Death's Touch": "死亡之觸", + "Deathspade": "死亡之鏟", + "Demon": "惡魔之", + "Devious": "迂迴之", + "Dimoaks Hew": "迪馬克之劈砍", + "Dire": "悲慘之", + "Doom": "毀滅之", + "Doomspittle": "毀滅投石者", + "Dragon's": "龍之", + "Drake's": "德爾克之", + "Dread": "恐懼之", + "DruOnly": "(限德魯伊使用)", + "Druid": "德魯依", + "Duskdeep": "黃昏深處", + "Eagle": "老鷹之", + "Emerald": "祖母綠之", + "Empyrion": "埃之及", + "Entropy": "幽冥之", + "ExInsertSocketsX": "可以放入凹槽物品", + "Fechmars Axe": "費屈瑪之斧", + "Felloak": "兇猛橡樹", + "Fiendra": "魔鬼", + "Fine": "精良之", + "Fletcher's": "製箭者之", + "Forked": "分叉之", + "Fortified": "防禦強化之", + "Fortuitous": "偶然之", + "Frostburn": "霜燃", + "Gale": "狂風之", + "Garnet": "深紅之", + "Gemmed": "鑲上寶石的", + "GemmedNormalName": "%0 %1", + "GhoulRI": "食屍鬼之", + "Gleamscythe": "閃耀的鐮刀", + "Glimmering": "微光之", + "Glorious": "光榮之", + "Glowing": "發光之", + "Glyph": "繪畫文字之", + "Goblin Toe": "小妖精腳趾", + "Gold": "金之", + "Goldskin": "黃金之皮", + "Goldwrap": "金色包裏", + "Gorefoot": "血腳", + "Goreshovel": "血塊之鏟", + "Gravenspine": "墓穴之脊", + "Greyform": "薄暮外觀", + "Grim": "冷酷之", + "Griswolds Edge": "格理斯瓦得的銳利", + "Gull": "海鷗", + "Hailstone": "霰之", + "Havoc": "浩劫之", + "Hawkmail": "鷹甲", + "Heavenly Garb": "天堂裝束", + "Hell Forge Hammer": "地獄熔爐鐵鎚", + "Hellcast": "投擲地獄", + "Hellclap": "作響的地獄", + "Hellfire Torch": "地獄火炬", + "Hellplague": "地獄瘟疫", + "Hiquality": "超強的", + "Holocaust": "世界末日之", + "Holy": "神聖之", + "Horadric Staff": "赫拉迪克法杖", + "Hotspur": "熱靴刺", + "Howling": "咆哮之", + "Howltusk": "怒號長牙", + "Hsarus' Defense": "哈斯拉柏的防禦", + "Hsarus' Iron Fist": "哈斯拉柏的鐵拳", + "Hsarus' Iron Heel": "哈斯拉柏的鐵後跟", + "Hsarus' Iron Stay": "哈斯拉柏的鐵胸衣", + "Iceblink": "冰雪眨眼", + "Ichorsting": "靈液之刺", + "Imp": "小惡魔之", + "Infernal Cranium": "地獄頭骨", + "Infernal Sign": "地獄符號", + "Infernal Tools": "地獄的工具", + "Infernal Torch": "地獄火炬", + "Iratha's Coil": "依雷撒的線圈", + "Iratha's Collar": "依雷撒的項圈", + "Iratha's Cord": "依雷撒之繩", + "Iratha's Cuff": "依雷撒的袖口", + "Iratha's Finery": "依雷撒的精銑爐", + "Irices Shard": "妖怪碎片", + "Iron": "鐵之", + "Ironstone": "鐵石", + "Iros Torch": "衣洛的火炬", + "Isenhart's Armory": "依森哈德的武器室", + "Isenhart's Case": "依森哈德的外殼", + "Isenhart's Horns": "依森哈德的號角", + "Isenhart's Lightbrand": "依森哈德的光之烙鐵", + "Isenhart's Parry": "依森哈德的閃避", + "ItemStats1a": "不符合需求", + "ItemStats1b": "未辨視", + "ItemStats1c": "使用次數:", + "ItemStats1d": "耐久度:", + "ItemStats1e": "須要的力量點數:", + "ItemStats1f": "須要的敏捷點數:", + "ItemStats1g": "傷害:", + "ItemStats1h": "防禦:", + "ItemStats1i": "數量:", + "ItemStats1j": "之", + "ItemStats1l": "單手傷害:", + "ItemStats1m": "雙手傷害:", + "ItemStats1n": "投擲傷害:", + "ItemStats1o": "重擊傷害:", + "ItemStats1p": "須要等級:", + "ItemStats1q": "點數:", + "ItemStats1r": "格擋機率:", + "ItemStatsrejuv1": "回復35%的生命和法力", + "ItemStatsrejuv2": "回復100%的生命和法力", + "Jade": "翠綠之", + "Jagged": "鋸齒之", + "KhalimFlail": "克林姆的連枷", + "Kinemils Awl": "金麥爾的錐子", + "King's": "國王之", + "Knell Striker": "敲擊喪鐘者", + "Knight's": "騎士之", + "Krintizs Skewer": "格林提斯的肉叉", + "Lance of Yaggai": "雅該長矛", + "Lapis": "天藍之", + "Lazarus Spire": "拉撒羅斯之螺旋", + "Leadcrow": "引導烏鴉", + "Lenyms Cord": "雷尼摩", + "Lizard's": "蜥蜴之", + "Loath": "不願之", + "Lord's": "君王之", + "Low Quality": "劣質的", + "Maelstromwrath": "漩渦", + "Magefist": "法師之拳", + "Maiden's": "處女之", + "Manald Heal": "瑪那得的治療", + "Massive": "穩重之", + "Merciless": "絕情之", + "Meteoric": "隕鐵之", + "Milabrega's Diadem": "米拉伯佳的王冠", + "Milabrega's Orb": "米拉伯佳之球", + "Milabrega's Regalia": "米拉伯佳的雪茄", + "Milabrega's Robe": "米拉伯佳之袍", + "Milabrega's Rod": "米拉伯佳之杖", + "Mindrend": "切開骷髏", + "ModStr1a": "力量", + "ModStr1b": "敏捷", + "ModStr1c": "體力", + "ModStr1d": "精力", + "ModStr1e": "法力", + "ModStr1f": "最大傷害值", + "ModStr1g": "最小傷害值", + "ModStr1h": "準確率", + "ModStr1i": "防禦", + "ModStr1j": "抗火", + "ModStr1k": "抗寒", + "ModStr1l": "抗閃電", + "ModStr1m": "抗魔法", + "ModStr1n": "抗毒", + "ModStr1o": "火焰傷害最大值", + "ModStr1p": "火焰傷害最小值", + "ModStr1q": "閃電傷害最大值", + "ModStr1r": "閃電傷害最小值", + "ModStr1s": "寒冷傷害最大值", + "ModStr1t": "寒冷傷害最小值", + "ModStr1u": "生命", + "ModStr1v": "攻擊者受到傷害", + "ModStr1w": "額外金幣從怪物身上取得", + "ModStr1x": "更佳的機會取得魔法裝備", + "ModStr1y": "擊退", + "ModStr1z": "力量靈葯", + "ModStr2a": "敏捷靈葯", + "ModStr2b": "能量靈葯", + "ModStr2c": "體力靈葯", + "ModStr2d": "法力靈葯", + "ModStr2e": "生命靈葯", + "ModStr2f": "每秒持久性", + "ModStr2g": "增加生命上限", + "ModStr2h": "增加法力上限", + "ModStr2i": "增加耐久性上限", + "ModStr2j": "增加傷害上限", + "ModStr2k": "增加傷害底限", + "ModStr2l": "生命補滿", + "ModStr2m": "法力補滿", + "ModStr2n": "醫治1/4生命", + "ModStr2o": "醫治1/2生命", + "ModStr2p": "醫治所有生命", + "ModStr2q": "回復 1/4法力", + "ModStr2r": "回復1/2法力", + "ModStr2s": "回復所有法力", + "ModStr2t": "法術傷害減少", + "ModStr2u": "傷害減少", + "ModStr2w": "吸取生命", + "ModStr2x": "吸取法力", + "ModStr2y": "擊中偷取法力", + "ModStr2z": "擊中偷取生命", + "ModStr3a": "亞馬遜技能等級", + "ModStr3b": "聖騎士技能等級", + "ModStr3c": "死靈法師技能等級", + "ModStr3d": "法師技能等級", + "ModStr3e": "野蠻人技能等級", + "ModStr3f": "照亮範圍", + "ModStr3g": "增加格檔可能性", + "ModStr3h": "需求", + "ModStr3i": "火焰技能", + "ModStr3j": "攻擊者受到電擊傷害", + "ModStr3k": "所有技能", + "ModStr3l": "凍結目標", + "ModStr3m": "撕開傷口機會", + "ModStr3n": "隱形", + "ModStr3o": "天生隱形", + "ModStr3p": "無法力治療", + "ModStr3q": "無生命治療", + "ModStr3r": "毒素的持續效果降低", + "ModStr3u": "擊中使怪物逃跑", + "ModStr3v": "回復體力加", + "ModStr3w": "受損的生命移至法力", + "ModStr3x": "回復生命加", + "ModStr3y": "忽視目標防禦力", + "ModStr3z": "毒素持續時間減半", + "ModStr4a": "防止怪物自療", + "ModStr4b": "冰凍時間減半", + "ModStr4c": "額外的攻擊準確率加成", + "ModStr4d": "每次擊中降低怪物防禦", + "ModStr4e": "對惡魔的傷害", + "ModStr4f": "對不死生物的傷害", + "ModStr4g": "法力重生", + "ModStr4h": "增加毒素傷害上限", + "ModStr4i": "增加毒素傷害底限", + "ModStr4j": "對抗惡魔準確率", + "ModStr4k": "對抗不死生物準確率", + "ModStr4l": "稍微增加準確率", + "ModStr4m": "增加準確率", + "ModStr4n": "強化準確率", + "ModStr4o": "再度攻擊速度加快", + "ModStr4p": "快速再度攻擊", + "ModStr4q": "超快速再度攻擊", + "ModStr4r": "跑步/行走加快", + "ModStr4s": "高速跑步/行走", + "ModStr4t": "急速跑步/行走", + "ModStr4u": "施展速度加快", + "ModStr4v": "高速施展速度", + "ModStr4w": "超高速施展率", + "ModStr4x": "快速格檔率", + "ModStr4y": "較快速格檔率", + "ModStr4z": "超高速格檔率", + "ModStr5a": "可投擲", + "ModStr5b": "傷害", + "ModStr5c": "造成壓碎性打擊的機率", + "ModStr5d": "精力最大值", + "ModStr5e": "腳踢傷害", + "ModStr5f": "點法力在每殺一個敵人後取得", + "ModStr5g": "火焰吸收", + "ModStr5h": "火焰吸收", + "ModStr5i": "閃電吸收", + "ModStr5j": "閃電吸收", + "ModStr5k": "魔法吸收", + "ModStr5l": "魔法吸收", + "ModStr5m": "寒冷吸收", + "ModStr5n": "寒冷吸收", + "ModStr5o": "目標防禦", + "ModStr5p": "額外血腥", + "ModStr5q": "致命攻擊", + "ModStr5r": "使目標減慢", + "ModStr5s": "祝福瞄準", + "ModStr5t": "輕視", + "ModStr5u": "最大火焰抵抗", + "ModStr5v": "最大冰凍抵抗", + "ModStr5w": "最大閃電抵抗", + "ModStr5x": "最大魔法抵抗", + "ModStr5y": "最大毒素抵抗", + "ModStr5z": "無法冰凍", + "ModStr6a": "對飛射性防禦", + "ModStr6b": "對近戰防禦", + "ModStr6c": "生命在殺死每一個惡魔後自動取得", + "ModStr6d": "擊中使目標目盲", + "ModStr6e": "減緩精力消耗", + "ModStr6f": "機會使目標復活", + "ModStr6g": "穿刺攻擊", + "ModStr6h": "射出魔法箭矢", + "ModStr6i": "箭矢或十字弓彈火焰爆炸", + "ModStre8b": "刺客技能", + "ModStre9j": "火焰傷害降低", + "ModStre9k": "冰冷傷害降低", + "ModStre9l": "閃電傷害降低", + "ModStre9m": "毒素傷害降低", + "ModStre9n": "吸收魔法傷害", + "ModStre9o": "吸收火焰傷害", + "ModStre9p": "吸收冰冷傷害", + "ModStre9q": "吸收閃電傷害", + "ModStre9r": "吸收毒素傷害", + "Moditem2ExpG": "轉為經驗值獲得", + "Moditem2allattrib": "轉為所有的屬性", + "ModitemAttratvsM": "轉為命中率相對", + "ModitemAura": "等級%d %s靈氣賦予", + "ModitemHPaK": "生命值在殺死後獲得", + "ModitemRedVendP": "降低所有商人的價格", + "ModitemSMRIP": "殺死怪物回復平靜", + "ModitemdamColdsk": "對冰凍技能傷害", + "ModitemdamFiresk": "對火焰技能傷害", + "ModitemdamLtngsk": "對雷電系技能傷害", + "ModitemdamPoissk": "轉為毒素技能傷害", + "Moditemdamvsm": "轉為傷害相對", + "Moditemenrescoldsk": "對敵人冰凍系抗性", + "Moditemenresfiresk": "對敵人火焰系抗性", + "Moditemenresltngsk": "對敵人雷電系抗性", + "Moditemenrespoissk": "對敵人毒素系抗性", + "Moditemreanimas": "復活為:", + "ModitemskonKill": "當你殺死一敵人 %d%% 機會施展等級 %d %s", + "ModitemskonLevel": "當你升級 %d%% 機會施展等級 %d %s", + "Moditemskondeath": "當你死去 %d%% 機會施展等級 %d %s", + "Modstr2v": "防禦強化", + "Monk's": "僧人之", + "Nagelring": "拿各的戒指", + "NecOnly": "(限死靈法師)", + "Necromancer": "死靈法師", + "Necromancer's": "死靈法師之", + "Nightsmoke": "夜煙", + "Nokozan Relic": "諾科藍遺物", + "Ocher": "赭黃之", + "Order": "秩序之", + "Pain": "痛苦之", + "PalOnly": "(限聖騎士)", + "Paladin": "聖騎士", + "Pelt": "投擲", + "Pelta Lunata": "新月小盾", + "Piercerib": "蘿格之弓", + "PlagueRI": "瘟疫之", + "Platinum": "白金之", + "Pluckeye": "勇氣之眼", + "Priest's": "牧師之", + "Prismatic": "稜鏡之", + "Pullspite": "暴風之擊", + "Rakescar": "火鉤之傷", + "Rattlecage": "作響之籠", + "Raven": "渡鳥之", + "Razortine": "剃刀之叉", + "Red": "紅之", + "Rift": "破開之", + "Rimeraven": "渡鳥之爪", + "Ripsaw": "粗齒大鋸", + "Rixots Keen": "瑞克撒特的輓歌", + "Rockfleece": "石之毛", + "Ruby": "紅寶石之", + "Rugged": "凹凸之", + "Rule": "法規", + "Rune": "符號之", + "Runeword22": "迪勒瑞姆", + "Russet": "赤楬之", + "Rusthandle": "生銹的把手", + "Saintly": "崇高之", + "Sapphire": "蔚藍之", + "Savage": "野蠻之", + "Serpent Lord": "海蛇之王", + "Serpent's": "海蛇之", + "Shadow": "陰影之", + "Shadowfang": "影之牙", + "Sharp": "尖銳之", + "Sigon's Complete Steel": "西剛的全套刀劍", + "Sigon's Gage": "西剛的挑戰", + "Sigon's Guard": "西剛的守護", + "Sigon's Sabot": "西剛的木鞋", + "Sigon's Shelter": "西剛的遮蔽", + "Sigon's Visor": "西剛之面甲", + "Sigon's Wrap": "西剛的披肩", + "Silver": "銀之", + "Skillname224": "狼人變化", + "Skull": "骷髏之", + "Slayer's": "屠殺者之", + "Snake's": "蛇之", + "Snakecord": "蛇索", + "Socketable": "有凹槽", + "Soldier's": "士兵之", + "SorOnly": "(限法師)", + "Sorceress": "法師", + "Soul": "靈魂之", + "Soul Harvest": "靈魂採集者", + "Soulflay": "剝皮靈魂", + "Sparking Mail": "火花之甲", + "Spirit": "精神之", + "Staff of Kings": "國王之杖", + "Steel": "鋼之", + "Steelclash": "作響的金屬", + "Steeldriver": "鐵製大鎚", + "Steelgoad": "鐵刺棒", + "Stone": "石塊之", + "Storm": "暴風之", + "Stormeye": "暴風眼", + "Stormguild": "暴風公會", + "Stoutnail": "堅硬的指甲", + "StrSklTabItem1": "+%d 鏢槍和長矛技能", + "StrSklTabItem10": "+%d 戰嚎", + "StrSklTabItem11": "+%d 戰鬥技能", + "StrSklTabItem12": "+%d 支配性", + "StrSklTabItem13": "+%d 冰冷系技能", + "StrSklTabItem14": "+%d 閃電系技能", + "StrSklTabItem15": "+%d 火焰系技能", + "StrSklTabItem16": "+%d 召喚系技能", + "StrSklTabItem17": "+%d 變形系技能", + "StrSklTabItem18": "+%d 元素系技能", + "StrSklTabItem19": "+%d 陷阱", + "StrSklTabItem2": "+%d 被動和魔法技能", + "StrSklTabItem20": "+%d 影子訓練", + "StrSklTabItem21": "+%d 武學藝術", + "StrSklTabItem3": "+%d 弓和十字弓技能", + "StrSklTabItem4": "+%d 防禦性靈氣", + "StrSklTabItem5": "+%d 攻擊性靈氣", + "StrSklTabItem6": "+%d 戰鬥技能", + "StrSklTabItem7": "+%d 毒素和白骨技能", + "StrSklTabItem8": "+%d 詛咒", + "StrSklTabItem9": "+%d召喚技能", + "Strong": "強壯之", + "Sturdy": "結實之", + "Summoner's": "召喚者之", + "SuperKhalimFlail": "克林姆的意志", + "Swordback Hold": "劍背之架", + "Tancred's Battlegear": "坦克雷的戰鬥工具", + "Tancred's Crowbill": "坦克雷的鴉嘴鉗", + "Tancred's Hobnails": "坦克雷的平頭釘", + "Tancred's Skull": "坦克雷之骷髏", + "Tancred's Spine": "坦克雷的脊柱", + "Tancred's Weird": "坦克雷的怪誕", + "Tangerine": "紅柑之", + "Tarnhelm": "塔因頭盔", + "Tearhaunch": "淚之臀", + "The Battlebranch": "戰鬥支系", + "The Centurion": "百夫長", + "The Chieftan": "族長", + "The Diggler": "迪格勒", + "The Dragon Chang": "張龍", + "The Eye of Etlich": "艾利屈之眼", + "The Face of Horror": "恐懼之臉", + "The Generals Tan Do Li Ga": "坦-杜-裡-嘎將軍", + "The Gnasher": "牙齒", + "The Grim Reaper": "冷酷開膛手", + "The Hand of Broc": "柏克之手", + "The Humongous": "巨大無比", + "The Iron Jang Bong": "鐵檢棒", + "The Jade Tan Do": "坦杜之玉", + "The Mahim-Oak Curio": "瑪哈姆橡木古董", + "The Patriarch": "族長", + "The Salamander": "火精靈", + "The Stone of Jordan": "喬丹之石", + "The Tannr Gorerod": "坦之血杖", + "The Ward": "囚房", + "Tireless": "不倦之", + "Treads of Cthon": "凱松的征服", + "Triumphant": "成功之", + "Twitchthroe": "抽動的掙扎", + "Umbral Disk": "陰影圓盤", + "Umes Lament": "烏米的慟哭", + "Undead Crown": "不死皇冠", + "Valkyrie's": "女武神之", + "Venomsward": "毒液牢房", + "Vicious": "惡毒之", + "Victors Silk": "勝利者之絲綢", + "Vidala's Ambush": "維達拉的突襲", + "Vidala's Barb": "維達拉之倒刺", + "Vidala's Fetlock": "維達拉的距毛", + "Vidala's Rig": "維達拉的配備", + "Vidala's Snare": "維達拉的陷阱", + "Viper": "蝮蛇之", + "Viridian": "銘綠之", + "Vulpine": "奸詐之", + "Wall of the Eyeless": "無眼之牆", + "War Bonnet": "畢格因的軟帽", + "Warp": "扭曲之", + "Warrior's": "戰士之", + "WeaponAttackFast": "快速攻擊速度", + "WeaponAttackFastest": "超高速攻擊速度", + "WeaponAttackNormal": "一般攻擊速度", + "WeaponAttackSlow": "慢速攻擊速度", + "WeaponAttackSlowest": "滯慢攻擊速度", + "WeaponAttackVeryFast": "急速攻擊速度", + "WeaponAttackVerySlow": "緩慢攻擊速度", + "WeaponDescAxe": "斧頭等級", + "WeaponDescBow": "弓等級", + "WeaponDescCrossBow": "十字弓等級", + "WeaponDescDagger": "匕首等級", + "WeaponDescH2H": " ", + "WeaponDescJavelin": "標槍等級", + "WeaponDescMace": "釘鎚等級", + "WeaponDescPoleArm": "長棍等級", + "WeaponDescSpear": "長矛等級", + "WeaponDescStaff": "杖等級", + "WeaponDescSword": "劍等級", + "WeaponDescThrownPotion": "裝備後丟擲", + "WeaponRack": "武器架", + "Weird": "怪異", + "Whichwild String": "狂野之弦", + "Witherstring": "凋謝之戒", + "Wizendraw": "凋謝之畫", + "Woestave": "煩惱詩集", + "Wormskull": "溫暖骷髏", + "Wraithra": "忿怒", + "Wyrm's": "維特之", + "aar": "古代裝甲", + "aegis": "庇護", + "amu": "護身符", + "aqv": "箭矢", + "ass": "滑鼠右鍵點選後可以增加一點技能點數\n技能之書", + "axe": "斧", + "badge": "徽章", + "bal": "平衡斧", + "band": "箍", + "bar": "大砍刀", + "barRI": "酒吧", + "barb": "倒鉤", + "bax": "闊斧", + "bbb": "藍.依森之書", + "beads": "串珠", + "bet": "燃烧的恐惧精华", + "bey": "巴爾之眼", + "bhm": "白骨頭盔", + "bite": "咬", + "bkd": "石塚之鑰", + "bkf": "平衡小刀", + "bks": "艾尼弗斯卷軸", + "blazer": "發光體", + "bld": "短刀", + "blow": "吹", + "bludgeon": "棍棒", + "bolt": "彈", + "box": "赫拉迪克方塊", + "branch": "枝", + "brand": "品牌", + "breaker": "破壞者", + "brn": "叉", + "brow": "額頭", + "brs": "胸甲", + "bsd": "闊劍", + "bsh": "白骨盾牌", + "bst": "戰鬥法杖", + "bsw": "巨劍", + "btx": "戰鬥斧", + "buc": "圓盾", + "buckle": "釦帶", + "bwn": "骨杖", + "call": "呼減", + "cap": "帽子", + "carapace": "甲殼", + "casque": "盔", + "cbw": "組合弓", + "ceh": "充盈的憎恨精华", + "chain": "鏈條", + "chant": "曲", + "chn": "鎖子甲", + "circle": "環", + "circlet": "飾環", + "clasp": "扣鉤", + "claw": "爪", + "clb": "木棒", + "cleaver": "切肉刀", + "clm": "雙刃大刀", + "cloak": "斗蓬", + "clutches": "手爪", + "coat": "外袍", + "coil": "盤繞", + "collar": "項圈", + "cord": "捆綁", + "cowl": "蒙頭斗蓬", + "cqv": "十字弓彈", + "crack": "破裂", + "crest": "頂飾", + "crn": "皇冠", + "crook": "鉤", + "crs": "水晶劍", + "crusher": "壓碎者", + "cry": "哭喊", + "cst": "多節棍", + "cudgel": "木棒", + "d33": "吉得賓誘餌", + "dart": "鏢", + "dgr": "匕首", + "dhn": "暗黑破壞神之角", + "dir": "長匕首", + "dr1": " ", + "dr2": " ", + "dr3": " ", + "dr4": " ", + "dr5": " ", + "ear": "耳", + "edge": "刃", + "elx": "靈葯", + "emblem": "象徵", + "eye": "眼", + "fang": "尖牙", + "fed": "溃烂的毁灭精华", + "fhl": "高級頭盔", + "finger": "手指", + "fist": "拳", + "fla": "連枷", + "flange": "凸緣", + "flb": "雙手飾劍", + "flc": "彎形大刀", + "fld": "實戰鎧甲", + "fletch": "箭羽", + "flight": "翔", + "fringe": "邊飾", + "ful": "高級戰甲", + "g33": "吉得賓", + "g34": "黃金鳥", + "gax": "卓越之斧", + "gcb": "碎裂的藍寶石", + "gcg": "碎裂的綠寶石", + "gcr": "碎裂的紅寶石", + "gcv": "碎裂的紫寶石", + "gcw": "碎裂的鑽石", + "gcy": "碎裂的黃寶石", + "gfb": "裂開的藍寶石", + "gfg": "裂開的綠寶石", + "gfr": "裂開的紅寶石", + "gfv": "裂開的紫寶石", + "gfw": "裂開的鑽石", + "gfy": "裂開的黃寶石", + "ghm": "卓越頭盔", + "gis": "大劍", + "gix": "大斧", + "glb": "無暇疵的藍寶石", + "gld": "黃金", + "glg": "無暇疵的綠寶石", + "glr": "無暇疵的紅寶石", + "glv": "大長刀", + "glw": "無暇疵的鑽石", + "gly": "無暇疵的黃寶石", + "gma": "卓越巨棍", + "gnarl": "節", + "gnash": "咬牙", + "goad": "刺棒", + "gorget": "頸甲", + "gpb": "完美的藍寶石", + "gpg": "完美的綠寶石", + "gpl": "勒頸瓦斯葯劑", + "gpm": "窒息瓦斯葯劑", + "gpr": "完美的紅寶石", + "gps": "惡臭瓦斯葯劑", + "gpv": "完美的紫寶石", + "gpw": "完美的鑽石", + "gpy": "完美的黃寶石", + "grasp": "抓取", + "greave": "油渣", + "grinder": "研磨者", + "grip": "緊握", + "gsb": "藍寶石", + "gsc": "雄偉權杖", + "gsd": "卓越之劍", + "gsg": "綠寶石", + "gsr": "紅寶石", + "gsv": "紫寶石", + "gsw": "鑽石", + "gsy": "黃寶石", + "gth": "哥德戰甲", + "gts": "哥德盾牌", + "guard": "守衛", + "gutter": "槽", + "gwn": "殘酷之杖", + "gyre": "旋迴", + "gzv": "無暇疵的紫寶石", + "hal": "長戟", + "hand": "手", + "harness": "挽具", + "harp": "豎琴", + "hax": "手斧", + "hbl": "金屬扣帶", + "hbt": "護脛", + "hbw": "獵弓", + "hdm": "赫拉迪克.馬勒斯", + "heart": "心", + "hew": "砍", + "hfh": "地獄熔爐鐵鎚", + "hgl": "鐵手套", + "hide": "隱藏", + "hla": "硬皮甲", + "hlm": "頭盔", + "hold": "握", + "hood": "兜帽", + "horn": "角", + "hp1": "輕微治療葯劑", + "hp2": "輕型治療葯劑", + "hp3": "治療葯劑", + "hp4": "強力葯劑", + "hp5": "超級治療葯劑", + "hrb": "葯草", + "hst": "赫拉迪克之杖", + "hxb": "重十字弓", + "ibk": "辨視之書", + "impaler": "刺穿者", + "increaseswithplaylevelX": "(以角色等級決定)", + "isc": "辨視卷軸", + "j34": "玉製小人", + "jack": "水兵", + "jav": "標槍", + "key": "鑰匙", + "kit": "輕盾", + "knell": "喪鐘", + "knot": "結", + "knuckle": "指節", + "kri": "波形刀", + "lance": "長槍", + "lash": "抽打", + "lax": "巨斧", + "lbb": "長戰鬥弓", + "lbl": "飾帶", + "lbt": "皮靴", + "lbw": "長弓", + "lea": "皮甲", + "leg": "維特之腳", + "lgl": "皮手套", + "lock": "鎖", + "loom": "織布機", + "loop": "圈", + "lrg": "大盾牌", + "lsd": "長劍", + "lst": "長棍", + "ltp": "輕型裝甲", + "luv": "黑塔之鑰", + "lwb": "長巨戰弓", + "lxb": "輕十字弓", + "mac": "釘頭錘", + "mallet": "大頭錘", + "mangler": "亂砍者", + "mantle": "披風", + "mar": "毀損", + "mark": "標記", + "mask": "面具", + "master": "專家", + "mau": "大木棍", + "mbl": "扣帶", + "mbr": "曼菲斯托之腦", + "mbt": "鎖鍊靴", + "mgl": "鎖鍊手套", + "mp1": "輕微法力葯劑", + "mp2": "輕型法力葯劑", + "mp3": "法力葯劑", + "mp4": "強力法力葯劑", + "mp5": "超級法力葯劑", + "mpi": "軍用鍬", + "msf": "赫拉迪克之杖的轉軸", + "msk": "面具", + "mss": "墨菲斯托的靈魂之石", + "mst": "流星鎚", + "mxb": "十字弓", + "nails": "釘", + "ne1": " ", + "ne2": " ", + "ne3": " ", + "ne4": " ", + "ne5": " ", + "necklace": "項鍊", + "needle": "針", + "neg": "地獄爪牙之骨", + "nock": "搭弦", + "noose": "套索", + "ob1": " ", + "ob2": " ", + "ob3": " ", + "ob4": " ", + "ob5": " ", + "of Absorption": "吸收", + "of Accuracy": "準確的", + "of Alacrity": "輕快的", + "of Amelioration": "演進的", + "of Balance": "平衡的", + "of Bashing": "重擊的", + "of Blight": "光明的", + "of Blocking": "格擋的", + "of Brilliance": "才華的", + "of Burning": "燃燒的", + "of Carnage": "屠殺的", + "of Chance": "機會的", + "of Craftsmanship": "工匠的", + "of Defiance": "反抗的", + "of Deflecting": "偏向的", + "of Dexterity": "敏捷的", + "of Ease": "安逸的", + "of Energy": "能源的", + "of Equilibrium": "均衡", + "of Excellence": "精靈的", + "of Fire": "火的", + "of Flame": "火焰的", + "of Fortune": "幸運的", + "of Frost": "霜的", + "of Gore": "凝血的", + "of Greed": "貪婪的", + "of Guarding": "守衛的", + "of Haste": "憎恨的", + "of Health": "生命的", + "of Life": "生命的", + "of Light": "光明的", + "of Lightning": "閃電的", + "of Maiming": "殘廢的", + "of Measure": "測量的", + "of Might": "武力的", + "of Negation": "否定的", + "of Pacing": "步伐的", + "of Perfection": "完美的", + "of Performance": "表現的", + "of Pestilence": "瘟疫的", + "of Piercing": "刺穿的", + "of Precision": "精密的", + "of Protection": "保護的", + "of Puncturing": "爆破的", + "of Quality": "品質的", + "of Quickness": "快速的", + "of Radiance": "光彩的", + "of Readiness": "迅速的", + "of Regeneration": "重造的", + "of Regrowth": "重生的", + "of Remedy": "醫治的", + "of Shock": "衝擊的", + "of Simplicity": "簡樸的", + "of Skill": "技能的", + "of Slaughter": "殘殺的", + "of Slaying": "屠殺的", + "of Sorcery": "幻術的", + "of Speed": "速度的", + "of Spikes": "尖刺的", + "of Stability": "穩定的", + "of Strength": "力量的", + "of Swiftness": "敏捷的", + "of Thorns": "刺尖的", + "of Thunder": "雷電的", + "of Venom": "毒素的", + "of Vileness": "下流的", + "of Warding": "防避的", + "of Warmth": "融解的", + "of Wealth": "財富的", + "of Wizardry": "法術的", + "of Worth": "價值的", + "of the Apprentice": "學徒的", + "of the Bat": "蝙蝠的", + "of the Bear": "熊的", + "of the Colosuss": "太陽神的", + "of the Fox": "狐狸的", + "of the Giant": "巨人的", + "of the Glacier": "冰河的", + "of the Jackal": "豺狼的", + "of the Leech": "妖巫的", + "of the Locust": "蝗蟲的", + "of the Magus": "馬格斯的", + "of the Mammoth": "巨大的", + "of the Mind": "思想的", + "of the Ox": "公牛的", + "of the Sentinel": "步哨的", + "of the Sun": "太陽的", + "of the Tiger": "虎的", + "of the Titan": "泰坦的", + "of the Vampire": "吸血鬼的", + "of the Wolf": "狼的", + "of the Wraith": "死靈", + "opl": "猛爆性葯劑", + "opm": "爆炸葯劑", + "ops": "油", + "pale": "蒼白", + "pax": "長柄戰斧", + "picket": "尖木", + "pik": "矛", + "pil": "短鏢槍", + "pk1": "恐懼之鑰", + "pk2": "憎恨之鑰", + "pk3": "毀滅之鑰", + "plt": "鎧甲", + "prod": "刺", + "qbr": "克林姆的大腦", + "qey": "克林姆的眼球", + "qf1": "克林姆的連枷", + "qf2": "克林姆的意志", + "qhr": "克林姆的心臟", + "quarrel": "爭吵", + "qui": "布甲", + "quill": "羽", + "r13": "符文:夏", + "r16": "符文:破", + "r31": "符文:喬", + "razor": "剃刀", + "reaver": "強奪者", + "rend": "分裂", + "rin": "戒指", + "rng": "鎖環甲", + "rock": "石塊", + "rvl": "全面回復活力葯劑", + "rvs": "回復活力葯劑", + "rxb": "連射十字弓", + "saw": "鋸", + "sbb": "短戰鬥弓", + "sbr": "軍刀", + "sbw": "短弓", + "scalpel": "小刀", + "scarab": "聖甲蟲", + "scl": "鱗甲", + "scm": "彎刀", + "scourge": "鞭", + "scp": "權杖", + "scratch": "抓", + "scy": "鐮刀", + "scythe": "鐮刀", + "sever": "斷裂者", + "shank": "小腿", + "shell": "殼", + "shield": "盾護", + "shroud": "壽衣", + "skc": "碎裂的骷髏", + "skewer": "串列者", + "skf": "裂開的骷髏", + "skillname0": "攻擊", + "skillname1": "腳踢", + "skillname10": "戳刺", + "skillname100": "抗火", + "skillname101": "聖光彈", + "skillname102": "聖火", + "skillname103": "刺針", + "skillname104": "反抗", + "skillname105": "抗冰冷", + "skillname106": "白熱", + "skillname107": "突擊", + "skillname108": "祝福瞄準", + "skillname109": "淨化", + "skillname11": "冰箭", + "skillname110": "抵抗閃電", + "skillname111": "復仇", + "skillname112": "祝福之鎚", + "skillname113": "專注", + "skillname114": "神聖冰凍", + "skillname115": "精力", + "skillname116": "轉換", + "skillname117": "神聖之盾", + "skillname118": "神聖衝擊", + "skillname119": "庇護所", + "skillname12": "多重箭", + "skillname120": "冥思", + "skillname121": "天堂之拳", + "skillname122": "狂熱", + "skillname123": "信念", + "skillname124": "救贖", + "skillname125": "救助", + "skillname126": "重擊", + "skillname127": "支配長劍", + "skillname128": "支配斧頭", + "skillname129": "支配釘頭鎚", + "skillname13": "閃避", + "skillname130": "狂嗥", + "skillname131": "找尋葯劑", + "skillname132": "跳躍", + "skillname133": "雙手揮擊", + "skillname134": "支配長棍", + "skillname135": "支配飛擲", + "skillname136": "支配長矛", + "skillname137": "嘲弄", + "skillname138": "大叫", + "skillname139": "擊昏", + "skillname14": "威力一擊", + "skillname140": "雙手投擲", + "skillname141": "增加耐力", + "skillname142": "找尋物品", + "skillname143": "跳躍攻擊", + "skillname144": "專心", + "skillname145": "鐵布杉", + "skillname146": "戰嗥", + "skillname147": "狂亂", + "skillname148": "加速", + "skillname149": "戰鬥體制", + "skillname15": "毒槍", + "skillname150": "殘酷嚇阻", + "skillname151": "旋風", + "skillname152": "狂戰士", + "skillname153": "自然抵抗", + "skillname154": "戰鬥狂嗥", + "skillname155": "戰鬥指揮", + "skillname16": "爆裂箭", + "skillname17": "慢速箭", + "skillname18": "躲避", + "skillname19": "刺爆", + "skillname2": "投擲", + "skillname20": "閃電球", + "skillname21": "急凍箭", + "skillname217": "辨視卷軸", + "skillname218": "辨視之書", + "skillname219": "城鎮傳送卷軸", + "skillname22": "導引箭", + "skillname220": "城鎮傳送之書", + "skillname23": "刺入", + "skillname24": "充能一擊", + "skillname25": "瘟疫標槍", + "skillname26": "砲轟", + "skillname27": "犧牲之箭", + "skillname28": "誘餌", + "skillname29": "迴避", + "skillname3": "取消召喚", + "skillname30": "擊退", + "skillname31": "凍結之箭", + "skillname32": "女武神", + "skillname33": "穿刺", + "skillname34": "閃電攻擊", + "skillname35": "閃電之怒", + "skillname36": "火彈", + "skillname37": "暖氣", + "skillname38": "充能彈", + "skillname39": "冰彈", + "skillname4": "左手投擲", + "skillname40": "冰封裝甲", + "skillname41": "地獄之火", + "skillname42": "靜態力場", + "skillname43": "心靈傳動", + "skillname44": "霜之新星", + "skillname45": "冰風暴", + "skillname46": "熾烈之徑", + "skillname47": "火球", + "skillname48": "新星", + "skillname49": "閃電", + "skillname5": "左手揮動", + "skillname50": "碎冰甲", + "skillname51": "火牆", + "skillname52": "強化", + "skillname53": "連鎖閃電", + "skillname54": "傳送", + "skillname55": "冰尖柱", + "skillname56": "隕石", + "skillname57": "雷雲風暴", + "skillname58": "能量護盾", + "skillname59": "暴風雪", + "skillname6": "魔法箭", + "skillname60": "寒冰裝甲", + "skillname62": "九頭海蛇", + "skillname63": "支配閃電", + "skillname64": "冰封球", + "skillname65": "支配冰冷", + "skillname66": "傷害加深", + "skillname67": "牙", + "skillname68": "白骨裝甲", + "skillname69": "支配骷髏", + "skillname7": "火焰箭", + "skillname70": "骷髏復甦", + "skillname71": "微暗靈視", + "skillname72": "削弱", + "skillname73": "淬毒匕首", + "skillname74": "屍體爆炸", + "skillname75": "黏土石魔", + "skillname76": "攻擊反噬", + "skillname77": "恐懼", + "skillname78": "骨牆", + "skillname79": "支配石魔", + "skillname8": "內視", + "skillname80": "復甦骷髏法師", + "skillname81": "迷亂", + "skillname82": "偷取生命", + "skillname83": "毒爆", + "skillname84": "骨矛", + "skillname85": "鮮血石魔", + "skillname86": "吸引", + "skillname87": "衰老", + "skillname88": "骨牢", + "skillname89": "召喚反抗", + "skillname9": "致命攻擊", + "skillname90": "鋼鐵石魔", + "skillname91": "降低抵抗", + "skillname92": "劇毒新星", + "skillname93": "白骨之魂", + "skillname94": "火焰石魔", + "skillname95": "重生", + "skillname96": "犧牲", + "skillname97": "重擊", + "skillname98": "力量", + "skillname99": "祈禱", + "skillsname61": "支配之焰", + "skl": "無暇疵的骷髏", + "skp": "骷髏帽", + "sku": "骷髏", + "skz": "完美的骷髏", + "slayer": "屠殺者", + "slippers": "便鞋", + "smasher": "擊碎者", + "sml": "小盾牌", + "song": "歌", + "spawn": "重生的", + "spc": "狼牙棒", + "spell": "法術", + "spike": "釘", + "spiral": "螺旋", + "spire": "螺旋", + "spk": "尖刺盾牌", + "spl": "板甲", + "splitter": "劈裂", + "spr": "長矛", + "spt": "大戰戟", + "spur": "踢馬刺", + "ssd": "短劍", + "ssp": "短矛", + "sst": "短棍", + "stake": "棍子", + "stalker": "潛行者", + "star": "星", + "std": "英雄旗幟", + "stinger": "有刺者", + "strModAllResistances": "所有抗性 +%d", + "strModAllSkillLevels": "+%d 到所有技能等級", + "strModColdDamage": "+%d 冰冷傷害", + "strModColdDamageRange": "增加 %d-%d 冰冷傷害", + "strModEnhancedDamage": "增強傷害\n", + "strModFireDamage": "+%d 火焰傷害", + "strModFireDamageRange": "增加 %d-%d 火焰傷害", + "strModLightningDamage": "+%d 閃電傷害", + "strModLightningDamageRange": "增加 %d-%d 閃電傷害", + "strModMagicDamage": "+%d 魔法傷害", + "strModMagicDamageRange": "增加 %d-%d 魔法傷害", + "strModMinDamage": "+%d 傷害", + "strModMinDamageRange": "增加 %d-%d 傷害", + "strModPoisonDamage": "+%d 毒素傷害維持 %d 秒", + "strModPoisonDamageRange": "增加 %d-%d 毒素傷害維持 %d 秒", + "strap": "皮帶", + "stu": "鑲嵌甲", + "suit": "衣", + "sunder": "撕碎者", + "swb": "短巨戰弓", + "talisman": "護符", + "tax": "飛斧", + "tbk": "城鎮傳送之書", + "tbl": "重扣帶", + "tbt": "輕型金屬靴", + "tch": "火焰", + "tes": "扭曲的苦痛精华", + "tgl": "輕型鐵手套", + "thirst": "渴望", + "tkf": "飛刀", + "toa": "右键点击以重设属性/技能点数。\n赦免徽章", + "torc": "金絲項圈", + "touch": "觸碰", + "tow": "塔盾", + "tower": "塔", + "tr1": "赫拉迪克卷軸", + "track": "追蹤", + "trample": "蹂躪", + "tread": "踏步", + "tri": "三叉戟", + "tsc": "城鎮傳送卷軸", + "tsp": "飛矛", + "turn": "轉", + "vbl": "輕扣帶", + "vbt": "重靴", + "veil": "面紗", + "vgl": "重手套", + "vip": "赫拉迪克之杖頂端", + "visage": "臉", + "visor": "面甲", + "vou": "鉤鐮槍", + "vps": "體力葯劑", + "wand": "杖", + "ward": "保護", + "wax": "巨戰斧", + "weaver": "編織者", + "whm": "巨戰鐵鎚", + "whorl": "螺層", + "winding": "捲燒", + "wing": "翼", + "wms": "融解葯劑", + "wnd": "法杖", + "wood": "木", + "wrack": "破滅", + "wrap": "包裹", + "wsc": "巨戰鐮刀", + "wsd": "巨戰之劍", + "wsp": "巨戰權杖", + "wst": "巨戰法杖", + "xap": "戰帽", + "xar": "華麗戰甲", + "xcl": "提格萊特戰甲", + "xea": "海蛇皮甲", + "xh9": "殘酷頭盔", + "xhb": "巨戰之靴", + "xhg": "巨戰手套", + "xhl": "輕鋼灰", + "xhm": "翼盔", + "xhn": "織網戰甲", + "xit": "龍盾", + "xkp": "輕便頭盔", + "xla": "魔皮戰甲", + "xlb": "魔皮靴", + "xld": "鯊齒戰甲", + "xlg": "魔皮手套", + "xlm": "無頰頭盔", + "xlt": "聖堂武士外袍", + "xmb": "織網之靴", + "xmg": "重型手鐲", + "xml": "圓型盾", + "xng": "連扣戰甲", + "xow": "大盾", + "xpk": "倒刺護盾", + "xpl": "羅瑟戰甲", + "xrg": "鱗盾", + "xrn": "巨皇冠", + "xrs": "護胸甲", + "xsh": "冷酷之盾", + "xsk": "死亡面具", + "xtb": "戰場之靴", + "xtg": "戰場手套", + "xth": "凸紋戰甲", + "xtp": "法師鎧甲", + "xts": "古代之盾", + "xtu": "攀繞戰甲", + "xuc": "防禦盾", + "xui": "鬼魂戰甲", + "xul": "混沌戰甲", + "xvb": "鯊皮之靴", + "xvg": "鯊魚皮套", + "xyz": "滑鼠右鍵點選之後,可以永久性的增加20點生命\n生命葯劑", + "yps": "解毒葯劑", + "ywn": "紫杉之杖", + "zhb": "巨戰腰帶", + "zlb": "魔皮勳帶", + "zmb": "織網腰帶", + "ztb": "戰場腰帶", + "zvb": "鯊皮腰帶" +} + +export const CANONICAL_ISC_DESC_TABLE: Readonly> = { + "strength": { + "id": 0, + "stat": "strength", + "descPriority": 67, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1a", + "descStrNeg": "ModStr1a", + "descStr2": "", + "dgrp": 1, + "dgrpFunc": 1, + "dgrpVal": 1, + "dgrpStrPos": "Moditem2allattrib", + "dgrpStrNeg": "Moditem2allattrib", + "dgrpStr2": "" + }, + "energy": { + "id": 1, + "stat": "energy", + "descPriority": 61, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1d", + "descStrNeg": "ModStr1d", + "descStr2": "", + "dgrp": 1, + "dgrpFunc": 1, + "dgrpVal": 1, + "dgrpStrPos": "Moditem2allattrib", + "dgrpStrNeg": "Moditem2allattrib", + "dgrpStr2": "" + }, + "dexterity": { + "id": 2, + "stat": "dexterity", + "descPriority": 65, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1b", + "descStrNeg": "ModStr1b", + "descStr2": "", + "dgrp": 1, + "dgrpFunc": 1, + "dgrpVal": 1, + "dgrpStrPos": "Moditem2allattrib", + "dgrpStrNeg": "Moditem2allattrib", + "dgrpStr2": "" + }, + "vitality": { + "id": 3, + "stat": "vitality", + "descPriority": 63, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1c", + "descStrNeg": "ModStr1c", + "descStr2": "", + "dgrp": 1, + "dgrpFunc": 1, + "dgrpVal": 1, + "dgrpStrPos": "Moditem2allattrib", + "dgrpStrNeg": "Moditem2allattrib", + "dgrpStr2": "" + }, + "maxhp": { + "id": 7, + "stat": "maxhp", + "descPriority": 59, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1u", + "descStrNeg": "ModStr1u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "maxmana": { + "id": 9, + "stat": "maxmana", + "descPriority": 55, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1e", + "descStrNeg": "ModStr1e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "maxstamina": { + "id": 11, + "stat": "maxstamina", + "descPriority": 51, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5d", + "descStrNeg": "ModStr5d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_armor_percent": { + "id": 16, + "stat": "item_armor_percent", + "descPriority": 74, + "descFunc": 4, + "descVal": 1, + "descStrPos": "Modstr2v", + "descStrNeg": "Modstr2v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdamage_percent": { + "id": 17, + "stat": "item_maxdamage_percent", + "descPriority": 129, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr2j", + "descStrNeg": "ModStr2j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_mindamage_percent": { + "id": 18, + "stat": "item_mindamage_percent", + "descPriority": 130, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr2k", + "descStrNeg": "ModStr2k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "tohit": { + "id": 19, + "stat": "tohit", + "descPriority": 115, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1h", + "descStrNeg": "ModStr1h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "toblock": { + "id": 20, + "stat": "toblock", + "descPriority": 134, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr3g", + "descStrNeg": "ModStr3g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "mindamage": { + "id": 21, + "stat": "mindamage", + "descPriority": 127, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1g", + "descStrNeg": "ModStr1g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "maxdamage": { + "id": 22, + "stat": "maxdamage", + "descPriority": 126, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1f", + "descStrNeg": "ModStr1f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "secondary_mindamage": { + "id": 23, + "stat": "secondary_mindamage", + "descPriority": 124, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1g", + "descStrNeg": "ModStr1g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "secondary_maxdamage": { + "id": 24, + "stat": "secondary_maxdamage", + "descPriority": 123, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1f", + "descStrNeg": "ModStr1f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "manarecoverybonus": { + "id": 27, + "stat": "manarecoverybonus", + "descPriority": 52, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr4g", + "descStrNeg": "ModStr4g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "staminarecoverybonus": { + "id": 28, + "stat": "staminarecoverybonus", + "descPriority": 48, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr3v", + "descStrNeg": "ModStr3v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "armorclass": { + "id": 31, + "stat": "armorclass", + "descPriority": 71, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1i", + "descStrNeg": "ModStr1i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "armorclass_vs_missile": { + "id": 32, + "stat": "armorclass_vs_missile", + "descPriority": 69, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr6a", + "descStrNeg": "ModStr6a", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "armorclass_vs_hth": { + "id": 33, + "stat": "armorclass_vs_hth", + "descPriority": 70, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr6b", + "descStrNeg": "ModStr6b", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "normal_damage_reduction": { + "id": 34, + "stat": "normal_damage_reduction", + "descPriority": 22, + "descFunc": 3, + "descVal": 2, + "descStrPos": "ModStr2u", + "descStrNeg": "ModStr2u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "magic_damage_reduction": { + "id": 35, + "stat": "magic_damage_reduction", + "descPriority": 21, + "descFunc": 3, + "descVal": 2, + "descStrPos": "ModStr2t", + "descStrNeg": "ModStr2t", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "damageresist": { + "id": 36, + "stat": "damageresist", + "descPriority": 22, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr2u", + "descStrNeg": "ModStr2u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "magicresist": { + "id": 37, + "stat": "magicresist", + "descPriority": 41, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr1m", + "descStrNeg": "ModStr1m", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "maxmagicresist": { + "id": 38, + "stat": "maxmagicresist", + "descPriority": 46, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr5x", + "descStrNeg": "ModStr5x", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "fireresist": { + "id": 39, + "stat": "fireresist", + "descPriority": 36, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr1j", + "descStrNeg": "ModStr1j", + "descStr2": "", + "dgrp": 2, + "dgrpFunc": 19, + "dgrpVal": 0, + "dgrpStrPos": "strModAllResistances", + "dgrpStrNeg": "strModAllResistances", + "dgrpStr2": "" + }, + "maxfireresist": { + "id": 40, + "stat": "maxfireresist", + "descPriority": 42, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr5u", + "descStrNeg": "ModStr5u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "lightresist": { + "id": 41, + "stat": "lightresist", + "descPriority": 38, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr1l", + "descStrNeg": "ModStr1l", + "descStr2": "", + "dgrp": 2, + "dgrpFunc": 19, + "dgrpVal": 0, + "dgrpStrPos": "strModAllResistances", + "dgrpStrNeg": "strModAllResistances", + "dgrpStr2": "" + }, + "maxlightresist": { + "id": 42, + "stat": "maxlightresist", + "descPriority": 43, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr5w", + "descStrNeg": "ModStr5w", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "coldresist": { + "id": 43, + "stat": "coldresist", + "descPriority": 40, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr1k", + "descStrNeg": "ModStr1k", + "descStr2": "", + "dgrp": 2, + "dgrpFunc": 19, + "dgrpVal": 0, + "dgrpStrPos": "strModAllResistances", + "dgrpStrNeg": "strModAllResistances", + "dgrpStr2": "" + }, + "maxcoldresist": { + "id": 44, + "stat": "maxcoldresist", + "descPriority": 44, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr5v", + "descStrNeg": "ModStr5v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "poisonresist": { + "id": 45, + "stat": "poisonresist", + "descPriority": 34, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr1n", + "descStrNeg": "ModStr1n", + "descStr2": "", + "dgrp": 2, + "dgrpFunc": 19, + "dgrpVal": 0, + "dgrpStrPos": "strModAllResistances", + "dgrpStrNeg": "strModAllResistances", + "dgrpStr2": "" + }, + "maxpoisonresist": { + "id": 46, + "stat": "maxpoisonresist", + "descPriority": 45, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr5y", + "descStrNeg": "ModStr5y", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "firemindam": { + "id": 48, + "stat": "firemindam", + "descPriority": 102, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1p", + "descStrNeg": "ModStr1p", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "firemaxdam": { + "id": 49, + "stat": "firemaxdam", + "descPriority": 101, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1o", + "descStrNeg": "ModStr1o", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "lightmindam": { + "id": 50, + "stat": "lightmindam", + "descPriority": 99, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1r", + "descStrNeg": "ModStr1r", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "lightmaxdam": { + "id": 51, + "stat": "lightmaxdam", + "descPriority": 98, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1q", + "descStrNeg": "ModStr1q", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "magicmindam": { + "id": 52, + "stat": "magicmindam", + "descPriority": 104, + "descFunc": 1, + "descVal": 1, + "descStrPos": "strModMagicDamage", + "descStrNeg": "strModMagicDamage", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "magicmaxdam": { + "id": 53, + "stat": "magicmaxdam", + "descPriority": 103, + "descFunc": 1, + "descVal": 1, + "descStrPos": "strModMagicDamage", + "descStrNeg": "strModMagicDamage", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "coldmindam": { + "id": 54, + "stat": "coldmindam", + "descPriority": 96, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1t", + "descStrNeg": "ModStr1t", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "coldmaxdam": { + "id": 55, + "stat": "coldmaxdam", + "descPriority": 95, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr1s", + "descStrNeg": "ModStr1s", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "poisonmindam": { + "id": 57, + "stat": "poisonmindam", + "descPriority": 92, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr4i", + "descStrNeg": "ModStr4i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "poisonmaxdam": { + "id": 58, + "stat": "poisonmaxdam", + "descPriority": 91, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr4h", + "descStrNeg": "ModStr4h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "lifedrainmindam": { + "id": 60, + "stat": "lifedrainmindam", + "descPriority": 88, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr2z", + "descStrNeg": "ModStr2z", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "manadrainmindam": { + "id": 62, + "stat": "manadrainmindam", + "descPriority": 89, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr2y", + "descStrNeg": "ModStr2y", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "hpregen": { + "id": 74, + "stat": "hpregen", + "descPriority": 56, + "descFunc": 1, + "descVal": 2, + "descStrPos": "ModStr2l", + "descStrNeg": "ModStr2w", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdurability_percent": { + "id": 75, + "stat": "item_maxdurability_percent", + "descPriority": 3, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr2i", + "descStrNeg": "ModStr2i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxhp_percent": { + "id": 76, + "stat": "item_maxhp_percent", + "descPriority": 58, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr2g", + "descStrNeg": "ModStr2g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxmana_percent": { + "id": 77, + "stat": "item_maxmana_percent", + "descPriority": 54, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr2h", + "descStrNeg": "ModStr2h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_attackertakesdamage": { + "id": 78, + "stat": "item_attackertakesdamage", + "descPriority": 13, + "descFunc": 3, + "descVal": 2, + "descStrPos": "ModStr1v", + "descStrNeg": "ModStr1v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_goldbonus": { + "id": 79, + "stat": "item_goldbonus", + "descPriority": 10, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr1w", + "descStrNeg": "ModStr1w", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_magicbonus": { + "id": 80, + "stat": "item_magicbonus", + "descPriority": 8, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr1x", + "descStrNeg": "ModStr1x", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_knockback": { + "id": 81, + "stat": "item_knockback", + "descPriority": 76, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr1y", + "descStrNeg": "ModStr1y", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_addclassskills": { + "id": 83, + "stat": "item_addclassskills", + "descPriority": 150, + "descFunc": 13, + "descVal": 1, + "descStrPos": "ModStr3a", + "descStrNeg": "ModStr3a", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_addexperience": { + "id": 85, + "stat": "item_addexperience", + "descPriority": 11, + "descFunc": 4, + "descVal": 1, + "descStrPos": "Moditem2ExpG", + "descStrNeg": "Moditem2ExpG", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_healafterkill": { + "id": 86, + "stat": "item_healafterkill", + "descPriority": 16, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModitemHPaK", + "descStrNeg": "ModitemHPaK", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_reducedprices": { + "id": 87, + "stat": "item_reducedprices", + "descPriority": 8, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModitemRedVendP", + "descStrNeg": "ModitemRedVendP", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_lightradius": { + "id": 89, + "stat": "item_lightradius", + "descPriority": 6, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr3f", + "descStrNeg": "ModStr3f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_req_percent": { + "id": 91, + "stat": "item_req_percent", + "descPriority": 0, + "descFunc": 4, + "descVal": 2, + "descStrPos": "ModStr3h", + "descStrNeg": "ModStr3h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fasterattackrate": { + "id": 93, + "stat": "item_fasterattackrate", + "descPriority": 145, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4m", + "descStrNeg": "ModStr4m", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fastermovevelocity": { + "id": 96, + "stat": "item_fastermovevelocity", + "descPriority": 148, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4s", + "descStrNeg": "ModStr4s", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_nonclassskill": { + "id": 97, + "stat": "item_nonclassskill", + "descPriority": 81, + "descFunc": 28, + "descVal": 0, + "descStrPos": "", + "descStrNeg": "", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fastergethitrate": { + "id": 99, + "stat": "item_fastergethitrate", + "descPriority": 139, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4p", + "descStrNeg": "ModStr4p", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fasterblockrate": { + "id": 102, + "stat": "item_fasterblockrate", + "descPriority": 136, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4y", + "descStrNeg": "ModStr4y", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fastercastrate": { + "id": 105, + "stat": "item_fastercastrate", + "descPriority": 142, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4v", + "descStrNeg": "ModStr4v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_singleskill": { + "id": 107, + "stat": "item_singleskill", + "descPriority": 81, + "descFunc": 27, + "descVal": 0, + "descStrPos": "", + "descStrNeg": "", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_restinpeace": { + "id": 108, + "stat": "item_restinpeace", + "descPriority": 81, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModitemSMRIP", + "descStrNeg": "ModitemSMRIP", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_poisonlengthresist": { + "id": 110, + "stat": "item_poisonlengthresist", + "descPriority": 18, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr3r", + "descStrNeg": "ModStr3r", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_normaldamage": { + "id": 111, + "stat": "item_normaldamage", + "descPriority": 122, + "descFunc": 1, + "descVal": 2, + "descStrPos": "ModStr5b", + "descStrNeg": "ModStr5b", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_howl": { + "id": 112, + "stat": "item_howl", + "descPriority": 79, + "descFunc": 5, + "descVal": 2, + "descStrPos": "ModStr3u", + "descStrNeg": "ModStr3u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_stupidity": { + "id": 113, + "stat": "item_stupidity", + "descPriority": 80, + "descFunc": 12, + "descVal": 2, + "descStrPos": "ModStr6d", + "descStrNeg": "ModStr6d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damagetomana": { + "id": 114, + "stat": "item_damagetomana", + "descPriority": 11, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr3w", + "descStrNeg": "ModStr3w", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_ignoretargetac": { + "id": 115, + "stat": "item_ignoretargetac", + "descPriority": 119, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr3y", + "descStrNeg": "ModStr3y", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fractionaltargetac": { + "id": 116, + "stat": "item_fractionaltargetac", + "descPriority": 118, + "descFunc": 20, + "descVal": 1, + "descStrPos": "ModStr5o", + "descStrNeg": "ModStr5o", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_preventheal": { + "id": 117, + "stat": "item_preventheal", + "descPriority": 81, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr4a", + "descStrNeg": "ModStr4a", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_halffreezeduration": { + "id": 118, + "stat": "item_halffreezeduration", + "descPriority": 19, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr4b", + "descStrNeg": "ModStr4b", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_percent": { + "id": 119, + "stat": "item_tohit_percent", + "descPriority": 117, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr4c", + "descStrNeg": "ModStr4c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damagetargetac": { + "id": 120, + "stat": "item_damagetargetac", + "descPriority": 75, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr4d", + "descStrNeg": "ModStr4d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_demondamage_percent": { + "id": 121, + "stat": "item_demondamage_percent", + "descPriority": 112, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4e", + "descStrNeg": "ModStr4e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_undeaddamage_percent": { + "id": 122, + "stat": "item_undeaddamage_percent", + "descPriority": 108, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModStr4f", + "descStrNeg": "ModStr4f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_demon_tohit": { + "id": 123, + "stat": "item_demon_tohit", + "descPriority": 110, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr4j", + "descStrNeg": "ModStr4j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_undead_tohit": { + "id": 124, + "stat": "item_undead_tohit", + "descPriority": 106, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr4k", + "descStrNeg": "ModStr4k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_throwable": { + "id": 125, + "stat": "item_throwable", + "descPriority": 5, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr5a", + "descStrNeg": "ModStr5a", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_elemskill": { + "id": 126, + "stat": "item_elemskill", + "descPriority": 157, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr3i", + "descStrNeg": "ModStr3i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_allskills": { + "id": 127, + "stat": "item_allskills", + "descPriority": 158, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr3k", + "descStrNeg": "ModStr3k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_attackertakeslightdamage": { + "id": 128, + "stat": "item_attackertakeslightdamage", + "descPriority": 14, + "descFunc": 3, + "descVal": 2, + "descStrPos": "ModStr3j", + "descStrNeg": "ModStr3j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_freeze": { + "id": 134, + "stat": "item_freeze", + "descPriority": 78, + "descFunc": 12, + "descVal": 2, + "descStrPos": "ModStr3l", + "descStrNeg": "ModStr3l", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_openwounds": { + "id": 135, + "stat": "item_openwounds", + "descPriority": 83, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr3m", + "descStrNeg": "ModStr3m", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_crushingblow": { + "id": 136, + "stat": "item_crushingblow", + "descPriority": 87, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr5c", + "descStrNeg": "ModStr5c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_kickdamage": { + "id": 137, + "stat": "item_kickdamage", + "descPriority": 121, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5e", + "descStrNeg": "ModStr5e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_manaafterkill": { + "id": 138, + "stat": "item_manaafterkill", + "descPriority": 16, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5f", + "descStrNeg": "ModStr5f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_healafterdemonkill": { + "id": 139, + "stat": "item_healafterdemonkill", + "descPriority": 15, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr6c", + "descStrNeg": "ModStr6c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_deadlystrike": { + "id": 141, + "stat": "item_deadlystrike", + "descPriority": 85, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr5q", + "descStrNeg": "ModStr5q", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbfire_percent": { + "id": 142, + "stat": "item_absorbfire_percent", + "descPriority": 23, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr5g", + "descStrNeg": "ModStr5g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbfire": { + "id": 143, + "stat": "item_absorbfire", + "descPriority": 27, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5h", + "descStrNeg": "ModStr5h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorblight_percent": { + "id": 144, + "stat": "item_absorblight_percent", + "descPriority": 24, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr5i", + "descStrNeg": "ModStr5i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorblight": { + "id": 145, + "stat": "item_absorblight", + "descPriority": 29, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5j", + "descStrNeg": "ModStr5j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbmagic_percent": { + "id": 146, + "stat": "item_absorbmagic_percent", + "descPriority": 26, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr5k", + "descStrNeg": "ModStr5k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbmagic": { + "id": 147, + "stat": "item_absorbmagic", + "descPriority": 33, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5l", + "descStrNeg": "ModStr5l", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbcold_percent": { + "id": 148, + "stat": "item_absorbcold_percent", + "descPriority": 25, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr5m", + "descStrNeg": "ModStr5m", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorbcold": { + "id": 149, + "stat": "item_absorbcold", + "descPriority": 31, + "descFunc": 1, + "descVal": 1, + "descStrPos": "ModStr5n", + "descStrNeg": "ModStr5n", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_slow": { + "id": 150, + "stat": "item_slow", + "descPriority": 77, + "descFunc": 2, + "descVal": 2, + "descStrPos": "ModStr5r", + "descStrNeg": "ModStr5r", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_aura": { + "id": 151, + "stat": "item_aura", + "descPriority": 159, + "descFunc": 16, + "descVal": 0, + "descStrPos": "ModitemAura", + "descStrNeg": "ModitemAura", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_indesctructible": { + "id": 152, + "stat": "item_indesctructible", + "descPriority": 160, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStre9s", + "descStrNeg": "ModStre9s", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_cannotbefrozen": { + "id": 153, + "stat": "item_cannotbefrozen", + "descPriority": 20, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr5z", + "descStrNeg": "ModStr5z", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_staminadrainpct": { + "id": 154, + "stat": "item_staminadrainpct", + "descPriority": 49, + "descFunc": 2, + "descVal": 1, + "descStrPos": "ModStr6e", + "descStrNeg": "ModStr6e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_reanimate": { + "id": 155, + "stat": "item_reanimate", + "descPriority": 17, + "descFunc": 23, + "descVal": 1, + "descStrPos": "Moditemreanimas", + "descStrNeg": "Moditemreanimas", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pierce": { + "id": 156, + "stat": "item_pierce", + "descPriority": 132, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr6g", + "descStrNeg": "ModStr6g", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_magicarrow": { + "id": 157, + "stat": "item_magicarrow", + "descPriority": 131, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr6h", + "descStrNeg": "ModStr6h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_explosivearrow": { + "id": 158, + "stat": "item_explosivearrow", + "descPriority": 133, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStr6i", + "descStrNeg": "ModStr6i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "attack_vs_montype": { + "id": 179, + "stat": "attack_vs_montype", + "descPriority": 108, + "descFunc": 22, + "descVal": 1, + "descStrPos": "ModitemAttratvsM", + "descStrNeg": "ModitemAttratvsM", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "damage_vs_montype": { + "id": 180, + "stat": "damage_vs_montype", + "descPriority": 106, + "descFunc": 22, + "descVal": 1, + "descStrPos": "Moditemdamvsm", + "descStrNeg": "Moditemdamvsm", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_addskill_tab": { + "id": 188, + "stat": "item_addskill_tab", + "descPriority": 151, + "descFunc": 14, + "descVal": 0, + "descStrPos": "StrSklTabItem1", + "descStrNeg": "StrSklTabItem1", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillonattack": { + "id": 195, + "stat": "item_skillonattack", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "ItemExpansiveChancX", + "descStrNeg": "ItemExpansiveChancX", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillonkill": { + "id": 196, + "stat": "item_skillonkill", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "ModitemskonKill", + "descStrNeg": "ModitemskonKill", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillondeath": { + "id": 197, + "stat": "item_skillondeath", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "Moditemskondeath", + "descStrNeg": "Moditemskondeath", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillonhit": { + "id": 198, + "stat": "item_skillonhit", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "ItemExpansiveChanc1", + "descStrNeg": "ItemExpansiveChanc1", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillonlevelup": { + "id": 199, + "stat": "item_skillonlevelup", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "ModitemskonLevel", + "descStrNeg": "ModitemskonLevel", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_skillongethit": { + "id": 201, + "stat": "item_skillongethit", + "descPriority": 160, + "descFunc": 15, + "descVal": 0, + "descStrPos": "ItemExpansiveChanc2", + "descStrNeg": "ItemExpansiveChanc2", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_charged_skill": { + "id": 204, + "stat": "item_charged_skill", + "descPriority": 1, + "descFunc": 24, + "descVal": 0, + "descStrPos": "ModStre10d", + "descStrNeg": "ModStre10d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_armor_perlevel": { + "id": 214, + "stat": "item_armor_perlevel", + "descPriority": 72, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1i", + "descStrNeg": "ModStr1i", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_armorpercent_perlevel": { + "id": 215, + "stat": "item_armorpercent_perlevel", + "descPriority": 73, + "descFunc": 8, + "descVal": 1, + "descStrPos": "Modstr2v", + "descStrNeg": "Modstr2v", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_hp_perlevel": { + "id": 216, + "stat": "item_hp_perlevel", + "descPriority": 57, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1u", + "descStrNeg": "ModStr1u", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_mana_perlevel": { + "id": 217, + "stat": "item_mana_perlevel", + "descPriority": 53, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1e", + "descStrNeg": "ModStr1e", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdamage_perlevel": { + "id": 218, + "stat": "item_maxdamage_perlevel", + "descPriority": 125, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1f", + "descStrNeg": "ModStr1f", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdamage_percent_perlevel": { + "id": 219, + "stat": "item_maxdamage_percent_perlevel", + "descPriority": 128, + "descFunc": 8, + "descVal": 1, + "descStrPos": "ModStr2j", + "descStrNeg": "ModStr2j", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_strength_perlevel": { + "id": 220, + "stat": "item_strength_perlevel", + "descPriority": 66, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1a", + "descStrNeg": "ModStr1a", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_dexterity_perlevel": { + "id": 221, + "stat": "item_dexterity_perlevel", + "descPriority": 64, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1b", + "descStrNeg": "ModStr1b", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_energy_perlevel": { + "id": 222, + "stat": "item_energy_perlevel", + "descPriority": 60, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1d", + "descStrNeg": "ModStr1d", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_vitality_perlevel": { + "id": 223, + "stat": "item_vitality_perlevel", + "descPriority": 62, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1c", + "descStrNeg": "ModStr1c", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_perlevel": { + "id": 224, + "stat": "item_tohit_perlevel", + "descPriority": 114, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1h", + "descStrNeg": "ModStr1h", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohitpercent_perlevel": { + "id": 225, + "stat": "item_tohitpercent_perlevel", + "descPriority": 116, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr4c", + "descStrNeg": "ModStr4c", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_cold_damagemax_perlevel": { + "id": 226, + "stat": "item_cold_damagemax_perlevel", + "descPriority": 94, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1s", + "descStrNeg": "ModStr1s", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fire_damagemax_perlevel": { + "id": 227, + "stat": "item_fire_damagemax_perlevel", + "descPriority": 100, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1o", + "descStrNeg": "ModStr1o", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_ltng_damagemax_perlevel": { + "id": 228, + "stat": "item_ltng_damagemax_perlevel", + "descPriority": 97, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr1q", + "descStrNeg": "ModStr1q", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pois_damagemax_perlevel": { + "id": 229, + "stat": "item_pois_damagemax_perlevel", + "descPriority": 90, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr4h", + "descStrNeg": "ModStr4h", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_cold_perlevel": { + "id": 230, + "stat": "item_resist_cold_perlevel", + "descPriority": 39, + "descFunc": 7, + "descVal": 2, + "descStrPos": "ModStr1k", + "descStrNeg": "ModStr1k", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_fire_perlevel": { + "id": 231, + "stat": "item_resist_fire_perlevel", + "descPriority": 35, + "descFunc": 7, + "descVal": 2, + "descStrPos": "ModStr1j", + "descStrNeg": "ModStr1j", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_ltng_perlevel": { + "id": 232, + "stat": "item_resist_ltng_perlevel", + "descPriority": 37, + "descFunc": 7, + "descVal": 2, + "descStrPos": "ModStr1l", + "descStrNeg": "ModStr1l", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_pois_perlevel": { + "id": 233, + "stat": "item_resist_pois_perlevel", + "descPriority": 33, + "descFunc": 7, + "descVal": 2, + "descStrPos": "ModStr1n", + "descStrNeg": "ModStr1n", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_cold_perlevel": { + "id": 234, + "stat": "item_absorb_cold_perlevel", + "descPriority": 32, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStre9p", + "descStrNeg": "ModStre9p", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_fire_perlevel": { + "id": 235, + "stat": "item_absorb_fire_perlevel", + "descPriority": 28, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStre9o", + "descStrNeg": "ModStre9o", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_ltng_perlevel": { + "id": 236, + "stat": "item_absorb_ltng_perlevel", + "descPriority": 30, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStre9q", + "descStrNeg": "ModStre9q", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_thorns_perlevel": { + "id": 238, + "stat": "item_thorns_perlevel", + "descPriority": 12, + "descFunc": 9, + "descVal": 2, + "descStrPos": "ModStr1v", + "descStrNeg": "ModStr1v", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_find_gold_perlevel": { + "id": 239, + "stat": "item_find_gold_perlevel", + "descPriority": 9, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr1w", + "descStrNeg": "ModStr1w", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_find_magic_perlevel": { + "id": 240, + "stat": "item_find_magic_perlevel", + "descPriority": 7, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr1x", + "descStrNeg": "ModStr1x", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_regenstamina_perlevel": { + "id": 241, + "stat": "item_regenstamina_perlevel", + "descPriority": 47, + "descFunc": 8, + "descVal": 2, + "descStrPos": "ModStr3v", + "descStrNeg": "ModStr3v", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_stamina_perlevel": { + "id": 242, + "stat": "item_stamina_perlevel", + "descPriority": 50, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr5d", + "descStrNeg": "ModStr5d", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damage_demon_perlevel": { + "id": 243, + "stat": "item_damage_demon_perlevel", + "descPriority": 111, + "descFunc": 8, + "descVal": 1, + "descStrPos": "ModStr4e", + "descStrNeg": "ModStr4e", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damage_undead_perlevel": { + "id": 244, + "stat": "item_damage_undead_perlevel", + "descPriority": 107, + "descFunc": 8, + "descVal": 1, + "descStrPos": "ModStr4f", + "descStrNeg": "ModStr4f", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_demon_perlevel": { + "id": 245, + "stat": "item_tohit_demon_perlevel", + "descPriority": 109, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr4j", + "descStrNeg": "ModStr4j", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_undead_perlevel": { + "id": 246, + "stat": "item_tohit_undead_perlevel", + "descPriority": 105, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr4k", + "descStrNeg": "ModStr4k", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_crushingblow_perlevel": { + "id": 247, + "stat": "item_crushingblow_perlevel", + "descPriority": 86, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr5c", + "descStrNeg": "ModStr5c", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_openwounds_perlevel": { + "id": 248, + "stat": "item_openwounds_perlevel", + "descPriority": 82, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr3m", + "descStrNeg": "ModStr3m", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_kick_damage_perlevel": { + "id": 249, + "stat": "item_kick_damage_perlevel", + "descPriority": 120, + "descFunc": 6, + "descVal": 1, + "descStrPos": "ModStr5e", + "descStrNeg": "ModStr5e", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_deadlystrike_perlevel": { + "id": 250, + "stat": "item_deadlystrike_perlevel", + "descPriority": 84, + "descFunc": 7, + "descVal": 1, + "descStrPos": "ModStr5q", + "descStrNeg": "ModStr5q", + "descStr2": "increaseswithplaylevelX", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_replenish_durability": { + "id": 252, + "stat": "item_replenish_durability", + "descPriority": 1, + "descFunc": 11, + "descVal": 0, + "descStrPos": "ModStre9t", + "descStrNeg": "ModStre9t", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_replenish_quantity": { + "id": 253, + "stat": "item_replenish_quantity", + "descPriority": 2, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStre9v", + "descStrNeg": "ModStre9v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_extra_stack": { + "id": 254, + "stat": "item_extra_stack", + "descPriority": 4, + "descFunc": 3, + "descVal": 0, + "descStrPos": "ModStre9i", + "descStrNeg": "ModStre9i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_armor_bytime": { + "id": 268, + "stat": "item_armor_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1i", + "descStrNeg": "ModStr1i", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_armorpercent_bytime": { + "id": 269, + "stat": "item_armorpercent_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "Modstr2v", + "descStrNeg": "Modstr2v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_hp_bytime": { + "id": 270, + "stat": "item_hp_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1u", + "descStrNeg": "ModStr1u", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_mana_bytime": { + "id": 271, + "stat": "item_mana_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1e", + "descStrNeg": "ModStr1e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdamage_bytime": { + "id": 272, + "stat": "item_maxdamage_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1f", + "descStrNeg": "ModStr1f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_maxdamage_percent_bytime": { + "id": 273, + "stat": "item_maxdamage_percent_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr2j", + "descStrNeg": "ModStr2j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_strength_bytime": { + "id": 274, + "stat": "item_strength_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1a", + "descStrNeg": "ModStr1a", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_dexterity_bytime": { + "id": 275, + "stat": "item_dexterity_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1b", + "descStrNeg": "ModStr1b", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_energy_bytime": { + "id": 276, + "stat": "item_energy_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1d", + "descStrNeg": "ModStr1d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_vitality_bytime": { + "id": 277, + "stat": "item_vitality_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1c", + "descStrNeg": "ModStr1c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_bytime": { + "id": 278, + "stat": "item_tohit_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1h", + "descStrNeg": "ModStr1h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohitpercent_bytime": { + "id": 279, + "stat": "item_tohitpercent_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr4c", + "descStrNeg": "ModStr4c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_cold_damagemax_bytime": { + "id": 280, + "stat": "item_cold_damagemax_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1s", + "descStrNeg": "ModStr1s", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_fire_damagemax_bytime": { + "id": 281, + "stat": "item_fire_damagemax_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1o", + "descStrNeg": "ModStr1o", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_ltng_damagemax_bytime": { + "id": 282, + "stat": "item_ltng_damagemax_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr1q", + "descStrNeg": "ModStr1q", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pois_damagemax_bytime": { + "id": 283, + "stat": "item_pois_damagemax_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr4h", + "descStrNeg": "ModStr4h", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_cold_bytime": { + "id": 284, + "stat": "item_resist_cold_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr1k", + "descStrNeg": "ModStr1k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_fire_bytime": { + "id": 285, + "stat": "item_resist_fire_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr1j", + "descStrNeg": "ModStr1j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_ltng_bytime": { + "id": 286, + "stat": "item_resist_ltng_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr1l", + "descStrNeg": "ModStr1l", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_resist_pois_bytime": { + "id": 287, + "stat": "item_resist_pois_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr1n", + "descStrNeg": "ModStr1n", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_cold_bytime": { + "id": 288, + "stat": "item_absorb_cold_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStre9p", + "descStrNeg": "ModStre9p", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_fire_bytime": { + "id": 289, + "stat": "item_absorb_fire_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStre9o", + "descStrNeg": "ModStre9o", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_absorb_ltng_bytime": { + "id": 290, + "stat": "item_absorb_ltng_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStre9q", + "descStrNeg": "ModStre9q", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_find_gold_bytime": { + "id": 292, + "stat": "item_find_gold_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr1w", + "descStrNeg": "ModStr1w", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_find_magic_bytime": { + "id": 293, + "stat": "item_find_magic_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr1x", + "descStrNeg": "ModStr1x", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_regenstamina_bytime": { + "id": 294, + "stat": "item_regenstamina_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 2, + "descStrPos": "ModStr3v", + "descStrNeg": "ModStr3v", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_stamina_bytime": { + "id": 295, + "stat": "item_stamina_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr5d", + "descStrNeg": "ModStr5d", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damage_demon_bytime": { + "id": 296, + "stat": "item_damage_demon_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr4e", + "descStrNeg": "ModStr4e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_damage_undead_bytime": { + "id": 297, + "stat": "item_damage_undead_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr4f", + "descStrNeg": "ModStr4f", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_demon_bytime": { + "id": 298, + "stat": "item_tohit_demon_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr4j", + "descStrNeg": "ModStr4j", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_tohit_undead_bytime": { + "id": 299, + "stat": "item_tohit_undead_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr4k", + "descStrNeg": "ModStr4k", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_crushingblow_bytime": { + "id": 300, + "stat": "item_crushingblow_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr5c", + "descStrNeg": "ModStr5c", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_openwounds_bytime": { + "id": 301, + "stat": "item_openwounds_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr3m", + "descStrNeg": "ModStr3m", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_kick_damage_bytime": { + "id": 302, + "stat": "item_kick_damage_bytime", + "descPriority": 180, + "descFunc": 17, + "descVal": 1, + "descStrPos": "ModStr5e", + "descStrNeg": "ModStr5e", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_deadlystrike_bytime": { + "id": 303, + "stat": "item_deadlystrike_bytime", + "descPriority": 180, + "descFunc": 18, + "descVal": 1, + "descStrPos": "ModStr5q", + "descStrNeg": "ModStr5q", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pierce_cold": { + "id": 305, + "stat": "item_pierce_cold", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenrescoldsk", + "descStrNeg": "Moditemenrescoldsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pierce_fire": { + "id": 306, + "stat": "item_pierce_fire", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenresfiresk", + "descStrNeg": "Moditemenresfiresk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pierce_ltng": { + "id": 307, + "stat": "item_pierce_ltng", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenresltngsk", + "descStrNeg": "Moditemenresltngsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "item_pierce_pois": { + "id": 308, + "stat": "item_pierce_pois", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenrespoissk", + "descStrNeg": "Moditemenrespoissk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_fire_mastery": { + "id": 329, + "stat": "passive_fire_mastery", + "descPriority": 88, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModitemdamFiresk", + "descStrNeg": "ModitemdamFiresk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_ltng_mastery": { + "id": 330, + "stat": "passive_ltng_mastery", + "descPriority": 88, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModitemdamLtngsk", + "descStrNeg": "ModitemdamLtngsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_cold_mastery": { + "id": 331, + "stat": "passive_cold_mastery", + "descPriority": 88, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModitemdamColdsk", + "descStrNeg": "ModitemdamColdsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_pois_mastery": { + "id": 332, + "stat": "passive_pois_mastery", + "descPriority": 88, + "descFunc": 4, + "descVal": 1, + "descStrPos": "ModitemdamPoissk", + "descStrNeg": "ModitemdamPoissk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_fire_pierce": { + "id": 333, + "stat": "passive_fire_pierce", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenresfiresk", + "descStrNeg": "Moditemenresfiresk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_ltng_pierce": { + "id": 334, + "stat": "passive_ltng_pierce", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenresltngsk", + "descStrNeg": "Moditemenresltngsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_cold_pierce": { + "id": 335, + "stat": "passive_cold_pierce", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenrescoldsk", + "descStrNeg": "Moditemenrescoldsk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + }, + "passive_pois_pierce": { + "id": 336, + "stat": "passive_pois_pierce", + "descPriority": 88, + "descFunc": 20, + "descVal": 1, + "descStrPos": "Moditemenrespoissk", + "descStrNeg": "Moditemenrespoissk", + "descStr2": "", + "dgrp": 0, + "dgrpFunc": 0, + "dgrpVal": 0, + "dgrpStrPos": "", + "dgrpStrNeg": "", + "dgrpStr2": "" + } +} diff --git a/src/game/class-starter-profiles.ts b/src/game/class-starter-profiles.ts index fffe815..e01684b 100644 --- a/src/game/class-starter-profiles.ts +++ b/src/game/class-starter-profiles.ts @@ -27,6 +27,19 @@ import { } from '../ui/hotkeys.ts' import { SKILLS_BY_CLASS } from '../data/skills-catalog.ts' import { calculateManaCost } from './skill-calc-engine.ts' +import { getSocketableInfo } from './gems-data.ts' + +function buildSocketableStats(code: string): readonly { text: string; color: 'white' }[] { + const info = getSocketableInfo(code) + if (!info) return [] + return [ + { text: '可镶嵌进有凹槽的装备', color: 'white' }, + { text: `武器: ${info.weaponsZh}`, color: 'white' }, + { text: `防具: ${info.armorZh}`, color: 'white' }, + { text: `头盔: ${info.helmsZh}`, color: 'white' }, + { text: `盾牌: ${info.shieldsZh}`, color: 'white' }, + ] +} export interface ClassProfileState { readonly classCode: CharacterClassCode @@ -92,7 +105,10 @@ const TRANG_BONUSES = [ { text: '+100 法力 (完整套装)', color: 'green' as const }, { text: '所有抗性 +50 (完整套装)', color: 'green' as const }, { text: '化身为吸血鬼巫妖形态 (完整套装)', color: 'green' as const }, - { text: '+18 火球 / +13 火墙 / +10 陨石 / +3 支配火焰 (完整套装)', color: 'green' as const }, + { text: '+18 火球 (完整套装)', color: 'green' as const }, + { text: '+13 火墙 (完整套装)', color: 'green' as const }, + { text: '+10 陨石 (完整套装)', color: 'green' as const }, + { text: '+3 支配火焰 (完整套装)', color: 'green' as const }, ] const GRIS_PIECES: readonly string[] = [ @@ -150,7 +166,8 @@ const NAT_BONUSES = [ { text: '+200 防御 (完整套装)', color: 'green' as const }, { text: '所有抗性 +50 (完整套装)', color: 'green' as const }, { text: '物理伤害减少 30% (完整套装)', color: 'green' as const }, - { text: '14% 每次命中偷取生命 / 14% 偷取法力 (完整套装)', color: 'green' as const }, + { text: '14% 每次命中偷取生命 (完整套装)', color: 'green' as const }, + { text: '14% 每次命中偷取法力 (完整套装)', color: 'green' as const }, ] export const CLASS_EXCLUSIVE_SETS: Record>>> = { @@ -253,7 +270,8 @@ export const CLASS_EXCLUSIVE_SETS: Record 0 && item.nameZh !== name) { - return item.nameZh + return item.nameZh.includes('(') ? item.nameZh : `${item.nameZh} (${name})` } const baseEn = typeof item?.base?.name === 'string' && item.base.name.length > 0 ? item.base.name : undefined if (quality === 'unique' && item?.uniqueItemDef) { diff --git a/src/game/item-names.ts b/src/game/item-names.ts index 7ba0ee8..f5cdb44 100644 --- a/src/game/item-names.ts +++ b/src/game/item-names.ts @@ -4,18 +4,22 @@ * Implements a three-tier string table lookup chain (patch -> expansion -> base) * with language fallback order: CHI -> ENG -> code/key fallback. * - * Table key column mappings: - * - Armor.txt / Weapons.txt / Misc.txt: `namestr` column (not `name`!) - * - UniqueItems.txt: `index` column - * - SetItems.txt: `index` column - * - Sets.txt: `name` column - * - Runes.txt: `Name` column (not `Rune Name`!) - * - MagicPrefix / MagicSuffix / RarePrefix / RareSuffix: raw display text (`name`), do NOT query tbl! + * Ground Truth (D2MOO `source/D2Common/src/DataTbls/ItemsTbls.cpp`): + * - Armor.txt / Weapons.txt / Misc.txt: `namestr` column (`0x6FD55280`) + * - UniqueItems.txt: `index` column (`0x6FD584E0`) + * - SetItems.txt: `index` column (`0x6FD59140`) + * - Sets.txt: `name` column (`0x6FD59140`) + * - Runes.txt: `Name` column (`0x6FD5E020`) + * - Gems.txt: `name` / `code` column (`0x6FD5B2F0`) + * - LowQualityItems.txt: `Name` column (`0x6FD5BDA0`) + * - MagicPrefix / MagicSuffix / AutoMagic: `Name` column via `D2LANG_GetTblIndex` (`0x6FD57C20`) + * - RarePrefix / RareSuffix: `name` column via `D2LANG_GetTblIndex` (`0x6FD58110`) */ import { decodeTbl } from '../formats/tbl.ts' import type { DecodedTbl } from '../formats/tbl.ts' import type { MountedArchives } from '../mpq/mount.ts' +import { CANONICAL_CHI_TBL_DICT, CANONICAL_ENG_TBL_DICT } from '../data/canonical-tbl-strings.ts' import type { ArmorBase } from './armor.ts' import type { WeaponBase } from './weapons.ts' import type { MiscBase } from './misc-items.ts' @@ -283,11 +287,80 @@ export function resolveRuneName( } /** - * For Magic/Rare prefixes and suffixes, the name column in the txt file - * is already raw display text, so tbl lookup is not performed. + * Resolves display name for Magic/Rare/AutoMagic prefixes and suffixes via `.tbl` + * (`DATATBLS_LoadMagicSuffix_Prefix_AutomagicTxt` `0x6FD57C20` and + * `DATATBLS_LoadRareSuffix_PrefixTxt` `0x6FD58110`). */ export function resolveAffixName( affix: string | { name?: string; Name?: string }, + chiChain?: StringTableChain | ItemNameChains | null, + engChain?: StringTableChain | null, ): string { - return typeof affix === 'string' ? affix : (affix.name ?? affix.Name ?? '') + const key = typeof affix === 'string' ? affix : (affix.name ?? affix.Name ?? '') + return resolveItemName(key, chiChain, engChain) } + +/** Alias for `resolveAffixName` used for `RarePrefix.txt` / `RareSuffix.txt`. */ +export const resolveRareName = resolveAffixName + +/** + * Resolves display name for Gems (`Gems.txt` `code` or `name` column, `0x6FD5B2F0`). + */ +export function resolveGemName( + gem: string | { code?: string; name?: string }, + chiChain?: StringTableChain | ItemNameChains | null, + engChain?: StringTableChain | null, +): string { + const key = typeof gem === 'string' ? gem : (gem.code ?? gem.name ?? '') + return resolveItemName(key, chiChain, engChain) +} + +/** + * Resolves display name for Low Quality prefixes (`LowQualityItems.txt` `Name` column, `0x6FD5BDA0`). + */ +export function resolveLowQualityName( + entry: string | { Name?: string; name?: string }, + chiChain?: StringTableChain | ItemNameChains | null, + engChain?: StringTableChain | null, +): string { + const key = typeof entry === 'string' ? entry : (entry.Name ?? entry.name ?? '') + return resolveItemName(key, chiChain, engChain) +} + +let cachedEmbeddedChains: { chi: StringTableChain; eng: StringTableChain } | undefined + +function createDecodedTblFromRecord(record: Readonly>): DecodedTbl { + const tbl = [] as unknown as DecodedTbl + tbl.dict = new Map(Object.entries(record)) + return tbl +} + +/** + * Returns singleton `StringTableChain` instances backed by the pre-packed 1.13c + * `.tbl` dictionaries (`CANONICAL_CHI_TBL_DICT` and `CANONICAL_ENG_TBL_DICT`), + * suitable for zero-MPQ browser runtime resolution. + */ +export function getEmbeddedItemNameChains(): { chi: StringTableChain; eng: StringTableChain } { + if (!cachedEmbeddedChains) { + cachedEmbeddedChains = { + chi: new StringTableChain('CHI', [createDecodedTblFromRecord(CANONICAL_CHI_TBL_DICT)]), + eng: new StringTableChain('ENG', [createDecodedTblFromRecord(CANONICAL_ENG_TBL_DICT)]), + } + } + return cachedEmbeddedChains +} + +/** + * Looks up a string key directly in the pre-packed 1.13c `.tbl` dictionary. + */ +export function lookupCanonicalTbl( + key: string, + lang: ItemLanguage | 'en' | 'zh' = 'ENG', +): string | undefined { + if (!key) return undefined + if (lang === 'CHI' || lang === 'zh') { + return CANONICAL_CHI_TBL_DICT[key] ?? CANONICAL_ENG_TBL_DICT[key] + } + return CANONICAL_ENG_TBL_DICT[key] +} + diff --git a/src/game/item-tooltip.ts b/src/game/item-tooltip.ts index 364f94c..ad1da28 100644 --- a/src/game/item-tooltip.ts +++ b/src/game/item-tooltip.ts @@ -35,10 +35,19 @@ import { translateItemName, translateMagicName, translateRareName, + resolveBaseItemNameEn, + resolveRareNameEn, + resolveMagicNameEn, formatPropertyCodeI18n, RUNE_INFO_ZH, type TooltipLocale, } from './tooltip-i18n.ts' +import { + CANONICAL_ENG_TBL_DICT, + CANONICAL_CHI_TBL_DICT, + CANONICAL_ISC_DESC_TABLE, + type CanonicalIscDescEntry, +} from '../data/canonical-tbl-strings.ts' import { GEM_INFO, RUNE_INFO, @@ -53,8 +62,17 @@ export { getTooltipLocale, setTooltipLocale, translateItemName, + resolveBaseItemNameEn, + resolveRareNameEn, + resolveMagicNameEn, type TooltipLocale, } from './tooltip-i18n.ts' +export { + CANONICAL_ENG_TBL_DICT, + CANONICAL_CHI_TBL_DICT, + CANONICAL_ISC_DESC_TABLE, + type CanonicalIscDescEntry, +} from '../data/canonical-tbl-strings.ts' export { GEM_INFO, RUNE_INFO, @@ -1281,6 +1299,129 @@ export function getPropertyStatId(code: string, tables?: RuntimePropertyTables): return PROP_STAT_ID[norm] ?? PROP_STAT_ID[lookup] ?? -1 } +const ISC_BY_ID: ReadonlyMap = (() => { + const map = new Map() + for (const entry of Object.values(CANONICAL_ISC_DESC_TABLE)) { + map.set(entry.id, entry) + } + return map +})() + +/** + * Formats an `ItemStatCost.txt` stat or `Properties.txt` property code directly from + * 1.13c `.tbl` (`CANONICAL_ENG_TBL_DICT` / `CANONICAL_CHI_TBL_DICT`) and `CANONICAL_ISC_DESC_TABLE` + * (`descFunc` 1..28, `descVal` 0..2, `descStrPos`, `descStrNeg`, `descStr2`, and `dgrp` 1..2). + */ +export function formatStatByIscDescFunc( + statOrCode: string, + value: number, + min: number = value, + max: number = value, + param?: string | number, + locale: TooltipLocale = getTooltipLocale(), +): string { + const norm = (statOrCode || '').trim().toLowerCase().replace(/^\*/, '') + const dict = locale === 'en' ? CANONICAL_ENG_TBL_DICT : CANONICAL_CHI_TBL_DICT + const lookupTbl = (key: string): string => { + if (!key) return '' + return (dict[key] ?? CANONICAL_ENG_TBL_DICT[key] ?? key).trim() + } + + const isDgrp1 = norm === 'all-stats' + const isDgrp2 = norm === 'res-all' || norm === 'all-res' + + let entry: CanonicalIscDescEntry | undefined + if (isDgrp1) { + entry = CANONICAL_ISC_DESC_TABLE['strength'] + } else if (isDgrp2) { + entry = CANONICAL_ISC_DESC_TABLE['fireresist'] + } else { + entry = + CANONICAL_ISC_DESC_TABLE[norm] ?? + (PROP_STAT_ID[norm] !== undefined ? ISC_BY_ID.get(PROP_STAT_ID[norm]) : undefined) + } + + if (!entry) { + return formatPropertyCode(statOrCode, value, min, max, param, locale) + } + + const useDgrp = isDgrp1 || isDgrp2 + const descFunc = useDgrp ? entry.dgrpFunc : entry.descFunc + const descVal = useDgrp ? entry.dgrpVal : entry.descVal + const strKey = value >= 0 + ? (useDgrp ? entry.dgrpStrPos : entry.descStrPos) + : ((useDgrp ? entry.dgrpStrNeg : entry.descStrNeg) || (useDgrp ? entry.dgrpStrPos : entry.descStrPos)) + const str2Key = useDgrp ? entry.dgrpStr2 : entry.descStr2 + + const str1 = lookupTbl(strKey) + const str2 = lookupTbl(str2Key) + + const composeWithVal = (valStr: string, baseStr: string, extraStr = ''): string => { + let result: string + if (descVal === 0 || !valStr) { + result = baseStr + } else if (descVal === 1) { + result = baseStr ? `${valStr} ${baseStr}` : valStr + } else { + result = baseStr ? `${baseStr} ${valStr}` : valStr + } + if (extraStr) { + result = `${result} ${extraStr}` + } + return result.replace(/\s+/g, ' ').trim() + } + + const signedInt = value >= 0 ? `+${value}` : `${value}` + const signedPerLvl = value >= 0 ? `+${formatPerLevelVal(value)}` : `${formatPerLevelVal(value)}` + + switch (descFunc) { + case 1: + return composeWithVal(signedInt, str1) + case 2: + return composeWithVal(`${value}%`, str1) + case 3: + return composeWithVal(`${value}`, str1) + case 4: + return composeWithVal(`${signedInt}%`, str1) + case 5: + return composeWithVal(`${Math.floor((value * 100) / 128)}%`, str1) + case 6: + return composeWithVal(signedPerLvl, str1, str2) + case 7: + return composeWithVal(`${formatPerLevelVal(value)}%`, str1, str2) + case 8: + return composeWithVal(`${signedPerLvl}%`, str1, str2) + case 9: + return composeWithVal(formatPerLevelVal(value), str1, str2) + case 10: + return composeWithVal(`${Math.floor((value * 100) / 128)}%`, str1, str2) + case 11: { + const rate = Number(param) || value || 1 + const seconds = Math.max(1, Math.floor(100 / rate)) + if (str1.includes('%d')) { + return str1.replace('%d', String(seconds)) + } + return formatPropertyCode(statOrCode, value, min, max, param, locale) + } + case 12: + return composeWithVal(value > 1 ? `+${value}` : '', str1) + case 19: + if (str1.includes('%+d')) { + return str1.replace('%+d', signedInt) + } + if (str1.includes('%d')) { + return str1.replace('%d', String(value)) + } + return composeWithVal(signedInt, str1) + case 20: + return composeWithVal(`-${Math.abs(value)}%`, str1) + case 21: + return composeWithVal(`-${Math.abs(value)}`, str1) + default: + return formatPropertyCode(statOrCode, value, min, max, param, locale) + } +} + const ALIAS_CODE_MAP: Record = { swing1: 'ias', swing2: 'ias', @@ -1807,21 +1948,24 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip affixReqLevel = Math.max(affixReqLevel, autoMagicDef.levelreq) } + const baseCode = (item.code || (base as any)?.code || base.id || '').trim() + const baseNameEn = resolveBaseItemNameEn(base.name, baseCode) + if (quality === 'unique') { qualityColor = '#c8a15a' const uniqDef = item.uniqueItemDef as UniqueItem | undefined if (uniqDef) { if (locale === 'zh') { title = translateItemName(uniqDef.index) - subTitle = translateItemName(base.name) + subTitle = translateItemName(baseNameEn) } else if (locale === 'bilingual') { const uZh = translateItemName(uniqDef.index) - const bZh = translateItemName(base.name) + const bZh = translateItemName(baseNameEn) title = `${uniqDef.index} (${uZh})` - subTitle = `${base.name} (${bZh})` + subTitle = `${baseNameEn} (${bZh})` } else { title = uniqDef.index - subTitle = base.name + subTitle = baseNameEn } if (uniqDef.levelreq > 0) affixReqLevel = Math.max(affixReqLevel, uniqDef.levelreq) if (item.rolledProps && item.rolledProps.length > 0) { @@ -1840,7 +1984,7 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } } } else { - subTitle = locale === 'zh' ? translateItemName(base.name) : locale === 'bilingual' ? `${base.name} (${translateItemName(base.name)})` : base.name + subTitle = locale === 'zh' ? translateItemName(baseNameEn) : locale === 'bilingual' ? `${baseNameEn} (${translateItemName(baseNameEn)})` : baseNameEn } } else if (quality === 'set') { qualityColor = '#00e600' @@ -1848,16 +1992,16 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip if (setDef) { if (locale === 'zh') { title = translateItemName(setDef.index) - subTitle = `${translateItemName(base.name)} · [${translateItemName(setDef.set)}]` + subTitle = `${translateItemName(baseNameEn)} · [${translateItemName(setDef.set)}]` } else if (locale === 'bilingual') { const sZh = translateItemName(setDef.index) - const bZh = translateItemName(base.name) + const bZh = translateItemName(baseNameEn) const setZh = translateItemName(setDef.set) title = `${setDef.index} (${sZh})` - subTitle = `${base.name} (${bZh}) · [${setDef.set} (${setZh})]` + subTitle = `${baseNameEn} (${bZh}) · [${setDef.set} (${setZh})]` } else { title = setDef.index - subTitle = `${base.name} · [${setDef.set}]` + subTitle = `${baseNameEn} · [${setDef.set}]` } if (setDef.levelreq > 0) affixReqLevel = Math.max(affixReqLevel, setDef.levelreq) if (item.rolledProps && item.rolledProps.length > 0) { @@ -1876,23 +2020,28 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } } } else { - subTitle = locale === 'zh' ? translateItemName(base.name) : locale === 'bilingual' ? `${base.name} (${translateItemName(base.name)})` : base.name + subTitle = locale === 'zh' ? translateItemName(baseNameEn) : locale === 'bilingual' ? `${baseNameEn} (${translateItemName(baseNameEn)})` : baseNameEn } } else if (quality === 'rare') { qualityColor = '#ffff60' const rareDef = item.rolledRareAffixes as GeneratedRareAffixes | undefined - const enName = rareDef?.name || item.name + const rawRareName = rareDef?.name || item.name + const enName = resolveRareNameEn( + rawRareName, + (rareDef as any)?.rarePrefix?.name ?? (rareDef as any)?.prefix1?.name, + (rareDef as any)?.rareSuffix?.name ?? (rareDef as any)?.suffix1?.name, + ) if (locale === 'zh') { - title = translateRareName(enName) - subTitle = translateItemName(base.name) + title = translateRareName(rawRareName) + subTitle = translateItemName(baseNameEn) } else if (locale === 'bilingual') { - const rZh = translateRareName(enName) - const bZh = translateItemName(base.name) + const rZh = translateRareName(rawRareName) + const bZh = translateItemName(baseNameEn) title = `${enName} (${rZh})` - subTitle = `${base.name} (${bZh})` + subTitle = `${baseNameEn} (${bZh})` } else { title = enName - subTitle = base.name + subTitle = baseNameEn } if (rareDef && rareDef.affixes) { for (const aff of rareDef.affixes) { @@ -1928,18 +2077,25 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } else if (quality === 'magic') { qualityColor = '#4880ff' const magicDef = item.rolledMagicAffixes as GeneratedAffixes | undefined - const enName = magicDef?.name || item.name + const rawMagicName = magicDef?.name || item.name + const enName = resolveMagicNameEn( + rawMagicName, + base.name, + magicDef?.prefix?.name ?? item.prefix?.name, + magicDef?.suffix?.name ?? item.suffix?.name, + baseCode, + ) if (locale === 'zh') { - title = translateMagicName(enName, base.name) - subTitle = translateItemName(base.name) + title = translateMagicName(rawMagicName, base.name) + subTitle = translateItemName(baseNameEn) } else if (locale === 'bilingual') { - const mZh = translateMagicName(enName, base.name) - const bZh = translateItemName(base.name) + const mZh = translateMagicName(rawMagicName, base.name) + const bZh = translateItemName(baseNameEn) title = `${enName} (${mZh})` - subTitle = `${base.name} (${bZh})` + subTitle = `${baseNameEn} (${bZh})` } else { title = enName - subTitle = base.name + subTitle = baseNameEn } if (magicDef) { if (magicDef.prefix) { @@ -1996,7 +2152,7 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } } else if (quality === 'superior') { qualityColor = '#ffffff' - const enName = item.name && item.name.startsWith('Superior ') ? item.name : `Superior ${base.name}` + const enName = item.name && item.name.startsWith('Superior ') ? item.name : `Superior ${baseNameEn}` if (locale === 'zh') { title = translateItemName(enName) } else if (locale === 'bilingual') { @@ -2013,7 +2169,7 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } } else if (quality === 'low') { qualityColor = '#a0a0a0' - const enName = item.name && item.name !== base.name ? item.name : `Cracked ${base.name}` + const enName = item.name && item.name !== base.name ? item.name : `Cracked ${baseNameEn}` if (locale === 'zh') { title = translateItemName(enName) } else if (locale === 'bilingual') { @@ -2027,17 +2183,17 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } else if (quality === 'runeword' || (quality === 'rune' && !socketable)) { qualityColor = '#c8a15a' const rwTitle = (item as any).nameZh || (item as any).runeword?.name || (item as any).runewordName || item.name || 'Runeword' - const bZh = (item as any).baseNameZh || translateItemName(base.name) + const bZh = (item as any).baseNameZh || translateItemName(baseNameEn) if (locale === 'zh') { title = (item as any).nameZh || translateItemName(rwTitle) || rwTitle subTitle = bZh } else if (locale === 'bilingual') { const rwZh = translateItemName(rwTitle) title = rwZh !== rwTitle ? `${rwTitle} (${rwZh})` : rwTitle - subTitle = `${base.name} (${bZh})` + subTitle = `${baseNameEn} (${bZh})` } else { title = rwTitle - subTitle = base.name + subTitle = baseNameEn } const rwLevelReq = (item as any).runeword?.levelreq || (item as any).reqLevel if (rwLevelReq && rwLevelReq > 0) { @@ -2060,7 +2216,7 @@ export function formatItemTooltip(item: Item, locale: TooltipLocale = getTooltip } } else { qualityColor = '#e0d5c1' - const enName = base.name + const enName = baseNameEn if (locale === 'zh') { title = translateItemName(enName) } else if (locale === 'bilingual') { diff --git a/src/game/items.ts b/src/game/items.ts index 839819b..cc4ce29 100644 --- a/src/game/items.ts +++ b/src/game/items.ts @@ -302,6 +302,8 @@ export interface Item { readonly level: number /** Final name, affixes included. */ readonly name: string + /** Optional localized Chinese display name resolved from .tbl. */ + readonly nameZh?: string | undefined /** Final stats: base plus every rolled modifier. */ readonly stats: Readonly> /** Inventory footprint. */ diff --git a/src/game/tooltip-i18n.ts b/src/game/tooltip-i18n.ts index cc747c1..3dfb07c 100644 --- a/src/game/tooltip-i18n.ts +++ b/src/game/tooltip-i18n.ts @@ -8,6 +8,7 @@ */ import { resolveSkillInfo } from './skills-data.ts' +import { CANONICAL_ENG_TBL_DICT, CANONICAL_CHI_TBL_DICT } from '../data/canonical-tbl-strings.ts' export type TooltipLocale = 'en' | 'zh' | 'bilingual' @@ -2839,6 +2840,131 @@ export const RUNE_INFO_ZH: Record> = { + 'Lesser Healing Potion': 'hp1', + 'Lesser Mana Potion': 'mp1', + 'Strong Healing Potion': 'hp4', + 'Strong Mana Potion': 'mp4', + 'Rejuv Potion': 'rvs', + 'Full Rejuv Potion': 'rvl', + 'Town Portal Book': 'tbk', + 'Identify Book': 'ibk', + 'Town Portal Scroll': 'tsc', + 'Identify Scroll': 'isc', + 'Scroll of Horadric Quest Info': 'tr1', + 'Bark Scroll': 'bks', + 'deciphered Bark Scroll': 'bkd', + 'viper amulet': 'vip', + 'Staff of the Kings': 'msf', + 'Mephisto SoulStone': 'mss', + 'KhalimEye': 'qey', + 'KhalimHeart': 'qhr', + 'KhalimBrain': 'qbr', + 'KhalimFlail': 'qf1', + 'SuperKhalimFlail': 'qf2', + 'decoy dagger': 'd33', + 'Gidbinn': 'g33', +} + +/** + * Resolves a base item's canonical 1.13c English display name via `.tbl` (`CANONICAL_ENG_TBL_DICT`). + */ +export function resolveBaseItemNameEn(baseName: string, baseCode?: string): string { + const trimmed = (baseName || '').trim() + const code = (baseCode || '').trim() + if (code && CANONICAL_ENG_TBL_DICT[code] && (!trimmed || trimmed === code || trimmed in TXT_NAME_TO_TBL_KEY)) { + return CANONICAL_ENG_TBL_DICT[code].trim() + } + if (!trimmed) return '' + const mappedKey = TXT_NAME_TO_TBL_KEY[trimmed] + if (mappedKey && CANONICAL_ENG_TBL_DICT[mappedKey]) { + return CANONICAL_ENG_TBL_DICT[mappedKey].trim() + } + if (CANONICAL_ENG_TBL_DICT[trimmed]) { + return CANONICAL_ENG_TBL_DICT[trimmed].trim() + } + return trimmed +} + +/** + * Resolves a Rare item's canonical 1.13c English name via `.tbl` (`RarePrefix.txt` + `RareSuffix.txt` keys + * such as `GhoulRI` -> `Ghoul`, `barRI` -> `Bar`, `bite` -> `Bite`). + */ +export function resolveRareNameEn(rareName: string, prefixKey?: string, suffixKey?: string): string { + if (prefixKey && suffixKey) { + const preEn = (CANONICAL_ENG_TBL_DICT[prefixKey.trim()] ?? prefixKey.trim()).trim() + const sufEn = (CANONICAL_ENG_TBL_DICT[suffixKey.trim()] ?? suffixKey.trim()).trim() + return `${preEn} ${sufEn}` + } + if (!rareName) return '' + const parts = rareName.trim().split(/\s+/) + if (parts.length >= 2) { + const pre = parts[0] + const suf = parts.slice(1).join(' ') + const preEn = (CANONICAL_ENG_TBL_DICT[pre] ?? pre).trim() + const sufEn = (CANONICAL_ENG_TBL_DICT[suf] ?? suf).trim() + return `${preEn} ${sufEn}` + } + return (CANONICAL_ENG_TBL_DICT[rareName.trim()] ?? rareName.trim()).trim() +} + +/** + * Resolves a Magic item's canonical 1.13c English name via `.tbl` (`MagicPrefix.txt` + `MagicSuffix.txt` keys + * such as `Mechanist's` -> `Mechanic's`, `of the Colosuss` -> `of the Colossus`, `of Warmth` -> `of Thawing`). + */ +export function resolveMagicNameEn( + magicName: string, + baseName?: string, + prefixKey?: string, + suffixKey?: string, + baseCode?: string, +): string { + if (!magicName && !baseName) return '' + let pre = prefixKey?.trim() || '' + let suf = suffixKey?.trim() || '' + let base = baseName?.trim() || '' + + if (!pre && !suf && magicName) { + if (magicName.includes(' of ')) { + const ofParts = magicName.split(' of ') + suf = 'of ' + ofParts.slice(1).join(' of ').trim() + const left = ofParts[0].trim() + if (base && left.endsWith(base)) { + pre = left.slice(0, left.length - base.length).trim() + } else { + const words = left.split(/\s+/) + if (words.length > 1) { + pre = words[0] + base = words.slice(1).join(' ') + } else { + base = left + } + } + } else if (base && magicName.endsWith(base)) { + pre = magicName.slice(0, magicName.length - base.length).trim() + } + } + + const resolvedBase = resolveBaseItemNameEn(base || magicName, baseCode) + const resolvedPre = pre ? (CANONICAL_ENG_TBL_DICT[pre] ?? pre).trim() : '' + const resolvedSuf = suf ? (CANONICAL_ENG_TBL_DICT[suf] ?? suf).trim() : '' + + if (resolvedPre && resolvedSuf) { + return `${resolvedPre} ${resolvedBase} ${resolvedSuf}` + } + if (resolvedPre) { + return `${resolvedPre} ${resolvedBase}` + } + if (resolvedSuf) { + return `${resolvedBase} ${resolvedSuf}` + } + return magicName ? resolveBaseItemNameEn(magicName, baseCode) : resolvedBase +} + /** * Translates an item name (base, unique, set item, set name, rune) into Chinese. */ @@ -2847,6 +2973,14 @@ export function translateItemName(enName: string): string { const trimmed = enName.trim() if (ITEM_NAMES_ZH[trimmed]) return ITEM_NAMES_ZH[trimmed] + const tblEn = resolveBaseItemNameEn(trimmed) + if (tblEn !== trimmed && ITEM_NAMES_ZH[tblEn]) { + return ITEM_NAMES_ZH[tblEn] + } + if (CANONICAL_CHI_TBL_DICT[trimmed]) { + return CANONICAL_CHI_TBL_DICT[trimmed].trim() + } + // Superior prefix if (trimmed.startsWith('Superior ')) { const sub = trimmed.slice('Superior '.length).trim() @@ -2892,7 +3026,7 @@ export function translateSkillName(enSkill: string): string { } /** - * Translates Rare Item Name (e.g. "Shadow Brow" -> "阴影之额骨" or "野兽之刃"). + * Translates Rare Item Name (e.g. "Shadow Brow" -> "阴影之额头", "GhoulRI barRI" -> "食尸鬼之棒"). */ export function translateRareName(rareName: string): string { if (!rareName) return '' @@ -2900,15 +3034,29 @@ export function translateRareName(rareName: string): string { if (parts.length >= 2) { const pre = parts[0] const suf = parts.slice(1).join(' ') - const preZh = RARE_PREFIX_ZH[pre] ?? RARE_PREFIX_ZH[pre.toLowerCase()] ?? pre - const sufZh = RARE_SUFFIX_ZH[suf] ?? RARE_SUFFIX_ZH[suf.toLowerCase()] ?? suf + const preEn = (CANONICAL_ENG_TBL_DICT[pre] ?? pre).trim() + const sufEn = (CANONICAL_ENG_TBL_DICT[suf] ?? suf).trim() + const preZh = + RARE_PREFIX_ZH[pre] ?? + RARE_PREFIX_ZH[preEn] ?? + RARE_PREFIX_ZH[pre.toLowerCase()] ?? + RARE_PREFIX_ZH[preEn.toLowerCase()] ?? + CANONICAL_CHI_TBL_DICT[pre]?.trim() ?? + preEn + const sufZh = + RARE_SUFFIX_ZH[suf] ?? + RARE_SUFFIX_ZH[sufEn] ?? + RARE_SUFFIX_ZH[suf.toLowerCase()] ?? + RARE_SUFFIX_ZH[sufEn.toLowerCase()] ?? + CANONICAL_CHI_TBL_DICT[suf]?.trim() ?? + sufEn return preZh + sufZh } return rareName } /** - * Translates Magic Item Name (e.g. "Sturdy Leather Armor of Life" -> "结实之皮甲生命的"). + * Translates Magic Item Name (e.g. "Sturdy Leather Armor of Life" -> "结实之生命之皮甲"). */ export function translateMagicName(magicName: string, baseName?: string): string { if (!magicName) return '' @@ -2943,9 +3091,26 @@ export function translateMagicName(magicName: string, baseName?: string): string } } - const preZh = pre ? (MAGIC_PREFIX_ZH[pre] ?? (pre.endsWith('之') ? pre : pre + '之')) : '' + const preEn = pre ? (CANONICAL_ENG_TBL_DICT[pre] ?? pre).trim() : '' + const sufEn = suf ? (CANONICAL_ENG_TBL_DICT[suf] ?? suf).trim() : '' + const preZh = pre + ? (MAGIC_PREFIX_ZH[pre] ?? + MAGIC_PREFIX_ZH[preEn] ?? + CANONICAL_CHI_TBL_DICT[pre]?.trim() ?? + (preEn.endsWith('之') ? preEn : preEn + '之')) + : '' const sufKey = suf.startsWith('of ') ? suf : 'of ' + suf - const sufZh = suf ? (MAGIC_SUFFIX_ZH[suf] ?? MAGIC_SUFFIX_ZH[sufKey] ?? MAGIC_SUFFIX_ZH[suf.replace(/^of\s+/, '')] ?? (suf.endsWith('之') ? suf : suf + '之')) : '' + const sufEnKey = sufEn.startsWith('of ') ? sufEn : 'of ' + sufEn + const sufZh = suf + ? (MAGIC_SUFFIX_ZH[suf] ?? + MAGIC_SUFFIX_ZH[sufKey] ?? + MAGIC_SUFFIX_ZH[sufEn] ?? + MAGIC_SUFFIX_ZH[sufEnKey] ?? + MAGIC_SUFFIX_ZH[suf.replace(/^of\s+/, '')] ?? + MAGIC_SUFFIX_ZH[sufEn.replace(/^of\s+/, '')] ?? + CANONICAL_CHI_TBL_DICT[suf]?.trim() ?? + (sufEn.endsWith('之') ? sufEn : sufEn + '之')) + : '' const baseZh = translateItemName(base) if (preZh && sufZh) { diff --git a/src/ui/ground-labels.ts b/src/ui/ground-labels.ts index f83f4b2..1d21054 100644 --- a/src/ui/ground-labels.ts +++ b/src/ui/ground-labels.ts @@ -13,6 +13,7 @@ */ import type { GroundItemEntity } from '../game/ground-items.ts' +import { translateItemName, translateRareName, translateMagicName } from '../game/tooltip-i18n.ts' /** * Authentic 1.13c Diablo II quality color codes for ground item labels. @@ -111,7 +112,25 @@ export function formatGroundItemLabelText(item: GroundItemEntity): string { if (item.isGold) { return `${item.amount} 金币` } - return item.nameZh || item.name || '物品' + if (item.nameZh) { + return item.nameZh + } + const srcNameZh = (item.item as any)?.nameZh ?? (item.item as any)?.item?.nameZh + if (typeof srcNameZh === 'string' && srcNameZh.trim() !== '') { + return srcNameZh + } + if (item.name) { + const q = (item.quality || 'normal').toLowerCase() + if (q === 'rare') { + return translateRareName(item.name) + } + if (q === 'magic') { + const baseName = (item.item as any)?.base?.name ?? (item.item as any)?.item?.base?.name + return translateMagicName(item.name, baseName) + } + return translateItemName(item.name) + } + return '物品' } /** diff --git a/src/ui/inventory.ts b/src/ui/inventory.ts index 5dd5be4..9087c9f 100644 --- a/src/ui/inventory.ts +++ b/src/ui/inventory.ts @@ -588,7 +588,8 @@ export const STARTER_EQUIPPED_GEAR: Readonly { + beforeEach(() => { + setTooltipLocale('en') + }) + + describe('1. Canonical .tbl String Dictionaries & ItemStatCost.txt Table', () => { + it('packs authentic 1.13c ENG and CHI .tbl dictionaries and ISC descfunc metadata', () => { + expect(Object.keys(CANONICAL_ENG_TBL_DICT).length).toBeGreaterThan(2000) + expect(Object.keys(CANONICAL_CHI_TBL_DICT).length).toBeGreaterThan(1000) + expect(Object.keys(CANONICAL_ISC_DESC_TABLE).length).toBeGreaterThan(150) + + // Base item code hp1 in Misc.txt has internal name "Lesser Healing Potion", + // but string.tbl maps "hp1" -> "Minor Healing Potion" / "輕微治療葯劑" + expect(lookupCanonicalTbl('hp1', 'en')).toBe('Minor Healing Potion') + expect(lookupCanonicalTbl('hp1', 'zh')).toBe('輕微治療葯劑') + + // RarePrefix.txt / RareSuffix.txt internal keys with RI or lowercase + expect(lookupCanonicalTbl('GhoulRI', 'en')).toBe('Ghoul') + expect(lookupCanonicalTbl('barRI', 'en')).toBe('Bar') + expect(lookupCanonicalTbl('bite', 'en')).toBe('Bite') + + // MagicPrefix.txt / MagicSuffix.txt internal keys vs .tbl display strings + expect(lookupCanonicalTbl("Mechanist's", 'en')).toBe("Mechanic's") + expect(lookupCanonicalTbl('of the Colosuss', 'en')).toBe('of the Colossus') + expect(lookupCanonicalTbl('of Warmth', 'en')).toBe('of Thawing') + }) + + it('resolves affix, rare, gem, and low-quality names through .tbl in item-names.ts', () => { + const chains = getEmbeddedItemNameChains() + expect(resolveAffixName({ name: "Mechanist's" }, chains)).toBe("Mechanic's") + expect(resolveRareName('GhoulRI', chains)).toBe('食屍鬼之') + expect(resolveRareName('barRI', chains)).toBe('酒吧') + expect(resolveGemName({ name: 'Perfect Amethyst', code: 'gpv' }, chains)).toBe('完美的紫寶石') + expect(resolveLowQualityName('Low Quality', chains)).toBe('劣質的') + }) + + it('resolves English and Chinese base, rare, and magic names via .tbl in tooltip-i18n.ts', () => { + expect(resolveBaseItemNameEn('Lesser Healing Potion', 'hp1')).toBe('Minor Healing Potion') + expect(translateItemName('Lesser Healing Potion')).toBe('轻微治疗药剂') + + expect(resolveRareNameEn('GhoulRI barRI', 'GhoulRI', 'barRI')).toBe('Ghoul Bar') + expect(resolveRareNameEn('Storm bite', 'Storm', 'bite')).toBe('Storm Bite') + expect(translateRareName('GhoulRI barRI')).toBe('食尸鬼之酒吧') + + expect(resolveMagicNameEn("Mechanist's Cap of the Colosuss", 'Cap', "Mechanist's", 'of the Colosuss', 'cap')).toBe( + "Mechanic's Cap of the Colossus", + ) + expect(translateMagicName("Mechanist's Cap of Warmth", 'Cap')).toBe('机械师之温暖之帽子') + }) + }) + + describe('2. ItemStatCost.txt descfunc (1..28) & descval (0..2) Engine', () => { + it('formats discrete stats via CANONICAL_ISC_DESC_TABLE and .tbl keys', () => { + // strength: descFunc=1, descVal=1, descStrPos=ModStr1a ("to Strength" / "力量") + expect(formatStatByIscDescFunc('strength', 15, 15, 15, undefined, 'en')).toBe('+15 to Strength') + expect(formatStatByIscDescFunc('strength', 15, 15, 15, undefined, 'zh')).toBe('+15 力量') + + // item_fastercastrate: descFunc=4, descVal=1, descStrPos=ModStr1c ("Faster Cast Rate" / "高速施展速度") + expect(formatStatByIscDescFunc('item_fastercastrate', 20, 20, 20, undefined, 'en')).toBe('+20% Faster Cast Rate') + expect(formatStatByIscDescFunc('item_fastercastrate', 20, 20, 20, undefined, 'zh')).toBe('+20% 高速施展速度') + + // fireresist: descFunc=4, descVal=2, descStrPos=strModFireResist ("Fire Resist" / "抗火") + expect(formatStatByIscDescFunc('fireresist', 40, 40, 40, undefined, 'en')).toBe('Fire Resist +40%') + expect(formatStatByIscDescFunc('fireresist', 40, 40, 40, undefined, 'zh')).toBe('抗火 +40%') + + // item_Cannotbefrozen: descFunc=3, descVal=0, descStrPos=ModStr2z ("Cannot Be Frozen" / "無法冰凍") + expect(formatStatByIscDescFunc('item_cannotbefrozen', 1, 1, 1, undefined, 'en')).toBe('Cannot Be Frozen') + expect(formatStatByIscDescFunc('item_cannotbefrozen', 1, 1, 1, undefined, 'zh')).toBe('無法冰凍') + + // item_magicbonus: descFunc=7, descVal=1, descStrPos=ModStr1x ("Better Chance of Getting Magic Items") + expect(formatStatByIscDescFunc('item_magicbonus', 50, 50, 50, undefined, 'en')).toBe( + '50% Better Chance of Getting Magic Items', + ) + }) + }) + + describe('3. Ground Items (地面掉落物品): createDroppedItem & formatGroundItemLabelText', () => { + const hp1Base: ItemBase = { + id: 'hp1', + name: 'Lesser Healing Potion', + kind: 'misc', + invWidth: 1, + invHeight: 1, + maxStack: 1, + value: 25, + damage: 0, + defense: 0, + tags: ['hpot'], + level: 1, + } + + const capBase: ItemBase = { + id: 'cap', + name: 'Cap', + kind: 'armor', + invWidth: 2, + invHeight: 2, + maxStack: 1, + value: 20, + damage: 0, + defense: 5, + tags: ['helm'], + level: 1, + } + + it('resolves dropped item .name and .nameZh through .tbl and renders ground labels accurately', () => { + // hp1 has internal Misc.txt name "Lesser Healing Potion", must resolve to "Minor Healing Potion" / "轻微治疗药剂" + const hp1Drop = createDroppedItem(hp1Base, 'normal', { ilvl: 1, dwInitSeed: 480 }) + expect(hp1Drop.name).toBe('Minor Healing Potion') + expect(hp1Drop.nameZh).toBe('轻微治疗药剂') + + const makeGroundEntity = (partial: Partial): GroundItemEntity => ({ + id: 'g-1', + item: hp1Drop, + name: hp1Drop.name, + nameZh: hp1Drop.nameZh ?? '', + quality: 'normal', + isGold: false, + amount: 1, + invWidth: 1, + invHeight: 1, + dropTime: 0, + x: 0, + y: 0, + cellX: 0, + cellY: 0, + sparklePhase: 0, + ...partial, + }) + + expect(formatGroundItemLabelText(makeGroundEntity({}))).toBe('轻微治疗药剂') + + // Ground item without pre-populated nameZh resolves via .tbl in formatGroundItemLabelText + expect( + formatGroundItemLabelText( + makeGroundEntity({ + name: 'GhoulRI barRI', + nameZh: '', + quality: 'rare', + item: undefined, + }), + ), + ).toBe('食尸鬼之酒吧') + + expect( + formatGroundItemLabelText( + makeGroundEntity({ + name: "Mechanist's Cap of the Colosuss", + nameZh: '', + quality: 'magic', + item: undefined, + }), + ), + ).toBe('机械师之巨神之帽子') + }) + + it('formats tooltip titles for Rare and Magic items with internal .txt keys via .tbl', () => { + const capDrop = createDroppedItem(capBase, 'rare', { ilvl: 20, dwInitSeed: 480 }) + const rareItem = { + ...capDrop, + quality: ItemQuality.RARE, + rarity: 'rare' as const, + name: 'GhoulRI barRI', + rolledRareAffixes: { + name: 'GhoulRI barRI', + rarePrefix: { name: 'GhoulRI' }, + rareSuffix: { name: 'barRI' }, + affixes: [], + } as any, + } + const enTip = formatItemTooltip(rareItem, 'en') + expect(enTip.title).toBe('Ghoul Bar') + const zhTip = formatItemTooltip(rareItem, 'zh') + expect(zhTip.title).toBe('食尸鬼之酒吧') + }) + }) + + describe('4. Inventory & Equipped Gear (背包与装备栏): 1-Stat-Per-Line .tbl Compliance', () => { + it('ensures STARTER_EQUIPPED_GEAR has no non-.tbl "/" merged multi-stat lines', () => { + for (const [slot, item] of Object.entries(STARTER_EQUIPPED_GEAR)) { + if (!item) continue + for (const stat of item.stats) { + // "高速跑步/行走" is the single stat FRW name in Chinese, not a multi-stat merge + const withoutFrw = stat.text.replace(/高速跑步\/行走/g, '') + expect(withoutFrw, `Slot ${slot} (${item.name}) has merged stat line: ${stat.text}`).not.toContain(' / ') + } + } + }) + + it('ensures all 7 classes in CLASS_EXCLUSIVE_SETS have 1-stat-per-line .tbl stats and setBonuses', () => { + for (const [cls, gear] of Object.entries(CLASS_EXCLUSIVE_SETS)) { + for (const [slot, item] of Object.entries(gear)) { + if (!item) continue + for (const stat of item.stats) { + const withoutFrw = stat.text.replace(/高速跑步\/行走/g, '') + expect(withoutFrw, `${cls}.${slot} (${item.name}) has merged stat line: ${stat.text}`).not.toContain(' / ') + } + for (const bonus of item.setBonuses ?? []) { + expect(bonus.text, `${cls}.${slot} (${item.name}) has merged setBonus: ${bonus.text}`).not.toContain(' / ') + } + } + } + }) + }) + + describe('5. Stash Items (储物箱): Canonical 4-Slot Socketable .tbl Format & Rare Jewel Parity', () => { + it('ensures all 24 socketables (12 Runes + 12 Gems/Skulls) in STARTER_STASH_ITEMS have canonical 5-line .tbl descriptions', () => { + const socketables = STARTER_STASH_ITEMS.filter( + (gp) => gp.item.id.startsWith('stash-r-') || gp.item.id.startsWith('stash-gem-'), + ) + expect(socketables.length).toBe(24) + + for (const gp of socketables) { + const lines = gp.item.stats.map((s) => s.text) + expect(lines.length, `${gp.item.id} (${gp.item.name}) should have 5 canonical socketable lines`).toBe(5) + expect(lines[0]).toBe('可镶嵌进有凹槽的装备') + expect(lines[1]).toMatch(/^武器: /) + expect(lines[2]).toMatch(/^防具: /) + expect(lines[3]).toMatch(/^头盔: /) + expect(lines[4]).toMatch(/^盾牌: /) + } + }) + + it('ensures stash-jew-rare (Doom Gyre) splits Strength and Dexterity into separate .tbl lines', () => { + const rareJewel = STARTER_STASH_ITEMS.find((gp) => gp.item.id === 'stash-jew-rare') + expect(rareJewel).toBeDefined() + const texts = rareJewel!.item.stats.map((s) => s.text) + expect(texts).toContain('+9 力量') + expect(texts).toContain('+9 敏捷') + for (const t of texts) { + expect(t).not.toContain(' / ') + } + }) + }) +})