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).
This commit is contained in:
1 parent
01f5b216c6
commit
88d578b3fe
9 files changed
+204
-23
No files matched your search
@@ -60,6 +60,7 @@
|
||||
|
||||
import { gameData, num, buffsOf, passiveBuff, effectRecord, directMods } from './support/index.js';
|
||||
import { isShopItem } from '../simdata.js';
|
||||
import { isHpLoss } from '../damage.js';
|
||||
|
||||
// =====================================================================================================================
|
||||
// data helpers
|
||||
@@ -472,7 +473,7 @@ export function install(battle) {
|
||||
if (!t || t.side !== 'ally' || (t.kind !== 'op' && t.kind !== 'token')) return;
|
||||
// 自愈: every damage instance an own unit takes (not HP loss 流失, not element gauge fills, not under 禁疗)
|
||||
const amt = heal.get(t.ownerId);
|
||||
if (amt > 0 && ctx.amount > 0 && ctx.type !== 'element' && !(ctx.dmg && Array.isArray(ctx.dmg.tags) && ctx.dmg.tags.includes('hpLoss'))
|
||||
if (amt > 0 && ctx.amount > 0 && ctx.type !== 'element' && !isHpLoss(ctx.dmg)
|
||||
&& t.alive && t.deployed && t.hp > 0 && !t.s.flags.noHeal) {
|
||||
battle.heal(null, t, amt, { self: true });
|
||||
}
|
||||
|
||||
@@ -90,8 +90,9 @@ const SHELL_FLIGHT = 3, SHELL_RADIUS = 1.2;
|
||||
/** 假想敌:黑云 抓取: the blackboard radius counts ×2.5 (PRTS "2.5倍可变半径": range_radius 1.5 → 3.75), at most 3 prey,
|
||||
* "短暂延迟后" the 延迟吞噬 lands (delay [ASSUMED] 0.5 s); its SP (= 全弹发射 hits) caps at the data's spData.maxSp. */
|
||||
const GRAB_RADIUS_SCALE = 2.5, GRAB_MAX_PREY = 3, GRAB_DELAY = 0.5;
|
||||
/** 源石污染区 aura radius of an activated 奇美拉 [ASSUMED]. */
|
||||
const CHIMERA_AURA_RADIUS = 1;
|
||||
/** 孽罪奇美拉 污染模式 aura (PRTS 天赋 "自身半径1.2范围内的所有单位…每0.5秒受到50真实持续伤害(同类效果取最高)"): radius,
|
||||
* damage period (s). */
|
||||
const CHIMERA_AURA_RADIUS = 1.2, CHIMERA_AURA_EVERY = 0.5;
|
||||
/** Bombardments per 自行炮 Cannon cast ("数次") [ASSUMED]. */
|
||||
const CANNON_SHOTS = 3;
|
||||
/** 枯朽之种 summoned per BornBugs cast ("数个") [ASSUMED]. */
|
||||
@@ -995,7 +996,9 @@ function kitDeepsea(ab, { swim = false, drown = false }) {
|
||||
if (!wet && a.wet) b.removeBuff(e, 'ab:swim');
|
||||
if (wet) b.removeBuff(e, 'terrain:deepsea'); // 免疫水蚀: drop devices.js' deep-water debuff
|
||||
}
|
||||
if (drown && wet) { const v = T(ab, 'Drown.damage') ?? 0; if (v > 0) b.loseHp(e, v * dt, { source: null }); }
|
||||
// PRTS 码头水手 "水蚀状态下或处于清澈水域时,每秒受到1000点无来源真实伤害" (伤害分类: 深水区/涨潮水蚀 is BUFF damage):
|
||||
// damage, not a 流失 — 脆弱 scales it (player report D1 audit)
|
||||
if (drown && wet) { const v = T(ab, 'Drown.damage') ?? 0; if (v > 0) b.dealDamage(null, e, { ...periodicDamage(v * dt), tags: ['dot', 'periodic', 'drown'] }); }
|
||||
a.wet = wet;
|
||||
},
|
||||
hitIn(c, b, e, a) { if (swim && a.wet && c.dmg.tags && c.dmg.tags.some((t) => t === 'terrain' || t === 'deepsea' || t === 'drown')) c.dmg.cancel = true; },
|
||||
@@ -1022,13 +1025,16 @@ function kitChimera(ab) {
|
||||
activate(b, e, a);
|
||||
if (!a.on) return;
|
||||
a.acc = (a.acc ?? 0) + 0.25;
|
||||
const pulse = a.acc >= 1 - 1e-9;
|
||||
if (pulse) a.acc -= 1;
|
||||
const pulse = a.acc >= CHIMERA_AURA_EVERY - 1e-9;
|
||||
if (pulse) a.acc -= CHIMERA_AURA_EVERY;
|
||||
for (const u of b.alliesInRadius(e.x, e.y, CHIMERA_AURA_RADIUS)) {
|
||||
auraBuff(b, u, 'ab:originium', 0.25, { spRecoveryMul: Math.max(0, 1 + spr) }, null, true);
|
||||
// PRTS "持续视为受到源石污染区影响…受到50真实持续伤害": a damage instance (受击回复, the 重装 trigger), not a 流失 —
|
||||
// 无来源 like the 源石污染区 terrain it stands for [ASSUMED], the chimera keeps the credit
|
||||
if (pulse && dmg > 0) b.dealDamage(e, u, { ...periodicDamage(dmg), tags: ['dot', 'pollution'] });
|
||||
// PRTS "持续视为受到源石污染区影响…每0.5秒受到50真实持续伤害": a damage instance (受击回复, the 重装 trigger), not a
|
||||
// 流失 — 无来源 like the 源石污染区 terrain it stands for [ASSUMED], the chimera keeps the credit; "同类效果取最高": one
|
||||
// tick per unit per period however many chimeras reach it (`mem.chimeraAt`; every chimera's is 50)
|
||||
if (!pulse || !(dmg > 0) || b.time - (u.mem.chimeraAt ?? -Infinity) < CHIMERA_AURA_EVERY - 1e-6) continue;
|
||||
u.mem.chimeraAt = b.time;
|
||||
b.dealDamage(e, u, { ...periodicDamage(dmg), tags: ['dot', 'pollution'] });
|
||||
}
|
||||
},
|
||||
}];
|
||||
@@ -2473,9 +2479,11 @@ export const KITS = Object.freeze({
|
||||
enemy_2085_skzjxd: (ab) => [frontGuard(T(ab, 'Weakness.damage_resistance') ?? 0, faceCrowd)], // 圆仔 · faces the bigger crowd, front damage −80 %
|
||||
enemy_2085_skzjxd_2: (ab) => [frontGuard(T(ab, 'Weakness.damage_resistance') ?? 0, faceCrowd)], // 圆仔 · same
|
||||
// 失衡 (pushed / pulled by operators)
|
||||
enemy_1328_cbjedi: (ab) => [unbalanced((b, e, a, d) => { // 弧光锋卫 · loses HP in proportion to the distance moved while unbalanced
|
||||
enemy_1328_cbjedi: (ab) => [unbalanced((b, e, a, d) => { // 弧光锋卫 · takes damage in proportion to the distance moved while unbalanced
|
||||
// PRTS 修正 "失衡移动时持续受到真实伤害", "处于失衡状态时,每0.066s受到400点无来源真实持续伤害" (伤害分类: 弧光锋卫失衡状态下的自残
|
||||
// 伤害 is BUFF damage): damage, not a 流失 (player report D1 audit)
|
||||
const v = T(ab, 'unbalanced_bleed.damage') ?? 0, iv = T(ab, 'unbalanced_bleed.interval') ?? 1;
|
||||
if (v > 0 && iv > 0) b.loseHp(e, (v * d) / (iv * UNBALANCE_SPEED), { source: null, tags: ['unbalanced'] });
|
||||
if (v > 0 && iv > 0) b.dealDamage(null, e, { ...periodicDamage((v * d) / (iv * UNBALANCE_SPEED)), tags: ['dot', 'periodic', 'unbalanced'] });
|
||||
})],
|
||||
enemy_10112_ymgds: (ab) => [unbalanced((b, e) => { // 冒失的小弟 · stunned after being unbalanced
|
||||
const st = T(ab, 'StunAfterUnbalance.stun') ?? 0;
|
||||
|
||||
@@ -56,6 +56,8 @@ function partnerOf(p) {
|
||||
const isProc = (dmg) => !!(dmg && dmg.tags && dmg.tags.indexOf('item') >= 0);
|
||||
const procTags = (k) => ['item', `item:${k}`];
|
||||
const chance = (battle, p) => p > 0 && (p >= 1 || battle.rng() < p);
|
||||
/** An ally built from an enemy record — PRTS's 敌人类我方单位 (炎佑 enemy_9012_acloon). */
|
||||
const ENEMY_RECORD = /^enemy_/;
|
||||
/** 'fatal' priorities (see header). */
|
||||
export const PRIO_REVIVE = -100;
|
||||
const PRIO_FREE_UNDYING = 20;
|
||||
@@ -320,10 +322,22 @@ const BY_BUFF = {
|
||||
// not a 流失 — shields, damage-taken modifiers and the target-side `hit` effects apply, and it is a "受到伤害" for 受击回复
|
||||
// SP, the 重装 TAKE_DAMAGE trigger and 信仰搅拌机 S3's counters (player report D1). 无来源: hooks see no source; the carrier
|
||||
// keeps the credit (a carrier the drain finishes off is its own kill, as before). May kill.
|
||||
// The same 备注: "携带后,全场范围内的所有敌人类我方单位也会获得此装备的“每秒受到60真实伤害”效果(该效果的付与为我方阵营索敌,
|
||||
// 可对空,无视目标可选性)" — every enemy-record unit on our side of the whole field (炎佑 enemy_9012_acloon, a partner's
|
||||
// too; flying, 孤立) takes the same tick, credited to nobody, while a carrier is on the field [ASSUMED: it ends with its
|
||||
// carriers]; one effect per unit however many carriers (PRTS 作战机制 "同名buff的默认叠加策略buff只能表现出一个").
|
||||
periodic_damage(battle, u, p, S) {
|
||||
const d = num(p.damage);
|
||||
if (!(d > 0)) return;
|
||||
S.stat('drain', null, { interval: 1, onTick: ({ unit }) => { if (unit.deployed) battle.dealDamage(unit, unit, periodicDamage(d)); } });
|
||||
S.stat('drain', null, { interval: 1, onTick: ({ unit }) => {
|
||||
if (!unit.deployed) return;
|
||||
battle.dealDamage(unit, unit, periodicDamage(d));
|
||||
for (const a of battle.allies()) {
|
||||
if (a === unit || !ENEMY_RECORD.test(a.defId ?? '') || battle.time - (a.mem.solventAt ?? -Infinity) < 1 - 1e-6) continue;
|
||||
a.mem.solventAt = battle.time;
|
||||
battle.dealDamage(null, a, periodicDamage(d));
|
||||
}
|
||||
} });
|
||||
},
|
||||
// 奥术法阵: 攻击使目标失去特殊能力 silence s
|
||||
silence_attachment(battle, u, p, S) {
|
||||
|
||||
Reference in new issue
Block a user