Commit Graph
87 Commits
Author SHA1 Message Date
sganggs f142012033 feedback1 integrate: WB follow-up - bounty lists, 机密商店 and 战术决策 from 66 official screenshots (22 matches)
Merges the 7 WB commits after the first WB merge (d1f8a49..2cb84bd): R3 one of 10 fixed
sets (9 seen), R9 one of 6 boss groups picked by the matches they came in, R11 one of the
7 seen lists of 7; R11 families 14 / 4 / 4; the 机密商店 and the 战术决策 can offer the
same card twice (R11 shop: two VI, at least one V and one 盟约之币). data/choices.json
rebuilt with tools/build-data.mjs --offline (identical to the branch's). The tactic bot
test uses a real seat (the merged bot scores tactic cards on the player's bonds).
DESIGN §21.2 / §7 / §21.20 and CHANGELOG describe the 22-match model.
2026-10-03 11:27:46 +08:00
sganggs 67e862d2b3 feedback1 WB: 战术决策 drawn with replacement like the 4 official drafts; R11 ally cards weighted by the screenshots
The user: "战术决策也按官方改成可以重复吧". The 4 official 战术决策 (R11 of
matches 7, 9, 18 and 20) show six cards each; match 7 offers 补给 twice.

- Every 战术决策 card is drawn on its own (with replacement), so the same
  card can come twice. choices.js tacticDraftCards / tacticCard.
- R11 (绝境 / 终极, the round of the screenshots; choices.json tacticDraft,
  build-data TACTIC_DRAFT): only the ally cards, weighted 1 + the official
  cards each showed on. All 24 official cards are ally cards (no 排斥 /
  责罚 / 裁决, no terrain card: about 0.04 % for the previous draw) and
  列装 / 财富 / 补给 / 整备 / 升华 made 12 of them (uniform: about 4.6).
  Other rounds (标准 / 险境, no screenshot) keep every card, uniform, with
  replacement too. The weights and the R11 terrain exclusion are assumed.
- The header is the official "进行协同调整,做好迎战准备。".
- Identical cards are separate cards: own index, own object; a pick
  applies its card once and leaves the twin pickable; two picks of a team
  card stack. Match / bot / overlay already go by index.
- Tests: official drafts vs data, generated R11 / solo / earlier rounds,
  a seeded draft with 补给 twice, co-op and solo E2E picks of twins, the
  bot, the overlay, and a headless-Chrome render (game-mock variant=tactic
  is now the official match 7 draft). Tests that drive given tactic cards
  lay them out explicitly. The 奥术 Final Assault test takes the first of
  a few seeds whose bots pair two 奥术 players (the draws moved seed 12).
2026-10-03 09:10:39 +08:00
sganggs 93a4d4d8d1 feedback1 integrate: the 奥术法阵 rider on 炎佑 ignores element gauge fills 2026-10-03 08:37:20 +08:00
sganggs bb6078efc2 feedback1 WB: R11 hunter events left open (the data's block order does not decide them); PLAYING 机变 row keeps the bounty payout with the bounty
The 7 seen R11 lists stay picked uniformly, assumed because that invents no list. By the blocks of
effectChoiceInfoDict, R11 would fire bounty_hunter_8..15 (beside artifact_paid_4/5 and hardbuff_select),
so the block order is no longer cited as support for '1..7'. 7, 8 or 9 events fit the 14 drafts about
equally; with 8, an unseen list would come in about 1 R11 bounty draft in 8 (open question).
2026-10-03 08:29:25 +08:00
sganggs f26e2014c4 feedback1 integrate: 迷迭香 header comment follows the official S2 splash radius 2026-10-03 08:23:32 +08:00
sganggs 3b18376eb7 feedback1 WB: R11 bounty list drawn from the 7 seen lists; R9 group sizes stated as they are; official 机密商店 composition only at R11
- R11 悬赏决策: the list is one of the 7 seen lists, uniform (slots 7, taken as the events
  bounty_hunter_1..7, one block of effectChoiceInfoDict). No list is built from nothing any more;
  the rule only completes the 4 lists seen with 6 cards, so 12_8 / 16_2 / 16_6 come in about
  1 R11 bounty draft in 15 (14 drafts without one: about 39 %).
- R9: the groups hold 9, 9, 9, 9, 8 and 6 cards (comments, docs, test); match 4's base-only
  group may be a draft of another group (open). 58 -> 59 bounty drafts in the build-data note.
- 机密商店: shopDraft.rounds [11]. The official composition (VI, VI, V, 盟约之币 + 2) applies at
  R11 (绝境 / 终极, where the screenshots are); the earlier 标准 / 险境 shops keep the previous draw,
  any tier I-VI per card with replacement (repeats still possible, about 26 %).
- Tests: R11 slots / block order / never-shown rate, R9 group sizes, the non-R11 shop draw.
2026-10-03 08:09:39 +08:00
sganggs ff4ff3f350 feedback1 integrate: bot reconciled with the merged rules
- plans each unit with the range it is deployed with (loadoutRecord attackRangeGrid, the grid of the server's
  summonRange and the card)
- an attack on every enemy in range (阵法术师 / 轰击术师 rangeAoe) counts double in its DPS value, splash and chain a little
- botbench seeds 1-40 before/after and the decision time (unchanged) in BALANCE.md
2026-10-03 08:09:29 +08:00
sganggs 0a15c6e41d feedback1 integrate: ticker lines by broadcast priority; AI 托管 keeps a human's items out of temp
- the strip queues by the official broadcast priority (BOSS_HIT 30 > CHAR_DAMAGE 20 > SHOP_LEVEL 11 > ...),
  match-flow notices at 25, never cutting the line on screen short
- on a human seat under AI 托管 an item left in temp with a full hand gets a hand slot (a bench operator sold)
2026-10-03 07:57:28 +08:00
sganggs 75e2f02590 feedback1 integrate: follow-ups from the workstream notes (official rules)
- an operator's radius area damage skips unblocked 隐匿 and untargetable enemies (Battle.foesInRadius;
  PRTS 作战机制 AOE伤害判定), the 逐火 embers included
- PRTS 溅射半径一览: 投掷手 0.9, 链术师 1.7, 格雷伊 1.0; 迷迭香 S2 radius 1.5
- 阿罗玛's first-attack mark is shared between 阿罗玛 and leaves with its setter (PRTS 备注)
- 奥术法阵 on the field: 炎佑's damage silences its target (PRTS 盟约记录 备注)
- skills restart from their initial cooldown when a 重生 ends (PRTS 特殊机制)
- 高准度伦蒂尼姆城防自行炮: lock in range, 3x3 area, every 0.5 s up to 10 shots, 失衡/控制免疫 meanwhile
- 琳琅诗怀雅 S3 coins go to range 2-4 in front and the units she blocks
- 阿戈尔 devour is a 物理流失 reduced by the target's DEF
2026-10-03 07:57:28 +08:00
sganggs d1f8a49829 feedback1 WB: bounty drafts and the 机密商店 from 66 official screenshots (22 matches)
Bounty drafts: every 悬赏决策 event is a fixed card list and the draft shows
6 different cards of it, drawn with weight 1 + the official drafts of its
group the card showed in.
- R3: 9 of the 10 fixed sets seen (two new: 20_1 + 20_5, and one with 17_6);
  3 x I + 2 x II + 1 x III in 22 of 22. The unseen 10th set is built by a
  rule whose III is 10_6 or 20_6, the only two-battle cards no draft showed.
- R9: 6 groups of 9 cards, one per bossInitial event. The 鼠王 group came in
  14 of 22 matches (every grey-board match among them), so groups are picked
  by the matches they came in. Named bosses no longer always come together.
- R11: lists of 7 cards, the draft leaves out one (matches 1 / 6 / 21 / 22
  leave out four different cards of one list); 7 of 15 lists seen, the rest
  and the 4 partial lists' 7th cards built by rule. Families 14 / 4 / 4.

机密商店 (the user: "机密商店按官方改成可以重复吧"): choices.json shopDraft,
six slots drawn with replacement - VI, VI, V, 盟约之币 and twice
V / IV / III / 盟约之币, items weighted by the official cards they showed on.
A repeated item now comes in about 61 % of shops (official 3 of 4). Two
identical cards stay two cards (picks by index): E2E, overlay and a
headless-Chrome test (game-mock ?variant=shop, the official match 8 shop).
2026-10-03 07:42:20 +08:00
sganggs 88d419b095 feedback1 integrate: WF smarter bots (same decision time)
# Conflicts:
#	docs/META.md
#	server/match/bot.js
2026-10-03 07:07:23 +08:00
sganggs a84cd3af96 feedback1 integrate: WQ healers keep healing while they block (tests and docs) 2026-10-03 07:04:07 +08:00
sganggs fcbccd4a32 feedback1 integrate: WR 阵法术师 / 轰击术师 attacks hit every enemy in range
# Conflicts:
#	docs/SIM.md
2026-10-03 07:04:07 +08:00
sganggs 313db2f55f feedback1 integrate: WP live skill range on the card; 烛煌 S3 target + 1.7 splash; 信仰搅拌机 S3 ignores 攻击距离 2026-10-03 07:00:41 +08:00
sganggs ff0f8d0211 feedback1 integrate: WK bond popup and card chips include 变形同构体 wearers
# Conflicts:
#	docs/SIM.md
#	public/js/ui/bondStrip.js
#	public/js/ui/detailPanel.js
#	server/sim/snapshot.js
2026-10-03 06:56:27 +08:00
sganggs c59b569dc7 feedback1 integrate: WJ BOSS_HIT share per boss round; stale-round ticker lines dropped 2026-10-03 06:54:47 +08:00
sganggs 6e1cf914d1 feedback1 integrate: WH 维娜·维多利亚 S3 lions on every free melee tile; 玛恩纳 S3 hits air units 2026-10-03 06:53:24 +08:00
sganggs 1041b6ed7e feedback1 integrate: WG 奥术 shown 本局禁用 where the mode disables it; returned equipment auto-merges
# Conflicts:
#	public/js/ui/shopBar.js
2026-10-03 06:53:18 +08:00
sganggs e228801bee feedback1 integrate: WL 源石溶剂 drain is 无来源 true damage; 信仰搅拌机 S3 counters any damage
# Conflicts:
#	data/items.json
2026-10-03 06:52:36 +08:00
sganggs 075ba6428b feedback1 integrate: WO official diagonal routes (the floor preference no longer straightens diagonals)
# Conflicts:
#	data/stages.json
#	docs/DATA.md
#	server/sim/grid.js
#	test/sim/pathing-blockable.test.js
2026-10-03 06:49:11 +08:00
sganggs 4b15919185 feedback1 integrate: WN 灼热/炽焰源石虫 models (local overlay, tinted alias); 暴鸰 bomb drop
# Conflicts:
#	docs/SIM.md
#	public/js/render/app.js
#	public/js/render/spine.js
#	public/js/render/units.js
#	server/sim/content/enemies.js
#	server/sim/snapshot.js
2026-10-03 06:45:59 +08:00
sganggs f0f6016479 feedback1 integrate: 隐德来希's candles standing at the time limit are no leaks (an honest client result was rejected)
A co-op 联防 battle that timed out during 隐德来希 S3 listed the 心烛 (in no spawn
schedule) as a leak, so the server rejected the client's result ('leak key').
Pre-existing on master; the merged bots reached it on fullmatch seed 116.
2026-10-03 06:43:26 +08:00
sganggs da0aa28d5f feedback1 integrate: WM 野鬃 S2 pushes along her facing; 琳琅诗怀雅 S3 coins radial
# Conflicts:
#	docs/SIM.md
2026-10-03 06:37:02 +08:00
sganggs f55de593a3 feedback1 integrate: WI flying enemies are static bodies (never displaced); 胄 parts, 守墓石像 and 喷气人 flight
# Conflicts:
#	data/enemies.json
#	server/sim/content/enemies.js
2026-10-03 06:36:35 +08:00
sganggs b1644f5ad7 feedback1 integrate: WC 深水区 refuses deployment; tactical points only inside the summoner's attack range
# Conflicts:
#	server/match/bot.js
2026-10-03 06:35:09 +08:00
sganggs 3328dedea2 feedback1 integrate: WD 转译基底 transforms, 逐火 embers beatable, knock-out forms kept by the client
# Conflicts:
#	docs/PLAYING.md
2026-10-03 06:34:25 +08:00
sganggs 8ffd075c9e feedback1 integrate: WE 鸭爵 strategy (圆仔 unblockable, hurt speed +300 %, swaps in the Final Assault and Hidden Core) 2026-10-03 06:32:49 +08:00
sganggs a5e78ee73b feedback1 integrate: WA per-copy 拉普兰德 refresh counter; 突变细胞 reusable 2026-10-03 06:32:26 +08:00
sganggs a657f809f1 feedback1e WP: review round 3 — 烛煌 S3 last bolt keeps the burst bonus, splash fx; prep overlay and wheel show the deployed range
- 烛煌 S3: the burn-burst bonus is gated on the attack's own isSkill (captured when the bolt was fired), not on the live
  skill, so the last bullet (it lands after end('ammo')) and bolts in flight when the skill ends early still carry it.
- 烛煌 S3: every landed bolt emits fx 'splash' (r 1.7, burn) at the main target, so the splash shows on screen.
- shared/loadoutRecord.js attackRangeGrid: the range a unit is deployed with — a selected passive range skill
  (引星棘刺 S3 3-9) and the 特性's permanent 攻击距离 (信仰搅拌机 SPT-Y +1; not 空弦 ISW-A's 集成战略-only one) —
  so the board overlay, the deploy wheel and the card agree with the prep live range. extendedGrid moves there
  (re-exported by targeting.js).
- runner.js header: unitStatsEntry carries the ally's live range.
2026-10-03 06:25:12 +08:00
sganggs 165e7255f8 feedback1e WR: real-wave test counts the enemies each attack damages; AoE source wording
The act2 m01 round 10 test now checks the damage itself: every attack of
卡涅利安 S2/S3 damages each enemy on her range, under the same attack id.
SIM.md, the CASTER comment and the test header name the primary source
for the 轰击术师 (PRTS 作战机制: 伊芙利特's next-attack skill 炎爆 is a
锁定攻击范围 AoE), mark Terra Wiki as secondary for the 阵法术师 and treat
the missing PRTS 溅射半径一览 row as supporting evidence only.
2026-10-03 06:12:34 +08:00
sganggs 3cdf7182f2 feedback1d WN: a stun before 暴鸰's release interrupts the cast; the release lands on tick 8; SIM.md timeline fixed 2026-10-03 05:55:29 +08:00
sganggs 5963a40d2d feedback1e WP: review fixes — 信仰搅拌机 S3 ignores 攻击距离, bounded range mini-map
- 信仰搅拌机 S3 退休前布道 attacks / counters on 3-13 exactly: SPT-Y's 攻击距离+1
  does not reach it (PRTS 技能3 备注 "此技能的攻击范围不受“攻击距离”属性影响";
  PRTS 修正 of the module text "(部分技能不受此影响)"). New SkillSpec flag
  targeting.noRangeExtend, read by Battle._refreshRange; S1 / S2 keep the +1.
- The detail card's 攻击范围 draws a grid larger than its box (远牙 S3's
  21-tile line) with smaller cells in the box's own space (rangeGridStyle,
  RANGE_FIT 6 columns × 7 rows), so the live stats beside it stay readable.
- 荒芜拉普兰德 S1's whole-field grid only selects targets (no rangeId, no 攻击范围
  text): targeting.showOwnRange keeps her 3-1 on the card.
- 烛煌 S3's bonus on burning enemies is dealt before the attack's damage
  (备注 "于攻击造成伤害前判定元素爆发并造成元素伤害"), main and splash.
- liveRangeGrid is the grid itself when nothing extends it (no copy per refresh).
- Audit test: 攻击距离加长 / 缩短 (深巡 S2, 山 S2) and every module of the loadout;
  real BattleSpec for 信仰搅拌机 SPT-Y.
2026-10-03 05:46:04 +08:00
sganggs f3a73fec6b feedback1e WR: 卡涅利安 charged S1 never attacks, S3 mark before the damage; review fixes
Review of the E3 fix (阵法术师 / 轰击术师 strike every enemy in range):

- 卡涅利安 S1 沙暴守卫 charged: PRTS 备注 "应用蓄力时:应用技能未开启时的特性"
  keeps the whole skill-off trait in force, 不攻击 included. A kit trait
  canAttack now stops her attacks while a charged S1 runs; the guard stays.
  The E3 test casts S1 uncharged and a new test pins both casts.
- 卡涅利安 S3 食噬之印 charged: the mark stacks before the attack's damage
  (PRTS 备注 "于攻击造成伤害前生效"): x1.2 on the first hit, x2.0 from the 5th
  (was one attack late). One mark per enemy: another 卡涅利安 only adds
  stacks, the bonus stays the setter's (PRTS 备注 popup).
- rangeAoe is applied after every override (kit trait included) and sets
  allInRange itself; SUB.phalanx / blastcaster carry rangeAoe only.
- 流形 copies (tokens.js and the 缪尔赛思 kit) turn a copied 'beam' into a
  plain bolt: the copy takes no attack shape.
- fx.js: the dead blastcaster shell colour is gone (and its test).
- SIM.md / comments cite PRTS 溅射半径一览 (no splash row for these
  branches), note that stealthed enemies are not struck unless revealed or
  blocked, and list the table's other radii as open deviations.
2026-10-03 05:38:06 +08:00
sganggs bfd8b1647c feedback1e WQ: healer tests cast every skill while blocking; rule in headers
Review follow-up for E2 (not reproduced, no behaviour change):
- blockRun fills the skill's SP (and puts the patient back to 5 %) the
  first tick the healer blocks, and tests 2 and 3 assert the skill is
  cast or running while it blocks: all 56 healer loadouts now cast in
  the window (half never did at the default initial SP).
- The reported 炎 boss round makes 录武官's skill ready when she first
  holds 卢西恩 / 不祥幻影 and asserts it is cast or running then.
- The boss test says what it covers: 0 healer damage on all 20 boss /
  hidden fields; healers block 卢西恩 / 不祥幻影 (h07_05) and a
  patrolling 碎铳之簧 once its shield is broken (h08_02); the other
  leaders and parts cannot be blocked by a block-1 unit.
- SIM.md: the healer qualifier follows the "one-line flip" sentence, so
  "This replaces..." refers to the every-blocker rule again.
- ai.js header, Battle.blockedTargets and targeting.js: the blocked-first
  rule is for attacks that hit enemies; a heal attack keeps selecting
  injured allies (PRTS 卫戍协议/帮助).
- PLAYING.md: the healer exception names 咒愈师 as the one that hits.
2026-10-03 05:35:18 +08:00
sganggs 47d4215cfe feedback1d WN: 暴鸰 hovers through its cast and speeds up when it ends; 掠海漂移体's crawl in UnitInfo.form
- Official Boomb ability: the cast finishes once the bomb has landed and at
  least 0.667 s after the release (_fireAttackFinishWhenProjectileInvalid,
  _minPostDelayWhenProjectileInvalid), then buff bomb_s gives the speed
  (PRTS "技能结束后移速最终提升至200%"). kitBombd: BOMBD_POST_DELAY; the speed-up
  at the cast end instead of the landing; the drone holds still until then,
  like the engine's pause for an enemy attack clip.
- The bomb-less look still starts at the release: the view begins the *_2
  clips after the Attack clip (the official end clip Idle_2); at the cast end
  it would draw the bomb back for a frame.
- kitSyufo records e.form = 'crawl', so a field opened later draws it crawling.
2026-10-03 05:18:31 +08:00
sganggs 88d578b3fe feedback1d WL: review follow-ups (源石溶剂 on 炎佑, enemy BUFF damage, self-damage stats, chimera aura)
- 源石溶剂: PRTS 备注 "携带后,全场范围内的所有敌人类我方单位也会获得此装备的“每秒受到60真实伤害”效果
  (该效果的付与为我方阵营索敌,可对空,无视目标可选性)". Every enemy-record ally of the field (炎佑,
  a partner's too) takes the 无来源 60 true-damage tick while a carrier is on the field, credited to
  nobody, once per second however many carriers (PRTS 作战机制 "同名buff的默认叠加策略buff只能表现出一个").
- 码头水手 drowning ("每秒受到1000点无来源真实伤害") and 弧光锋卫's 失衡 bleed (修正 "失衡移动时持续受到真实
  伤害") are damage, not 流失 (PRTS 伤害分类 lists both as BUFF damage).
- 孽罪奇美拉 污染模式 follows PRTS: radius 1.2, a tick every 0.5 s, one tick per unit per period
  however many chimeras reach it ("同类效果取最高").
- Damage-dealt stats (unit dmg, the player's damageDealt) no longer count damage to the source's own
  side (a carrier's own drain, an operator's own 流失); taken and the kill credit are unchanged.
- 机变 自愈 uses damage.js isHpLoss.
- SIM.md: the loseHp rule lists the remaining 流失 sources; the chimera aura; the stats rule.
  data/items.json regenerated (源石溶剂 implFormula text only).
2026-10-03 05:09:42 +08:00
sganggs 7c13e38422 feedback1 WB: R11 bounty drafts as groups + tier-I fill (matches 1 and 6 share a group); solo R11 weights marked assumed
The official R11 bounty drafts are not a free draw under the old rule: matches 1
and 6 show the same 特异III giant and the same four tier-II cards and differ only
in their one tier-I card; 15_7 + 13_8 come together in 3 of the 5 drafts; 10_8,
11_8 and 12_8 never show. A uniform draw under the old rule repeats 5 of 6 cards
in some pair of 5 drafts in about 2.5 % of samples.

- tools/build-data.mjs: BOUNTY_HUNTER_TEMPLATES (the 4 seen R11 groups: giant +
  tier-II cards, fill = the 5 tier-I cards seen) and BOUNTY_HUNTER (the shape an
  unseen slot draws: one giant + 1-4 tier-II cards + tier-I fill, one card per
  faction series 10-15). choices.json bountyDrafts.hunter gains slots (15),
  templates and rule. The R9 note now names the per-match explanation (leader,
  map) beside two versions. Solo 绝境 / 终极 R11 family weights are marked as
  extrapolated from co-op.
- server/match/choices.js: the hunter draft picks one of the 15 event slots: a
  seen group, or a rule group of that shape, then tier-I fill.
- test/match/feedback1-bounty.test.js: each official R11 bounty draft fits
  exactly one seen group and the rule shape; matches 1 / 6 share 5 cards;
  generated drafts: a seen group in about 4 of 15, every seen group and every
  R11 card offered.
- docs/DATA.md, docs/META.md: the R11 structure, the solo weights and the R9
  open question.
2026-10-03 05:08:25 +08:00
sganggs 6be059b34e feedback1e WQ: healers that block keep healing (E2 not reproduced, locked by tests)
A community report said a medic blocking a roaming boss in a 炎 build stops
healing and strikes the boss, its 强力击-type skill included. The real sim
does not do that: every pure healer (医师 / 群愈师 / 疗养师 / 链愈师 / 行医,
the map characters, normal and elite, every skill) blocking an enemy keeps
healing and never targets it, under every bond as a member, with every
equipment item and on every boss / hidden field (卢西恩 and its phantom,
the 剑 / 锤). Official: PRTS 卫戍协议/帮助 "对于医疗干员(咒愈师分支除外),
攻击目标为需要治疗的单位". The only damage a pure healer deals is a bond's
own effect by its text (卡西米尔's pulse while blocking).

No behaviour change: the rule is spelled out in SIM.md and ai.js
acquireTargets, and test/sim/feedback1e-healers.test.js locks it (the
reported 炎 boss round, every healer x bond, items, heal-mode skills of
古米 / 塞雷娅 / 波登可, 咒愈师 and 吟游者, every boss template).
2026-10-03 05:03:28 +08:00
sganggs 8b0e672bb8 feedback1e WP: live attack range on the battle card; 烛煌 S3 splash 1.7
Community report "干员烛煌开启3技能时候攻击范围不会变". The sim already attacked
with S3's 4-11 while it ran (real matches, and every attack-range change of
the mode); what stayed the same was the battle detail card: its 攻击范围
mini-map kept the base 3-1 grid while the live stats beside it moved.

- Battle._refreshRange keeps the relative grid behind rangeKeys as
  unit.liveRangeGrid (targeting.js extendedGrid: rangeExtend grown on);
  shared/protocol.js unitStatsEntry carries it as `range`; the detail card
  draws it (cardRangeGrid) in battle and in the prep preview, and names a
  whole-field range (纯烬艾雅法拉 S3) 全场 instead of drawing it.
- 烛煌 S3 "攻击变为群体攻击" is one target + a 1.7 splash (PRTS 技能3 备注
  "攻击溅射半径1.7"), not every enemy inside 4-11; the burst bonus hits
  every enemy of the attack; a burn burst's +2 ammo stops at the skill's
  ammo ("补充后的弹药数量无法超过上限").
- Tests: test/sim/feedback1e-skillrange.test.js (S3 range, splash, ammo
  cap, live grid, the audit of every attack-range change, a real spec),
  test/ui/feedback1e-range.test.js (the card).
2026-10-03 05:03:07 +08:00
sganggs 27181d88bd feedback1e WR: 阵法术师 / 轰击术师 strike every enemy in range (卡涅利安 E3)
Community report E3 "卡涅利安的攻击不是真群攻" was real: the phalanx trait
"技能开启时攻击造成群体法术伤害" was read as one bolt at the priority target
plus a 1.1-tile splash, so spread enemies took one hit per attack (act2 m01,
round 10: 2.3 of 12.4 enemies on her range per attack, never all).

Officially a 阵法术师 attack hits every enemy inside the attack range at
once, the same damage near and far (Arknights Terra Wiki, Phalanx Caster;
PRTS 林 S3 note; PRTS 作战机制 AOE), and so does the 轰击术师 line
(Terra Wiki, Blast Caster; PRTS 作战机制: 伊芙利特's 炎爆 is a range-locked
AoE). The 扩散术师 keep their 1.1-tile splash around the target.

- professions.js: phalanx and blastcaster get allInRange + rangeAoe
  (instant 'beam' hits, no projectile) instead of the 1.1 splash.
- 卡涅利安 S3 食噬之印: ATK climbs in 1 s steps to the full bonus at 20 s
  (PRTS note) instead of continuously over the 21 s duration.
- fx.js: phalanx / blastcaster leave the splash-ring list.
- Tests: real battles counting damaged enemies per attack for every
  phalanx skill, both blast casters, a splash-caster guard, a real stage
  and wave, the S3 ramp; opt-in headless-Chrome check of the strikes.
- SIM.md profession rows and kit comments updated.
2026-10-03 04:59:08 +08:00
sganggs 7a3918eab9 feedback1d WO: the preference route is 0.1.0's again; equal floor keeps the official route
Review follow-up to the D5 fix. Two changes in grid.js _buildField:

- The road-over-floor preference smoothing is 0.1.0's again: its line of sight
  may cover non-blockable tiles (Bresenham footprint, diagonal-step corners
  included) only on the tile's own raw chain, and the jump stops at the first
  ancestor it cannot see so. Exact crossings (a corner touch is not a crossing)
  are used only to choose between the official and the preference pointer.
  The previous version let the preference brush the corner of off-chain floor,
  so on 战场#02's Final Assault the right-half exit route (2,10) -> (3,11)
  slipped past an operator on (2,11) while the left half was still blocked on
  (2,9). Both halves now mirror each other again ((2,10) -> (2,11) -> (4,11)).
- On an equal floor count the official pointer stays; the preference pointer
  wins only when it merely skips a collinear official waypoint (same walk).
  The old "farther waypoint" tie-break could bend an official route without
  saving any floor, e.g. a crate on (10,6) of 战场#04 brought back the L via
  (9,8) for the lower gate.

Still 140 of 154 stage routes official; data/stages.json groundPaths
regenerated (战场#02 boss right exit back to 0.1.0's, device-less helper paths
of #03 / #04 / #06 follow the same rule). New tests: 战场#02 boss exits mirror
and are blocked beside the exit; a single crate on any tile of an active stage
never leaves a gate route non-official without crossing strictly less floor.
The cross-check reference port follows both rules.
2026-10-03 04:57:30 +08:00
sganggs 8ac1aaadbb feedback1 WB: bounty drafts follow the official R3 / R9 / R11 drafts (33 screenshots of 11 official matches)
R3 offers one of the official sets of six "接下来两场作战" cards (3 x I, 2 x II, 1 x III):
the 7 sets seen, the 3 unseen slots built by their rule. R9 offers a seen group of
named bosses filled to 6 with the cheap boss bounties and 源石虫·特训. R11 of 绝境 / 终极
is 悬赏决策, 机密商店 or 战术决策 (never 道具补给); its bounty is one 特异III giant and 5
"下场战斗" cards, one per faction series. Cards no official draft showed (the
multi-round cards, enemyeffect_3_*, five boss bounties) are no longer drafted.
The screenshot readings are a test fixture; tests check every reading against the
data and every generated draft against the official structure.
2026-10-03 04:43:44 +08:00
sganggs 97538091ed feedback1d WM: cite the client push templates for 野鬃 / 琳琅诗怀雅
The direction rules now rest on client data instead of the skill wording:
野鬃 S2's attack ability carries buff wildmn_s_2[force] of template
knockback[dir] (Knockback, _useSourceDirection true, force level -2 when
off direction); 琳琅诗怀雅 S3, 山 S3 and 莫斯提马 S3 use knockback[relative]
(radial); 圣聆初雪 S1 is KnockBackWithCharacterDirection (no correction).
Comments, SIM.md and the test header cite these. The generic kit header
notes its text keywords are only a fallback. PLAYING.md explains 野鬃's
push direction to players. No behaviour change.
2026-10-03 04:31:36 +08:00
sganggs 2591b8638e feedback1 WD: form changes survive the client's catch-up frames, hidden tab and pre-entry buffer
Every setForm fx now carries 'form' (shared/protocol.js fxForm). The runner keeps
these fx in catch-up frames (keepsState), holds the state-bearing events of the
battle on screen while the tab is hidden and delivers them with the first frame
back (re-entering from the field meta past HELD_MAX); screens/game.js buffers
them before a field is entered. A husk beaten while its stand-up clip plays dies
on the husk's clip. 幽灵 form cited from PRTS; 特战术师 flyer question recorded.
2026-10-03 04:27:24 +08:00
sganggs 01f5b216c6 feedback1d WL: 源石溶剂 drain is 无来源 true damage; 信仰搅拌机 S3 counters any damage
Player report D1: the 源石溶剂 HP loss should set off 信仰搅拌机 S3 and, next to
莫斯提马, stack 拉特兰 layers on its own. The drain was a Battle.loseHp 流失, which
skips 受击回复 SP and the 重装 TAKE_DAMAGE trigger, and the S3 counter needed an
enemy attack and a target.

Official: PRTS 盟约记录 源石溶剂 "受到60真实伤害" (修正 "并非流失", 备注
"造成无来源真实持续环境伤害"); PRTS 信仰搅拌机 S3 备注 "反击受到任何伤害后均可触发,
无需目标,视为普通攻击"; PRTS 作战机制: 生命流失 skips 反伤 / 受击回复.

- damage.js periodicDamage: the periodic_damage template (源石溶剂, 狂暴宿主组长)
  as 无来源 true damage (shields, damage-taken modifiers, hit effects, 受击回复 SP,
  TAKE_DAMAGE); the credit is unchanged.
- 信仰搅拌机 S3: any damage except 流失 / element 损伤 counters; with no enemy in
  range the counter still spends its bullet.
- Audit, same rule both ways (damage.js isHpLoss): 孽罪奇美拉's aura on operators
  is damage; 雷蛇 战术防御 and 蒂比 S2 / 片场工作指南 respond to any damage
  (PRTS notes); 乌尔比安, 伪装服, 远牙, 录武官's guard and 坚守 thorn chances no
  longer respond to a 流失.
- data/items.json regenerated (源石溶剂 implFormula text only).
2026-10-03 04:23:21 +08:00
sganggs cc57afa8c4 feedback1d WN: a field opened after 暴鸰's drop draws it without its bomb (UnitInfo.form)
The bomb-less mode lived only in the client that saw the fx 'phase' event. UnitInfo now
carries an enemy's recorded mode (unit.form, set by kitBombd at the release), and the
renderer keeps it on the unit info, so a field watched or rejoined later starts on the
*_2 clips.
2026-10-03 04:22:36 +08:00
sganggs 901d5b9613 feedback1d WN: 暴鸰 drops its bomb as a projectile and flies on without it (D4)
The drone triggered its one bomb, but the damage and the blast landed in the trigger tick
while the model kept the bomb hanging under it for good. Official (PRTS 暴鸰; the client's
battle prefab enemy_1040_bombd and projectile_bombd): the cast plays the Attack clip, the bomb
leaves on its OnAttack event (0.267 s), flies to the target at 5 tiles/s and explodes on it
and the 8 tiles around; the drone switches to its bomb-less clips and speeds up.

Sim (kitBombd): release after BOMBD_RELEASE with an 'atk' event of kind 'droneBomb' and fx
'phase' {kind: 'bombed'}, a homing projectile (PROJECTILE_SPEEDS.droneBomb 5) whose arrival
deals the damage, then the speed buff. Render: FORMS.enemy_1040_bombd.bombed (*_2 clips),
PROJ.droneBomb (a falling shell), a one-off cast plays the attack clip once at its own
speed instead of the drone's 5 s attack rhythm, no puff for the silent mode change.
2026-10-03 04:21:19 +08:00
sganggs d8c62a96b5 feedback1d WO: official route wherever it crosses no more floor (D5 战场#04 diagonal)
Community report: on 战场#04 活性源石 the lower-gate enemies walked two tiles left
of the red gate and then straight up instead of crossing diagonally from row 9
into row 10 as in the official game. The playtest #2 road-over-floor smoothing
counted the corner tiles of a diagonal step as crossed, so it bent the official
(9,10) -> (10,7) into (9,10) -> (9,8) -> (10,8) although that line only brushes
the corner of the floor tile (10,9).

grid.js now keeps the official flow field (research 08 §3.1) and replaces a
tile's pointer by the road-over-floor preference one only where its route
crosses strictly fewer non-blockable tiles (or as few with a farther waypoint);
a segment crosses the tiles whose interior it passes through (segmentTiles,
exact geometry). 140 of the 154 stage x gate x field routes are now official
(was 109); the 14 left avoid floor the official route walks over (战场#01's
col-8 road of playtest #2, boss exits of 战场#01 / #02, two 联防 partner gates).
data/stages.json groundPaths regenerated.
2026-10-03 04:14:43 +08:00
sganggs d374e537b9 feedback1d WM: 野鬃 S2 pushes along her direction; 琳琅诗怀雅 S3 coin push radial
Player report D2: 野鬃's skill sometimes pushed enemies the opposite way.
Her S2 text "往攻击方向…推开" is the 推击手 wording that PRTS 推与拉 calls a
directional force; the remake pushed radially at full force, so an enemy
grabbed behind her centre (or at her back) flew 1.7-2.14 tiles towards the
objective. Now directional with the official correction (> 45 deg off or
< 0.25 tile: radial at force level -2, at most 0.44 tile).

Direction audit: 琳琅诗怀雅 S3's coin push is radial (PRTS note), it was
pushed along her facing. The generic kit reads 往攻击方向 as directional.
2026-10-03 04:06:08 +08:00
sganggs a7ec6a1438 feedback1b WI: 守墓石像's statue and flight are 失衡免疫; 喷气人 lands unblockable
PRTS 守墓石像 / 愤怒的守墓石像: the statue is unblockable, rooted, 失衡免疫 and
immune to 浮空; the reborn flyer is 失衡免疫 (not a 静态刚体, so a persistent
noDisplace buff). PRTS 喷气人: 1.5 s at -90 % speed after take-off, then
1.333 s unblockable at -90 % speed after landing.
2026-10-03 03:46:23 +08:00