feat(测试模式): 新增怪物技能测试覆盖功能并完善测试配置

修复怪物生成位置索引越界问题,通过对位置数组长度取模限制合法索引范围
新增测试模式专属的怪物技能覆盖逻辑,支持覆盖普攻及各类触发技能配置
扩展测试模式配置项,新增怪物生成数量、词缀配置以及全类型技能覆盖参数
优化 Rogue 关卡生成引擎,支持批量生成测试怪物并计算词缀属性加成
This commit is contained in:
pan
2026-06-12 16:31:32 +08:00
parent 85ab6b0507
commit 488b1632ef
3 changed files with 83 additions and 11 deletions

View File

@@ -554,7 +554,21 @@ export const TestModeConfig = {
/** 固定的测试怪物类型 */
monType: MonType.Melee,
/** 固定的测试怪物 UUID (如 6001 兽人战士) */
monUuid: 6001
monUuid: 6001,
/** 测试模式中生成怪物是否携带特定词缀(为空则不带) */
affixes: [] as AffixType[],
/** 每次刷新的怪物数量 */
spawnCount: 1,
// ===== 附加技能测试覆盖配置 =====
/** 替换普攻技能(清除旧技能,添加新技能) */
skill: undefined as { s_uuid: number; cd?: number; overrides?: any } | undefined,
/** 覆盖触发技能(完全替换该类型的触发配置) */
atking: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
atked: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
dead: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
fstart: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
fend: undefined as { s_uuid: number; t_num: number; overrides?: any }[] | undefined,
}
// ======================== 向后兼容接口 ========================
@@ -606,6 +620,15 @@ export interface GeneratedMonster {
affixes: AffixType[]
isBoss: boolean
spawnIndex: number
/** 测试模式专属:临时覆盖怪物技能配置 */
testSkills?: {
skill?: { s_uuid: number; cd?: number; overrides?: any };
atking?: { s_uuid: number; t_num: number; overrides?: any }[];
atked?: { s_uuid: number; t_num: number; overrides?: any }[];
dead?: { s_uuid: number; t_num: number; overrides?: any }[];
fstart?: { s_uuid: number; t_num: number; overrides?: any }[];
fend?: { s_uuid: number; t_num: number; overrides?: any }[];
}
}
// ======================== 生成引擎 ========================
@@ -670,15 +693,37 @@ export class RogueSpawningEngine {
// 测试模式拦截
if (TestModeConfig.enable) {
const growth = 1 + (waveNumber - 1) * TestModeConfig.growthRatePerWave;
return [{
uuid: TestModeConfig.monUuid,
type: TestModeConfig.monType,
hp: Math.round(TestModeConfig.baseHp * growth),
ap: Math.round(TestModeConfig.baseAp * growth),
affixes: [],
isBoss: false,
spawnIndex: 0
}];
// 提取词缀加成
const affixHpMul = 1.0 + TestModeConfig.affixes.reduce(
(sum, a) => sum + (AffixConfigs[a].hpMultiplier - 1.0), 0
);
const affixApMul = 1.0 + TestModeConfig.affixes.reduce(
(sum, a) => sum + (AffixConfigs[a].apMultiplier - 1.0), 0
);
const count = Math.max(1, TestModeConfig.spawnCount || 1);
const monsters: GeneratedMonster[] = [];
for (let i = 0; i < count; i++) {
monsters.push({
uuid: TestModeConfig.monUuid,
type: TestModeConfig.monType,
hp: Math.round(TestModeConfig.baseHp * growth * affixHpMul),
ap: Math.round(TestModeConfig.baseAp * growth * affixApMul),
affixes: [...TestModeConfig.affixes],
isBoss: false,
spawnIndex: i,
testSkills: {
skill: TestModeConfig.skill,
atking: TestModeConfig.atking,
atked: TestModeConfig.atked,
dead: TestModeConfig.dead,
fstart: TestModeConfig.fstart,
fend: TestModeConfig.fend
}
});
}
return monsters;
}
const tier = Math.ceil(waveNumber / 3)