fix: 补回驭械术师普通攻击的本体伤害

This commit is contained in:
星闌 committed 2026-10-11 16:42:50 +08:00
1 parent bc50cac01f
commit 823e3d0af4
21 files changed
+1011 -710

No files matched your search

+3 -3
View File
@@ -1114,7 +1114,7 @@ Element conventions of the kits (user playtest #5 #3; official term dictionary:
targeting: { maxTargets, rangeGrid, rangeExtend, priority, allInRange, canHitFly,
noRangeExtend /* the skill's range ignores the unit's 攻击距离 (rangeExtend): 信仰搅拌机 S3, PRTS 备注 */,
showOwnRange /* rangeGrid only selects targets, no official range change: the card keeps the unit's own range */ },
attack: { dmgType, atkScale, healScale, splashRadius, splashScale, hits, projectile, maxTargets, dmgMul,
attack: { dmgType, atkScale, healScale, splashRadius, splashScale, hits, projectile, maxTargets, dmgMul, funnelMul, funnelBodyHits,
chain: {count, falloff, radius, sluggish}, heal: {mode, count, falloff, hpAtMost /* targets at or below this HP ratio only */}, onHitStatus: {key, duration, value},
onHit(ctx), // once per attack (main target; target may be null for a splash landing)
onEachHit(ctx) }, // per victim: main, every splash / chain victim — ctx += { dealt, kind:'main'|'splash'|'chain', isSplash, isChain, main, attackId }
@@ -1202,7 +1202,7 @@ chess_char_2_07_a: (bb) => ({
twice; 2 charges; the funnel profile already ramps damage on the same target):
```js
chess_char_3_13_a: (bb) => ({
skill: { kind: 'charges', attack: { atkScale: bb.atk_scale, hits: 2, dmgType: 'arts' } },
skill: { kind: 'charges', attack: { atkScale: bb.atk_scale, hits: 2, funnelBodyHits: 2, dmgType: 'arts' } },
}),
```
An AoE instant (德克萨斯 剑雨, bb `stun 2`: two hits of 120 % arts around her + stun) uses `onStart` instead:
@@ -1341,7 +1341,7 @@ header of professions.js).
| loopshooter | 回环射手 (user playtest #3): every attack throws a boomerang (`ai.js throwBoomerang`, projectile `'boomerang'`) out to the target at 15 tiles/s — it hits on arrival — and back to the thrower's current position at 3.75 tiles/s without damage (PRTS 跃跃 "投射物飞行速度15,返回时飞行速度3.75"); attacks only while holding it (every boomerang thrown caught — "必须回收全部回旋投掷物才可以进行下一次攻击", `unit.trait.boomerangsOut`) and with the attack cooldown ready, so the real interval is the longer of the two; a target dead mid-flight is not hit (it still flies to the last position and back); knocked out / withdrawn ⇒ lost, a redeployed thrower holds a fresh one; 跃跃 S2's extra boomerangs share the one flight (cnt hits); each catch fires `boomerangCaught`, and an attack profile's `boomerangOnward(ctx)` flies it on after the first hit before it turns back — ctx `hit` (a hit of the same attack), `comeBack(x, y)` once (a content error sends it back from the hit point): 娜仁图亚 S1 bounces, S2 dashes on and hits on its way back (kits/ops/op-narant.js) |
| reaperrange | hits every enemy in range; ×1.5 (bb atk_scale) on the trait front grid (or its own line ahead) — both along its direction |
| chain | chain N (trait text/bb max_target) with −15 % per jump (bb chain.atk_scale), 1.7-tile jumps (constants.js CHAIN_RADIUS, PRTS 溅射半径一览: 链术师 1.7; 1.8 until 0.1.1), sluggish on each hit |
| funnel | drone damage 20 % → +15 %/hit on the same target → 110 % (bb init/delta/max) |
| funnel | normal attack: one 100 % ATK body hit plus separate drone additional damage, 20 % → +15 %/hit on the same target → 110 % (bb init/delta/max; modules can change init/cap). `funnelMul` holds the drone ramp; `dmgMul` applies to both. Extra drones (`hits`) do not duplicate the body; an unreleased skill attack can set `funnelBodyHits` (至简 S2: two body hits and two additions). Body and additions share an `attackId`, but only the body is `isAttack`; additions carry `addition, funnel`. [ASSUMED] body instances first at the existing impact, one ramp per volley. Released-skill profiles keep their existing paths; this normal-attack correction does not settle their body behaviour. |
| mystic | 秘术师 (PRTS 分支特性信息 秘术师, GitHub #181): at its attack check (the attack ready, able to act, not disarmed) with no valid target — no target, or its kit's `canAttack` false (深靛 never picks a bound enemy) — it stores one energy (`storeEnergy`, up to bb times: 3, 深靛's MSC-X 4), an attack action: the attack interval restarts; a full store idles with the attack ready. The energies leave with its next attack that happens (`releaseEnergy` in `performAttack`, after `beforeAttack`: an attack cancelled before its shot keeps them) and land with the main hit, one arts attack hit each (`hitsFn` reads the hit's `info.energy`); a redeployment holds none [ASSUMED]. 维伊 / 黑键 plug their own `storeEnergy` (转置能量, elite energies) into the same check |
| phalanx | no attack & DEF +200 %, RES +20 (bb) while the skill is off; while on, `rangeAoe`: each attack strikes every selectable enemy on its range at once (blocked enemies included; a stealthed one only when revealed or blocked), the same damage near and far, instant (`'beam'`) — "群体法术伤害" (secondary: Terra Wiki, Phalanx Caster: "attacks hit all enemies within their range"; supporting: PRTS 林 S3 备注 "单次普攻最多触发1次效果" — one normal attack can kill several — the same 锁定攻击范围 shape as the 轰击术师, and PRTS 溅射半径一览 documents no splash radius for it (it omits the 撼地者 too, so this is not proof); no primary source states a target cap; community report E3: it used to be one bolt + a 1.1 splash). 卡涅利安's charged S1 keeps the skill-off trait, 不攻击 included (kit `canAttack`, PRTS 备注) |
| physician | heal the lowest HP% injured ally in range (a skill `targeting.maxTargets` widens any heal profile) |
+10
View File
@@ -167,6 +167,16 @@ Profession traits (default behaviours implemented once in the engine, keyed by `
---
Unreleased `funnel` drones deal **additional** arts damage alongside the caster's ordinary attack (PRTS
[驭械术师](https://prts.wiki/w/分支特性信息/data#驭械术师)). The engine keeps a 100% ATK body instance and a separate
drone instance, each through mitigation and shields. `funnelMul` holds only the drone ramp; the attack's `dmgMul`
(至简's talent) is shared once. Extra attached drones raise `hits`, not the body count; 至简's charged S2 explicitly
sets `funnelBodyHits` to two. Both components share one `attackId`, attack hook and SP/charge use; additions have
`addition, funnel` tags and do not count as `isAttack`. [ASSUMED] Body instances precede additions at the existing
projectile impact; consecutive hits keep one ramp per volley. This correction covers ordinary and strengthened
ordinary attacks. Released skill paths retain their existing behaviour; it does not establish whether those
skills should also have body attacks (耶拉 S2 / 澄闪 S1 and S2 remain to be reconciled separately).
## 7. Content modules (server/sim/content + match/effectsMeta handlers)
Each domain file `server/sim/content/{tokens,bonds,garrisons,items,bands,enemies,bosses,devices,choices}.js` exports `install(battle)` (battle side; called once per Battle by `content/index.js → installContent`) and `registerMeta(registry)` (prep side; called once at server boot by `match/effectsMeta.js`, API documented in `docs/META.md`). Kits live one per file in `content/kits/ops/` (`export default { [baseChessId]: (bb, chess, def) => Kit }`), listed in `content/kits/index.js` (guide: `content/kits/README.md`). Content must be **data-driven from blackboards** (numbers never hard-coded when a blackboard key exists). Every effect gets at least one unit test in `test/content/*.test.js` using the `test/helpers/battleHarness.js` harness (provided by sim-core).
+20
View File
@@ -274,3 +274,23 @@ enemy: picking emitted a unit click with no definition, instead of the tile clic
engine-canvas regression retains the card/100 HP assertions and also covers another field refresh, live HP loss and
closing the card when the crate is destroyed. Device metadata supplied by the new entry still wins; changing fields
does not carry old devices across. Gameplay and allied targeting rules are unchanged.
### 29.15 Funnel caster ordinary body damage
[PRTS 驭械术师](https://prts.wiki/w/分支特性信息/data#驭械术师) describes unreleased drone damage as additional damage.
The old profile used its 20%→110% ramp for the whole attack: normal 洛洛 at ATK 283 against RES 0 lost only 56.6 HP
on the first hit. The body now deals 283 separately and the attached drone adds 56.6. Mitigation, hit-count HP and
shields apply to each instance. Extra attached drones do not multiply body hits; 至简's charged S2 has two body hits
and two additions, with one talent roll shared by all four. Field migrations in 耶拉 / 荒芜 kits preserve existing
released-skill damage; independent virtual drone paths are unchanged.
Controlled Battle regressions cover normal/elite 洛洛、至简、耶拉 (tiers 3 and 4)、荒芜 and all eight 澄闪 DIY forms,
RES, hit-count HP, a one-hit barrier, attribute skills, overload and attached drone count. A production Match and a
headless Chrome run both reproduce the first-hit defect through legal actions at service seed 6: standard solo,
华法琳, level up in round 1, buy 洛洛 in round 2 and place at (11,8) facing LEFT. Natural 奥术 raises her ATK to 311.3;
the old first hit is only 62.26. No HP, SP, units or network commands are injected for that route.
[ASSUMED] Body instances precede drone additions at the existing projectile impact, with one ramp per consecutive-hit
volley. The source confirms additional damage and 至简's skill multiplier on drones, not that exact event order.
Released-skill body behaviour remains outside this ordinary-attack correction: 耶拉 S2's source explicitly mentions
both her own and drone attacks, and 澄闪 S1/S2's existing `noAttack` still needs separate reconciliation.