// server/sim/content/kits/ops/chess_char_2_08-bubble.js — 泡泡 (char_381_bubble) kit, tier 2. // Conventions of the tier-2 kits: ../shared/tier2.js; kit contract and rules: ../README.md. import { num, talentBb, traitBb, byEnemyAttack, onDamagedOn, toggleBuff } from '../shared/tier1.js'; import { onDefaultSkill } from '../shared/tier2.js'; export default { // --------------------------------------------------------------------------------------------------------------- // 2_08 泡泡 “挨打”: stops attacking; DEF +def, taunt +taunt_level, each attack received returns atk_scale × DEF phys // damage to the attacker. 尖刺盾: attackers get ATK −atk for `duration` s. Elite module (PRO-X): DEF +def while blocking. // S1 防御力强化·β型 (alt, TAKE_DAMAGE from data): DEF +def for its duration; the counter belongs to “挨打” only. chess_char_2_08_a: (bb, chess) => { const t = talentBb(chess, 0); const tb = traitBb(chess); const s2 = onDefaultSkill(chess); return { skill: { kind: 'duration', mods: { defPct: num(bb.def), taunt: num(bb.taunt_level) }, attack: { noAttack: true } }, skills: { 'skcom_def_up[2]': { kind: 'duration', mods: { defPct: num(bb.def) } } }, talents: [{ install(battle, unit) { onDamagedOn(battle, unit, (ctx) => { if (!byEnemyAttack(ctx) || !unit.alive) return; const src = ctx.source; if (s2 && unit.skill?.active && src.alive) { battle.dealDamage(unit, src, { amount: unit.s.def * num(bb.atk_scale), type: 'phys', isSkill: true, canDodge: false, tags: ['counter'] }); battle.fx('counter', { x: src.x, y: src.y, id: unit.id }); } if (num(t.atk) < 0 && src.alive) battle.addBuff(src, { key: 'bubble:spike', duration: num(t.duration, 5), mods: { atkPct: num(t.atk) }, refresh: 'extend', source: unit }); }); if (num(tb.def)) toggleBuff(battle, unit, 'bubble:guard', () => unit.blocking.length > 0, { defPct: num(tb.def) }); } }], }; }, };