feedback3 WA: 联防 阿戈尔 devour counts the operators down since their own combat — they mark and are marked as if they stood (base ATK / block gains), then stay forced out (per players' reports, owner's decision 2026-10-04)
This commit is contained in:
1 parent
6f4a19a5c5
commit
0e2133de69
2 files changed
+97
-2
No files matched your search
@@ -40,6 +40,7 @@ import { mitigate } from '../../damage.js';
|
||||
import { spawnYanyou } from '../tokens.js';
|
||||
import { kjeragColdWind } from '../devices.js';
|
||||
import * as items from '../items.js';
|
||||
import { FORCED_EXIT } from '../../constants.js';
|
||||
|
||||
const num = S.num;
|
||||
|
||||
@@ -343,6 +344,8 @@ function installLaterano(battle, pid, bb, members) {
|
||||
* cancelled, also when it is back at once (the 5-tier 立刻复活, 不屈's 立刻重新部署, 埃芒加德 / M3茧甲): PRTS 盟约记录 "目标首次被
|
||||
* 击倒后解除自身被付与但还未触发的【吞噬】效果". A marker off the field gives no further mark (the rule since 0.1.0; one knocked
|
||||
* out and back in the same pass still gives its marks).
|
||||
* 联防: the operators down since the end of their own combat (forced out by Battle.start) mark and are marked like
|
||||
* standing ones, but nothing resolves on or from them (below; per players' reports, owner's decision 2026-10-04).
|
||||
* Each devoured operator adds its tier to 阿戈尔 once (IN_BATTLE gain, disabled in 联防 / boss fields).
|
||||
* Tokens / devices / empty tiles are never devoured.
|
||||
*/
|
||||
@@ -352,12 +355,22 @@ function devour(battle, pid, bb, members) {
|
||||
// first — row 0 is the BOTTOM row (DESIGN §3), so the top of the board is the highest row index. The order is a
|
||||
// board position, independent of the members' directions (only "身前" follows each member's `dir`).
|
||||
const boardCol = (u) => (u.player && u.player.mirror ? -u.tileC : u.tileC);
|
||||
const order = members.filter(S.onField).sort((a, b) =>
|
||||
// 联防: an operator down at the end of its own combat (carryState.down — Battle.start forced it out right before
|
||||
// battleStart, FORCED_EXIT) still takes part in the marking as if it stood on its tile: it marks in its turn, it is
|
||||
// "the unit in front" of another (the chain goes on through it when it is a member) and its base ATK / block count
|
||||
// for its marker — then it stays out: its marks and the marks on it resolve nothing (as for any unit off the field
|
||||
// during the pass), so it is never knocked out again, revived or devoured. Per players' reports (community report #3,
|
||||
// GitHub #33 item 3), owner's decision 2026-10-04; until 0.1.2 the forced exit came first and the chain broke there.
|
||||
const downAtStart = (u) => S.isOp(u) && !u.alive && u.removeReason === FORCED_EXIT && !!u.carry && u.carry.down === true
|
||||
&& battle.isDown(u);
|
||||
const order = members.filter((u) => S.onField(u) || downAtStart(u)).sort((a, b) =>
|
||||
boardCol(a) - boardCol(b) || b.tileR - a.tileR || a.id - b.id);
|
||||
const opAt = (u) => {
|
||||
const [r, c] = S.frontTile(u);
|
||||
const a = S.allyAt(battle, r, c, pid);
|
||||
return a && S.isOp(a) && a.alive ? a : null;
|
||||
if (a) return S.isOp(a) && a.alive ? a : null;
|
||||
const d = battle.downOn(r, c);
|
||||
return d && d.ownerId === pid && downAtStart(d) ? d : null;
|
||||
};
|
||||
const markedBy = new Map(); // marker → [targets]
|
||||
const marks = [];
|
||||
@@ -392,6 +405,7 @@ function devour(battle, pid, bb, members) {
|
||||
for (const [, t] of marks) if (!dep.has(t)) dep.set(t, items.deploymentOf(t));
|
||||
const knocked = (t) => !t.alive || items.deploymentOf(t) !== dep.get(t);
|
||||
for (const [m, t] of marks) {
|
||||
// (a member down since its own combat — downAtStart — is off the field: neither its marks nor the marks on it resolve)
|
||||
if (knocked(t) || !m.alive) continue;
|
||||
S.fxOn(battle, 'devour', t, 'bond:egirShip', 'devour', { from: m.id });
|
||||
if (amount > 0) battle.loseHp(t, mitigate(amount, 'phys', t.s), { source: m, tags: ['bond:egir:devour'] });
|
||||
|
||||
Reference in new issue
Block a user