feedback5 CB1: 凯瑟琳's 定向投放 offers every shop item, not only those up to the shop level (community report 「凯瑟琳装备池没有超出商店等级的装备,原版凯瑟琳1升2都能有6本装备」, item 43)

The pool (pool_equip_kathe) is server-side; tools/build-data.mjs had capped it at the shop level [ASSUMED], so the 1 → 2
upgrade only ever offered tiers I–II (measured over 40 seeds: 55 × I, 65 × II). The players' first-hand account: tier VI
shows at that upgrade. Now every shop-eligible item, uniform [ASSUMED] (40 seeds: I 9, II 15, III 25, IV 31, V 16, VI 24);
pool_equip_narant keeps its cap (no report). data/choices.json rebuilt offline (build-data --offline): the JSON compare
shows only pools.pool_equip_kathe.maxTier removed. Test: test/match/feedback5-cathy-pool.test.js (fails on the parent
data). Docs: research 04 (the pool).

Golden: coop4-ABYSS-7 — a bot on 凯瑟琳 is offered other items at its upgrades (the match runs differently from there).
This commit is contained in:
sganggs committed 2026-10-07 02:27:54 +08:00
1 parent a1d118a01f
commit 1d3c76b11c
5 files changed
+84 -56

No files matched your search

+32
View File
@@ -0,0 +1,32 @@
// Community report of 2026-10-06 「凯瑟琳装备池没有超出商店等级的装备,原版凯瑟琳1升2都能有6本装备」 (item 43): the 凯瑟琳 strategy
// (定向投放, up_shop_add_special_goods {count 3, choice 1, pool pool_equip_kathe}) offered only items up to the shop level —
// data/choices.json pool_equip_kathe maxTier 'shopLevel', an [ASSUMED] cap (the pool is server-side). The players' first-hand
// account: tier VI items show at the 1 → 2 upgrade. The pool is every shop-eligible item now (uniform [ASSUMED]).
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeMatch, DATA } from './harness.js';
test('凯瑟琳 定向投放: the level 1 → 2 offer draws from every tier, the special items never', () => {
assert.equal(DATA.choices.pools.pool_equip_kathe.maxTier, undefined, 'no shop-level cap in the data');
const tiers = new Map();
for (let seed = 1; seed <= 12; seed++) {
const h = makeMatch({ mode: 'solo', difficulty: 'NORMAL', humans: 1, seed, fake: true }).start();
h.toPrep(1, { band: 'band_cathy' });
const ps = h.ps('p_0');
ps.funds = 50;
assert.deepEqual(h.m.handle('p_0', { t: 'g.levelUp' }), { ok: true });
assert.equal(ps.shop.level, 2);
const offer = ps.offers[ps.offers.length - 1];
assert.ok(offer, `seed ${seed}: an offer`);
const ids = (offer.slots ?? []).filter((s) => s && s.kind === 'item').map((s) => s.id);
assert.equal(ids.length, 3, `seed ${seed}: 3 items`);
for (const id of ids) {
const rec = h.m.gd.item(id);
assert.ok(rec && !rec.shopExcluded, `seed ${seed}: ${id} is a shop item`);
tiers.set(rec.tier, (tiers.get(rec.tier) || 0) + 1);
}
}
assert.ok([...tiers.keys()].some((t) => t > 2), `items above the shop level (the parent: tiers I–II only) — ${JSON.stringify([...tiers])}`);
assert.ok(tiers.has(6), 'tier VI among them');
});