feedback4: the 5-阿戈尔 revives go to the first 3 members knocked out, in knock-out order
The owner's decision of 2026-10-05, following players' reports (GitHub #105 comment 2, #140 comment 3 and a report the owner quoted): 0.1.3 fixed the 3 holders at battle start by position, so uneaten front members held slots they never used and whatever the food chain ate only 3 阿戈尔 stood. Now: - A member operator's first knock-out ('killed') of the battle takes a slot while fewer than 3 are spent, the battle-start devour included; it redeploys at once (free) where it lies. A member never knocked out takes none, so survivors = uneaten + 3. Later knock-outs never take one; a first knock-out after the 3 are gone stays down. - One slot at most per member however many 阿戈尔 mark it: the devour still cancels a target's pending marks once it is knocked out. The report that each devour of the same operator wastes a revive was checked and not reproduced on 0.1.3 (the extra marks were already cancelled); the fixed holders were what players saw. - An operator's own save uses no slot: every kit / item / band saver is a fatal hook (斯卡蒂's DRE-Y, M3茧甲, 坚固维式重锤, 埃芒加德) and runs before the death hook, so the unit is not knocked out; the 0.1.3 rule that an in-place save spends the holder's revive is gone ([ASSUMED] for 埃芒加德, a band, treated like M3茧甲). - 联防: a member entering down is not knocked out (no slot) until it stands up and falls again. 埃芒加德's own "first 3 knock-downs" rule is a separate hook and is unchanged. - research 02 §3.6 and its JSON spec; data/bonds.json regenerated offline (only egirShip.spec.tiers[2].effect changed). - Tests (bonds_core): knock-out order wherever members stand; the devour chain with 6 members (survivors = 2 + 3, normal and 联防); a member marked three times spends one slot; 斯卡蒂's DRE-Y, M3茧甲 and 埃芒加德 saves use none; 联防 / 调和 / mirrored boss player. All five fail on 0.1.3's code. Golden: no scenario moved (no corpus battle has a 5-阿戈尔 knock-out whose slot differs; bond-egirShip-high runs at 999 layers and nobody falls to the devour).
This commit is contained in:
1 parent
83fc408a55
commit
6ab9a0648c
5 files changed
+167
-114
No files matched your search
@@ -16,8 +16,8 @@
|
||||
// 拉特兰 lateranoShip member ammo skills start with floor(ammo × (1 + base_ammo_percent + ammo_percent_per_stack·L));
|
||||
// 6: every ammo used by a member → all members ATK +atk_per_consume (≤ max_atk_for_consume)
|
||||
// 阿戈尔 egirShip members max HP +(base_max_hp + max_hp_per_stack·L) (直接乘算); battle start devour (see devour());
|
||||
// 5: the first max_free_respawn_cnt members by position (the devour's order, fixed at battle
|
||||
// start) each redeploy at once (free) on their first knock-out
|
||||
// 5: the first max_free_respawn_cnt members knocked out (in knock-out order, the devour's food
|
||||
// included) each redeploy at once (free) on that first knock-out
|
||||
// 叙拉古 siracusaShip every member deployment: ASPD +(base + per·L) for (base_duration + per·L) s; 6: 隐匿 for the same
|
||||
// time, and while hidden / end_duration s after, every 普通伤害 hit (siracusaRolls) procs (PRD,
|
||||
// nominal `prob`) base_damage + damage_per_stack·L true damage + fear `fear` s
|
||||
@@ -34,7 +34,7 @@
|
||||
// Two players in one field: everything is per player (own members, own deployments); the 谢拉格 wind and 炎佑 act on
|
||||
// every enemy of the field (debuffs on shared enemies help both, research 06 §8.6).
|
||||
// Hook priorities: 拉特兰 skillStart −10 (after kits' own ammo changes), 阿戈尔 death 11 (5-tier revive, before 不屈's
|
||||
// death 10), layerGain −100 (after 魔王-style modifiers).
|
||||
// death 10; every `fatal` saver runs before any death hook), layerGain −100 (after 魔王-style modifiers).
|
||||
|
||||
import * as S from '../support/index.js';
|
||||
import { mitigate } from '../../damage.js';
|
||||
@@ -333,15 +333,14 @@ function installLaterano(battle, pid, bb, members) {
|
||||
|
||||
// "更靠左和靠上": left first (on the player's own board: mirrored players count from the field's right), then top 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`). The devour marks in this order and the
|
||||
// 5-tier revive's beneficiaries are the first members in it (PRTS "从最先部署(更靠左和靠上的)的【阿戈尔】干员开始"; the
|
||||
// battle's initial deployment order, Battle.start).
|
||||
// independent of the members' directions (only "身前" follows each member's `dir`). The devour marks in this order (PRTS
|
||||
// "从最先部署(更靠左和靠上的)的【阿戈尔】干员开始"; the battle's initial deployment order, Battle.start).
|
||||
const boardCol = (u) => (u.player && u.player.mirror ? -u.tileC : u.tileC);
|
||||
const egirOrder = (a, b) => boardCol(a) - boardCol(b) || b.tileR - a.tileR || a.id - b.id;
|
||||
|
||||
/**
|
||||
* 联防: an operator forced out at the deployment (carry.down, Battle.start, before battleStart) still stands on its
|
||||
* deploy position. The devour and the 5-tier revive slots both count it there (PRTS 盟约记录 前3名 / 最先部署).
|
||||
* deploy position for the devour (PRTS 盟约记录 最先部署). The forced exit is not a knock-out, so it takes no 5-tier slot.
|
||||
*/
|
||||
function egirDownAtStart(battle, u) {
|
||||
return S.isOp(u) && !u.alive && u.removeReason === FORCED_EXIT && !!u.carry && u.carry.down === true
|
||||
@@ -436,37 +435,37 @@ function installEgir(battle, pid, bb, members) {
|
||||
};
|
||||
apply();
|
||||
onLayers(battle, pid, 'egirShip', apply);
|
||||
// 5: "前3名【阿戈尔】干员首次被击倒时立刻复活" — the 3 (bonds.json max_free_respawn_cnt) are the first 3 members BY POSITION,
|
||||
// in the devour's order above = the battle's deployment order (PRTS 盟约记录 阿戈尔 备注 "从最先部署(更靠左和靠上的)的
|
||||
// 【阿戈尔】干员开始"; players' videos: the revivers go by position, not by who is eaten or knocked out first). They are
|
||||
// fixed at battle start, before the devour; each revives once, on its own first knock-out ('killed'), whatever the order
|
||||
// of knock-outs, so a member the devour knocks out comes back only when it is one of them. Until 0.1.3 the first 3
|
||||
// members knocked out took the revives and the devour's food spent them at t = 0. A member entering 联防 down (forced
|
||||
// out before battleStart) keeps the slot its position earned: the forced exit is not a 击倒 (reason !== 'killed'), so
|
||||
// the charge waits until they are knocked out after standing back up. A 调和 member counts like any other.
|
||||
// [ASSUMED] a beneficiary 埃芒加德 / M3茧甲 save in place (items revivedInPlace, the stand-in for PRTS's 0-time redeploy)
|
||||
// has used its revive (PRTS 不屈 备注: a held 复活 is consumed even when another effect redeploys the unit at once).
|
||||
// PRTS: the knocked-out unit's next deployment has 0 redeploy time and 0 cost, i.e. it IS knocked out (被击倒 triggers,
|
||||
// 克莱门莎, 幽灵鲨 … fire) and redeploys at once where it lies (the engine's rest tile, Battle._layBody: the tile it was
|
||||
// knocked out on — a raid-relocated member comes back where it fell —, or its own home when it fell on another board
|
||||
// piece's home; PRTS 卫戍协议/帮助 §作战阶段 单位部署) with full HP, SP reset and `deploy` effects (卡西米尔 / 叙拉古).
|
||||
// Death priority 11: before 不屈 (10), whose redeploy "also consumes a 复活 charge" — with this order the charge is
|
||||
// always the one used, same outcome. The marks still pending on a revived member are cancelled (devour).
|
||||
// 5: "前3名【阿戈尔】干员首次被击倒时立刻复活" — the 3 (bonds.json max_free_respawn_cnt) slots go to the first 3 members
|
||||
// knocked out, in knock-out order: the owner's decision of 2026-10-05, following players' reports (GitHub #105, #140:
|
||||
// "没被吃的阿戈尔干员也会占用复活名额" — with 0.1.3's fixed holders by position the uneaten front members held the
|
||||
// slots, so whatever the food chain ate only 3 阿戈尔 stood). A knock-out by the battle-start devour counts like any
|
||||
// other, so the eaten food usually takes them at t = 0 and survivors = uneaten members + 3. A member takes at most one
|
||||
// slot, on its first knock-out ('killed') in the battle: its later knock-outs never take one, and a first knock-out
|
||||
// after the 3 are gone stays down. However many members mark it, its pending marks are cancelled once it is knocked
|
||||
// out (devour), so a multi-devoured member spends one slot at most. Its own saver acts first: every kit, item or band
|
||||
// revive that prevents or replaces the knock-out is a `fatal` hook (斯卡蒂's DRE-Y −50, kit savers 10 … −60, 坚固维式
|
||||
// 重锤 PRIO_REVIVE −100, M3茧甲 PRIO_RESPAWN −101, 埃芒加德 −110), so the unit is never knocked out and no slot is used —
|
||||
// the slot waits for its first real knock-out [ASSUMED for 埃芒加德, a band: as M3茧甲, the item revive the owner named].
|
||||
// An operator entering 联防 down (FORCED_EXIT) is not knocked out either; a 调和 member counts like any other. Each
|
||||
// battle (normal, 联防, boss) counts its own. PRTS: the knocked-out unit's next deployment has 0 redeploy time and 0
|
||||
// cost, i.e. it IS knocked out (被击倒 triggers, 克莱门莎, 幽灵鲨 … fire) and redeploys at once where it lies (the
|
||||
// engine's rest tile, Battle._layBody: the tile it was knocked out on — a raid-relocated member comes back where it
|
||||
// fell —, or its own home when it fell on another board piece's home; PRTS 卫戍协议/帮助 §作战阶段 单位部署) with full
|
||||
// HP, SP reset and `deploy` effects (卡西米尔 / 叙拉古). Death priority 11: before 不屈 (10), whose redeploy "also
|
||||
// consumes a 复活 charge" — with this order the slot is always the one used, same outcome. Until 0.1.3 the slots were
|
||||
// fixed at battle start for the first 3 members by position (§23.20); until 0.1.2 the first 3 knocked out took them
|
||||
// but a revived member's pending marks could knock it out again (GitHub #33, fixed in devour since).
|
||||
const max = reached(battle, pid, 'egirShip', bb.power_bond_char_cnt) ? Math.max(0, Math.floor(num(bb.max_free_respawn_cnt, 0))) : 0;
|
||||
const holders = new Map(); // beneficiary → its in-place revives (mem.revives) at battle start
|
||||
battle.on('battleStart', () => {
|
||||
for (const u of members.filter((x) => S.isOp(x) && (S.onField(x) || egirDownAtStart(battle, x))).sort(egirOrder).slice(0, max)) holders.set(u, u.mem.revives | 0);
|
||||
devour(battle, pid, bb, members);
|
||||
}, { once: true });
|
||||
battle.on('battleStart', () => devour(battle, pid, bb, members), { once: true });
|
||||
if (!(max > 0)) return;
|
||||
const used = new Set();
|
||||
const memberOps = new Set(members.filter(S.isOp));
|
||||
const knockedOut = new Set(); // members whose first knock-out of this battle has happened
|
||||
let revives = 0;
|
||||
battle.on('death', (c) => {
|
||||
const u = c.unit;
|
||||
if (c.reason !== 'killed' || !holders.has(u) || used.has(u)) return;
|
||||
used.add(u);
|
||||
if ((u.mem.revives | 0) !== holders.get(u)) return; // saved in place since the battle start: the revive is gone
|
||||
if (u.alive || u.removed) return;
|
||||
if (c.reason !== 'killed' || !memberOps.has(u) || knockedOut.has(u)) return;
|
||||
knockedOut.add(u);
|
||||
if (revives >= max || u.alive || u.removed) return;
|
||||
if (!battle.redeploy(u, { free: true })) return;
|
||||
revives++;
|
||||
S.fxOn(battle, 'revive', u, 'bond:egirShip', 'respawn', { n: revives });
|
||||
|
||||
Reference in new issue
Block a user