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).
33 lines
1.9 KiB
JavaScript
33 lines
1.9 KiB
JavaScript
// 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');
|
||
});
|