feedback5 WAA: a bounty enemy that dies with no operator behind it — 无来源 damage, its own HP loss, another enemy — pays in 联防 too: the helper whose half it fell on (community report of 2026-10-06 「被源石地板烫死的悬赏没给赏金」)

- Reproduced (scratchpad scripts): on its own field a bounty enemy the 活性源石 alone burns to death pays its
  owner — on this tree and on v0.1.4 (all 96 walking kill-bounty enemies, 战场#04, no operator: 0 unpaid). The
  loss is in 联防: a leaked bounty enemy re-enters with `bounty.ownerPlayerId` = the leaker (unite.js
  planUnite), who has no per-player entry in that battle. A death without an operator killer fell back to that
  owner, and Battle.addCoins dropped the coins. Until 0.1.3 the 联防 field was the round's map, so 战场#04's
  活性源石 burned leaked bounty enemies for nothing — the report; since then the 联防 maps have no terrain, but a
  无来源 tick, the enemy's own drain or another enemy's hit still paid nobody.
- Official: PRTS 卫戍协议:盟约 决策 "该敌人于对应玩家所属区域倒下时,使相应玩家获得额外资金"; the bounty pays whenever the
  body dies (the owner's decision, relayed 2026-10-06; 0.1.1 "paid once, at the final death"). No PRTS exception
  for 环境伤害.
- Now: Battle._bountyPayee (battle/economy.js): an operator or summon of a player in the battle that dealt the
  blow pays its player (as before, 联防 helpers included); any other death pays the card's owner when that player
  fights there (own field, Final Assault / Hidden Core — unchanged), else the player whose half of the field the
  enemy fell on (Battle._ownerForTile) [ASSUMED for 联防: no source names the payee of a death nobody caused there].
- Docs: SIM.md §1.2, META.md SETTLE, PLAYING.md (联防 rules), unite.js header.
- Tests: test/sim/feedback5-bounty-payee.test.js — the 联防 case (one helper; two helpers by half; killed by
  nobody, 无来源 terrain damage, another enemy, its own HP loss) fails on the parent; pinned: the own-field
  活性源石 death, a helper's operator on the other half, a pair boss field. Golden unchanged.
This commit is contained in:
sganggs committed 2026-10-06 22:02:25 +08:00
1 parent 6372f2892b
commit 59b3c49b2b
7 files changed
+130 -10

No files matched your search

+1 -4
View File
@@ -139,10 +139,7 @@ export class BattleDeploy {
if (pp) pp.killed++;
}
if (killer) killer.stats.kills++;
if (unit.bounty && unit.bounty.coins > 0) {
const payee = killer && killer.side === 'ally' && killer.ownerId != null ? killer.ownerId : (unit.bounty.ownerPlayerId ?? unit.ownerId);
this.addCoins(payee, unit.bounty.coins);
}
if (unit.bounty && unit.bounty.coins > 0) this.addCoins(this._bountyPayee(unit, killer), unit.bounty.coins);
}
}
// the reason ('killed' | 'retreat' | 'expired' | …) lets the client keep the knock-down sound for real knock-outs