feedback1b WI: static-body enemies are never pushed or pulled (B5: 薄绿 vs drones)

Player report after 0.1.0: "飞机可以被薄绿的技能拉走". Real. PRTS 特殊机制 静态刚体:
such a unit "可以进入失衡状态…但物理层面上无法产生任何速度或移动", independent of
its movement type. Every air unit of the mode except “炎佑” lists it in its PRTS
天赋, and so does the ground boss 盐风主教昆图斯.

- build-data: STATIC_BODIES (from the enemies' PRTS pages, like HIT_AREAS)
  writes enemies.json `staticBody: true` on those 28 keys; data regenerated
- Battle._displaceable: a static body moves 0 tiles from every push or pull;
  the skills that reach it still hit it (薄绿 S2, 锏 S3, the hookmasters)
- 刺胄之弹 / 斩胄之剑 / 破胄之锤 also get 失衡免疫 (PRTS 天赋)
- ground enemies keep the 力度 − 重量 tables; the hovering 吉兆飞鳞 / 掠海漂移体
  stay 失衡免疫 while they hover and movable once grounded
- tests: the player's scenarios (薄绿 S2 vs 妖怪 / 寒霜, the act2 m01 drone), the
  data list, and an audit of every displacement source against ground, static
  air, dynamic air, hovering and 胄-shell targets
This commit is contained in:
sganggs committed 2026-10-03 03:17:00 +08:00
1 parent 7f134737ce
commit f9f26cea52
11 files changed
+416 -18

No files matched your search

+4 -2
View File
@@ -708,7 +708,7 @@ const KITS = {
// ---- 3_07 见行者 · 推击手 (hidden) — S2 惊爆射击: push every enemy in the skill range forward + stun (longer when
// slammed into a wall, collided enemies stunned too; air units too [ASSUMED: "范围内所有敌人", no 对空 note on
// PRTS] — a 失衡免疫 enemy is not pushed but still stunned); 技巧射击: ignore DEF vs heavy enemies;
// PRTS] — a 失衡免疫 enemy or a 静态刚体 (the drones) is not pushed but still stunned); 技巧射击: ignore DEF vs heavy enemies;
// 精锐 module PUS-X: redeployed on a ranged tile ⇒ half the deployment cost back
chess_char_3_07_a: (bb, chess, def) => {
const d = defOf(chess, def);
@@ -816,7 +816,9 @@ const KITS = {
onHit({ battle, unit, target }) {
if (!target || !target.alive || target.side !== 'enemy') return;
// PRTS 备注: "此技能的“拖拽”机制实际为反方向(指向薄绿方向)的推开" — a radial push towards her by the
// official 力度 − 重量 push distance (小力 vs weight 1: 0.44 tiles), never past her (Battle.push inward)
// official 力度 − 重量 push distance (小力 vs weight 1: 0.44 tiles), never past her (Battle.push inward). Her
// attack reaches air units (阵法术师 "攻击时可对空"), but the drones of the mode are 静态刚体 (PRTS 特殊机制): hit,
// never dragged (player report after 0.1.0, "飞机可以被薄绿的技能拉走")
if (battle.push(target, pullForce, { from: unit, inward: true }) > 0) fx(battle, 'pull', target, { src: unit.id });
},
},
+3 -2
View File
@@ -53,7 +53,8 @@
// while they roam; 头狼 stage 2 "特殊能力失效" = silence; stage 3 = +1 drone (normal attacks hit once
// more, S3 releases one more drone). Base drone count 1.
// 6_19 锏 10 slashes every d_hit_interval, pulls every p_hit_interval, final blow (skill range) at the end;
// S3 slashes and pulls air units too (PRTS 备注 "可对空").
// S3 slashes and pulls air units too (PRTS 备注 "可对空"; a 静态刚体 — every drone of the mode — is hit
// but stays put: Battle._displaceable).
// 6_20 纯烬艾雅法拉 5 shots are padded by cycling targets when fewer injured allies exist.
//
// Operator loadouts (DESIGN §16): every visible chess also authors its selectable NON-default skills in `skills`
@@ -2939,7 +2940,7 @@ function blkkgt(bb, chess, def) {
// removes the skill's range
const skillKeys = (unit) => unit.rangeKeys || [];
// S3 hits and pulls air units too — PRTS 锏 S3 备注 "※可对空。不会拖拽自身中心半径0.6708范围内的敌人" (her attacks and S1 /
// S2 stay ground-only: "地面敌人")
// S2 stay ground-only: "地面敌人"); the air units of the mode are 静态刚体, so the pull leaves them in place (Battle.pull)
const victims = (battle, unit) => {
const c = battle.enemiesInKeys(skillKeys(unit), unit, { ...unit.profile, canHitFly: true, groundOnly: false });
sortEnemyTargets(battle, unit, c, null);