0.2.5-dev: 萨卡兹枯朽战士 (and every enemy sharing its death fog) leaves no 污秽侵蚀 when it dies silenced — the owner's official-play recall, against the PRTS / in-game wording (#470); the 调度中心 5 / 6 promotion reward includes 自选 operators of the newly reached tier (#515, after research; the owner's decision); golden: unchanged

This commit is contained in:
sganggs committed 2026-10-12 15:24:07 +08:00
1 parent a8ff5e7c1d
commit 9b37a68fcf
15 files changed
+157 -49

No files matched your search

+6 -3
View File
@@ -215,8 +215,11 @@ export class PlayerAcquire {
* copy-weighted roll from the shared pool excluding the ones already drawn; a tier left without another chess tops
* up from the tier below (user playtest #6 item 19: the official promotion reward never offers one operator twice —
* the user's first-hand report; the normal shop's slots may repeat). The offer reserves no copies (the pick takes one).
* The player's slotted 自选 pieces join the draw like in its shop (player/diy.js diyRollEntries: once the 调度中心 is at
* the slot's level) — the reward is a temporary refresh of the shop ("临时刷新3名…干员") [ASSUMED].
* The player's slotted 自选 pieces of the reward tier join the draw (player/diy.js diyStockEntries: copies left, then
* the roll's tier — not the ordinary shop's shopLevel gate). 卫戍协议/帮助 干员晋升 names one temporary refresh one tier
* above the 调度中心 and no separate pool; the owner decided on 2026-10-12 that the refresh includes 自选 of the newly
* reached tier. 0.2.0 had [ASSUMED] the shop-level gate on this refresh too (DESIGN §25); §30.20 reverses that.
* An offer built from explicit `ids` does not roll.
*/
pushRewardOffer(source = 'merge', { tier = null, ids = null, label = null } = {}) {
const ro = this.gd.rewardOffer();
@@ -228,7 +231,7 @@ export class PlayerAcquire {
const fresh = (id) => !list.includes(id);
for (let i = 0; i < ro.count; i++) {
let id = null;
for (let tt = t; tt >= 1 && !id; tt--) id = this.m.pool.roll(this.m.rngShop, { tier: tt, filter: fresh, extra: this.diyRollEntries() });
for (let tt = t; tt >= 1 && !id; tt--) id = this.m.pool.roll(this.m.rngShop, { tier: tt, filter: fresh, extra: this.diyStockEntries() });
if (id) list.push(id);
}
}
+16 -9
View File
@@ -21,11 +21,16 @@
// gets no stock and so leaves the shop, like a preset chess whose bonds are all off (PRTS 卫戍协议:盟约 "禁用盟约有可能
// 影响自选的支援干员"); 协防 (emptyShip) is never banned, so a prototype always stays. poolOf(baseId) routes every copy
// taken or returned for a slotted slot to that stock (buy, reward picks, merges, promotions, sells, temp, elimination).
// * the shop's draws (diyRollEntries): the stock of each slotted slot joins this player's copy-weighted rolls — the
// shop's chess slots and the reward offers' temporary refreshes [ASSUMED] — weighted like any chess of its tier, once
// the 调度中心 has reached the slot's shopLevel (activity_table shopLevelDisplayDataDict lists the tier-5 slots at
// level 5 and the tier-6 slots at level 6; PRTS 帮助 "仅在调度中心等级 ≥ 干员所在等阶"). The price is the slot's (any
// chess of its tier: 4).
// * the shop's draws (diyRollEntries): the stock of each slotted slot joins this player's copy-weighted shop rolls,
// weighted like any chess of its tier, once the 调度中心 has reached the slot's shopLevel (activity_table
// shopLevelDisplayDataDict lists the tier-5 slots at level 5 and the tier-6 slots at level 6; PRTS 帮助 "仅在调度中心
// 等级 ≥ 干员所在等阶" is that persistent shop). The price is the slot's (any chess of its tier: 4).
// * the promotion reward (pushRewardOffer with no explicit ids) draws diyStockEntries() under the reward tier
// min(shopLevel + 1, 6): a tier-5 自选 piece can appear when the 调度中心 reaches 4, a tier-6 piece when it reaches
// 5, one shop level before the ordinary shop. 卫戍协议/帮助 干员晋升 names that refresh and no second pool; the owner
// decided on 2026-10-12 that it includes 自选 of the newly reached tier. 0.2.0 had [ASSUMED] the shop-level gate
// for this refresh too (DESIGN §25); §30.20 reverses it. A piece is not guaranteed. Banned slots and `left <= 0`
// stay out. Explicit-id offers do not use this draw.
// * random grants (diyStockEntries, 0.2.0 WE2 #9): an effect, reward or 机变 card that grants this player a random
// operator from the pool draws its stock too — 「自选干员放入后模拟中的补给池随机范围也将被相应扩大」 (bilibili), "调度中心
// 随机资源的范围将被扩大" (PRTS 新手教程) — under the roll's own tier rules (the effect's tier / maxTier: no 调度中心 gate,
@@ -206,8 +211,9 @@ export class PlayerDiy {
}
/**
* The stock entries this player's shop draws from now ([baseId, entry] with copies left and the 调度中心 at the slot's
* shopLevel), or null (none — the shared pool's roll alone, exactly as without picks).
* The stock entries this player's ordinary shop draws from now ([baseId, entry] with copies left and the 调度中心 at
* the slot's shopLevel), or null (none — the shared pool's roll alone, exactly as without picks). The promotion
* reward does not use this gate (`diyStockEntries`).
* @returns {Array<[string, { cap: number, left: number, tier: number, shopLevel: number }]> | null}
*/
diyRollEntries() {
@@ -218,8 +224,9 @@ export class PlayerDiy {
}
/**
* The stock entries a random grant of this player draws besides the shared pool (see the header): every slotted piece
* with copies left, whatever the 调度中心 level (the roll's own tier rules apply), or null (none).
* The stock entries a random grant, and the promotion reward's temporary refresh, draw besides the shared pool
* (see the header): every slotted piece with copies left, whatever the 调度中心 level (the roll's own tier rules
* apply), or null (none).
* @returns {Array<[string, { cap: number, left: number, tier: number, shopLevel: number }]> | null}
*/
diyStockEntries() {