chore: 调整怪物配置与肉鸽模式参数,优化游戏平衡性

1.  重构基础怪物数据,按站位分类并更新属性、名称与描述
2.  更新怪物池与属性配置,调整各类型怪物生成权重与消耗
3.  修改阶梯预算与生成数量,调整适配性配置参数
4.  优化生成引擎的预算填充逻辑,增加生成上限限制
This commit is contained in:
walkpan
2026-05-23 19:03:09 +08:00
parent 9f6f09dbd3
commit f49831bf9e
2 changed files with 111 additions and 101 deletions

View File

@@ -420,37 +420,40 @@ export const HeroInfo: Record<number, heroInfo> = {
*/
// 基础怪物
6001:{uuid:6001,name:"兽人初阶战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:360,ap:12,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:0.65,ccd:0}},info:""},
6002:{uuid:6002,name:"兽人高阶战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:360,ap:12,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:0.65,ccd:0}},info:""},
6003:{uuid:6003,name:"兽人初阶射手",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:1050,ap:30,speed:100,
skills:{6008:{uuid:6008,lv:1,cd:2,ccd:0}},info:""},
6004:{uuid:6004,name:"兽人高阶射手",path:"m4", fac:FacSet.MON,lv:1,type:HType.Long,hp:720,ap:45,speed:100,
skills:{6008:{uuid:6008,lv:1,cd:1.5,ccd:0}},info:""},
6005:{uuid:6005,name:"兽人刺客",path:"m5", fac:FacSet.MON,lv:1,type:HType.Long,hp:720,ap:20,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:1.5,ccd:0}},info:""},
6006:{uuid:6006,name:"骷髅高阶战士",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:2,ccd:0}},info:""},
6007:{uuid:6007,name:"兽人蓝色法师",path:"m7", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:2,ccd:0}},info:""},
6008:{uuid:6008,name:"兽人红色法师",path:"m8", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:2,ccd:0}},info:""},
// 基础怪物 (全部远程攻击HType仅决定站位)
// 近战位怪物 (站在前排,承受更多伤害)
6001:{uuid:6001,name:"兽人战士",path:"m1", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:360,ap:15,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:0.65,ccd:0}},info:"基础近战位怪"},
6002:{uuid:6002,name:"兽人精锐战士",path:"m2", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:500,ap:20,speed:110,
skills:{6005:{uuid:6005,lv:1,cd:0.55,ccd:0}},info:"进阶近战位怪,更快更痛"},
6003:{uuid:6003,name:"兽人重装兵",path:"m3", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:1400,ap:28,speed:80,
skills:{6008:{uuid:6008,lv:1,cd:1.8,ccd:0}},info:"重型坦克怪高HP慢攻"},
// 远程位怪物 (站在后排,输出更高)
6004:{uuid:6004,name:"兽人射手",path:"m4", fac:FacSet.MON,lv:1,type:HType.Long,hp:320,ap:50,speed:100,
skills:{6008:{uuid:6008,lv:1,cd:1.2,ccd:0}},info:"远程高DPS怪"},
6005:{uuid:6005,name:"兽人刺客",path:"m5", fac:FacSet.MON,lv:1,type:HType.Long,hp:350,ap:55,speed:130,
skills:{6103:{uuid:6103,lv:1,cd:0.8,ccd:0}},info:"高AP快速攻击刺客"},
// 特殊位怪物
6006:{uuid:6006,name:"骷髅领主",path:"m6", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:8000,ap:30,speed:90,
skills:{6005:{uuid:6005,lv:1,cd:1.5,ccd:0}},info:"MiniBoss级坦克"},
6007:{uuid:6007,name:"兽人术士",path:"m7", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:500,ap:35,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:1.2,ccd:0}},info:"法师怪,远程魔法攻击"},
6008:{uuid:6008,name:"兽人火法",path:"m8", fac:FacSet.MON,lv:1,type:HType.Melee,dis:360,hp:450,ap:45,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:1.0,ccd:0}},info:"高输出法师怪"},
// BOSS怪物
6101:{uuid:6101,name:"兽人首领-双刀战士-蓝边",path:"mb1", fac:FacSet.MON,lv:6,type:HType.Long,hp:720,ap:30,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:2,ccd:0},6206:{uuid:6206,lv:1,cd:10,ccd:0}},info:""},
6102:{uuid:6102,name:"兽人首领-斧头战士-绿边",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:2,ccd:0},},info:""},
6103:{uuid:6103,name:"兽人首领-魔法师-紫边",path:"mb3", fac:FacSet.MON,lv:6,type:HType.Long,hp:720,ap:30,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:2,ccd:0},6206:{uuid:6206,lv:1,cd:10,ccd:0}},info:""},
6104:{uuid:6104,name:"兽人首领-射手-黄边",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:2,ccd:0},},info:""},
6105:{uuid:6105,name:"亡灵首领-法师-红边",path:"mb5", fac:FacSet.MON,lv:6,type:HType.Long,hp:720,ap:30,speed:100,
skills:{6103:{uuid:6103,lv:1,cd:2,ccd:0},6206:{uuid:6206,lv:1,cd:10,ccd:0}},info:""},
6106:{uuid:6106,name:"亡灵首领-骑马战士-红边",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:4500,ap:20,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:2,ccd:0},},info:""},
6101:{uuid:6101,name:"兽人首领-双刀战士",path:"mb1", fac:FacSet.MON,lv:6,type:HType.Long,hp:2500,ap:40,speed:120,
skills:{6103:{uuid:6103,lv:1,cd:0.8,ccd:0},6206:{uuid:6206,lv:1,cd:10,ccd:0}},info:"远程Boss高攻速"},
6102:{uuid:6102,name:"兽人首领-斧头战士",path:"mb2", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:10000,ap:35,speed:90,
skills:{6005:{uuid:6005,lv:1,cd:1.2,ccd:0}},info:"近战Boss超高HP"},
6103:{uuid:6103,name:"兽人首领-魔法师",path:"mb3", fac:FacSet.MON,lv:6,type:HType.Long,hp:3000,ap:50,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:0.7,ccd:0},6206:{uuid:6206,lv:1,cd:8,ccd:0}},info:"远程法系Boss高AP"},
6104:{uuid:6104,name:"兽人首领-射手",path:"mb4", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:9000,ap:40,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:1.0,ccd:0}},info:"近战位Boss均衡型"},
6105:{uuid:6105,name:"亡灵首领-法师",path:"mb5", fac:FacSet.MON,lv:6,type:HType.Long,hp:3500,ap:55,speed:110,
skills:{6103:{uuid:6103,lv:1,cd:0.7,ccd:0},6206:{uuid:6206,lv:1,cd:8,ccd:0}},info:"远程高AP Boss"},
6106:{uuid:6106,name:"亡灵首领-骑马战士",path:"mb6", fac:FacSet.MON,lv:6,type:HType.Melee,dis:360,hp:12000,ap:35,speed:130,
skills:{6005:{uuid:6005,lv:1,cd:1.0,ccd:0}},info:"终极Boss最高HP+高速"},
};

View File

@@ -183,13 +183,13 @@ export const TemplateModifier: Record<TemplateType, number> = {
*/
export const MonList: Record<number, number[]> = {
[MonType.Melee]: [6001, 6002],
[MonType.Heavy]: [6003, 6103],
[MonType.Long]: [6004, 6102],
[MonType.Support]: [6005],
[MonType.Summoner]: [6203],
[MonType.Assassin]: [6204],
[MonType.MeleeBoss]: [6006, 6105],
[MonType.LongBoss]: [6104],
[MonType.Heavy]: [6003],
[MonType.Long]: [6004],
[MonType.Support]: [6007],
[MonType.Summoner]: [6008],
[MonType.Assassin]: [6005],
[MonType.MeleeBoss]: [6006, 6102, 6104, 6106],
[MonType.LongBoss]: [6101, 6103, 6105],
}
// ======================== 怪物基础属性 & 成本 ========================
@@ -215,14 +215,14 @@ export interface MonsterBaseStats {
* @see MonsterBaseStats 字段说明
*/
export const MonsterStats: Record<MonType, MonsterBaseStats> = {
[MonType.Melee]: { hp: 360, ap: 12, cost: 30, isBoss: false },
[MonType.Heavy]: { hp: 1050, ap: 30, cost: 50, isBoss: false },
[MonType.Long]: { hp: 240, ap: 45, cost: 40, isBoss: false },
[MonType.Support]: { hp: 240, ap: 20, cost: 50, isBoss: false },
[MonType.Summoner]: { hp: 300, ap: 15, cost: 60, isBoss: false },
[MonType.Assassin]: { hp: 270, ap: 55, cost: 45, isBoss: false },
[MonType.MeleeBoss]: { hp: 4500, ap: 20, cost: 200, isBoss: true },
[MonType.LongBoss]: { hp: 1050, ap: 30, cost: 200, isBoss: true },
[MonType.Melee]: { hp: 360, ap: 15, cost: 25, isBoss: false },
[MonType.Heavy]: { hp: 1400, ap: 28, cost: 50, isBoss: false },
[MonType.Long]: { hp: 320, ap: 50, cost: 35, isBoss: false },
[MonType.Support]: { hp: 500, ap: 35, cost: 40, isBoss: false },
[MonType.Summoner]: { hp: 450, ap: 45, cost: 50, isBoss: false },
[MonType.Assassin]: { hp: 350, ap: 55, cost: 35, isBoss: false },
[MonType.MeleeBoss]: { hp: 10000, ap: 35, cost: 200, isBoss: true },
[MonType.LongBoss]: { hp: 3000, ap: 50, cost: 200, isBoss: true },
}
// ======================== 阶梯Tier配置 ========================
@@ -252,11 +252,11 @@ const MAJOR_BOSS_TIERS = new Set([3, 5])
* 主线 15 波映射wave 1-3 → T1, wave 4-6 → T2, ..., wave 13-15 → T5
*/
export const TierConfigs: Record<number, TierConfig> = {
1: { multiplier: 1.0, budget: 500, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false },
2: { multiplier: 1.6, budget: 1000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true },
3: { multiplier: 2.5, budget: 1800, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true },
4: { multiplier: 3.8, budget: 3000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
5: { multiplier: 5.5, budget: 5000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
1: { multiplier: 1.0, budget: 200, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long], isBossTier: false },
2: { multiplier: 2.0, budget: 600, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support], isBossTier: true },
3: { multiplier: 3.5, budget: 1400, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin], isBossTier: true },
4: { multiplier: 5.5, budget: 2500, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
5: { multiplier: 8.5, budget: 4000, availableTypes: [MonType.Melee, MonType.Heavy, MonType.Long, MonType.Support, MonType.Assassin, MonType.Summoner], isBossTier: true },
}
/**
@@ -361,98 +361,102 @@ export interface BlueprintTemplate {
* 生成引擎根据当前 Tier 和波内位置从中筛选并随机抽取
*/
export const BlueprintTemplates: BlueprintTemplate[] = [
// ---- REST 类 ----
// ---- REST 类 (恢复波:少量怪,让玩家喘口气) ----
{ id: "R1", type: TemplateType.REST, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee], countMin: 5, countMax: 10, weight: 1.0 }] },
{ id: "R2", type: TemplateType.REST, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee, MonType.Heavy], countMin: 5, countMax: 15, weight: 1.0 }] },
slots: [{ typePool: [MonType.Melee], countMin: 3, countMax: 5, weight: 1.0 }] },
{ id: "R2", type: TemplateType.REST, tierMin: 2, allowAffix: false,
slots: [{ typePool: [MonType.Melee, MonType.Heavy], countMin: 5, countMax: 8, weight: 1.0 }] },
{ id: "R3", type: TemplateType.REST, tierMin: 3, allowAffix: false,
slots: [{ typePool: [MonType.Melee, MonType.Long], countMin: 10, countMax: 15, weight: 1.0 }] },
slots: [{ typePool: [MonType.Melee, MonType.Long], countMin: 6, countMax: 10, weight: 1.0 }] },
// ---- NORMAL 类 ----
// N1/N2: T1专用(1-5英雄),数量少
{ id: "N1", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee], countMin: 10, countMax: 20, weight: 1.0 }] },
slots: [{ typePool: [MonType.Melee], countMin: 3, countMax: 5, weight: 1.0 }] },
{ id: "N2", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,
slots: [
{ typePool: [MonType.Melee], countMin: 5, countMax: 15, weight: 0.6 },
{ typePool: [MonType.Long, MonType.Heavy], countMin: 5, countMax: 10, weight: 0.4 },
{ typePool: [MonType.Melee], countMin: 2, countMax: 4, weight: 0.6 },
{ typePool: [MonType.Long], countMin: 1, countMax: 3, weight: 0.4 },
] },
// N3+: T2起(5-6英雄),正常数量
{ id: "N3", type: TemplateType.NORMAL, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 15, weight: 0.5 },
{ typePool: [MonType.Long], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 5, countMax: 5, weight: 0.2 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 5, countMax: 8, weight: 0.5 },
{ typePool: [MonType.Long], countMin: 3, countMax: 6, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 2, countMax: 3, weight: 0.2 },
] },
{ id: "N4", type: TemplateType.NORMAL, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 20, weight: 0.4 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 5, countMax: 15, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 6, countMax: 10, weight: 0.4 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 4, countMax: 8, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 2, countMax: 4, weight: 0.3 },
] },
// ---- MIXED 类 ----
// M1: T1专用(波3,5英雄),适中数量
{ id: "M1", type: TemplateType.MIXED, tierMin: 1, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 15, weight: 0.4 },
{ typePool: [MonType.Long], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 5, countMax: 5, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 3, countMax: 5, weight: 0.4 },
{ typePool: [MonType.Long], countMin: 2, countMax: 3, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 1, countMax: 2, weight: 0.3 },
] },
// M2+: T3起(6英雄),正常数量
{ id: "M2", type: TemplateType.MIXED, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 20, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 10, countMax: 15, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 5, countMax: 5, weight: 0.4 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 6, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 5, countMax: 8, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 3, countMax: 5, weight: 0.4 },
] },
{ id: "M3", type: TemplateType.MIXED, tierMin: 4, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 15, countMax: 20, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 10, countMax: 15, weight: 0.3 },
{ typePool: [MonType.Summoner], countMin: 5, countMax: 10, weight: 0.2 },
{ typePool: [MonType.Support], countMin: 5, countMax: 10, weight: 0.2 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 8, countMax: 12, weight: 0.3 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 5, countMax: 8, weight: 0.3 },
{ typePool: [MonType.Summoner], countMin: 2, countMax: 4, weight: 0.2 },
{ typePool: [MonType.Support], countMin: 2, countMax: 4, weight: 0.2 },
] },
// ---- ELITE 类 ----
// ---- ELITE 类 (精英波:少但强,考验单兵质量) ----
{ id: "E1", type: TemplateType.ELITE, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 5, countMax: 10, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 5, countMax: 10, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Heavy], countMin: 3, countMax: 5, weight: 0.5, forceAffix: true },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 3, countMax: 6, weight: 0.5, forceAffix: true },
] },
{ id: "E2", type: TemplateType.ELITE, tierMin: 4, allowAffix: true,
slots: [
{ typePool: [MonType.Heavy], countMin: 5, countMax: 10, weight: 0.3, forceAffix: true },
{ typePool: [MonType.Assassin], countMin: 5, countMax: 10, weight: 0.4, forceAffix: true },
{ typePool: [MonType.Support], countMin: 5, countMax: 10, weight: 0.3, forceAffix: true },
{ typePool: [MonType.Heavy], countMin: 3, countMax: 5, weight: 0.3, forceAffix: true },
{ typePool: [MonType.Assassin], countMin: 4, countMax: 6, weight: 0.4, forceAffix: true },
{ typePool: [MonType.Support], countMin: 2, countMax: 4, weight: 0.3, forceAffix: true },
] },
// ---- BOSS 类 ----
{ id: "B1", type: TemplateType.BOSS, tierMin: 1, allowAffix: true,
// ---- BOSS 类 (Boss波1个Boss + 少量精英随从) ----
{ id: "B1", type: TemplateType.BOSS, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Melee], countMin: 10, countMax: 15, weight: 0.6 },
{ typePool: [MonType.Long], countMin: 0, countMax: 10, weight: 0.4 },
{ typePool: [MonType.Melee], countMin: 4, countMax: 6, weight: 0.6 },
{ typePool: [MonType.Long], countMin: 2, countMax: 4, weight: 0.4 },
] },
{ id: "B2", type: TemplateType.BOSS, tierMin: 2, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 15, weight: 0.5 },
{ typePool: [MonType.Long, MonType.Support], countMin: 5, countMax: 10, weight: 0.5 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 5, countMax: 8, weight: 0.5 },
{ typePool: [MonType.Long, MonType.Support], countMin: 3, countMax: 6, weight: 0.5 },
] },
{ id: "B3", type: TemplateType.BOSS, tierMin: 3, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 10, countMax: 20, weight: 0.4 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 5, countMax: 15, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Melee, MonType.Heavy], countMin: 6, countMax: 10, weight: 0.4 },
{ typePool: [MonType.Long, MonType.Assassin], countMin: 3, countMax: 6, weight: 0.3 },
{ typePool: [MonType.Support], countMin: 2, countMax: 4, weight: 0.3 },
] },
{ id: "B4", type: TemplateType.BOSS, tierMin: 4, allowAffix: true,
slots: [
{ typePool: [MonType.MeleeBoss, MonType.LongBoss], countMin: 1, countMax: 1, weight: 1.0 },
{ typePool: [MonType.Heavy], countMin: 10, countMax: 15, weight: 0.4 },
{ typePool: [MonType.Assassin], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Summoner, MonType.Support], countMin: 5, countMax: 10, weight: 0.3 },
{ typePool: [MonType.Heavy], countMin: 5, countMax: 8, weight: 0.4 },
{ typePool: [MonType.Assassin], countMin: 3, countMax: 6, weight: 0.3 },
{ typePool: [MonType.Summoner, MonType.Support], countMin: 3, countMax: 5, weight: 0.3 },
] },
// ---- 教程专用 ----
// ---- 教程专用 (波1: 1个英雄) ----
{ id: "TUTORIAL", type: TemplateType.NORMAL, tierMin: 1, allowAffix: false,
slots: [{ typePool: [MonType.Melee], countMin: 2, countMax: 2, weight: 1.0 }] },
]
@@ -471,14 +475,14 @@ export const BlueprintTemplates: BlueprintTemplate[] = [
* @property antiDriftDelta - 反漂移时的反向微调量
*/
export const AdaptiveConfig = {
factorMin: 0.85,
factorMax: 1.15,
deltaPerWave: 0.03,
targetClearTime: 15.0,
factorMin: 0.75,
factorMax: 1.30,
deltaPerWave: 0.04,
targetClearTime: 12.0,
strongThreshold: 0.8,
weakThreshold: 0.3,
maxConsecutiveDirection: 5,
antiDriftDelta: 0.01,
weakThreshold: 0.4,
maxConsecutiveDirection: 4,
antiDriftDelta: 0.015,
}
// ======================== 无限模式配置 ========================
@@ -866,13 +870,15 @@ export class RogueSpawningEngine {
}
}
// 预算利用率检查 (目标 >= 70%)
// 预算利用率检查 (目标 >= 70%但填充上限为模板数量的50%)
let totalCost = budget - remainingBudget
if (budget > 0 && totalCost / budget < 0.7 && template.id !== "TUTORIAL") {
const tierConfig = getTierConfig(tier)
const type = MonType.Melee
const stats = MonsterStats[type]
while (remainingBudget >= stats.cost) {
const maxFill = Math.max(5, Math.ceil(monsters.length * 0.5))
let fillCount = 0
while (remainingBudget >= stats.cost && fillCount < maxFill) {
const finalHp = Math.max(1, Math.round(stats.hp * tierConfig.multiplier * this.adaptiveFactor))
const finalAp = Math.max(1, Math.round(stats.ap * tierConfig.multiplier * this.adaptiveFactor))
const uuids = MonList[type]
@@ -884,6 +890,7 @@ export class RogueSpawningEngine {
spawnIndex++
remainingBudget -= stats.cost
totalCost += stats.cost
fillCount++
}
}