114 lines
2.9 KiB
JavaScript
114 lines
2.9 KiB
JavaScript
// 难度页当前用于保存“开始训练前上下文”的本地存储 key。
|
|
export const trainingDifficultyStorageKey = "training-selection";
|
|
|
|
// 当前是页面联调用的模拟数据:
|
|
// 1. 总难度 20 级
|
|
// 2. 已解锁到 Lv3
|
|
// 3. 前三关展示不同完成进度
|
|
const totalDifficultyLevel = 20;
|
|
const mockedUnlockedDifficultyId = "lv3";
|
|
const mockedDifficultyProgressMap = {
|
|
lv1: 100,
|
|
lv2: 90,
|
|
lv3: 70,
|
|
};
|
|
|
|
const modeList = [
|
|
{
|
|
key: "endurance",
|
|
title: "耐力训练",
|
|
},
|
|
{
|
|
key: "precision",
|
|
title: "精准训练",
|
|
},
|
|
{
|
|
key: "rhythm",
|
|
title: "节奏训练",
|
|
},
|
|
{
|
|
key: "basic",
|
|
title: "基础训练",
|
|
},
|
|
{
|
|
key: "power",
|
|
title: "力量训练",
|
|
},
|
|
{
|
|
key: "focus",
|
|
title: "专注训练",
|
|
},
|
|
];
|
|
|
|
const createDifficultyId = (level) => `lv${level}`;
|
|
|
|
const createDifficultyLabel = (level) => `Lv${level}`;
|
|
|
|
// 根据等级生成模拟文案,方便一次性扩展到更多关卡。
|
|
const createDifficultySummary = (level) => {
|
|
return [
|
|
`箭靶划分为${Math.min(1 + Math.floor((level - 1) / 5), 4)}个区域`,
|
|
`需${4 + level}次命中目标`,
|
|
`${100 + Math.floor((level - 1) / 2) * 10}秒内完成所有射击`,
|
|
"需使用20CM全环靶",
|
|
];
|
|
};
|
|
|
|
// 难度页的节点位置已经在页面内统一计算,
|
|
// 这里保留最核心的 id / label 即可,不再维护无效的 left / top / style 字段。
|
|
const createDifficultyNode = (level) => {
|
|
return {
|
|
id: createDifficultyId(level),
|
|
label: createDifficultyLabel(level),
|
|
};
|
|
};
|
|
|
|
const createDifficultyDetail = (level) => {
|
|
const id = createDifficultyId(level);
|
|
const label = createDifficultyLabel(level);
|
|
|
|
return {
|
|
id,
|
|
label,
|
|
title: `${label}难度`,
|
|
summary: createDifficultySummary(level),
|
|
startText: "开始",
|
|
targetPaperType: "20CM全环靶",
|
|
};
|
|
};
|
|
|
|
// 所有训练模式当前共用同一套难度定义。
|
|
const sharedDifficultyNodes = Array.from(
|
|
{ length: totalDifficultyLevel },
|
|
(_, index) => createDifficultyNode(index + 1)
|
|
);
|
|
|
|
const sharedDifficultyDetails = Object.fromEntries(
|
|
Array.from({ length: totalDifficultyLevel }, (_, index) => {
|
|
const detail = createDifficultyDetail(index + 1);
|
|
return [detail.id, detail];
|
|
})
|
|
);
|
|
|
|
const createModeConfig = ({ key, title, reward = null }) => {
|
|
return {
|
|
key,
|
|
title,
|
|
nodes: sharedDifficultyNodes,
|
|
details: sharedDifficultyDetails,
|
|
activeDifficultyId: mockedUnlockedDifficultyId,
|
|
progressMap: mockedDifficultyProgressMap,
|
|
reward,
|
|
};
|
|
};
|
|
|
|
// 难度页数据源入口:
|
|
// 页面通过 getTrainingDifficultyModeConfig(modeKey) 获取当前模式完整配置。
|
|
export const trainingDifficultyModeMap = Object.fromEntries(
|
|
modeList.map((mode) => [mode.key, createModeConfig(mode)])
|
|
);
|
|
|
|
export const getTrainingDifficultyModeConfig = (modeKey) => {
|
|
return trainingDifficultyModeMap[modeKey] || trainingDifficultyModeMap.precision;
|
|
};
|