Files
ark-stronghold-protocol/server/sim/content/kits/ops/chess_char_5_23-reckpr.js
T
sganggs 027c8477eb feedback5 WE1: the 「治疗生命值低于50%」 module heal compares HP as its client buff does — 华法琳 / 闪灵 ≤, 瑕光 / 古米 / 塞雷娅 / 录武官 < (follow-up 19)
PRTS gives only the display text; the client's module buffs decide (local [uc]equips.ab + buff_template_data, extracted
2026-10-06): 瑕光 / 古米 / 塞雷娅 GUA-X set_heal_scale_by_hpratio (FilterByTargetHpRatio LT), 录武官 reckpr_e_002_tr (LT),
Touch acmedc_e_tr (LT); 华法琳 bldsk_e_002_tr and 闪灵 shining_e_003_tr — like 黍's GUA-X and 凯尔希's PHY-X —
heal_scale_up[hpratio][LE].

- kits/shared/tier4.js installLowHpHealBonus and tier5.js lowHpHealUp take { atOrBelow }; 华法琳 (tier 4 and 5) and 闪灵's
  PHY-X heal ×1.15 at or below 50 %; the strictly-below kits keep `<` and cite their template.

Golden: no scenario moved (no heal of the corpus lands on an ally at exactly 50 % HP).

Tests: test/content/feedback5-lowhp-heal.test.js (new, 2); kits_t4, kits_alt_t4, kits_t5, kits_alt_t5, op_shining,
standin_acmedc pass.
2026-10-06 15:51:43 +08:00

51 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// server/sim/content/kits/ops/chess_char_5_23-reckpr.js — 录武官 (char_4196_reckpr) kit, tier 5.
// Conventions of the tier-5 kits: ../shared/tier5.js; kit contract and rules: ../README.md.
import { isHpLoss } from '../../../damage.js';
import {
num, on, inRange, talent, traitBb, mods, isOp, lazySkills, instantKind, lowHpHealUp,
} from '../shared/tier5.js';
export default {
// ---------------------------------------------------------------------------------------------------------------
// 录武官 — S2 一点关窍 (25 s): ATK +; healed allies get a 10 s buff healing 80/120 HP on every hit taken.
// T1 学成于聚: an op in range starting a skill → +1 SP and ASPD +16 for 8 s. Module (elite): heals below 50 % ×1.15.
// S1 触类旁通 (2/3 charges): the next heal restores heal_scale × ATK and heals max_target allies.
chess_char_5_23_a: (bb, chess, def) => {
const t0 = talent(chess, 0), tb = traitBb(chess);
const dur = num(bb['attack@buff_duration'], 10), value = num(bb['attack@fixed_heal_value']);
return {
skills: lazySkills({
skchr_reckpr_1: () => ({ kind: instantKind(chess, def), heal: true, attack: { healScale: num(bb.heal_scale, 1), maxTargets: Math.max(1, num(bb.max_target, 2)) } }),
}),
skill: {
kind: 'duration', heal: true,
mods: mods({ atkPct: num(bb.atk) }),
onHit({ battle, unit, target }) {
// "治疗干员后为其施加一个增益": operators only (summons are 友方单位, not 干员)
if (!target || !target.alive || !isOp(target) || !(value > 0)) return;
battle.addBuff(target, { key: 'reckpr:guard', duration: dur, visible: true, data: { src: unit, value } });
},
},
talents: [{ install(battle, unit) { // 学成于聚
battle.on('skillStart', (c) => {
const a = c.unit;
if (a === unit || !isOp(a) || !on(unit) || !inRange(unit, a)) return;
if (num(t0.prob, 1) < 1 && !battle.rng.chance(num(t0.prob, 1))) return;
unit.skill?.gainSp(num(t0.sp), 'talent');
if (num(t0.attack_speed)) battle.addBuff(unit, { key: 'reckpr:learn', duration: num(t0.duration, 8), mods: { aspd: num(t0.attack_speed) } });
}, { owner: unit });
} }],
install(battle, unit) {
battle.on('damaged', (c) => {
const a = c.target;
if (a.side !== 'ally' || !(c.amount > 0) || a.hp <= 0 || c.type === 'element' || isHpLoss(c.dmg)) return; // (not a 流失)
const b = a.findBuff('reckpr:guard');
if (b && b.data.src === unit) battle.heal(unit, a, num(b.data.value));
}, { owner: unit });
lowHpHealUp(battle, unit, tb); // PHY-X: reckpr_e_002_tr filters LT (strictly below)
},
};
},
};