From b2510524b0e8b85c89d40071aa1f5b7125428ea1 Mon Sep 17 00:00:00 2001 From: sganggs Date: Thu, 8 Oct 2026 19:10:37 +0800 Subject: [PATCH] =?UTF-8?q?feedback7=20R22-GHSIM:=20=E6=AD=8C=E8=95=BE?= =?UTF-8?q?=E8=92=82=E5=A8=85=20S3's=20skill-end=20=E6=8D=95=E7=BD=91=20pu?= =?UTF-8?q?lls=20the=20enemies=20within=201=20tile=20of=20the=20tornado,?= =?UTF-8?q?=20not=201.5=20=E2=80=94=20the=20tornado=20keeps=201.5=20(GitHu?= =?UTF-8?q?b=20#324,=20PR=20#329=20by=20@IceCodeNew,=20re-implemented);=20?= =?UTF-8?q?golden:=20fields=20boss-boss=5F4-pair=20moves?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRTS 歌蕾蒂娅 S3 备注: 「龙卷风半径1.5」 and 「技能结束时的拖拽为捕网,捕网半径为1,无伤害」. The kit reused the tornado's radius for the final pull (its 1.5 was marked [ASSUMED]; PRTS now backs it). The slow and the pulses keep 1.5; only the skill-end pull (to her front, as before) uses 1. Golden: boss-boss_4-pair fields 歌蕾蒂娅 — fewer enemies are dragged to her front at the skill end, the fight runs differently (11 kills instead of 14, one leak). --- .../content/kits/ops/chess_char_4_12-glady.js | 9 +- test/content/kits_t4.test.js | 21 ++++ test/golden/fields.json | 108 +++++++++--------- 3 files changed, 81 insertions(+), 57 deletions(-) diff --git a/server/sim/content/kits/ops/chess_char_4_12-glady.js b/server/sim/content/kits/ops/chess_char_4_12-glady.js index 98e7700c..9cfbe3eb 100644 --- a/server/sim/content/kits/ops/chess_char_4_12-glady.js +++ b/server/sim/content/kits/ops/chess_char_4_12-glady.js @@ -12,14 +12,17 @@ const ABYSSAL = new Set(['char_143_ghost', 'char_263_skadi', 'char_474_glady', ' const isAbyssal = (u) => u?.def?.raw?.groupId === 'abyssal' || ABYSSAL.has(u?.def?.charId ?? u?.def?.raw?.charId); export default withDefaults({ - // ===== 歌蕾蒂娅 (hookmaster) S3 缺水的碎漩狂舞 — bind a far target, tornado: slow, 85 % arts pulses + pull, final pull + // ===== 歌蕾蒂娅 (hookmaster) S3 缺水的碎漩狂舞 — bind a far target, tornado (r 1.5): slow, 85 % arts pulses + pull, + // final pull (the 捕网, r 1) // S1 缺水的大洋裂断 (charges: next attack pulls the target to her front, 150 %/180 %); S2 缺水的掌握怒海 (BAT +0.5 s, // wider range, ≤ 2 targets — blocked first — at 135 %/150 % and pulled to her front); module HOK-Y (淡金坠饰): // a pull towards herself of an enemy farther than 2.5 tiles is one force level stronger chess_char_4_12_a: (bb, chess, def) => { const t0 = tbb(def, 0), t1 = tbb(def, 1), mb = moduleBb(def); const tb = def.traitBb || {}; - const R = 1.5; // [ASSUMED] tornado radius (no blackboard key) + // S3 radii (no blackboard key) — PRTS 备注: 「龙卷风半径1.5」 (slow, pulses) and 「技能结束时的拖拽为捕网,捕网半径为1,无伤害」 + // (the skill-end pull; until 0.2.2 it reused the tornado's 1.5 — GitHub #324, PR #329) + const R = 1.5, NET_R = 1; const force = num(bb.force, num(bb['attack@force'], 0)); const iv = Math.max(0.1, num(bb.interval, 1.5)); const g = grid(def.skill?.rangeGrid); @@ -76,7 +79,7 @@ export default withDefaults({ const T = unit.mem.tornado; unit.mem.tornado = null; if (!T || reason === 'death' || !unit.alive) return; - for (const e of battle.foesInRadius(T.x, T.y, R)) pullSelf(battle, unit, e, force); + for (const e of battle.foesInRadius(T.x, T.y, NET_R)) pullSelf(battle, unit, e, force); // the 捕网 battle.fx('pull', { x: T.x, y: T.y, id: unit.id }); }, }, diff --git a/test/content/kits_t4.test.js b/test/content/kits_t4.test.js index 2f32ad02..6e4d49ec 100644 --- a/test/content/kits_t4.test.js +++ b/test/content/kits_t4.test.js @@ -454,6 +454,27 @@ test('歌蕾蒂娅 S3: binds the farthest target, tornado pulses 85 % ATK arts e checkInvariants(h.b); }); +test('歌蕾蒂娅 S3: the skill-end 捕网 has radius 1, the tornado 1.5 (PRTS 备注; GitHub #324, PR #329)', () => { + const id = 'chess_char_4_12_a'; + const h = makeBattle({ defs: { enemies: { enemy_dummy: dummy() } }, units: [{ chessId: id, row: 10, col: 3 }], timeLimit: 200, autoFinish: false }); + h.step(); + const u = h.unit(id); + h.spawn('enemy_dummy', { pos: [10, 6] }); // the farthest enemy: bound, the tornado sits on it + h.step(); + assert.ok(u.skill.activate('test', { free: true })); + assert.deepEqual([u.mem.tornado.x, u.mem.tornado.y], [6, 10]); + const at = (x, y) => { const e = h.spawn('enemy_dummy', { pos: [10, 6] }); e.x = x; e.y = y; return e; }; + const inner = at(6, 9.1), outer = at(6, 11.25); // 0.9 and 1.25 from the centre + h.step(); + for (const e of [inner, outer]) assert.ok(e.findBuff(`glady:slow:${u.id}`), 'both inside the tornado (slowed)'); + const p0 = [inner.x, inner.y, outer.x, outer.y]; + u.skill.end('test'); + h.run(0.6); + assert.ok(Math.hypot(inner.x - p0[0], inner.y - p0[1]) > 0.3, 'the net pulls the enemy 0.9 from the centre'); + assert.deepEqual([outer.x, outer.y], [p0[2], p0[3]], 'the one 1.25 from the centre stays: outside the net'); + checkInvariants(h.b); +}); + test('歌蕾蒂娅 阿戈尔的波涛: 深海猎人 regen 2.5 %/s and −25 % damage from 海怪; elite drag damage', () => { const id = 'chess_char_4_12_a', t0 = D(id).talents[0].bb; const sea = withTags(dummy({ key: 'enemy_sea', atk: 0 }), ['seamonster']); diff --git a/test/golden/fields.json b/test/golden/fields.json index a1568be1..d48ca3e4 100644 --- a/test/golden/fields.json +++ b/test/golden/fields.json @@ -425,81 +425,81 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 14, + "killed": 11, "total": 14, "unspawned": 0, - "bossHpLeft": 7089603, - "rngDraws": 790, + "bossHpLeft": 7409377, + "rngDraws": 605, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":14,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1232553,"bossDmg":447559,"heal":54877,"deaths":14,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1161150,"bossDmg":862838,"heal":6691,"deaths":14,"layerGains":{}} + "p1": {"killed":11,"total":14,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":979196,"bossDmg":339107,"heal":30297,"deaths":17,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":978164,"bossDmg":651515,"heal":4827,"deaths":19,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,54,0,155980,8234,420,28,2], - ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",1373.6,1,60,2,14823,8720,1235,14,1], - ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,49,0,52926,18466,3193,26,12], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",1187.98,1,52,0,28347,13246,275,19,2], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",911.19,1,55,2,447919,3364,21815,111,19], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",298.05,1,61,2,96428,10840,743,39,4], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1227.14,1,19,1,132749,4452,335,209,6], - ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1176.62,1,57,6,174306,2559,513,45,19], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,50,0,0,4335,26014,44,3], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1293.14,1,15,0,129076,4452,335,71,3], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2307.16,1,62,0,0,7381,302,0,1], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",272.31,1,26,0,286831,5830,290,256,8], - ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",1851.09,1,56,0,25219,5607,202,31,7], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,53,0,105158,8892,178,187,5], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2548.55,1,59,0,245655,5827,262,55,5], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,51,0,203707,3584,462,170,3], - ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1573.58,1,14,0,0,4452,515,0,0], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,75126,9258,2532,87,5], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,4,1,66605,3677,1688,66,19], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1224.14,1,58,0,152849,2733,262,72,13], + ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",705.31,1,59,4,131873,7528,420,24,1], + ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",1900.22,1,58,0,17700,9171,1117,15,2], + ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,49,0,44334,13392,2872,19,9], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,56,0,16983,9690,38,10,1], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",792.86,1,61,4,373855,3374,10736,110,15], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,55,1,81328,10164,552,32,4], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,19,0,109465,4097,137,150,4], + ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1058.29,1,63,1,97795,2559,395,36,12], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,52,0,0,4335,13944,32,3], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,68,0,105862,4163,87,50,2], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2188.83,1,66,0,377,7381,183,1,1], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",2149,1,64,0,189683,6159,30,182,7], + ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",1732.75,1,62,0,29484,5607,83,37,9], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,57,0,104682,11074,310,154,6], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,53,0,211676,5907,57,42,4], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,54,0,148737,3584,462,128,2], + ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,14,0,0,3172,310,0,0], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,67,0,64191,5877,2900,74,5], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1501.32,1,60,1,69313,2825,348,69,20], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1105.8,1,65,0,160021,2518,143,71,13], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ], - "enemies": {"enemy_1010_demon":[4,4,0,2399,200612],"enemy_1438_dspred":[10,10,0,18789,882694],"enemy_1521_dslily":[1,0,0,106920,1310397]}, - "hooks": [1,60,6000,1412,1519,3473,3619,7435,42,44,137,135,14,39147,1338,16,15,0,1,42,0,41,1], - "events": {"atk":1655,"deploy":45,"die":44,"dmg":3602,"engage":17,"fx":970,"heal":326,"skill":272,"spawn":37,"status":1032}, + "enemies": {"enemy_1010_demon":[4,4,0,2399,200612],"enemy_1438_dspred":[10,7,3,17928,766125],"enemy_1521_dslily":[1,0,0,95770,990623]}, + "hooks": [1,66,6000,1164,1243,2884,3011,5758,47,52,120,117,15,33717,1094,14,15,3,1,50,0,31,1], + "events": {"atk":1392,"deploy":51,"die":49,"dmg":2997,"engage":18,"fx":781,"heal":197,"leak":3,"skill":237,"spawn":37,"status":944}, "fx": { - "aoe": 35, - "appear": 5, + "aoe": 24, + "appear": 7, "blink": 2, - "burst": 41, - "charge": 7, - "counter": 14, - "crit": 87, - "dilemma": 5, - "disappear": 5, - "displace": 31, + "burst": 31, + "charge": 9, + "counter": 15, + "crit": 62, + "dilemma": 4, + "disappear": 7, + "displace": 28, "dodge": 1, "explosion": 13, - "frostNova": 19, + "frostNova": 20, "grow": 1, - "iceSpike": 163, + "iceSpike": 119, "overclock": 1, - "pull": 5, - "quadShot": 3, - "ripple": 23, + "pull": 4, + "quadShot": 2, + "ripple": 14, "rockfall": 18, - "sentry": 1, - "sermon": 1, - "shadowWeave": 1, - "shield": 4, - "soul": 6, - "sp": 18, - "stealth": 8, - "swordRain": 31, - "swordStorm": 5, + "sentry": 3, + "sermon": 2, + "shadowWeave": 4, + "shield": 5, + "soul": 4, + "sp": 6, + "stealth": 7, + "swordRain": 35, + "swordStorm": 6, "tentacle": 6, "tide": 5, "tornado": 5, - "tornadoPulse": 25, + "tornadoPulse": 20, "weightless": 4, - "zone": 371 + "zone": 287 }, - "snaps": "c2a7999d 8a4c19ba a9160fe3 7790e2d3 b4c7df2c aeea651a 14cb22cd 25ce984d 1dae4eaa 3b5bc6f4 cea353c7 a707d801 93c5ab85 abfa7f42 649abe2c 3a9580f7 d78d904b 13046d3f 101d5dee 5b6642d4" + "snaps": "c2a7999d e9680942 e3840c7b 42c88c80 94a6e7f9 e3adc041 fb0ab7c9 a417daa3 276e9da9 3fe787bd efdfd5a6 be8d612e 6d73c0e0 c042c02d 8eb02031 e24fb236 cdcefb5e 80d6b414 6b9e081e 0da412b8" }, "boss-boss_4-solo": { "about": "盐风主教昆图斯 solo pool 4200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",