diablo2-web/src/common/units/class-starter-profiles.ts

1676 lines
56 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Diablo II v1.13c 7-Class Starter Profiles, Exclusive Signature Sets, and Stash Treasures.
*
* Implements Issue #379 specifications:
* - 7 Classes: Amazon (ama), Sorceress (sor), Necromancer (nec), Paladin (pal), Barbarian (bar), Druid (dru), Assassin (ass)
* - Exclusive Set on Body ONLY:
* - Amazon: M'avina's Battle Hymn (Diadem, Kraken Shell, Grand Matron Bow, Battle Gauntlets, Sharkskin Belt)
* - Sorceress: Tal Rasha's Wrappings (Death Mask, Lacquered Plate, Swirling Crystal, Mesh Belt, Amulet)
* - Necromancer: Trang-Oul's Avatar (Bone Visage, Chaos Armor, Cantor Trophy, Heavy Bracers, Troll Belt)
* - Paladin: Griswold's Legacy (Corona, Ornate Plate, Caduceus, Vortex Shield)
* - Barbarian: Immortal King (Avenger Guard, Sacred Armor, Ogre Maul, War Gauntlets, War Belt, War Boots)
* - Druid: Aldur's Watchtower (Hunter's Guise, Shadow Plate, Jagged Star, Battle Boots)
* - Assassin: Natalya's Odium (Grim Helm, Loricated Mail, Scissors Suwayyah, Mesh Boots)
* - Stash contains authentic Runes (Jah, Ber, Lo, etc.), Perfect & Flawless Gems/Skulls, and unique/magic/rare Jewels.
*/
import type { CharacterClassCode } from './classes.ts'
import type { EquipSlotId, GridPlacement, UiInventoryItem } from '../items/inventory-model.ts'
import type { CharacterAttributes } from './unit-types.ts'
import { getSocketableInfo } from '../items/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' },
]
}
// -------------------------------------------------------------------------------------------------
// 1. CLASS EXCLUSIVE SET ITEMS (Body Only)
// -------------------------------------------------------------------------------------------------
const MAVINA_PIECES: readonly string[] = [
"马维娜的真实之眼 (M'avina's True Sight)",
"马维娜的拥抱 (M'avina's Embrace)",
"马维娜的施展 (M'avina's Caster)",
"马维娜的冰冷之握 (M'avina's Icy Clutch)",
"马维娜的原则 (M'avina's Tenet)",
]
const MAVINA_BONUSES = [
{ text: '+3 亚马逊技能等级 (完整套装)', color: 'green' as const },
{ text: '+100 防御 (完整套装)', color: 'green' as const },
{ text: '+100 攻击准确率 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
{ text: '100% 更佳机会取得魔法装备 (完整套装)', color: 'green' as const },
]
const TAL_PIECES: readonly string[] = [
"塔·拉夏的守护 (Tal Rasha's Guardianship)",
"塔·拉夏的赫拉迪克纹章 (Tal Rasha's Horadric Crest)",
"塔·拉夏的判决 (Tal Rasha's Adjudication)",
"塔·拉夏的无睑之眼 (Tal Rasha's Lidless Eye)",
"塔·拉夏的织细衣服 (Tal Rasha's Fine-Spun Cloth)",
]
const TAL_BONUSES = [
{ text: '+3 法师技能等级 (完整套装)', color: 'green' as const },
{ text: '+150 防御 (完整套装)', color: 'green' as const },
{ text: '+50 对远距离攻击的防御 (完整套装)', color: 'green' as const },
{ text: '+150 生命 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
]
const TRANG_PIECES: readonly string[] = [
"塔格奥之容 (Trang-Oul's Guise)",
"塔格奥之鳞 (Trang-Oul's Scales)",
"塔格奥之翼 (Trang-Oul's Wing)",
"塔格奥之爪 (Trang-Oul's Claws)",
"塔格奥之束带 (Trang-Oul's Girth)",
]
const TRANG_BONUSES = [
{ text: '+3 死灵法师技能等级 (完整套装)', color: 'green' as const },
{ text: '+200 防御 (完整套装)', color: 'green' as const },
{ text: '+100 法力 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
{ text: '化身为吸血鬼巫妖形态 (完整套装)', 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[] = [
"格里斯瓦德的勇气 (Griswold's Valor)",
"格里斯瓦德之心 (Griswold's Heart)",
"格里斯瓦德的救赎 (Griswold's Redemption)",
"格里斯瓦德的荣耀 (Griswold's Honor)",
]
const GRIS_BONUSES = [
{ text: '+3 圣骑士技能等级 (完整套装)', color: 'green' as const },
{ text: '+200 攻击准确率 (完整套装)', color: 'green' as const },
{ text: '+150 生命 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
{ text: '+30% 快速再度攻击 (完整套装)', color: 'green' as const },
]
const IK_PIECES: readonly string[] = [
"不朽之王的意志 (Immortal King's Will)",
"不朽之王的灵魂牢笼 (Immortal King's Soul Cage)",
"不朽之王的点魂碎石者 (Immortal King's Stone Crusher)",
"不朽之王的熔炉 (Immortal King's Forge)",
"不朽之王的心腹 (Immortal King's Detail)",
"不朽之王之柱 (Immortal King's Pillar)",
]
const IK_BONUSES = [
{ text: '+3 野蛮人技能等级 (完整套装)', color: 'green' as const },
{ text: '+450 攻击准确率 (完整套装)', color: 'green' as const },
{ text: '+150 生命 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
{ text: '魔法伤害减少 10 (完整套装)', color: 'green' as const },
]
const ALDUR_PIECES: readonly string[] = [
"艾尔多的冷酷目光 (Aldur's Stony Gaze)",
"艾尔多的欺瞒 (Aldur's Deception)",
"艾尔多的律动 (Aldur's Rhythm)",
"艾尔多的成长 (Aldur's Advance)",
]
const ALDUR_BONUSES = [
{ text: '+3 德鲁伊技能等级 (完整套装)', color: 'green' as const },
{ text: '+150% 额外攻击准确率 (完整套装)', color: 'green' as const },
{ text: '+150 防御 (完整套装)', color: 'green' as const },
{ text: '+150 法力 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
]
const NAT_PIECES: readonly string[] = [
"娜塔亚的图腾 (Natalya's Totem)",
"娜塔亚的影子 (Natalya's Shadow)",
"娜塔亚的印记 (Natalya's Mark)",
"娜塔亚的灵魂 (Natalya's Soul)",
]
const NAT_BONUSES = [
{ text: '+3 刺客技能等级 (完整套装)', color: 'green' as const },
{ text: '+200 防御 (完整套装)', color: 'green' as const },
{ text: '所有抗性 +50 (完整套装)', color: 'green' as const },
{ text: '物理伤害减少 30% (完整套装)', color: 'green' as const },
{ text: '14% 每次命中偷取生命 (完整套装)', color: 'green' as const },
{ text: '14% 每次命中偷取法力 (完整套装)', color: 'green' as const },
]
export const CLASS_EXCLUSIVE_SETS: Record<CharacterClassCode, Readonly<Partial<Record<EquipSlotId, UiInventoryItem>>>> = {
ama: {
helm: {
id: 'set-mavina-helm',
code: 'ci3',
invFile: 'invci3',
invtransform: 'whit',
name: "M'avina's True Sight",
nameZh: "马维娜的真实之眼 (M'avina's True Sight)",
baseNameZh: '权冠 (Diadem)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 210,
durability: { current: 20, max: 20 },
reqLevel: 64,
stats: [
{ text: '+150 防御', color: 'blue' },
{ text: '+30% 快速再度攻击 (FHR)', color: 'blue' },
{ text: '法力回复速度提高 10%', color: 'blue' },
{ text: '+25 法力', color: 'blue' },
{ text: '+1 所有技能 (完整套装加成)', color: 'green' },
{ text: '+50% 额外攻击准确率 (完整套装加成)', color: 'green' },
{ text: '所有抗性 +25 (完整套装加成)', color: 'green' },
],
setPieces: MAVINA_PIECES,
setBonuses: MAVINA_BONUSES,
},
armor: {
id: 'set-mavina-armor',
code: 'uld',
invFile: 'invfld',
invtransform: 'whit',
name: "M'avina's Embrace",
nameZh: "马维娜的拥抱 (M'avina's Embrace)",
baseNameZh: '海妖壳甲 (Kraken Shell)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 1220,
durability: { current: 48, max: 48 },
reqLevel: 70,
reqStr: 122,
stats: [
{ text: '+350 防御', color: 'blue' },
{ text: '+2 亚马逊被动与魔法技能', color: 'blue' },
{ text: '需求 -30%', color: 'blue' },
{ text: '魔法伤害减少 12', color: 'blue' },
{ text: '+30% 快速再度攻击 (完整套装加成)', color: 'green' },
],
setPieces: MAVINA_PIECES,
setBonuses: MAVINA_BONUSES,
},
weapon1: {
id: 'set-mavina-bow',
code: 'amc',
invFile: 'invam2',
invtransform: 'whit',
name: "M'avina's Caster",
nameZh: "马维娜的施展 (M'avina's Caster)",
baseNameZh: '大院长的弓 (Grand Matron Bow)',
quality: 'set',
invWidth: 2,
invHeight: 4,
allowedSlots: ['weapon1'],
damage: '40 - 207',
speedText: '弓类 - 极快攻击速度 [40]',
reqLevel: 70,
reqStr: 108,
stats: [
{ text: '+188% 增强伤害 (ED)', color: 'blue' },
{ text: '+40% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '发射魔法箭 (等级 1)', color: 'blue' },
{ text: '+50 攻击准确率', color: 'blue' },
{ text: '增加 114-377 魔法伤害 (完整套装加成)', color: 'green' },
{ text: '+2 亚马逊弓与十字弓技能 (完整套装加成)', color: 'green' },
],
setPieces: MAVINA_PIECES,
setBonuses: MAVINA_BONUSES,
},
gloves: {
id: 'set-mavina-gloves',
code: 'xtg',
invFile: 'invtgl',
invtransform: 'whit',
name: "M'avina's Icy Clutch",
nameZh: "马维娜的冰冷之握 (M'avina's Icy Clutch)",
baseNameZh: '战场手套 (Battle Gauntlets)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['gloves'],
defense: 98,
durability: { current: 18, max: 18 },
reqLevel: 32,
reqStr: 88,
stats: [
{ text: '+50 防御', color: 'blue' },
{ text: '+10 力量', color: 'blue' },
{ text: '+15 敏捷', color: 'blue' },
{ text: '增加 6-18 冰冷伤害 (持续 4 秒)', color: 'blue' },
{ text: '冻结目标时间减半', color: 'blue' },
{ text: '增加 131-252 冰冷伤害 (完整套装加成)', color: 'green' },
{ text: '+20% 冰冷技能伤害 (完整套装加成)', color: 'green' },
],
setPieces: MAVINA_PIECES,
setBonuses: MAVINA_BONUSES,
},
belt: {
id: 'set-mavina-belt',
code: 'zvb',
invFile: 'invvbl',
invtransform: 'whit',
name: "M'avina's Tenet",
nameZh: "马维娜的原则 (M'avina's Tenet)",
baseNameZh: '鲨皮腰带 (Sharkskin Belt)',
quality: 'set',
invWidth: 2,
invHeight: 1,
allowedSlots: ['belt'],
defense: 86,
durability: { current: 14, max: 14 },
reqLevel: 45,
reqStr: 20,
stats: [
{ text: '+50 防御', color: 'blue' },
{ text: '+20% 高速跑步/行走 (FRW)', color: 'blue' },
{ text: '5% 每次命中偷取法力', color: 'blue' },
{ text: '+5 照亮范围', color: 'blue' },
{ text: '所有抗性 +25 (完整套装加成)', color: 'green' },
],
setPieces: MAVINA_PIECES,
setBonuses: MAVINA_BONUSES,
},
},
sor: {
helm: {
id: 'set-tal-helm',
code: 'xsk',
invFile: 'invmsk',
invtransform: 'dpur',
chrtransform: 'dpur',
name: "Tal Rasha's Horadric Crest",
nameZh: "塔·拉夏的赫拉迪克纹章 (Tal Rasha's Horadric Crest)",
baseNameZh: '死亡面具 (Death Mask)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 131,
durability: { current: 20, max: 20 },
reqLevel: 66,
reqStr: 55,
stats: [
{ text: '+45 防御', color: 'blue' },
{ text: '10% 每次命中偷取生命', color: 'blue' },
{ text: '10% 每次命中偷取法力', color: 'blue' },
{ text: '+60 生命', color: 'blue' },
{ text: '+30 法力', color: 'blue' },
{ text: '所有抗性 +15', color: 'blue' },
],
setPieces: TAL_PIECES,
setBonuses: TAL_BONUSES,
},
armor: {
id: 'set-tal-armor',
code: 'uth',
invFile: 'invgth',
invtransform: 'dpur',
chrtransform: 'dpur',
name: "Tal Rasha's Guardianship",
nameZh: "塔·拉夏的守护 (Tal Rasha's Guardianship)",
baseNameZh: '漆甲 (Lacquered Plate)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 941,
durability: { current: 55, max: 55 },
reqLevel: 71,
reqStr: 84,
stats: [
{ text: '+400 防御', color: 'blue' },
{ text: '抗寒 +40%', color: 'blue' },
{ text: '抗电 +40%', color: 'blue' },
{ text: '抗火 +40%', color: 'blue' },
{ text: '魔法伤害减少 15', color: 'blue' },
{ text: '88% 更佳机会取得魔法装备', color: 'blue' },
],
setPieces: TAL_PIECES,
setBonuses: TAL_BONUSES,
},
weapon1: {
id: 'set-tal-orb',
code: 'oba',
invFile: 'invob5',
invtransform: 'dpur',
chrtransform: 'dpur',
name: "Tal Rasha's Lidless Eye",
nameZh: "塔·拉夏的无睑之眼 (Tal Rasha's Lidless Eye)",
baseNameZh: '涡流水晶 (Swirling Crystal)',
quality: 'set',
invWidth: 1,
invHeight: 3,
allowedSlots: ['weapon1'],
damage: '18 - 42',
durability: { current: 50, max: 50 },
speedText: '法球类 - 普通攻击速度',
reqLevel: 65,
stats: [
{ text: '+20% 快速施法速度 (FCR)', color: 'blue' },
{ text: '+2 支配火焰 (限法师)', color: 'blue' },
{ text: '+2 支配闪电 (限法师)', color: 'blue' },
{ text: '+2 支配冰冷 (限法师)', color: 'blue' },
{ text: '+57 生命', color: 'blue' },
{ text: '+77 法力', color: 'blue' },
{ text: '+10 精力', color: 'blue' },
],
setPieces: TAL_PIECES,
setBonuses: TAL_BONUSES,
},
belt: {
id: 'set-tal-belt',
code: 'zmb',
invFile: 'invmbl',
invtransform: 'dpur',
chrtransform: 'dpur',
name: "Tal Rasha's Fine-Spun Cloth",
nameZh: "塔·拉夏的织细衣服 (Tal Rasha's Fine-Spun Cloth)",
baseNameZh: '织网腰带 (Mesh Belt)',
quality: 'set',
invWidth: 2,
invHeight: 1,
allowedSlots: ['belt'],
defense: 40,
durability: { current: 16, max: 16 },
reqLevel: 53,
reqStr: 47,
stats: [
{ text: '+20 敏捷', color: 'blue' },
{ text: '+30 法力', color: 'blue' },
{ text: '受损生命转化为法力 37%', color: 'blue' },
{ text: '15% 更佳机会取得魔法装备', color: 'blue' },
{ text: '需求 -20%', color: 'blue' },
],
setPieces: TAL_PIECES,
setBonuses: TAL_BONUSES,
},
amulet: {
id: 'set-tal-amulet',
code: 'amu',
invFile: 'invamu',
invtransform: 'dpur',
chrtransform: 'dpur',
name: "Tal Rasha's Adjudication",
nameZh: "塔·拉夏的判决 (Tal Rasha's Adjudication)",
baseNameZh: '项链 (Amulet)',
quality: 'set',
invWidth: 1,
invHeight: 1,
allowedSlots: ['amulet'],
reqLevel: 67,
stats: [
{ text: '+2 法师技能等级', color: 'blue' },
{ text: '增加 3-32 闪电伤害', color: 'blue' },
{ text: '+50 生命', color: 'blue' },
{ text: '+42 法力', color: 'blue' },
{ text: '抗电 +33%', color: 'blue' },
],
setPieces: TAL_PIECES,
setBonuses: TAL_BONUSES,
},
},
nec: {
helm: {
id: 'set-trang-helm',
code: 'uh9',
invFile: 'invbhmu',
invtransform: 'dgld',
name: "Trang-Oul's Guise",
nameZh: "塔格奥之容 (Trang-Oul's Guise)",
baseNameZh: '骸骨面罩 (Bone Visage)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 257,
durability: { current: 40, max: 40 },
reqLevel: 65,
reqStr: 106,
stats: [
{ text: '+100 防御', color: 'blue' },
{ text: '+25% 快速再度攻击 (FHR)', color: 'blue' },
{ text: '+150 法力', color: 'blue' },
{ text: '生命回复 +5', color: 'blue' },
{ text: '攻击者受到伤害 20', color: 'blue' },
],
setPieces: TRANG_PIECES,
setBonuses: TRANG_BONUSES,
},
armor: {
id: 'set-trang-armor',
code: 'xul',
invFile: 'invful',
invtransform: 'dyel',
name: "Trang-Oul's Scales",
nameZh: "塔格奥之鳞 (Trang-Oul's Scales)",
baseNameZh: '混沌战甲 (Chaos Armor)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 857,
durability: { current: 70, max: 70 },
reqLevel: 49,
reqStr: 84,
stats: [
{ text: '+150% 增强防御', color: 'blue' },
{ text: '+40% 高速跑步/行走 (FRW)', color: 'blue' },
{ text: '+2 召唤技能 (限死灵法师)', color: 'blue' },
{ text: '+100 对远距离攻击的防御', color: 'blue' },
{ text: '需求 -40%', color: 'blue' },
{ text: '抗毒 +40%', color: 'blue' },
],
setPieces: TRANG_PIECES,
setBonuses: TRANG_BONUSES,
},
weapon2: {
id: 'set-trang-shield',
code: 'ne9',
invFile: 'invne4',
invtransform: 'dyel',
name: "Trang-Oul's Wing",
nameZh: "塔格奥之翼 (Trang-Oul's Wing)",
baseNameZh: '领唱者印记 (Cantor Trophy)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['weapon2'],
defense: 189,
durability: { current: 20, max: 20 },
reqLevel: 54,
reqStr: 50,
stats: [
{ text: '+125 防御', color: 'blue' },
{ text: '+30% 增加格挡几率', color: 'blue' },
{ text: '+2 毒素与白骨技能 (限死灵法师)', color: 'blue' },
{ text: '+25 力量', color: 'blue' },
{ text: '+15 敏捷', color: 'blue' },
{ text: '抗火 +45%', color: 'blue' },
{ text: '抗毒 +40%', color: 'blue' },
],
setPieces: TRANG_PIECES,
setBonuses: TRANG_BONUSES,
},
gloves: {
id: 'set-trang-gloves',
code: 'xmg',
invFile: 'invmgl',
invtransform: 'dyel',
name: "Trang-Oul's Claws",
nameZh: "塔格奥之爪 (Trang-Oul's Claws)",
baseNameZh: '重型手镯 (Heavy Bracers)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['gloves'],
defense: 74,
durability: { current: 16, max: 16 },
reqLevel: 45,
reqStr: 58,
stats: [
{ text: '+20% 快速施法速度 (FCR)', color: 'blue' },
{ text: '+25% 毒素技能伤害', color: 'blue' },
{ text: '+30 防御', color: 'blue' },
{ text: '抗寒 +30%', color: 'blue' },
{ text: '+2 诅咒技能 (限死灵法师)', color: 'blue' },
],
setPieces: TRANG_PIECES,
setBonuses: TRANG_BONUSES,
},
belt: {
id: 'set-trang-belt',
code: 'utc',
invFile: 'invtbl',
invtransform: 'dyel',
name: "Trang-Oul's Girth",
nameZh: "塔格奥之束带 (Trang-Oul's Girth)",
baseNameZh: '巨魔腰带 (Troll Belt)',
quality: 'set',
invWidth: 2,
invHeight: 1,
allowedSlots: ['belt'],
defense: 166,
durability: { current: 18, max: 18 },
reqLevel: 62,
reqStr: 91,
stats: [
{ text: '+100 防御', color: 'blue' },
{ text: '无法冰冻', color: 'blue' },
{ text: '需求 -40%', color: 'blue' },
{ text: '+66 生命', color: 'blue' },
{ text: '+50 法力', color: 'blue' },
{ text: '+30 最大耐力', color: 'blue' },
{ text: '生命回复 +5', color: 'blue' },
],
setPieces: TRANG_PIECES,
setBonuses: TRANG_BONUSES,
},
},
pal: {
helm: {
id: 'set-gris-helm',
code: 'urn',
invFile: 'invcrn',
invtransform: 'dgld',
name: "Griswold's Valor",
nameZh: "格里斯瓦德的勇气 (Griswold's Valor)",
baseNameZh: '头冠 (Corona)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 290,
durability: { current: 50, max: 50 },
reqLevel: 69,
reqStr: 105,
sockets: 2,
stats: [
{ text: '+75% 增强防御', color: 'blue' },
{ text: '所有抗性 +5', color: 'blue' },
{ text: '30% 更佳机会取得魔法装备', color: 'blue' },
{ text: '需求 -40%', color: 'blue' },
{ text: '带插槽 (2)', color: 'blue' },
],
setPieces: GRIS_PIECES,
setBonuses: GRIS_BONUSES,
},
armor: {
id: 'set-gris-armor',
code: 'xar',
invFile: 'invxaru',
invtransform: 'dgld',
name: "Griswold's Heart",
nameZh: "格里斯瓦德之心 (Griswold's Heart)",
baseNameZh: '华丽战甲 (Ornate Plate)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 950,
durability: { current: 60, max: 60 },
reqLevel: 45,
reqStr: 102,
sockets: 3,
stats: [
{ text: '+500 防御', color: 'blue' },
{ text: '+2 防御灵气 (限圣骑士)', color: 'blue' },
{ text: '+20 力量', color: 'blue' },
{ text: '需求 -40%', color: 'blue' },
{ text: '带插槽 (3)', color: 'blue' },
],
setPieces: GRIS_PIECES,
setBonuses: GRIS_BONUSES,
},
weapon1: {
id: 'set-gris-scepter',
code: '7ws',
invFile: 'invwsp',
invtransform: 'dgld',
name: "Griswold's Redemption",
nameZh: "格里斯瓦德的救赎 (Griswold's Redemption)",
baseNameZh: '神使之杖 (Caduceus)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['weapon1'],
damage: '125 - 162',
durability: { current: 70, max: 70 },
speedText: '权杖类 - 极快攻击速度 [40]',
reqLevel: 66,
reqStr: 78,
stats: [
{ text: '+240% 增强伤害 (ED)', color: 'blue' },
{ text: '+40% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '+200% 对不死生物的伤害', color: 'blue' },
{ text: '需求 -20%', color: 'blue' },
{ text: '带插槽 (4)', color: 'blue' },
],
setPieces: GRIS_PIECES,
setBonuses: GRIS_BONUSES,
},
weapon2: {
id: 'set-gris-shield',
code: 'paf',
invFile: 'invpa5',
invtransform: 'dgld',
name: "Griswold's Honor",
nameZh: "格里斯瓦德的荣耀 (Griswold's Honor)",
baseNameZh: '旋风盾 (Vortex Shield)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['weapon2'],
defense: 333,
durability: { current: 90, max: 90 },
reqLevel: 68,
reqStr: 148,
sockets: 3,
stats: [
{ text: '+108 防御', color: 'blue' },
{ text: '+65% 快速格挡率', color: 'blue' },
{ text: '+20% 增加格挡几率', color: 'blue' },
{ text: '所有抗性 +45', color: 'blue' },
{ text: '带插槽 (3)', color: 'blue' },
],
setPieces: GRIS_PIECES,
setBonuses: GRIS_BONUSES,
},
},
bar: {
helm: {
id: 'set-ik-helm',
code: 'ba5',
invFile: 'invba5',
invtransform: 'lgry',
name: "Immortal King's Will",
nameZh: "不朽之王的意志 (Immortal King's Will)",
baseNameZh: '复仇者之盔 (Avenger Guard)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 175,
durability: { current: 55, max: 55 },
reqLevel: 47,
reqStr: 65,
sockets: 2,
stats: [
{ text: '+2 战吼技能 (限野蛮人)', color: 'blue' },
{ text: '+4 生命补给', color: 'blue' },
{ text: '40% 更佳机会取得魔法装备', color: 'blue' },
{ text: '带插槽 (2)', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
armor: {
id: 'set-ik-armor',
code: 'uar',
invFile: 'invaaru',
invtransform: 'lgry',
name: "Immortal King's Soul Cage",
nameZh: "不朽之王的灵魂牢笼 (Immortal King's Soul Cage)",
baseNameZh: '神圣盔甲 (Sacred Armor)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 1001,
durability: { current: 60, max: 60 },
reqLevel: 76,
reqStr: 232,
stats: [
{ text: '+400 防御', color: 'blue' },
{ text: '+2 战斗技能 (限野蛮人)', color: 'blue' },
{ text: '抗毒 +50%', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
weapon1: {
id: 'set-ik-maul',
code: '7m7',
invFile: 'invmau',
invtransform: 'lgry',
name: "Immortal King's Stone Crusher",
nameZh: "不朽之王的点魂碎石者 (Immortal King's Stone Crusher)",
baseNameZh: '食人魔之槌 (Ogre Maul)',
quality: 'set',
invWidth: 2,
invHeight: 4,
allowedSlots: ['weapon1'],
damage: '231 - 318',
durability: { current: 60, max: 60 },
speedText: '锤类 - 极快攻击速度 [40]',
reqLevel: 76,
reqStr: 225,
sockets: 2,
stats: [
{ text: '+200% 增强伤害 (ED)', color: 'blue' },
{ text: '+40% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '40% 压碎性打击 (CB)', color: 'blue' },
{ text: '永不磨损 (Indestructible)', color: 'blue' },
{ text: '带插槽 (2)', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
gloves: {
id: 'set-ik-gloves',
code: 'xhg',
invFile: 'invhgl',
invtransform: 'lgry',
name: "Immortal King's Forge",
nameZh: "不朽之王的熔炉 (Immortal King's Forge)",
baseNameZh: '战场手套 (War Gauntlets)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['gloves'],
defense: 118,
durability: { current: 24, max: 24 },
reqLevel: 30,
reqStr: 110,
stats: [
{ text: '+65 防御', color: 'blue' },
{ text: '+20 力量', color: 'blue' },
{ text: '+20 敏捷', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
belt: {
id: 'set-ik-belt',
code: 'zhb',
invFile: 'invhbl',
invtransform: 'lgry',
name: "Immortal King's Detail",
nameZh: "不朽之王的心腹 (Immortal King's Detail)",
baseNameZh: '战场腰带 (War Belt)',
quality: 'set',
invWidth: 2,
invHeight: 1,
allowedSlots: ['belt'],
defense: 89,
durability: { current: 24, max: 24 },
reqLevel: 29,
reqStr: 110,
stats: [
{ text: '+36 防御', color: 'blue' },
{ text: '+25 力量', color: 'blue' },
{ text: '抗火 +28%', color: 'blue' },
{ text: '抗电 +31%', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
boots: {
id: 'set-ik-boots',
code: 'xhb',
invFile: 'invhbt',
invtransform: 'lgry',
name: "Immortal King's Pillar",
nameZh: "不朽之王之柱 (Immortal King's Pillar)",
baseNameZh: '战场之靴 (War Boots)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['boots'],
defense: 128,
durability: { current: 24, max: 24 },
reqLevel: 31,
reqStr: 125,
stats: [
{ text: '+75 防御', color: 'blue' },
{ text: '+40% 高速跑步/行走 (FRW)', color: 'blue' },
{ text: '+110 攻击准确率', color: 'blue' },
{ text: '+44 生命', color: 'blue' },
],
setPieces: IK_PIECES,
setBonuses: IK_BONUSES,
},
},
dru: {
helm: {
id: 'set-aldur-helm',
code: 'dr8',
invFile: 'invdr3',
invtransform: 'oran',
name: "Aldur's Stony Gaze",
nameZh: "艾尔多的冷酷目光 (Aldur's Stony Gaze)",
baseNameZh: "猎人之容 (Hunter's Guise)",
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 171,
durability: { current: 20, max: 20 },
reqLevel: 36,
reqStr: 56,
sockets: 2,
stats: [
{ text: '+90 防御', color: 'blue' },
{ text: '+25% 快速再度攻击 (FHR)', color: 'blue' },
{ text: '抗寒 +50%', color: 'blue' },
{ text: '法力回复速度提高 17%', color: 'blue' },
{ text: '带插槽 (2)', color: 'blue' },
],
setPieces: ALDUR_PIECES,
setBonuses: ALDUR_BONUSES,
},
armor: {
id: 'set-aldur-armor',
code: 'uul',
invFile: 'invful',
invtransform: 'oran',
name: "Aldur's Deception",
nameZh: "艾尔多的欺瞒 (Aldur's Deception)",
baseNameZh: '阴影铠甲 (Shadow Plate)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 850,
durability: { current: 70, max: 70 },
reqLevel: 76,
reqStr: 115,
stats: [
{ text: '+300 防御', color: 'blue' },
{ text: '+1 元素技能 (限德鲁伊)', color: 'blue' },
{ text: '+1 变形技能 (限德鲁伊)', color: 'blue' },
{ text: '+20 力量', color: 'blue' },
{ text: '+15 敏捷', color: 'blue' },
{ text: '抗电 +50%', color: 'blue' },
{ text: '需求 -50%', color: 'blue' },
],
setPieces: ALDUR_PIECES,
setBonuses: ALDUR_BONUSES,
},
weapon1: {
id: 'set-aldur-mace',
code: '9mt',
invFile: 'invmstu',
invtransform: 'oran',
name: "Aldur's Rhythm",
nameZh: "艾尔多的律动 (Aldur's Rhythm)",
baseNameZh: '锯齿流星锤 (Jagged Star)',
quality: 'set',
invWidth: 1,
invHeight: 3,
allowedSlots: ['weapon1'],
damage: '60 - 93',
durability: { current: 72, max: 72 },
speedText: '钉头槌类 - 极快攻击速度 [30]',
reqLevel: 42,
reqStr: 74,
sockets: 3,
stats: [
{ text: '+200% 增强伤害 (ED)', color: 'blue' },
{ text: '+30% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '10% 每次命中偷取生命', color: 'blue' },
{ text: '5% 每次命中偷取法力', color: 'blue' },
{ text: '增加 40-62 闪电伤害', color: 'blue' },
{ text: '带插槽 (3)', color: 'blue' },
],
setPieces: ALDUR_PIECES,
setBonuses: ALDUR_BONUSES,
},
boots: {
id: 'set-aldur-boots',
code: 'xtb',
invFile: 'invtbt',
invtransform: 'oran',
name: "Aldur's Advance",
nameZh: "艾尔多的成长 (Aldur's Advance)",
baseNameZh: '战场之靴 (Battle Boots)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['boots'],
defense: 47,
durability: { current: 48, max: 48 },
reqLevel: 45,
reqStr: 95,
stats: [
{ text: '+40% 高速跑步/行走 (FRW)', color: 'blue' },
{ text: '+50 生命', color: 'blue' },
{ text: '+180 最大耐力', color: 'blue' },
{ text: '抗火 +50%', color: 'blue' },
{ text: '受损生命转化为法力 10%', color: 'blue' },
],
setPieces: ALDUR_PIECES,
setBonuses: ALDUR_BONUSES,
},
},
ass: {
helm: {
id: 'set-nat-helm',
code: 'xh9',
invFile: 'invbhmu',
invtransform: 'dgry',
name: "Natalya's Totem",
nameZh: "娜塔亚的图腾 (Natalya's Totem)",
baseNameZh: '残酷头盔 (Grim Helm)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['helm'],
defense: 300,
durability: { current: 40, max: 40 },
reqLevel: 59,
reqStr: 58,
stats: [
{ text: '+175 防御', color: 'blue' },
{ text: '所有抗性 +20', color: 'blue' },
{ text: '+20 力量', color: 'blue' },
{ text: '+30 敏捷', color: 'blue' },
{ text: '魔法伤害减少 3', color: 'blue' },
],
setPieces: NAT_PIECES,
setBonuses: NAT_BONUSES,
},
armor: {
id: 'set-nat-armor',
code: 'ucl',
invFile: 'invscl',
invtransform: 'dgry',
name: "Natalya's Shadow",
nameZh: "娜塔亚的影子 (Natalya's Shadow)",
baseNameZh: '罗格战甲 (Loricated Mail)',
quality: 'set',
invWidth: 2,
invHeight: 3,
allowedSlots: ['armor'],
defense: 721,
durability: { current: 36, max: 36 },
reqLevel: 73,
reqStr: 149,
sockets: 3,
stats: [
{ text: '+225 防御', color: 'blue' },
{ text: '+2 影子训练技能 (限刺客)', color: 'blue' },
{ text: '抗毒 +25%', color: 'blue' },
{ text: '生命回复 +10', color: 'blue' },
{ text: '带插槽 (3)', color: 'blue' },
],
setPieces: NAT_PIECES,
setBonuses: NAT_BONUSES,
},
weapon1: {
id: 'set-nat-claw',
code: '7qr',
invFile: 'invskru',
invtransform: 'dgry',
name: "Natalya's Mark",
nameZh: "娜塔亚的印记 (Natalya's Mark)",
baseNameZh: '近身刃 (Scissors Suwayyah)',
quality: 'set',
invWidth: 1,
invHeight: 3,
allowedSlots: ['weapon1'],
damage: '153 - 170',
durability: { current: 68, max: 68 },
speedText: '爪类 - 极快攻击速度 [40]',
reqLevel: 79,
reqStr: 118,
stats: [
{ text: '+200% 增强伤害 (ED)', color: 'blue' },
{ text: '+40% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '增加 12-17 伤害', color: 'blue' },
{ text: '忽略目标防御', color: 'blue' },
{ text: '+200% 对恶魔的伤害', color: 'blue' },
{ text: '+200% 对不死生物的伤害', color: 'blue' },
{ text: '增加 50 冰冷伤害 (持续 4 秒)', color: 'blue' },
],
setPieces: NAT_PIECES,
setBonuses: NAT_BONUSES,
},
boots: {
id: 'set-nat-boots',
code: 'xmb',
invFile: 'invmbt',
invtransform: 'dgry',
name: "Natalya's Soul",
nameZh: "娜塔亚的灵魂 (Natalya's Soul)",
baseNameZh: '织网之靴 (Mesh Boots)',
quality: 'set',
invWidth: 2,
invHeight: 2,
allowedSlots: ['boots'],
defense: 169,
durability: { current: 16, max: 16 },
reqLevel: 25,
reqStr: 65,
stats: [
{ text: '+125 防御', color: 'blue' },
{ text: '+40% 高速跑步/行走 (FRW)', color: 'blue' },
{ text: '抗寒 +25%', color: 'blue' },
{ text: '抗电 +25%', color: 'blue' },
{ text: '生命回复 +10', color: 'blue' },
{ text: '受损生命转化为法力 10%', color: 'blue' },
],
setPieces: NAT_PIECES,
setBonuses: NAT_BONUSES,
},
},
}
// -------------------------------------------------------------------------------------------------
// 2. STASH ITEMS: JEWELS, GEMS, AND RUNES (6x8 grid)
// -------------------------------------------------------------------------------------------------
export const STARTER_STASH_ITEMS: readonly GridPlacement[] = [
// Row 0: High Runes (Jah, Ber, Lo, Ohm, Vex, Cham)
{
col: 0, row: 0,
item: {
id: 'stash-r-jah', code: 'r31', invFile: 'invrjo', name: 'Jah Rune', nameZh: '乔 (Jah 符文)', baseNameZh: '符文 (#31)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 65,
stats: buildSocketableStats('r31'),
},
},
{
col: 1, row: 0,
item: {
id: 'stash-r-ber', code: 'r30', invFile: 'invrber', name: 'Ber Rune', nameZh: '贝 (Ber 符文)', baseNameZh: '符文 (#30)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 63,
stats: buildSocketableStats('r30'),
},
},
{
col: 2, row: 0,
item: {
id: 'stash-r-lo', code: 'r28', invFile: 'invrlo', name: 'Lo Rune', nameZh: '罗 (Lo 符文)', baseNameZh: '符文 (#28)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 59,
stats: buildSocketableStats('r28'),
},
},
{
col: 3, row: 0,
item: {
id: 'stash-r-ohm', code: 'r27', invFile: 'invrohm', name: 'Ohm Rune', nameZh: '欧姆 (Ohm 符文)', baseNameZh: '符文 (#27)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 57,
stats: buildSocketableStats('r27'),
},
},
{
col: 4, row: 0,
item: {
id: 'stash-r-vex', code: 'r26', invFile: 'invrvex', name: 'Vex Rune', nameZh: '伐克斯 (Vex 符文)', baseNameZh: '符文 (#26)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 55,
stats: buildSocketableStats('r26'),
},
},
{
col: 5, row: 0,
item: {
id: 'stash-r-cham', code: 'r32', invFile: 'invrcham', name: 'Cham Rune', nameZh: '查姆 (Cham 符文)', baseNameZh: '符文 (#32)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 67,
stats: buildSocketableStats('r32'),
},
},
// Row 1: High & Mid Runes (Zod, Sur, Gul, Ist, Mal, Um)
{
col: 0, row: 1,
item: {
id: 'stash-r-zod', code: 'r33', invFile: 'invrzod', name: 'Zod Rune', nameZh: '佐德 (Zod 符文)', baseNameZh: '符文 (#33)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 69,
stats: buildSocketableStats('r33'),
},
},
{
col: 1, row: 1,
item: {
id: 'stash-r-sur', code: 'r29', invFile: 'invrsur', name: 'Sur Rune', nameZh: '苏尔 (Sur 符文)', baseNameZh: '符文 (#29)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 61,
stats: buildSocketableStats('r29'),
},
},
{
col: 2, row: 1,
item: {
id: 'stash-r-gul', code: 'r25', invFile: 'invrgul', name: 'Gul Rune', nameZh: '古尔 (Gul 符文)', baseNameZh: '符文 (#25)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 53,
stats: buildSocketableStats('r25'),
},
},
{
col: 3, row: 1,
item: {
id: 'stash-r-ist', code: 'r24', invFile: 'invrist', name: 'Ist Rune', nameZh: '伊斯特 (Ist 符文)', baseNameZh: '符文 (#24)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 51,
stats: buildSocketableStats('r24'),
},
},
{
col: 4, row: 1,
item: {
id: 'stash-r-mal', code: 'r23', invFile: 'invrmal', name: 'Mal Rune', nameZh: '马尔 (Mal 符文)', baseNameZh: '符文 (#23)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 49,
stats: buildSocketableStats('r23'),
},
},
{
col: 5, row: 1,
item: {
id: 'stash-r-um', code: 'r22', invFile: 'invrum', name: 'Um Rune', nameZh: '乌姆 (Um 符文)', baseNameZh: '符文 (#22)', quality: 'rune', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 47,
stats: buildSocketableStats('r22'),
},
},
// Row 2: Perfect Gems (Amethyst, Ruby, Sapphire, Topaz, Emerald, Diamond)
{
col: 0, row: 2,
item: {
id: 'stash-gem-p-ame', code: 'gpv', invFile: 'invgsve', name: 'Perfect Amethyst', nameZh: '完美紫宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpv'),
},
},
{
col: 1, row: 2,
item: {
id: 'stash-gem-p-ruby', code: 'gpr', invFile: 'invgsre', name: 'Perfect Ruby', nameZh: '完美红宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpr'),
},
},
{
col: 2, row: 2,
item: {
id: 'stash-gem-p-sap', code: 'gpb', invFile: 'invgsbe', name: 'Perfect Sapphire', nameZh: '完美蓝宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpb'),
},
},
{
col: 3, row: 2,
item: {
id: 'stash-gem-p-top', code: 'gpy', invFile: 'invgsye', name: 'Perfect Topaz', nameZh: '完美黄宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpy'),
},
},
{
col: 4, row: 2,
item: {
id: 'stash-gem-p-eme', code: 'gpg', invFile: 'invgsge', name: 'Perfect Emerald', nameZh: '完美绿宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpg'),
},
},
{
col: 5, row: 2,
item: {
id: 'stash-gem-p-dia', code: 'gpw', invFile: 'invgswe', name: 'Perfect Diamond', nameZh: '完美白宝石', baseNameZh: '完美宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 18,
stats: buildSocketableStats('gpw'),
},
},
// Row 3: Flawless Gems & Skulls
{
col: 0, row: 3,
item: {
id: 'stash-gem-fl-ame', code: 'gzv', invFile: 'invgsvd', name: 'Flawless Amethyst', nameZh: '无瑕紫宝石', baseNameZh: '宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('gzv'),
},
},
{
col: 1, row: 3,
item: {
id: 'stash-gem-fl-ruby', code: 'glr', invFile: 'invgsrd', name: 'Flawless Ruby', nameZh: '无瑕红宝石', baseNameZh: '宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('glr'),
},
},
{
col: 2, row: 3,
item: {
id: 'stash-gem-fl-sap', code: 'glb', invFile: 'invgsbd', name: 'Flawless Sapphire', nameZh: '无瑕蓝宝石', baseNameZh: '宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('glb'),
},
},
{
col: 3, row: 3,
item: {
id: 'stash-gem-fl-top', code: 'gly', invFile: 'invgsyd', name: 'Flawless Topaz', nameZh: '无瑕黄宝石', baseNameZh: '宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('gly'),
},
},
{
col: 4, row: 3,
item: {
id: 'stash-gem-fl-eme', code: 'glg', invFile: 'invgsgd', name: 'Flawless Emerald', nameZh: '无瑕绿宝石', baseNameZh: '宝石', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('glg'),
},
},
{
col: 5, row: 3,
item: {
id: 'stash-gem-fl-skull', code: 'skz', invFile: 'invskz', name: 'Flawless Skull', nameZh: '无瑕骷髅', baseNameZh: '骷髅', quality: 'normal', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 15,
stats: buildSocketableStats('skz'),
},
},
// Row 4: Jewels (Unique Rainbow Facets, Magic, Rare)
{
col: 0, row: 4,
item: {
id: 'stash-jew-facet-fire', code: 'jew', invFile: 'invjw1', name: 'Rainbow Facet', nameZh: '彩虹刻面 (Rainbow Facet - 火焰)', baseNameZh: '暗金珠宝 (Jewel)', quality: 'unique', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 49,
stats: [
{ text: '升级时有 100% 几率施放等级 29 炽烈之径', color: 'blue' },
{ text: '+5% 火焰技能伤害', color: 'blue' },
{ text: '-5% 敌人火焰抗性', color: 'blue' },
{ text: '增加 17-45 火焰伤害', color: 'blue' },
],
},
},
{
col: 1, row: 4,
item: {
id: 'stash-jew-ruby-fervor', code: 'jew', invFile: 'invjw2', name: 'Ruby Jewel of Fervor', nameZh: '红宝石之狂热珠宝 (40/15)', baseNameZh: '魔法珠宝 (Jewel)', quality: 'magic', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 58,
stats: [
{ text: '+40% 增强伤害 (ED)', color: 'blue' },
{ text: '+15% 提升攻击速度 (IAS)', color: 'blue' },
],
},
},
{
col: 2, row: 4,
item: {
id: 'stash-jew-res-ias', code: 'jew', invFile: 'invjw3', name: 'Scintillating Jewel of Fervor', nameZh: '闪耀之狂热珠宝 (15/15)', baseNameZh: '魔法珠宝 (Jewel)', quality: 'magic', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 31,
stats: [
{ text: '+15% 提升攻击速度 (IAS)', color: 'blue' },
{ text: '所有抗性 +15 (All Resistances +15)', color: 'blue' },
],
},
},
{
col: 3, row: 4,
item: {
id: 'stash-jew-rare', code: 'jew', invFile: 'invjw4', name: 'Doom Gyre', nameZh: '末日环绕 (稀有珠宝)', baseNameZh: '稀有珠宝 (Rare Jewel)', quality: 'rare', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 42,
stats: [
{ text: '+30% 增强伤害 (ED)', color: 'blue' },
{ text: '+9 力量', color: 'blue' },
{ text: '+9 敏捷', color: 'blue' },
{ text: '所有抗性 +10', color: 'blue' },
{ text: '+7% 快速再度攻击 (FHR)', color: 'blue' },
],
},
},
{
col: 4, row: 4,
item: {
id: 'stash-jew-facet-cold', code: 'jew', invFile: 'invjw5', name: 'Rainbow Facet (Cold)', nameZh: '彩虹刻面 (Rainbow Facet - 冰冷)', baseNameZh: '暗金珠宝 (Jewel)', quality: 'unique', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 49,
stats: [
{ text: '阵亡时有 100% 几率施放等级 37 暴风雪', color: 'blue' },
{ text: '+5% 冰冷技能伤害', color: 'blue' },
{ text: '-5% 敌人冰冷抗性', color: 'blue' },
{ text: '增加 24-38 冰冷伤害 (持续 3 秒)', color: 'blue' },
],
},
},
{
col: 5, row: 4,
item: {
id: 'stash-jew-facet-ltng', code: 'jew', invFile: 'invjw6', name: 'Rainbow Facet (Lightning)', nameZh: '彩虹刻面 (Rainbow Facet - 闪电)', baseNameZh: '暗金珠宝 (Jewel)', quality: 'unique', invWidth: 1, invHeight: 1, allowedSlots: [], reqLevel: 49,
stats: [
{ text: '升级时有 100% 几率施放等级 41 新星', color: 'blue' },
{ text: '+5% 闪电技能伤害', color: 'blue' },
{ text: '-5% 敌人闪电抗性', color: 'blue' },
{ text: '增加 1-74 闪电伤害', color: 'blue' },
],
},
},
]
// -------------------------------------------------------------------------------------------------
// 3. INVENTORY BAG GENERATION PER CLASS
// -------------------------------------------------------------------------------------------------
export function createStarterBagForClass(classCode: CharacterClassCode): GridPlacement[] {
const torchSkillText: Record<CharacterClassCode, string> = {
ama: '+3 亚马逊技能等级',
sor: '+3 法师技能等级',
nec: '+3 死灵法师技能等级',
pal: '+3 圣骑士技能等级',
bar: '+3 野蛮人技能等级',
dru: '+3 德鲁伊技能等级',
ass: '+3 刺客技能等级',
}
const skillerNameZh: Record<CharacterClassCode, string> = {
ama: '弓与十字弓超级护身符',
sor: '冰冷法术超级护身符',
nec: '毒素与白骨超级护身符',
pal: '圣骑士战斗技能超级护身符',
bar: '战斗专家超级护身符',
dru: '元素法术超级护身符',
ass: '陷阱技能超级护身符',
}
return [
{
col: 0,
row: 0,
item: {
id: `bag-cube-${classCode}`,
code: 'box',
invFile: 'invbox',
name: 'Horadric Cube',
nameZh: '赫拉迪克方块 (Horadric Cube)',
baseNameZh: '任务宝盒',
quality: 'unique',
invWidth: 2,
invHeight: 2,
allowedSlots: [],
stats: [{ text: '右键点击打开合成界面 (3×4 网格)', color: 'gold' }],
},
},
{
col: 2,
row: 0,
item: {
id: `bag-tbk-${classCode}`,
code: 'tbk',
invFile: 'invbbk',
name: 'Tome of Town Portal',
nameZh: '回城之书 (Tome of Town Portal)',
baseNameZh: '法术书 (数量: 20)',
quality: 'normal',
invWidth: 1,
invHeight: 2,
allowedSlots: [],
quantity: 20,
maxQuantity: 20,
stats: [{ text: '右键施放城镇传送门', color: 'white' }],
},
},
{
col: 2,
row: 2,
item: {
id: `bag-ibk-${classCode}`,
code: 'ibk',
invFile: 'invrbk',
name: 'Tome of Identify',
nameZh: '鉴定之书 (Tome of Identify)',
baseNameZh: '法术书 (数量: 20)',
quality: 'normal',
invWidth: 1,
invHeight: 2,
allowedSlots: [],
quantity: 20,
maxQuantity: 20,
stats: [{ text: '鉴定未辨识的魔法/暗金装备', color: 'white' }],
},
},
{
col: 3,
row: 0,
item: {
id: `bag-torch-${classCode}`,
code: 'cm2',
invFile: 'invtrch',
name: 'Hellfire Torch',
nameZh: '地狱火炬 (Hellfire Torch)',
baseNameZh: '大型护身符 (Large Charm)',
quality: 'unique',
invWidth: 1,
invHeight: 2,
allowedSlots: [],
reqLevel: 75,
stats: [
{ text: '击中时有 5% 几率施放等级 10 火风暴', color: 'blue' },
{ text: torchSkillText[classCode] ?? '+3 角色技能等级', color: 'blue' },
{ text: '+20 所有属性', color: 'blue' },
{ text: '所有抗性 +20', color: 'blue' },
{ text: '+8 照亮范围', color: 'blue' },
],
},
},
{
col: 3,
row: 2,
item: {
id: `bag-anni-${classCode}`,
code: 'cm1',
invFile: 'invmss',
name: 'Annihilus',
nameZh: '毁灭 (Annihilus)',
baseNameZh: '小型护身符 (Small Charm)',
quality: 'unique',
invWidth: 1,
invHeight: 1,
allowedSlots: [],
reqLevel: 70,
stats: [
{ text: '+1 所有技能 (+1 To All Skills)', color: 'blue' },
{ text: '+20 所有属性', color: 'blue' },
{ text: '所有抗性 +20', color: 'blue' },
{ text: '+10% 获得经验值', color: 'blue' },
],
},
},
{
col: 4,
row: 0,
item: {
id: `bag-gheeds-${classCode}`,
code: 'cm3',
invFile: 'invch3',
name: "Gheed's Fortune",
nameZh: "基德的运气 (Gheed's Fortune)",
baseNameZh: '超大型护身符 (Grand Charm)',
quality: 'unique',
invWidth: 1,
invHeight: 3,
allowedSlots: [],
reqLevel: 62,
stats: [
{ text: '160% 额外金币取得', color: 'blue' },
{ text: '40% 更佳机会取得魔法装备 (MF)', color: 'blue' },
{ text: '降低所有商人价格 15%', color: 'blue' },
],
},
},
{
col: 5,
row: 0,
item: {
id: `bag-skiller-${classCode}`,
code: 'cm3',
invFile: 'invch3',
name: 'Grand Charm of Vita',
nameZh: `${skillerNameZh[classCode]} (Skiller)`,
baseNameZh: '超大型护身符 (Grand Charm)',
quality: 'magic',
invWidth: 1,
invHeight: 3,
allowedSlots: [],
reqLevel: 42,
stats: [
{ text: `${torchSkillText[classCode]?.replace('+3', '+1')}`, color: 'blue' },
{ text: '+45 最大生命', color: 'blue' },
],
},
},
]
}
// -------------------------------------------------------------------------------------------------
// 4. CHARACTER SHEET ATTRIBUTES PER CLASS
// -------------------------------------------------------------------------------------------------
export const CLASS_STARTER_ATTRS: Record<CharacterClassCode, CharacterAttributes> = {
ama: {
name: 'Cassia',
classNameZh: '亚马逊',
classNameEn: 'Amazon',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 135,
dex: 210,
vit: 250,
ene: 50,
statPoints: 15,
baseMaxHp: 1250,
baseMaxMana: 450,
baseMaxStamina: 480,
defense: 1680,
attackRating: 2450,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
sor: {
name: 'Isendra',
classNameZh: '女法师',
classNameEn: 'Sorceress',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 156,
dex: 75,
vit: 315,
ene: 95,
statPoints: 15,
baseMaxHp: 1180,
baseMaxMana: 940,
baseMaxStamina: 465,
defense: 1845,
attackRating: 1240,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
nec: {
name: 'Xul',
classNameZh: '死灵法师',
classNameEn: 'Necromancer',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 120,
dex: 80,
vit: 290,
ene: 120,
statPoints: 15,
baseMaxHp: 1080,
baseMaxMana: 820,
baseMaxStamina: 450,
defense: 1580,
attackRating: 1120,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
pal: {
name: 'Cartographus',
classNameZh: '圣骑士',
classNameEn: 'Paladin',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 175,
dex: 120,
vit: 340,
ene: 45,
statPoints: 15,
baseMaxHp: 1520,
baseMaxMana: 520,
baseMaxStamina: 520,
defense: 2680,
attackRating: 2150,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
bar: {
name: 'Sonya',
classNameZh: '野蛮人',
classNameEn: 'Barbarian',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 235,
dex: 110,
vit: 380,
ene: 30,
statPoints: 15,
baseMaxHp: 1950,
baseMaxMana: 350,
baseMaxStamina: 550,
defense: 2450,
attackRating: 2850,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
dru: {
name: 'Loreov',
classNameZh: '德鲁伊',
classNameEn: 'Druid',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 165,
dex: 90,
vit: 330,
ene: 70,
statPoints: 15,
baseMaxHp: 1420,
baseMaxMana: 580,
baseMaxStamina: 490,
defense: 1720,
attackRating: 1840,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
ass: {
name: 'Natalya',
classNameZh: '刺客',
classNameEn: 'Assassin',
level: 85,
xp: 1_068_078_030,
nextLevelXp: 1_163_635_493,
str: 150,
dex: 180,
vit: 280,
ene: 60,
statPoints: 15,
baseMaxHp: 1320,
baseMaxMana: 490,
baseMaxStamina: 510,
defense: 1920,
attackRating: 2320,
fireRes: 75,
coldRes: 75,
lightRes: 75,
poisRes: 75,
},
}
// -------------------------------------------------------------------------------------------------
// 5. STARTER HARD POINTS ALLOCATIONS PER CLASS (Level 85)
// -------------------------------------------------------------------------------------------------
export const CLASS_STARTER_HARD_POINTS: Record<CharacterClassCode, Readonly<Record<number, number>>> = {
ama: {
6: 1, 7: 1, 11: 1, 12: 10, 22: 20, 26: 10, 31: 10, // Bow
8: 1, 9: 10, 13: 5, 17: 1, 18: 5, 23: 10, 29: 5, 32: 10, 33: 5, // Passive
10: 1, 14: 1, 20: 1, 24: 5, 35: 10, // Javelin
},
sor: {
39: 1, 40: 1, 44: 1, 45: 5, 55: 10, 59: 20, 64: 20, 65: 10, // Cold
38: 1, 42: 1, 43: 1, 49: 5, 54: 1, // Lightning
36: 1, 37: 1, 47: 15, 56: 10, 61: 5, // Fire
},
nec: {
70: 20, 69: 20, 75: 1, 79: 1, 80: 5, 89: 5, 95: 5, // Summoning
67: 1, 68: 1, 74: 10, 78: 1, 84: 15, 92: 5, // Poison & Bone
66: 1, 71: 1, 72: 1, 76: 1, 77: 1, 82: 1, 87: 1, // Curses
},
pal: {
96: 1, 97: 1, 101: 1, 106: 5, 107: 1, 112: 20, 117: 15, // Combat
98: 1, 108: 20, 113: 20, 122: 10, // Offensive
99: 1, 100: 1, 104: 1, 105: 1, 109: 1, 110: 1, 115: 15, 120: 1, 124: 1, // Defensive
},
bar: {
126: 1, 132: 1, 133: 5, 140: 1, 143: 1, 144: 5, 147: 10, 151: 20, 152: 1, // Combat
129: 20, 145: 10, 148: 10, 153: 5, // Masteries
130: 1, 137: 1, 138: 15, 149: 20, 154: 1, 155: 1, // Warcries
},
dru: {
221: 1, 225: 1, 227: 15, 229: 1, 235: 15, 240: 20, 245: 20, // Elemental
223: 1, 224: 5, // Shape Shifting
226: 15, 231: 1, 237: 5, 247: 5, // Summoning
},
ass: {
251: 15, 256: 15, 261: 15, 271: 20, 276: 20, // Traps
252: 1, 253: 1, 258: 5, 263: 5, 264: 1, 267: 5, 268: 1, 273: 1, 279: 5, // Shadow
254: 1, 255: 5, 260: 1, 270: 1, // Martial Arts
},
}