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.
91 lines
9.7 KiB
91 lines
9.7 KiB
|
3 weeks ago
|
# 方案:怪物技能
|
||
|
|
|
||
|
|
> 状态:框架已落地;奔波儿灞 30105、牛魔王 30106、六耳 30107、蟹将 30205、龟丞相 30206、敖广 30207、黑无常 30305、白无常 30306、谛听 30307、千里眼 30405、顺风耳 30406、太白 30407 已落地
|
||
|
|
> 日期:2026-09-04
|
||
|
|
> 关联:[方案-战斗技能逻辑层.md](./方案-战斗技能逻辑层.md)、[方案-出怪逻辑实现.md](./方案-出怪逻辑实现.md)
|
||
|
|
|
||
|
|
## 1. 目标(本切片)
|
||
|
|
|
||
|
|
1. `Monster.skill` 关联 `Skill.id`,出怪后按表进入 OnTick 施法。
|
||
|
|
2. 怪物技能 `target_stage=1`(敌人)默认只打 **敌方阵营、Hero.herotype ≠ 2**(非组合英雄 / Weapon2.type≠2 组合字)。无特殊需求时不选 type2。
|
||
|
|
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`:只保留 herotype≠2 且非多格组合的塔(`atk_type=9` 除外,要打组合弓将);`atk_buff1` 类型 12 再加 `monsterBasicHero`(仅 herotype=1、**跳过已损毁**);类型 6 再加 `monsterRandomPick`(全屏洗牌后再取 `atk_para` 个数);`atk_type=9` 再加 `weaponType`=将 id(Hero.weapon,4=弓,含组合武将) |
|
||
|
|
| 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 | 怪 | 表现 |
|
||
|
|
|---|---|---|
|
||
|
|
| 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 只锁 `herotype=1` 基础字。类型 6 对每个锁定目标播降雨并加攻速(不走 `ApplySkillAtkBuff`);攻速写 `aspd_add` 万分比,负值降攻速。类型 5 范围内没有可吞小兵则不施法。`target_stage=2` 的 30407 对每个同侧友军上 buff(含自身)。`target_stage=3` 的 30107 / 30305 不锁敌。`ApplySkillAtkBuff` 对 `ctx.targets` 全部目标生效(龟丞相 / 白无常 / 顺风耳)。
|
||
|
|
|
||
|
|
## 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` 失效至合成升级 |
|
||
|
|
| 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` + `怪_加速` |
|
||
|
|
| 表现分发 | `SkillController` 跳过;Host 听 `PresentationCue` |
|