From 96794c5cc7c00d3d34a038ba0744d77712748678 Mon Sep 17 00:00:00 2001 From: sganggs Date: Wed, 7 Oct 2026 02:08:24 +0800 Subject: [PATCH] =?UTF-8?q?feedback5=20CB1:=20=E4=BD=A9=E4=BD=A9's=20speci?= =?UTF-8?q?al=20refresh=20is=20the=20next=20manual=20refresh=20at=20its=20?= =?UTF-8?q?usual=20price,=20no=20free=20refresh=20comes=20with=20it=20(com?= =?UTF-8?q?munity=20report=20=E3=80=8C=E4=BD=A9=E4=BD=A9=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E7=9A=84=E7=89=B9=E6=AE=8A=E5=88=B7=E6=96=B0=E4=B9=9F=E6=98=AF?= =?UTF-8?q?=E8=A6=81=E8=8A=B1=E9=92=B1=E7=9A=84=EF=BC=8C=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E5=85=8D=E8=B4=B9=E3=80=8D,=20item=2020)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 博学多通 "升级调度中心至2、4和6级后,获得1次特殊刷新:此次刷新出现的干员优先为<萨尔贡>干员" names no 免费 (德克萨斯's trait says 「获得1次免费刷新」 for a free one); bands/meta.js read the blackboard's `price` 0 as a free refresh and granted one at each of those level-ups (measured: level 2 → 1 free refresh, the special refresh cost 0, the next 1). Now the level-up only marks the next manual refresh special: it costs the refresh price (unless another free refresh pays it) and fills the chess slots with <萨尔贡> first as before. [ASSUMED] `cnt` / `price` 0 change nothing. Test: test/content/bands.test.js (佩佩, fails on the parent). Golden unchanged (no corpus match levels a 佩佩 shop). --- server/sim/content/bands/meta.js | 8 ++++++-- test/content/bands.test.js | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/server/sim/content/bands/meta.js b/server/sim/content/bands/meta.js index 9606a716..9b70b710 100644 --- a/server/sim/content/bands/meta.js +++ b/server/sim/content/bands/meta.js @@ -12,7 +12,8 @@ // give_coin_in_round {round,coin} 老鲤 income of round `round` = coin (R1/R2 0, R3 15) // prep_start_gain_chess_from_pool_in_round {round} 老鲤 round start of `round`: 1 chess of pool // band_coin_cost_gain_random_char_by_shop_level 绮良 every coin_cnt funds spent → count random chess ≤ shop level -// up_shop_next_refresh_must_present_bond_char 佩佩 level-up to a level of lvlist → +1 free refresh (price 0) that prefers +// up_shop_next_refresh_must_present_bond_char 佩佩 level-up to a level of lvlist → the next manual refresh (its usual +// price) prefers // gain_bond_char_per_round {round,preround,bond} 哈洛德 rounds round, round+preround, …: a chess (≤ shop level, else any tier) // first_buy_in_round_char_price_change {price,bond} 休露丝 first chess of the round costs `price` (bought in the // shop: onBuy — a free pick / grant never uses it up) @@ -184,12 +185,15 @@ K.band_coin_cost_gain_random_char_by_shop_level = (ps) => ({ }, }); +// 佩佩 博学多通 "升级调度中心至2、4和6级后,获得1次特殊刷新:此次刷新出现的干员优先为<萨尔贡>干员": the special refresh is the +// player's next manual refresh, paid as usual — the text gives no 免费 (德克萨斯's trait says 「获得1次免费刷新」 for a free +// one), and the community report of 2026-10-06 「佩佩策略的特殊刷新也是要花钱的,不是免费」. Until 0.2.0 a free refresh came +// with it (blackboard `price` 0 read as its price) [ASSUMED: `cnt` / `price` 0 change nothing]. K.up_shop_next_refresh_must_present_bond_char = (ps) => ({ onLevelUp(ctx, ev) { const p = ps[0]; if (!list(p.lvlist).map(Number).includes(ev.level)) return; ctx.incCounter('band:pepe:special', 1); - if (int(p.price, 0) === 0) ctx.grantFreeRefresh(1); }, onRefresh(ctx) { if (ctx.counter('band:pepe:special') <= 0) return; diff --git a/test/content/bands.test.js b/test/content/bands.test.js index 40e9f070..a0efc03c 100644 --- a/test/content/bands.test.js +++ b/test/content/bands.test.js @@ -223,16 +223,16 @@ test('绮良 通关奖励: every 20 funds spent ⇒ 1 random operator of tier cover('band_kirara'); }); -test('佩佩 博学多通: upgrading to 2 / 4 / 6 gives 1 special (free) refresh whose operators are <萨尔贡> first', () => { +test('佩佩 博学多通: upgrading to 2 / 4 / 6 makes the next refresh special (paid as usual) — its operators are <萨尔贡> first', () => { const seed = seedWithBond('sargonShip', 2, 2); const { m, ps } = setup({ band: 'band_pepe', seed }); ps.shop.upgradePrice = 0; assert.deepEqual(m.handle('p_0', { t: 'g.levelUp' }), OK); assert.equal(ps.shop.level, 2); - assert.equal(ps.shop.freeRefreshes, 1); + assert.equal(ps.shop.freeRefreshes, 0, 'no free refresh comes with it (community report of 2026-10-06)'); const f0 = ps.funds; assert.deepEqual(m.handle('p_0', { t: 'g.refresh' }), OK); - assert.equal(ps.funds, f0, 'free'); + assert.equal(ps.funds, f0 - m.gd.refreshPrice, 'the usual refresh price'); const chess = ps.shop.slots.filter((sl) => sl && sl.kind === 'chess'); assert.ok(chess.length >= 3 && chess.every((sl) => DATA.chess[sl.id].bonds.includes('sargonShip')), 'all 萨尔贡'); assert.equal(ps.counters['band:pepe:special'], 0, 'consumed');