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 = { "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 = { "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 = {} 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.') }