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

16 KiB

方案:战斗技能逻辑层(普攻 + 英雄技能 + 武器技能)

状态:已落地(2026-08-29)
日期:2026-08-29
关联:需求-新项目概述.md、assets/script/battle/docs/需求说明.md

1. 术语

对外说法 配表 / 代码 含义
技能 Skill / ITableSkill 战斗技能配置(普攻形态、主动、被动、额外效果)
普攻 Hero.atk_id[level-1] → Skill.id 每塔 1 个,随合成等级取数组索引
英雄技能 Hero.act_skill[level-1] → Skill.id 可无;按合成等级取索引
武器技能 Weapon.act_skill → Skill.id 局外装备确定;type=1 主动 / type=2 被动
词条 — 旧三选1表已删;代码遗留路径须空操作,禁止把新 Skill 当词条

代码里历史变量名 weapon1Id 仍表示 Hero.id,新增代码优先用 heroId。

2. 三槽模型

Hero(合成等级 level)
  ├─ atk_id[level-1]     → 普攻 Skill
  ├─ act_skill[level-1]  → 英雄主动 Skill(可空)
  └─ 装备武器 weaponId
        └─ Weapon.act_skill → 武器技能(0=无;type 分流主动/被动)

装备解析:gg.equip.getHeroDisplayWeaponId(heroId)(穿戴 >0 用穿戴,否则 Hero.startweapon)。

3. Ability id

种类 id 格式
普攻 ability_norm_{skillId}
英雄主动 ability_hero_{skillId}_e{entityId}
武器主动 ability_weapon_{skillId}_e{entityId}
怪物技能 ability_monster_{skillId}_e{entityId}

4. 主动技施法队列

  • 普攻:OnTick + 攻速;interruptibleByCast,施法锁期间冻结
  • 英雄主动 + 武器主动(Skill.type=1):Skill.priority 只排序,同时就绪必须全部排队串行释放,禁止因 priority 高低丢掉
  • 同 tick / 施法锁占用:只放队头一个;其余 timer 保持就绪,锁解开后立刻放下一个;同 priority 保持 abilityIds 原序
  • 施法锁未释放时不叠放下一主动,也不放普攻

5. 被动(Skill.type=2)

读 condition / result,挂实体被动运行时;不进 OnTick 施法队列。

不回触发:result 字段产生的一切效果不再回判任何 condition。其伤害不进条件 1/4,其击杀不进条件 5;结算期间抬闸,连同该次伤害带出的额外伤/击杀一并排除。不靠伤害类型白名单。经验/掉落仍结算。condition 3/6 只听 AbilityCast(普攻/主动),被动 result 不走施法,不会叠次数。

result 1(剑阵):同施法者同 Skill.id 只保留一团,再次触发刷新落点与剩余持续,不叠多团。例:诛仙剑 1,100,0.3,3000,5。

击退落点:须可走且能寻路到攻击点(距离场有限)。直线推出场外/断路格则沿射线回退;再不行沿进路退。禁止落到无法 assignPath 的格。

result 7(爆炸火球):参数 最大数量,伤害系数万分比,飞行速度像素/秒,飞行时间秒。在触发点(击杀目标)按 360/数量 均分方向直线飞出,穿透且每敌只伤一次;飞满配表时间后逻辑结束、表现到终点回池。例:火尖枪 7,8,4000,320,1。

result 9(直线火龙):参数 飞行速度像素/秒,伤害系数万分比,持续秒。从施法者沿触发目标方向匀速飞满持续时间,穿透且每敌只伤一次;不因命中消失。体盒按预制体 100×30 再加半格占地(与 atk_type 12 一致)。表现沿同一逻辑方向飞(Cocos Y 取反),不跟腰点重瞄。例:龙舌弓 9,400,10000,4。

result 10(改普攻):触发后覆盖该宿主普攻 Skill 的 atk_type / atk_para,按实体重建 ability_norm_{id}_e{entity}。不改共享配表,避免同技能其他塔串台。例:10,12,5,12,10000 → atk_type=12,atk_para=5,12,10000。

result 11(直线剑气):参数 数量,间隔秒,伤害系数万分比。按间隔连发;优先各朝不同敌人(触发主目标优先,其余随机),敌数不足则循环复用同一批目标仍发满数量。穿透且每敌只伤一次;飞出地图边界结束。表现用 battleHero/prefab/skill/玉帝刀光,飞出可视区后回池。飞行速度代码常量(表无速度段)。动画:轩辕剑 剑气蓝,吴钩双剑 剑气红。例:轩辕剑 11,3,0.3,15000。

result 12(闪电链):参数 蔓延范围像素,蔓延数量,伤害系数万分比。从触发目标起跳,向范围内未打过的最近敌蔓延(触发目标算第 1 跳,不重复)。每跳先出电弧/受击,间隔后再结算该落点伤害。表现用老项目 电母-大招(普通雷电)与 电母-大招受击(普通受击),传导间隔对齐资源时长/2。例:三尖两面刀 12,200,5,120000。

6. 逻辑 / 表现契约

逻辑 表现
索敌、命中、伤害、buff、CD 动画 / 弹道 / 特效

打敌方时索敌一律按威胁:沿当前路离目标营地越近越优先(已抵墙最高);剩余相同则离施法者更近者优先。友军/自身仍按原 selector。monsterRandomPick(怪技 atk_buff 6)仍洗牌。 | PlayPresentation 发出 cue | SkillController → onAttack / onSkill / onWeaponSkill | | DealDamage 在 deferred 或逻辑几何结算 | 禁止碰撞 AABB 作为唯一伤害源 |

cue

cue 含义 Skill 方法
attack 普攻 onAttack
skill 英雄技能 onSkill
weaponSkill 武器主动 onWeaponSkill
monsterSkill 怪物技能 MonsterSkillHost 播 Skill.animation(见 方案-怪物技能.md)

PlayPresentation.params

字段 类型 说明
skillKind 'normal'|'hero'|'weapon'|'monster' 槽位
skillId number Skill.id
heroId number Hero.id
weaponId number 当前武器 id
composeLevel number 合成等级
animation string 动画名
atkType / atkPara string 形态与参数
fly string 投射物
showeffect string 预兆:延迟秒,预制体名(battleHero/prefab/skill);空则无。有值时命中/buff/extra 等预兆起播后 0.33s 再施加
priority / cd number 优先级 / CD
extraSkill string Skill.skill 额外效果
buff1 / buff2 string 命中 buff
targetEntityIds number[] 逻辑锁定目标快照

表现只读上述字段;时刻对齐可调 ctx.hit() / ctx.finish(),不自行算伤害目标。

atk_type 2 / 5 前向矩形

朝威胁最高的敌开口:长=射程(沿朝向),宽=atk_para 第 1 段像素(左右各一半)。占地盒与该条带相交即命中,不再外扩半格。

atk_type 14 360° 多段

圈半径=Skill.range(≤0 则塔射程)。atk_para=段数,间隔秒,伤害万分比(例 5,0.2,5000 = 5 段、间隔 0.2s、每段 50%)。无 deferred 段;开战仅作施法门槛,每段伤害以施法者为圆心 pulseHostileCircle 重新索敌后 dealDamage(含 atk_buff)。有 showeffect 也只播预兆,多段伤害出手即按 PRES_HIT_AT_BASE 起跳,不等预兆。武器动画 loopWeapon 循环至全部段结束(与伤害时长同步,如棍神通「原地旋转大风车」),段尽 endHoldCast 收招。

atk_type 10 连续多个单体

atk_para=次数,间隔秒,伤害万分比。Skill.range 内按威胁锁最多 N 个单体。

  • 飞剑武器主动(Skill.id 210101~250101,fly=飞剑):瞬发;按间隔依次实例化 飞剑.prefab 飞向目标,落地才结算伤害(无 deferred 段);飞棍连砸不走此路径。
  • 其余(如飞棍狠击 / 金箍棒连砸):按间隔砸满 N 次,每次独立武器实例(克隆 weaponType*),砸出帧对齐命中。

atk_type 15 目标圆形

Skill.range 内先锁主目标,再以主目标为圆心、atk_para=半径(px),伤害万分比 收圆内敌(可含射程外)。半径与黄圈同一套:配表像素/83=格,按格心距;并扫格子占地,避免漏塔。圆内仍排除组合字。表现层瞬时类;怪物 skill=9 时在主目标处挂 干扰迷雾(尺寸由资源控制,不等于逻辑半径)。

atk_type 16 扇形多段

atk_para=段数,间隔秒,角度,伤害万分比(例 2,0.3,60,10000 = 2 段、间隔 0.3s、扇形 60°、每段 100%)。索敌同 atk_type 6 扇形:圈半径=Skill.range(≤0 则塔射程),朝威胁最高的怪开口,保留夹角 ≤ 角度/2 的目标。每段 hit() 结算一段,段间按间隔推进。atk_buff1/2 仍按原命中效果随每段 DealDamage 施加(如击退 2,5000,50)。

atk_type 18 目标圆形多段(丢出独立持续)

atk_para=段数,间隔秒,半径,伤害万分比。开战时以主目标逻辑坐标锁圆心与半径;无 deferred 段。瞬间 releasePresentationLock + finish,不占普攻;实例化 battleHero/prefab/skill/飞棍 飞向落点(缩放=半径/175,对齐预制体 350 边长),落地后由 ThrownCircleHost 按段调用 pulseHostileCircle 重新索敌圈伤(可与普攻并行)。行上 atk_buff1/2 随每段影子伤害施加。

atk_type 20 目标圆形多段(暴风雪地面持续)

atk_para 同 18(段数,间隔秒,半径,伤害万分比)。开战时以主目标逻辑坐标锁圆心与半径;无 deferred 段。占施法锁至全部段结束(期间不可普攻);武器循环播 Skill.animation(如「暴风雪技能」),同时在主目标落点实例化 battleHero/prefab/skill/暴风雪(缩放=半径/200;预制体默认循环),由 GroundCircleHost 按段 pulseHostileCircle 重新索敌圈伤。行上 atk_buff1/2 随每段影子伤害施加。

atk_type 19 直线冰锥

atk_para=数量,伤害万分比。射程内按威胁锁最多 N 个敌(Skill.range≤0 则塔 Hero.atk_range,与点击范围圈一致);对每个目标发直线「冰锥」预制体,落地结算伤害与 atk_buff。配表写「根据范围内怪物数量」,禁止全屏 AllEnemies。

atk_buff 13 冰冻

参数:概率,冰冻秒。挂 debuff_13(定身 + 禁施法)。表现用 冰冻 预制体覆盖怪物:REALTIME 定格「怪物冻结」首帧冰块(不 loop,避免末帧卸附件闪烁);BuffRemoved 时播「怪物冻结2」破冰再回池;飘「冰冻」。部署 loadout 不施加。

atk_buff 14 点燃

参数:间隔秒,伤害系数万分比,持续秒。挂 debuff_1,立即首跳再按间隔跳伤(burn_dot)。被动 result 附带施加时用 passive_burn / fromPassiveResult,不回触发 condition。部署 loadout 不施加。

result 13 分裂冰锥

参数:索敌半径像素,分裂数量,伤害万分比。从触发目标向半径内其它敌(按距排序)发最多 N 枚冰锥,落地伤;行上 atk_buff1/2 非空时对落地目标 applyPair。

result 14 爆炸

参数:爆炸圆形半径,伤害系数万分比。以触发目标为圆心圈伤(fromPassiveResult)。仅当行上 atk_buff1/2 非空时对命中目标 applyPair(不为 desc 补效果)。

6b. 血量上限(配表)

Skill.atk_buff type 4、营召唤 atk_buff type 4、局外被动 functiontype=15:上限 ×(1+万分比/10000),保持原当前血量/上限比(例:100 上限 70 当前 +20% → 120 / 84)。允许时播 血量上限 并飘「血上限」+上箭头,不播 怪物加血;营召唤出生加成不播。不是单纯加血(type 10 / skill extra 4)。

atk_type=7 的 atk_para 第 1 段是最多目标数上限(如悟净治疗术 100,0),target_stage=2 锁己方行军怪/友方召唤,每人只结算一次,不足不循环补位。

7. 修订记录

日期 说明
2026-08-29 初版:三槽、priority 队列、逻辑伤害、表现 cue
2026-08-31 表现层见 方案-战斗表现数据驱动.md
2026-09-02 被动 result 10:按宿主覆盖普攻 atk_type / atk_para
2026-09-03 配表血量上限保持原血量比,当前血量增加时播加血特效
2026-09-04 怪物技能框架:出怪绑定 + 播释放动画;效果逐个实现见方案-怪物技能
2026-09-04 Skill.skill 类型 9:干扰迷雾,参数为显示秒;奔波儿灞 30105
2026-09-04 Skill.atk_para 伤害万分比写 0 表示无直伤(悟能/悟净/玉帝)
2026-09-05 打敌方索敌优先离目标营地最近(威胁最高)
2026-09-07 atk_type 2/5 前向矩形去掉半格 pad,宽高只按配表
2026-09-07 atk_type=14:360° 圈内多段伤害
2026-09-07 营召唤出生 type4 血量上限不播加血特效
2026-09-08 atk_type=15:主目标圆心范围;奔波儿灞迷雾改挂主目标(尺寸由资源控制)
2026-09-08 被动 result 11:轩辕剑直线剑气(玉帝刀光,间隔连发,穿透出界回收)
2026-09-08 被动 result 7:击杀点爆炸火球多向穿透(数量角分、速度/时间配表,到终点回收)
2026-09-09 被动 result 9:直线火龙穿透体盒按半格放大;表现与逻辑同向,不跟腰点重瞄
2026-09-10 被动 result 12:三尖两面刀闪电链(从目标起跳,范围/数量/系数配表,电母大招表现)
2026-09-11 血量上限提升飘「血上限」并显示 battleText 上箭头
2026-09-11 血上限播 血量上限 不播 怪物加血;阎王生死簿对敌直伤播 怪_流血
2026-09-11 被动 result 伤害/击杀不回触发 condition 1/4/5
2026-09-12 result 全程抬闸 + fromPassiveResult,不再用伤害类型白名单;其伤害/击杀不回判任何 condition
2026-09-12 result 伤害立即派发 DamageDealt,跳伤结束前 flush 残留事件,避免帧末出闸后回触发(诛仙剑阵)
2026-09-12 剑阵同塔同技能不叠加,再次触发刷新落点与持续
2026-09-11 击退落点须在攻击点距离场内,避免推出后无法寻路
2026-09-11 atk_type=15 圆半径按配表 83px/格 + 占地扫描;奔波儿灞迷雾起播即降攻速
2026-09-11 atk_type=10:连续多个单体(次数,间隔秒,伤害万分比),如意金箍棒 20501
2026-09-11 atk_type=10:每次砸独立武器实例,不在原武器上重播
2026-09-11 target_stage=2:maxCount 仅为上限,每人一次,不循环补位(悟净治疗术/悟能疾行术)
2026-09-30 atk_type=16:扇形多段(段数,间隔秒,角度,伤害万分比);atk_buff1/2 命中效果保持不变(100001~100005)
2026-10-04 atk_type=18:丢出独立圈伤(瞬发不占普攻);atk_type=20:占锁且每段播 animation;result 14 爆炸;atk_buff 14 点燃
2026-10-08 atk_type=19 全屏直线冰锥;atk_buff 13 冰冻;result 13 分裂冰锥;飞棍 320301~350301 atk_para 补间隔段
2026-10-09 atk_type=19 改射程内索敌(与范围指示器一致),不再 AllEnemies 全屏
2026-10-08 飞剑主动 210101~250101:飞剑.prefab 直线落地伤;剑阵 result1 仍为目标点区域持续跳伤
2026-10-08 atk_type=18/20:每段伤害按锁定圆 pulseHostileCircle 重新索敌,非施法瞬间名单、非怪上持续 buff
2026-10-08 atk_type=18:丢出 飞棍.prefab(按半径缩放),落地后持续圈伤
2026-10-08 atk_type=20:主目标圆心放置 暴风雪.prefab;占锁并循环播「暴风雪技能」至圈伤结束
2026-10-09 冰锥发射物改「冰锥」;冰冻覆盖「冰冻」播怪物冻结/解冻怪物冻结2
2026-10-09 atk_type=14:武器动画循环至多段伤害结束(棍神通大风车与时长同步)
2026-10-09 atk_type=14:每段按施法者射程圆重新索敌,非开战锁定名单