diablo2-web/scripts/generate-affix-dictionaries.ts

608 lines
17 KiB
TypeScript

import { getEmbeddedDropTables } from '../src/game/embedded-drop-tables.ts'
import { SKILL_NAMES_ZH } from '../src/game/tooltip-i18n.ts'
const dt = getEmbeddedDropTables()
const prefixes = Array.from(new Set(dt.magicAffixes.prefixes.all.map(p => p.name))).sort()
const suffixes = Array.from(new Set(dt.magicAffixes.suffixes.all.map(s => s.name))).sort()
// Complete 252 prefixes
const prefixMap: Record<string, string> = {
"Accursed": "诅咒之",
"Acrobat's": "杂技之",
"Amber": "琥珀之",
"Ambergris": "龙涎香之",
"Amethyst": "紫水晶之",
"Angel's": "天使之",
"Antimagic": "防魔之",
"Arcadian": "阿卡迪亚之",
"Arch-Angel's": "大天使之",
"Archer's": "弓箭手之",
"Arcing": "电弧之",
"Argent": "白银之",
"Artificer's": "工匠之",
"Assamic": "阿萨姆之",
"Astral": "星界之",
"Athlete": "运动之",
"Athlete's": "运动之",
"Aureolin": "钴黄之",
"Azure": "天青之",
"Bahamut's": "巴哈姆特之",
"Beryl": "绿柱石之",
"Berserker's": "狂战士之",
"Bishop's": "主教之",
"Blanched": "漂白之",
"Blank": "虚无之",
"Blazing": "炽热之",
"Blessed": "祝福之",
"Blighting": "枯萎之",
"Bloody": "血腥之",
"Bone": "白骨之",
"Boreal": "极北之",
"Bowyer's": "弓箭手之",
"Bright": "光明之",
"Bronze": "青铜之",
"Brown": "棕褐之",
"Brutal": "残忍之",
"Burgundy": "红棕之",
"Burly": "魁梧之",
"Burning": "燃烧之",
"Buzzing": "嗡鸣之",
"Calling": "呼唤之",
"Camphor": "樟脑之",
"Captain's": "领袖之",
"Carbuncle": "痈肿之",
"Caretaker's": "看顾者之",
"Carmine": "洋红之",
"Celestial": "天界之",
"Charged": "充能之",
"Chestnut": "栗色之",
"Chilling": "严寒之",
"Chromatic": "炫彩之",
"Cinnabar": "朱砂之",
"Cobalt": "钴蓝之",
"Commander's": "指挥官之",
"Communal": "公社之",
"Compact": "紧密之",
"Consecrated": "奉献之",
"Coral": "珊瑚之",
"Corosive": "腐蚀之",
"Crimson": "枣红之",
"Cruel": "残忍之",
"Cunning": "狡黠之",
"Deadly": "致命之",
"Dense": "致密之",
"Devious": "迂回之",
"Diamond": "钻石之",
"Divine": "神圣之",
"Dragon's": "龙之",
"Drake's": "德尔克之",
"Dun": "黑褐之",
"Eagleeye": "雕眼之",
"Earth": "大地之",
"Eburin": "象牙之",
"Echoing": "回音之",
"Elysian": "极乐之",
"Ember": "余烬之",
"Emerald": "绿宝石之",
"Entrapping": "陷阱之",
"Envenomed": "腐烂之",
"Eocene": "始新世之",
"Expert's": "专家之",
"Falconeye": "猎鹰之眼",
"Fanatic": "狂热之",
"Felicitous": "吉庆之",
"Feral": "野性之",
"Ferocious": "凶猛之",
"Fine": "精良之",
"Flaming": "烈焰之",
"Fletcher's": "制箭者之",
"Fool's": "愚人之",
"Forked": "分叉之",
"Fortified": "防御强化之",
"Fortuitous": "偶然之",
"Freezing": "冰冻之",
"Fungal": "真菌之",
"Furious": "狂怒之",
"Gaea's": "大地之",
"Gaia": "大地之",
"Garnet": "石榴石之",
"Glacial": "极冰之",
"Glimmering": "微光之",
"Glorious": "光荣之",
"Glowing": "发光之",
"Godly": "神圣之",
"Gold": "金之",
"Golemlord": "魔像领主之",
"Golemlord's": "魔像领主之",
"Grandmaster's": "宗师之",
"Graverobber's": "盗墓者之",
"Great Wyrm's": "大巨龙之",
"Gritty": "坚韧之",
"Guardian's": "护卫者之",
"Gymnastic": "体操之",
"Gymnast's": "体操之",
"Hallowed": "神圣之",
"Harpoonist's": "标枪之",
"Hawk Branded": "鹰之烙印之",
"Hawkeye": "鹰眼之",
"Hexing": "诅咒之",
"Hibernal": "极寒之",
"Hierophant's": "教皇之",
"Holy": "神圣之",
"Howling": "咆哮之",
"Iron": "铁之",
"Ivory": "象牙之",
"Jacinth": "风信子石之",
"Jack's": "随从之",
"Jade": "翡翠之",
"Jagged": "锯齿之",
"Jester's": "弄臣之",
"Jeweler's": "珠宝匠之",
"Joker's": "小丑之",
"Kenshi's": "剑士之",
"Keeper's": "守护者之",
"King's": "国王之",
"Knave's": "盗贼之",
"Knight's": "骑士之",
"Lancer's": "长矛手之",
"Lapis": "青金石之",
"Lapis Lazuli": "青金石之",
"Lion Branded": "狮子烙印之",
"Lizard's": "蜥蜴之",
"Lord's": "领主之",
"Loud": "响亮之",
"Lucky": "幸运之",
"Magekiller's": "法师杀手之",
"Maiden's": "处女之",
"Maroon": "褐红之",
"Marshal": "元帅之",
"Marshal's": "元帅之",
"Massive": "稳重之",
"Master's": "大师之",
"Mechanist's": "机械师之",
"Mentalist": "通灵之",
"Mentalist's": "通灵之",
"Merciless": "绝情之",
"Meteoric": "陨铁之",
"Miocene": "中新世之",
"Mnemonic": "记忆之",
"Monk's": "僧人之",
"Nature": "自然之",
"Nature's": "自然之",
"Necromancer": "死灵法师之",
"Necromancer's": "死灵法师之",
"Nickel": "白镍之",
"Noxious": "有害之",
"Null": "无效之",
"Ocher": "赭黄之",
"Oligocene": "渐新世之",
"Paleocene": "忠诚信使之",
"Paradox": "悖论之",
"Patriarch's": "先知之",
"Pearl": "珍珠之",
"Pestilent": "瘟疫之",
"Platinum": "白金之",
"Powered": "能量之",
"Preserver": "保护者之",
"Preserver's": "保护者之",
"Priest's": "祭司之",
"Prismatic": "彩虹之",
"Psychic": "心灵之",
"Pure": "纯净之",
"Raging": "暴怒之",
"Rainbow": "彩虹之",
"Realgar": "雄黄之",
"Red": "红之",
"Resonant": "共鸣之",
"Robineye": "知更鸟眼之",
"Rose Branded": "玫瑰烙印之",
"Ruby": "红宝石之",
"Rugged": "凹凸之",
"Russet": "铁锈之",
"Rusty": "生锈之",
"Sacred": "圣洁之",
"Saintly": "崇高之",
"Sanguinary": "鲜血之",
"Sapphire": "蓝宝石之",
"Savage": "野蛮之",
"Scarlet": "猩红之",
"Scintillating": "闪烁之",
"Scorching": "灼烧之",
"Screaming": "尖叫之",
"Sensei's": "老师之",
"Septic": "腐臭之",
"Serpent's": "海蛇之",
"Serrated": "锯齿之",
"Shadow": "阴影之",
"Shaman's": "萨满之",
"Sharp": "尖锐之",
"Shimmering": "微光之",
"Shivering": "寒颤之",
"Shocking": "雷霆之",
"Shogukusha's": "刺客之",
"Shouting": "咆哮之",
"Silver": "银之",
"Slayer's": "屠杀者之",
"Smoldering": "焖燃之",
"Smoking": "烟雾之",
"Snake's": "蛇之",
"Snowflake": "雪花之",
"Soldier's": "士兵之",
"Sounding": "鸣响之",
"Sparking": "火花之",
"Sparroweye": "麻雀眼之",
"Spearmaiden's": "标枪女郎之",
"Spiritual": "精神之",
"Stalwart": "健壮之",
"Static": "静电之",
"Steel": "钢之",
"Stout": "坚固之",
"Strange": "怪异之",
"Strong": "强壮之",
"Sturdy": "结实之",
"Summoner's": "召唤者之",
"Tangerine": "橙黄之",
"Terra's": "大地之",
"Thin": "轻薄之",
"Tin": "白铁之",
"Tireless": "不倦之",
"Topaz": "黄宝石之",
"Toxic": "剧毒之",
"Trainer's": "驯兽师之",
"Trickster's": "戏法师之",
"Triumphant": "得胜之",
"Trump": "胜者之",
"Turquoise": "绿松石之",
"Unearthly": "超凡之",
"Valkyrie's": "女武神之",
"Venomous": "剧毒之",
"Vermillion": "朱砂之",
"Veteran's": "老兵之",
"Vicious": "恶毒之",
"Victorious": "胜利之",
"Vigorous": "强健之",
"Viridian": "铭绿之",
"Visionary": "梦幻之",
"Vodoun": "伏都之",
"Volcanic": "火山之",
"Vulpine": "奸诈之",
"Wailing": "哀嚎之",
"Warden": "看守者之",
"Warder's": "监视者之",
"Warrior's": "战士之",
"Weird": "怪异之",
"Witch-hunter's": "猎巫者之",
"Wyrm's": "维特之",
"Yelling": "呐喊之",
"Zircon": "锆石之"
}
// Complete 288 suffixes
const suffixBaseMap: Record<string, string> = {
"Health": "健康之",
"Acceleration": "加速之",
"Anima": "生灵之",
"Balance": "平衡之",
"Equilibrium": "均势之",
"Stability": "安定之",
"Chance": "几率之",
"Greed": "贪欲之",
"Wealth": "财富之",
"Light": "光明之",
"Radiance": "光辉之",
"the Sun": "太阳之",
"Nirvana": "涅槃之",
"Vileness": "卑劣之",
"the Colosuss": "巨神之",
"the Jackal": "胡狼之",
"Protection": "守护之",
"Absorption": "吸收之",
"Life": "生命之",
"Warding": "防避之",
"the Sentinel": "步哨之",
"Guarding": "守卫之",
"Negation": "否定之",
"Piercing": "刺穿之",
"Bashing": "重击之",
"Puncturing": "爆破之",
"Thorns": "荆棘之",
"Spikes": "尖刺之",
"Readiness": "准备之",
"Alacrity": "迅捷之",
"Swiftness": "疾速之",
"Quickness": "快速之",
"Blocking": "格挡之",
"Deflecting": "偏向之",
"the Apprentice": "学徒之",
"the Magus": "法师之",
"Frost": "冰霜之",
"the Glacier": "冰川之",
"Flame": "火焰之",
"Fire": "烈火之",
"Burning": "燃烧之",
"Lightning": "闪电之",
"Thunder": "雷霆之",
"Shock": "电击之",
"Spark": "火花之",
"Static": "静电之",
"Craftsmanship": "工匠之",
"Quality": "品质之",
"Maiming": "残废之",
"Slaying": "杀戮之",
"Gore": "鲜血之",
"Carnage": "大屠杀之",
"Slaughter": "屠杀之",
"Butchery": "屠戮之",
"Evisceration": "剖腹之",
"Destruction": "毁灭之",
"Worth": "价值之",
"Measure": "度量之",
"Excellence": "卓越之",
"Performance": "精良之",
"Joyfulness": "欢欣之",
"Bliss": "至福之",
"Blight": "枯萎之",
"Venom": "毒素之",
"Pestilence": "瘟疫之",
"Anthrax": "炭疽之",
"Frostbite": "冻疮之",
"the Leech": "水蛭之",
"the Bat": "蝙蝠之",
"the Vampire": "吸血鬼之",
"the Lamprey": "八目鳗之",
"the Wraith": "幽灵之",
"the Ghoul": "食尸鬼之",
"the Locust": "蝗虫之",
"Daring": "果敢之",
"Truth": "真理之",
"Honor": "荣耀之",
"Avarice": "贪婪之",
"Luck": "幸运之",
"Good Luck": "好运之",
"Prosperity": "繁荣之",
"Fortune": "财富之",
"Perfection": "完美之",
"Enlightenment": "启迪之",
"Knowledge": "知识之",
"Substinence": "生计之",
"Vita": "活力之",
"Spirit": "精神之",
"Hope": "希望之",
"Freedom": "自由之",
"Atlus": "阿特拉斯之",
"Virility": "刚毅之",
"Traveling": "旅行之",
"Inertia": "抗性之",
"Self-Repair": "自我修复之",
"Fast Repair": "快速修复之",
"Ages": "万古之",
"Replenishing": "充盈之",
"Propogation": "繁衍之",
"the Kraken": "海妖之",
"Memory": "记忆之",
"the Elephant": "大象之",
"Power": "力量之",
"Grace": "优雅之",
"Grace and Power": "优雅与力量之",
"the Yeti": "雪人之",
"the Phoenix": "凤凰之",
"the Efreeti": "火灵之",
"the Cobra": "眼镜蛇之",
"the Elements": "元素之",
"the Icicle": "冰柱之",
"Winter": "严冬之",
"Frigidity": "寒冷之",
"Incineration": "焚化之",
"Passion": "激情之",
"Storms": "风暴之",
"Ennui": "厌倦之",
"Ire": "愤怒之",
"Wrath": "盛怒之",
"Transcendence": "卓越之",
"Envy": "嫉妒之",
"Fervor": "狂热之",
"Speed": "速度之",
"Haste": "急速之",
"Dexterity": "敏捷之",
"Skill": "技巧之",
"Accuracy": "准确之",
"Precision": "精确之",
"Sniping": "狙击之",
"the Bear": "巨熊之",
"Strength": "力量之",
"Might": "强力之",
"the Ox": "公牛之",
"the Giant": "巨人之",
"the Titan": "泰坦之",
"the Fox": "狐狸之",
"the Wolf": "苍狼之",
"the Tiger": "猛虎之",
"the Mammoth": "猛犸之",
"the Colossus": "巨神之",
"the Squid": "乌贼之",
"the Whale": "巨鲸之",
"Defiance": "蔑视之",
"Fumigation": "熏蒸之",
"Ease": "轻便之",
"Simplicity": "简朴之",
"Dawn": "黎明之",
"Sunlight": "阳光之",
"Energy": "能量之",
"Mind": "心灵之",
"Brilliance": "辉煌之",
"Sorcery": "巫术之",
"Wizardry": "法术之",
"Warmth": "温暖之",
"Remedy": "救治之",
"Amelioration": "改善之",
"Regeneration": "再生之",
"Regrowth": "新生之",
"Revivification": "复苏之",
"Spikers": "尖刺之",
"Passing": "消逝之",
"Stamina": "耐力之",
"Pacing": "步行之",
"Striding": "跨步之",
"Health Everlasting": "永恒健康之",
"Life Everlasting": "永恒生命之",
"Amianthus": "石棉之",
"Fire Quenching": "灭火之",
"Incombustibility": "不燃之",
"Coolness": "清凉之",
"Faith": "信仰之",
"Resistance": "抗性之",
"Insulation": "绝缘之",
"Grounding": "接地之",
"the Dynamo": "发电机之",
"Stoicism": "坚忍之",
"Warming": "保温之",
"Thawing": "解冻之",
"the Dunes": "沙丘之",
"the Sirocco": "热风之",
"Desire": "渴望之",
"Razors": "剃刀之",
"Swords": "剑刃之",
"Malice": "恶意之",
"the Mind": "心灵之",
"Telekinesis": "心灵传动之",
"Teleportation": "传送之",
"Teleport Shield": "传送护盾之",
"Inner Sight": "内视之",
"Slow Missiles": "慢速箭之",
"Damage Amplification": "伤害加深之",
"Amplify Damage": "伤害加深之",
"Weaken": "削弱之",
"Dim Vision": "微暗灵视之",
"Iron Maiden": "攻击反噬之",
"Terror": "恐惧之",
"Confusion": "迷乱之",
"Life Tap": "偷取生命之",
"Attraction": "吸引之",
"Decrepification": "衰老之",
"Lower Resistance": "降低抗性之",
"Taunting": "嘲弄之",
"Howling": "狂嚎之",
"Shouting": "大叫之",
"Battle Cry": "刺耳尖叫之",
"Battle Orders": "战斗体制之",
"Battle Command": "战斗指挥之",
"War Cry": "战鸣之",
"Stunning": "击晕之",
"Concentration": "专注之",
"Grim Ward": "残骸清理之",
"Item Finding": "寻找物品之",
"Potion Finding": "寻找药剂之",
"Holy Bolts": "圣光弹之",
"Blessed Hammers": "祝福之槌之",
"Conversion": "转化之",
"Sacrifice": "牺牲之",
"Zeal": "热诚之",
"Vengeance": "复仇之",
"Fist of the Heavens": "天堂之拳之",
"Static Field": "静电场之",
"Nova": "新星之",
"Novas": "新星之",
"Nova Shield": "新星护盾之",
"Frost Novas": "冰霜新星之",
"Frost Shield": "冰霜护盾之",
"Ice Blast": "冰风暴之",
"Ice Blasts": "冰风暴之",
"Icebolt": "冰弹之",
"Ice Bolts": "冰弹之",
"Glacial Spike": "冰尖柱之",
"Glacial Spikes": "冰尖柱之",
"Blizzard": "暴风雪之",
"Blizzards": "暴风雪之",
"Frozen Orb": "冰封球之",
"Frozen Orbs": "冰封球之",
"Frozen Armor": "冰封甲之",
"Shiver Armor": "碎冰甲之",
"Chilling Armor": "寒冰甲之",
"Charged Bolts": "充能弹之",
"Charged Shield": "充能护盾之",
"Charged Strike": "充能一击之",
"Lightning Strike": "雷电一击之",
"Lightning Javelin": "闪电标枪之",
"Lightning Fury": "闪电之怒之",
"Chain Lightning": "连锁闪电之",
"Thunder Storm": "雷暴之",
"Energy Shield": "能量护盾之",
"Hydras": "九头海蛇之",
"Hydra Shield": "九头蛇护盾之",
"Firebolt": "火弹之",
"Firebolts": "火弹之",
"Fire Bolts": "火弹之",
"Fire Ball": "火球之",
"Fire Balls": "火球之",
"Fire Wall": "火墙之",
"Fire Walls": "火墙之",
"Enchant": "强化之",
"Enchantment": "强化之",
"Meteor": "陨石之",
"Meteors": "陨石之",
"Blaze": "炽烈之径之",
"Blazing": "炽烈之径之",
"Firestorms": "火风暴之",
"Molten Boulders": "熔岩巨石之",
"Eruption": "火山喷发之",
"Cyclone Armor": "飓风装甲之",
"Twister": "龙卷风之",
"Volcano": "火山之",
"Tornado": "暴风之",
"Armageddon": "末日风暴之",
"Hurricane": "飓风之",
"Teeth": "牙之",
"Bone Armor": "白骨装甲之",
"Poison Dagger": "毒匕首之",
"Corpse Explosions": "尸体爆炸之",
"Bone Walls": "骨墙之",
"Poison Explosion": "毒爆之",
"Bone Spears": "骨矛之",
"Bone Imprisonment": "骨牢之",
"Poison Novas": "剧毒新星之",
"Bone Spirits": "白骨之魂之",
"Clay Golem Summoning": "黏土魔像之",
"Blood Golem Summoning": "鲜血魔像之",
"Iron Golem Creation": "钢铁魔像之",
"Fire Golem Summoning": "火焰魔像之",
"Raise Skeletons": "复生骷髅之",
"Raise Skeletal Mages": "骷髅法师之",
"Magic Arrows": "魔法箭之",
"Fire Arrows": "火箭之",
"Cold Arrows": "冰箭之",
"Multiple Shot": "多重箭之",
"Exploding Arrows": "爆裂箭之",
"Ice Arrows": "冻结箭之",
"Guided Arrows": "追踪箭之",
"Immolating Arrows": "牺牲之箭之",
"Freezing Arrows": "急冻箭之",
"Power Strike": "威力一击之",
"Poison Jab": "毒枪之",
"Jabbing": "戳刺之",
"Impaling Strike": "刺爆之",
"Fending": "击退之",
"Plague Jab": "瘟疫标枪之"
}
// Build full suffix map
const suffixMap: Record<string, string> = {}
for (const [k, v] of Object.entries(suffixBaseMap)) {
suffixMap['of ' + k] = v
suffixMap[k] = v
}
// Validation
const missingPre = prefixes.filter(p => !prefixMap[p])
const missingSuf = suffixes.filter(s => !suffixMap[s] && !suffixMap['of ' + s])
console.log('Validating coverage...')
console.log('Prefix coverage: ' + (prefixes.length - missingPre.length) + ' / ' + prefixes.length)
if (missingPre.length > 0) console.log('Missing prefixes:', missingPre)
console.log('Suffix coverage: ' + (suffixes.length - missingSuf.length) + ' / ' + suffixes.length)
if (missingSuf.length > 0) console.log('Missing suffixes:', missingSuf)
if (missingPre.length === 0 && missingSuf.length === 0) {
console.log('SUCCESS! 100% Affix Coverage achieved for all 252 prefixes and 288 suffixes.')
}