You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AdLike2048/docs/方案-怪物技能.md

96 lines
11 KiB

3 weeks ago
# 方案:怪物技能
> 状态:框架已落地;金 Boss 11101、水 Boss 31101、火 Boss 41101、土 Boss 51101、奔波儿灞 30105、牛魔王 30106、六耳 30107、蟹将 30205、龟丞相 30206、敖广 30207、黑无常 30305、白无常 30306、谛听 30307、千里眼 30405、顺风耳 30406、太白 30407 已落地
3 weeks ago
> 日期:2026-09-04
> 关联:[方案-战斗技能逻辑层.md](./方案-战斗技能逻辑层.md)、[方案-出怪逻辑实现.md](./方案-出怪逻辑实现.md)
## 1. 目标(本切片)
1. `Monster.skill` 关联 `Skill.id`,出怪后按表进入 OnTick 施法。
2. 怪物技能 `target_stage=1`(敌人)默认只打 **敌方阵营五行单字**(`Hero.herotype` 1–5 金木水火土,且非多格组合)。新表 `herotype` 表示五行,不再用旧「≠2=非组合神将」。
3 weeks ago
3. 做到播 `Skill.animation`(多为「技能」)并 `finish` 解锁;伤害 / 召唤 / debuff / 冲锋等 **后续逐个核对**。
## 2. 管线
```
UnitSpawned(波次 / 营召唤 / atk_type=8 召唤)
→ MonsterSkillHost 读 Monster.skill
→ SkillAbilityBuilder.buildMonster
→ registerAbility + AbilitySetComp + abilities.bindEntity
→ OnTick(interval=Skill.cd;普通怪 firstDelaySec=0 跳出后即放;Boss firstDelaySec=cd 跳出后先满 CD 再放)
→ PlayPresentation cue=monsterSkill
→ MonsterSkillHost 播 Spine(施法者 presentLocked 停步),结束后解锁并回走路 finish;**门神盾牌顶推期间仍同步位移**(Boss 施法锁不得把怪钉死)
```
不给怪物挂 `Skill.ts` / HeroActor。`SkillController` 忽略怪物 cue,避免按塔去绑 HeroActor。
## 3. Ability
| 项 | 约定 |
|---|---|
| id | `ability_monster_{skillId}_e{entityId}` |
| skillKind | `monster` |
| cue | `monsterSkill` |
| timeline | 默认仅 `PlayPresentation`;`atk_type=8/11` 挂 `SummonFromSkill`;非 6/9/12 且非 `target_stage=2` 的 `atk_buff` 挂 `ApplySkillAtkBuff`;动画结束后 `hit` |
| 被动 `Skill.type=2` | 不绑定,`warn` |
| `Skill.type` 非 1 且非 2 | `warn` 后仍按主动绑定(例:哮天犬 40001 表里 type=0) |
## 4. 索敌
| `target_stage` | team | 本切片 |
|---|---|---|
| 1 敌人 | enemy | `params.monsterEnemyHero`:只保留五行单字且非多格(`atk_type=9` 除外);`atk_buff1` 类型 12 再加 `monsterBasicHero`(同口径、**跳过已损毁**);类型 6 再加 `monsterRandomPick`(全屏洗牌后再取 `atk_para` 个数);`atk_type=9` 再加 `weaponType`=将 id(Hero.weapon,4=弓,含组合武将) |
3 weeks ago
| 2 友军 | ally | `params.monsterSameSide`:同一 `ownerId` 且同为敌/己的怪物;`skill` 类型 5 再加 `monsterDevourMinion`(仅小怪/召唤物),`stageStrategy=1` 去重 |
| 3 自身 | self | 无 `HasTargetInRange`,到点即放 |
`target_stage=1` 且范围内没有非组合英雄时,不施法、看不到动画(`atk_buff` 类型 9 千里眼除外:目标是格子,空 Put 也可封;`atk_type=9` 顺风耳除外:需场上有对应将 id 的弓字,含组合武将)。验收其它 `target_stage=1` 的怪时场上需有基础字/功能字;`self`(六耳 / 蟹将 / 黑无常)与千里眼不依赖敌塔;太白射程内无其它友军时仍可对自己放。行军怪索敌圆心跟当前格,不跟出生占地。
## 5. 已实现技能
| Skill.id | 怪 | 表现 |
|---|---|---|
| 11101 | 金系 Boss | `result=11,1,0,0` + `atk_buff1=12,10000`:播「攻击」后放直线剑气(玉帝刀光),伤害系数 0 仅表现;剑气穿透路径上命中的基础字按类型 12 击倒(禁攻倒下);`Skill.range=0` 单体全图索敌;动画结束不再立刻损毁主目标 |
| 31101 | 水系 Boss | `target_stage=2` 射程 208 `atk_type=3` `atk_buff1=3,10000,3000,3`:播「攻击」后给射程内**同侧友军怪(含自身)**移速 ×1.3 持续 3 秒(身上 `怪_加速`);走太白同源 Host 友军 buff 通路,`Skill.range` 须 >0 |
| 41101 | 火系 Boss | `atk_buff1=12,10000`:播「攻击」后损毁锁定的五行单字(同牛魔王类型12);`Skill.range=0` 全图索敌;**写死不锁当前场上等级最高的数字**(`monsterSkipMaxLevel`;场上仅最高级时不施法) |
| 51101 | 土系 Boss | `atk_type=3` 圈径跟 `Monster.atkdistance`(表 `range=0`)`atk_buff1=1,10000,3`:播「攻击」后按**当时位置**为圆心重扫周围五行单字眩晕 3 秒(`debuff_4` 禁攻 + 格上 `怪_晕眩`;不锁开战目标) |
3 weeks ago
| 30105 | 奔波儿灞 | `atk_type=15` `atk_para=半径,伤害`:射程内锁主目标(**跳过蟠桃树**;`atk_buff1` 类型6 时在非桃候选中随机),再对主目标圆心半径内敌方非组合字结算(半径按配表 83px/格 + 占地扫描);`skill=9,秒` 与葫芦同时在**主目标格**渐显 `干扰迷雾`(**隐藏全屏紫雾槽**,节点缩放 `0.2×0.4`;持续后渐隐);`atk_buff1=6,…` 迷雾起播即圆内降攻速(**不挂降雨**,降雨仅敖广);播「技能」同时出池 `葫芦` 挂怪物(预制体默认偏移),播 `技能葫芦` 并朝向同一目标格,播完回 45° 后回池 |
| 30106 | 牛魔王 | `atk_buff1=12,概率`:播「技能」后在锁定基础字格播 `损毁文字`,该字**失效禁攻**(可拖可换位,不激活),字形倒下转 -90°;**不选已损毁、不选组合字**;营损毁后 Host 停出怪,合成升级解除后恢复;**损毁跟字块走**(进背包仍倒下,交换不传染别的字;倒下只拧本格 HeroActor/字形,合成升级一把不得扶正另一把);**己方与敌方字均倒下**;ebg/营底框保持世界角与世界坐标;**合成升级**后回正 |
| 30107 | 六耳 | `atk_type=8` `atk_para=10002,4,0.5,2`:播「技能」后在**自身周围**每隔 0.5 秒招 1 只猴(共 4 只),阵营与六耳一致 |
| 30205 | 蟹将 | `atk_buff1=3,10000,30000,5`:播「技能」后自身移速 ×4,持续 5 秒(沿路冲锋) |
| 30206 | 龟丞相 | `atk_type=3` 射程 208 `atk_buff1=7,10000,3,5`:播「技能」后降低射程内非组合字 3 级(最低 1),持续 5 秒禁合成升级、可移动;期间等级字 `#bf3f48`,到期恢复等级 |
| 30207 | 敖广 | `atk_type=7` `atk_para=3,0` `atk_buff1=6,10000,-2000,5`:播「技能」后随机锁最多 3 个敌方文字,格上方挂 `降雨`(默认动画循环),攻速 ×0.8 持续 5 秒 |
| 30305 | 黑无常 | `atk_type=8` `atk_para=10003,1,0,2`:播「技能」后在**自身周围**招 1 只魂(Monster.id=10003) |
| 30306 | 白无常 | `atk_type=3` 射程 208 `atk_buff1=8,10000,5`:播「技能」后使射程内非组合字混乱 5 秒(禁攻),格上挂 `混乱效果` |
| 30307 | 谛听 | `skill=5,10,5000`:放技能时 Host **当场扫描**射程 208 内同侧小怪/召唤物(最多 10)吸入,动画结束 `despawn`(不发击杀桃),血上限 `×(1+只数×5000/10000)` |
| 30405 | 千里眼 | `atk_type=7` `atk_para=1,0` `atk_buff1=9`:播「技能」时在 Boss 处出 `千里眼技能`,光束瞄向目标格并按距离拉 X 缩放,落点播默认循环;同时在**被进攻玩家**可放置格中随机 1 格改为可开挖(空 Put 可选),地块 fillRange 0→1(铲子开挖反向);组合武将与组合字(`Weapon2.type=2`,含未成将散字)跳过;格上非组合单字销毁 |
| 30406 | 顺风耳 | `atk_type=9` `atk_para=4,99,0` `atk_buff1=8,10000,5`:播「技能」后令全屏 `Hero.weapon=4` 的弓字(含组合武将)混乱 5 秒(禁攻),格上挂 `混乱效果`;无弓字则不放 |
| 30407 | 太白 | `atk_type=3` 射程 291 `atk_buff1=3,10000,2000,3` `atk_buff2=10,3000`:播「技能」后给射程内**同侧友军怪(含自身)**移速 ×1.2 持续 3 秒(身上 `怪_加速`),并回复 30% 最大生命(`怪物加血`) |
| 40001 | 哮天犬 | `type=0` 仍按主动绑定;播「技能」后给射程 208 内同侧友军移速 ×1.2 持续 3 秒(`怪_加速`);己方皮 `哮天犬`、敌方皮 `哮天犬2` |
类型 9(封格 atk_buff)不走 `HasTargetInRange`(封格不锁英雄)。`skill` 类型 9 且**无** `atk_type` 时仍半屏迷雾、不锁英雄;`atk_type=15` + `skill` 9 则锁主目标并扩圆。`atk_type=9` 指定将走 `HasTargetInRange` + `weaponType`。类型 12 锁五行单字(非多格、跳过已损毁/蟠桃树);41101 再跳过当前场上最高等级。类型 6 对每个锁定目标播降雨并加攻速(不走 `ApplySkillAtkBuff`);攻速写 `aspd_add` 万分比,负值降攻速。类型 5 范围内没有可吞小兵则不施法。`target_stage=2` 的 30407 对每个同侧友军上 buff(含自身)。`target_stage=3` 的 30107 / 30305 不锁敌。`ApplySkillAtkBuff` 对 `ctx.targets` 全部目标生效(龟丞相 / 白无常 / 顺风耳)。
3 weeks ago
## 6. 本切片不做
- 哮天犬 40001 战吼时机(表 `Skill.type=0`,仍按主动绑定;皮肤 `哮天犬`/`哮天犬2`,动画「技能」已接入)
- 机制怪未发 `UnitSpawned` 的路径(白骨精等);波次 / 营 / 技能召唤已覆盖
- 改策划表、给怪物加 `Skill` 组件
## 7. 关键路径
| 用途 | 路径 |
|---|---|
| 绑定 + 播动画 | `assets/script/battle/combat/MonsterSkillHost.ts` |
| Ability 构建 | `SkillAbilityBuilder.buildMonster` |
| Ability id | `Weapon1BattleIds.entityMonsterAbilityId` |
| 默认敌人过滤 | `BattleHeroTable.isMonsterDefaultEnemyTarget` → `TargetResolver` |
| 类型12基础字 | `isMonsterBasicHeroTarget` → `TargetResolver`;`TowerRuinHost` 失效至合成升级;火 Boss 41101 另加 `monsterSkipMaxLevel` 剔除场上最高等级 |
3 weeks ago
| atk_type=9 指定将 | `params.weaponType` → `isHeroWeaponTarget`;`monsterEnemyHero` 关闭 |
| 类型6随机字 | `params.monsterRandomPick` → `TargetResolver` 洗牌;Host `applyPair` 降攻速;无 skill 类型9 时再播 `降雨`(敖广);奔波儿灞出池 `葫芦` 挂怪物(预制体默认偏移)、与迷雾同瞄主目标格 |
| 类型5吞噬 | `params.monsterDevourMinion` → `TargetResolver`;Host 吸入后 `lifecycle.despawn` + `applyMaxHpCoeff` |
| 类型9封格 | 施法起播:`千里眼技能` 根在 Boss、光束瞄格、落点默认循环;Host → `pickSealablePutTiles` + `sealPlaceableTiles`:随机 Put→Dig(跳过组合武将与 type2 组合字),单字 `deploy.sell`,地块 fillRange 0→1 |
| 类型7降级 | `TowerLevelDownHost`:钳制最低 1 级,持续秒内禁合成、可移动,到期恢复;等级字变色 |
| 类型12损毁 | `TowerRuinHost`:禁攻、可移动;不选已损毁 / type2 组合字;损毁写在字块上(进背包仍倒下,交换不传染;倒下只拧本格字形,升级一把不得扶正另一把);**己方与敌方 AI 地图字均倒下**;ebg/营底框保持世界角与世界坐标;合成升级解除。营出怪走 `YingCampSummonHost`,须跟 `castBlockPredicate`(损毁/魅惑)停出怪,解除后恢复 |
| 类型2友军 buff | `params.monsterSameSide` → `TargetResolver`;Host 扫描射程内同侧怪 `applyPair` + `怪_加速` |
| 类型1圈晕 | Host 动画结束按当前位置 `targets.resolve` → `applyPair` → `debuff_4`;`AbilitySystem` 禁攻;塔格 `SkillController` → `TextGrid.setStunFx`(`怪_晕眩`) |
| 表现分发 | `SkillController` 跳过怪物 cue;Host 听 `PresentationCue`;塔 debuff 特效仍由 SkillController 接 |