import React, {useEffect} from 'react'; export interface Skill { name: string; type: 'None' | 'Passive' | 'Active'; soulBurn?: number; description: string; enhancements?: { stars: number; attack?: string; health?: string; defense?: string; effectiveness?: string; }[]; } export interface ImprintConcentration { type: string; values: { rank: string; value: string; }[]; } interface CharacterDetailProps { character: { id: number; name: string; stars: number; class: string; element: string; baseStats: { attack: number; health: number; defense: number; speed: number; }; skills: Skill[]; imprintConcentration: ImprintConcentration[]; imageUrl: string; }; } // mock数据类型定义 interface GearSetRate { setNames: string[]; // 每个set下可有1-3个套装 percent: number; } interface BuildStats { attack: number; defense: number; health: number; critChance: number; critDamage: number; effectiveness: number; effectResistance: number; speed: number; } interface BuildInfo { stats: BuildStats; gearSets: string[]; artifact: { name: string; img?: string; }; } // mock数据 const mockAverageStats: BuildStats = { attack: 1887, defense: 2136, health: 17809, critChance: 99, critDamage: 267, effectiveness: 1, effectResistance: 2, speed: 173, }; const mockGearSetRates: GearSetRate[] = [ {setNames: ['免疫', '吸血'], percent: 40.37}, {setNames: ['暴击', '吸血', '速度'], percent: 28.7}, {setNames: ['生命'], percent: 7.4}, {setNames: ['命中', '防御'], percent: 5.1}, // 测试多余set不会显示 ]; const mockBuilds: BuildInfo[] = [ { stats: { attack: 1769, defense: 2156, health: 19281, critChance: 102, critDamage: 273, effectiveness: 22, effectResistance: 0, speed: 168, }, gearSets: ['生命', '吸血', '吸血'], artifact: {name: '伊赛丽亚的誓约', img: ''}, }, { stats: { attack: 1957, defense: 2090, health: 18369, critChance: 100, critDamage: 271, effectiveness: 0, effectResistance: 0, speed: 178, }, gearSets: ['暴击', '吸血'], artifact: {name: '圣洁的遗物', img: ''}, }, { stats: { attack: 1894, defense: 2030, health: 19053, critChance: 100, critDamage: 272, effectiveness: 0, effectResistance: 0, speed: 183, }, gearSets: ['暴击', '吸血'], artifact: {name: '伊赛丽亚的誓约', img: ''}, }, ]; // 套装图标映射 const setIconMap: Record = { 'Health': '/pic/item/set/Health.png', 'Immunity': '/pic/item/set/Immunity.png', '生命': '/pic/item/set/Health.png', '免疫': '/pic/item/set/Immunity.png', }; // 神器图片映射 const artifactImgMap: Record = { 'Elbris Ritual Sword': 'https://epic7db.com/images/artifacts/elbris-ritual-sword.webp', '伊赛丽亚的誓约': 'https://epic7db.com/images/artifacts/elbris-ritual-sword.webp', }; const CharacterDetail: React.FC = ({character}) => { useEffect(() => { window.scrollTo({top: 0, behavior: 'auto'}); }, []); const renderStars = (count: number) => { return Array(count) .fill(0) .map((_, index) => ( )); }; const renderSkillType = (type: string) => { switch (type) { case 'None': return None; case 'Passive': return Passive; case 'Active': return Active; default: return null; } }; const renderSoulBurn = (souls?: number) => { if (!souls) return null; return ( +{souls} souls ); }; // 属性图标占位 const statIcons: Record = { attack: '⚔️', defense: '🛡️', health: '❤️', critChance: '🎯', critDamage: '💥', effectiveness: '🎲', effectResistance: '🚫', speed: '💨', }; return (
{/* 左侧:头像+导航 */} {/* 右侧:详细内容 */}
{/* 基础属性 */}

六星满觉属性

Attack: {character.baseStats.attack}
Health: {character.baseStats.health}
Defense: {character.baseStats.defense}
Speed: {character.baseStats.speed}
{/* 配装推荐模块 */}

角色配装推荐

{/* 平均属性 */}

平均属性

{Object.entries(mockAverageStats).map(([key, value]) => (
{statIcons[key] || '?'} {key.replace(/([A-Z])/g, ' $1')}
{value}{['critChance', 'critDamage', 'effectiveness', 'effectResistance'].includes(key) ? '%' : ''}
))}
{/* 主流套装占比 */}

主流套装占比

{mockGearSetRates.slice(0, 3).map((set, idx) => (
Set {idx + 1} ({set.percent}% Use Rate)
{set.setNames.map((name, i) => ( {setIconMap[name] ? ( {name} ) : ( ? )} {name} ))}
))}
{/* 下方builds,两列布局 */}
{mockBuilds.concat({ stats: { attack: 1800, defense: 2100, health: 18500, critChance: 101, critDamage: 270, effectiveness: 5, effectResistance: 1, speed: 175, }, gearSets: ['速度', '命中'], artifact: { name: 'Elbris Ritual Sword', img: '' }, }).map((build, idx) => (

Build {idx + 1}

{/* 左侧:属性 */}

属性

{Object.entries(build.stats).map(([key, value]) => (
{statIcons[key] || '?'} {key.replace(/([A-Z])/g, ' $1')}
{value}{['critChance', 'critDamage', 'effectiveness', 'effectResistance'].includes(key) ? '%' : ''}
))}
{/* 右侧:套装图标+神器图片+神器名 */}
{/* 套装组合描述 */}

套装组合

{/* 套装组合图标 */}
{build.gearSets.map((set, i) => ( setIconMap[set] ? ( {set} ) : ( ? ) ))}
{/* 神器图片 */}
{artifactImgMap[build.artifact.name] ? ( {build.artifact.name} ) : build.artifact.img ? ( {build.artifact.name} ) : (
?
)}
{/* 神器名称 */} {build.artifact.name}
))}
{/* 技能列表 */}
{character.skills.map((skill, index) => (

{skill.name}

{renderSkillType(skill.type)} {renderSoulBurn(skill.soulBurn)}

{skill.description}

{skill.enhancements && skill.enhancements.length > 0 && (

Skill Enhancements

{skill.enhancements.map((enhancement, idx) => (
{renderStars(enhancement.stars)}
{enhancement.attack && ( Attack {enhancement.attack} )} {enhancement.health && ( Health {enhancement.health} )} {enhancement.defense && ( Defense {enhancement.defense} )} {enhancement.effectiveness && ( Effectiveness {enhancement.effectiveness} )}
))}
)}
))}
{/* 印记集中 */}

Imprint Concentration

{character.imprintConcentration.map((imprint, index) => (

{imprint.type}

{imprint.values.map((value, idx) => (
{value.rank} {value.value}
))}
))}
); }; export default CharacterDetail;