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:
1 parent
a8ff5e7c1d
commit
9b37a68fcf
15 files changed
+157
-49
No files matched your search
@@ -26,7 +26,8 @@
|
||||
// rerolls everything and the new slots stay frozen), level-up price = base − rounds elapsed (floor 0).
|
||||
// * Merge: 3 normal copies (风丸 2) on board/hand/temp → 1 elite; equipment returns to the hand; a
|
||||
// reward offer of 3 different free chess of tier min(level+1, 6) is queued (never one operator twice — user
|
||||
// playtest #6 item 19; a short tier tops up from the tier below; pick 1, expires at prep end; an offer earned
|
||||
// playtest #6 item 19; a short tier tops up from the tier below; the player's stocked 自选 of that tier joins,
|
||||
// §30.20; pick 1, expires at prep end; an offer earned
|
||||
// after the prep — SETTLE / Final Assault effects — is kept for the next prep). Where the elite goes (PRTS
|
||||
// 卫戍协议/帮助 "发送1名【精锐】状态的该干员至手牌区(若消耗已部署至作战区的干员,则发送至作战区对应位置)", user
|
||||
// playtest #6 follow-up): when a consumed copy stood on the board, onto that copy's tile with its facing (of several,
|
||||
@@ -116,7 +117,7 @@
|
||||
// battleInput
|
||||
// views.js pieceView, effectsView, m.private (privateView)
|
||||
// diy.js 自选编队: the picks (setDiy), the player's data view, the DIY stock (initDiyStock, poolOf), the shop's
|
||||
// DIY draws (diyRollEntries), the pick of a piece (diyPickOf)
|
||||
// DIY draws (diyRollEntries) and the reward / grant draws (diyStockEntries), the pick of a piece (diyPickOf)
|
||||
// common.js HAND_SIZE, TEMP_SIZE, MAX_OFFER_SLOTS, OK, fail
|
||||
|
||||
import { FIELD } from './board.js';
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
// Rolls: each chess slot draws ONE copy uniformly from all remaining copies of eligible chess with tier ≤ shop level
|
||||
// ("copy-weighted"; duplicates within a roll allowed). The item slot picks a tier with the same tier shares, then a
|
||||
// uniform shop-eligible item of that tier (falling back to lower tiers). A roll may add entries outside the pool
|
||||
// (`extra`, after its own): one player's 自选 stock (0.2.0, player/diy.js diyRollEntries) — weighted by its copies like
|
||||
// any chess, drawn by that player's shop only.
|
||||
// (`extra`, after its own): one player's 自选 stock — the ordinary shop passes diyRollEntries (the shopLevel gate);
|
||||
// the promotion reward and random grants pass diyStockEntries (the roll's own tier, DESIGN §30.20). Weighted by its
|
||||
// copies like any chess, drawn by that player only.
|
||||
|
||||
/**
|
||||
* Per-match disabled bond set D and banned chess (research 01 A2): D = uniform sample of `core` core bonds and `addon`
|
||||
|
||||
@@ -17,8 +17,10 @@
|
||||
// hidden from later 'kill' handlers) · death(c,…) · status(c,…) (statusApplied on e) · burst(c,…) (elementBurst on e)
|
||||
// · tick(b,e,a,dt) every `iv` s (every tick when iv is 0) · skill: `cd`/`left`(=icd)/`cond`/`fire` (cooldown runs
|
||||
// continuously; fires when ready, the enemy can act and `cond` holds). `sil: true` = the ability's handbook line
|
||||
// is flagged SILENCE (沉默 disables it: exactly the data's `format: "SILENCE"` lines — and 萨卡兹枯朽战士 / 组长's
|
||||
// 死亡爆炸, a NORMAL line whose client template checks 沉默: archetypes.js kitPolluted); stun / freeze / sleep block
|
||||
// is flagged SILENCE (沉默 disables it: exactly the data's `format: "SILENCE"` lines). 萨卡兹枯朽战士 / 组长's
|
||||
// 【污染秽蚀】 death fog is the one NORMAL line also silenced (archetypes.js kitPolluted, `enemy_1267_nhpbr` and
|
||||
// `_2` only): the owner's official-play recall of 2026-10-12 is that a death while silenced creates no fog, and
|
||||
// that recall contradicts the PRTS / in-game text 「不可沉默」 (DESIGN §30.20). stun / freeze / sleep block
|
||||
// skills. Enemy SP skills ("数次攻击后…"): SP +1 per attack, the (spCost+1)-th attack is the skill attack (official
|
||||
// 粉碎攻坚手 text: spCost 2 = "攻击2次后,下一次攻击").
|
||||
// Shared mechanics: reborn() — "首次被击倒后重生 / 第二形态" (the first KO is hidden from kill credit and bounty; a
|
||||
|
||||
@@ -658,13 +658,16 @@ const kitSelfFear = (ab) => [selfFear(ab)];
|
||||
const kitEmber = (ab) => [husk({ hits: T(ab, 'Revive[Trigger].prop_max_hp'), delay: T(ab, 'Revive[Trigger].interval') })];
|
||||
|
||||
/**
|
||||
* 萨卡兹枯朽战士 / 组长 · death: 【污染秽蚀】 (PRTS 天赋 "{{特殊机制|死亡爆炸}}(释放半径2.0,持续8s的【污染秽蚀】)"). Silenced at its
|
||||
* death it releases nothing: PRTS 特殊机制 死亡爆炸 "如无特殊说明,此能力默认可沉默…若不处于沉默状态,将会…释放", and the
|
||||
* client agrees — its PollutedDie ability is a buff of template `projectile_on_killed` (battle prefab
|
||||
* enemy_1267_nhpbr / _2), whose ON_OWNER_KILLED first checks `CheckAbnormalFlag SILENCED` (unset) before it emits the
|
||||
* pollution projectile — the template of 高能源石虫's SILENCE-flagged blast too. Its handbook line alone is NORMAL, the one
|
||||
* exception to the handbook rule of content/enemies.js (community report of 2026-10-06, item 10: until 0.2.0 a
|
||||
* silenced one still poisoned its blockers).
|
||||
* 萨卡兹枯朽战士 / 组长 (`enemy_1267_nhpbr`, `enemy_1267_nhpbr_2`) · death: 【污染秽蚀】 (PollutedDie; PRTS 天赋
|
||||
* "{{特殊机制|死亡爆炸}}(释放半径2.0,持续8s的【污染秽蚀】)"). These two keys are the only enemies with this ability.
|
||||
* Not this fog: 萨卡兹枯朽战车 / 尖端's 秽蚀轰击 (an attack skill, `_ignoreSilence`), 枯朽之种's self-destruct,
|
||||
* 枯朽萃聚使徒's summons, 萨卡兹枯朽前锋 / 辟路前锋's arts while in a 源石污染区, 假想敌:蚀裂's death cloud, and
|
||||
* 高能源石虫's 死亡爆炸.
|
||||
* A death while silenced creates no fog. The owner's official-play recall of 2026-10-12 (GitHub #470) is that
|
||||
* killing one that already shows the silence icon leaves no 污染秽蚀. That recall contradicts the PRTS / in-game
|
||||
* text 「不可沉默」. Both handbook lines are NORMAL ("被击倒时释放污染秽蚀…"), not SILENCE. 0.2.0 already withheld
|
||||
* the fog, from the general 死亡爆炸 line "如无特殊说明,此能力默认可沉默" and the client template
|
||||
* `projectile_on_killed` (DESIGN §25.18.2). The recorded reason is now the owner's recall, against 「不可沉默」.
|
||||
*/
|
||||
const kitPolluted = (ab) => [{
|
||||
sil: true,
|
||||
|
||||
Reference in new issue
Block a user