← All scenarios
CARD-003autoAttack

Self-condition — '+30% damage while HP below 50%' triggers correctly

Tests the hpBelow condition predicate targeting self. Run the same skill twice: once at full HP (no bonus), once at 30% HP (bonus applies). The two damage values must clearly differ.

conditionalModifierselfHPConditionhpBelowPredicate
Action
autoAttack
Auto-attack in expected mode
mode
expected
context.mapType
pve

Actors

Berserker (full HP variant)
player · lord_knight · Lv90
attacker
Primary stats
str
99
agi
40
vit
70
int
1
dex
50
luk
20
Equipment
  • mainhand: berserkers_blade · sword_2h · +8 · ATK 180 · 1 card
HP 10000 / 10000
Generic medium dummy
monster · Lv85
defender
formlessneutral 1mediumnormal
HP 999999 / 999999
Hard DEF 30
Hard MDEF 10
Expected output
From the scenario fixture. Numerical values marked as null are placeholders pending rAthena verification.

Two variants: at full HP the atk.percent bonus does NOT apply; at 30% HP it DOES (30% < 50% threshold). damage(30%) should be ~30% higher than damage(full). The threshold is currentHP/maxHP — the library must compute this ratio from the Actor, not be told.

Show full expected JSON
{
  "propertyAssertions": [
    "damage(hp=30%) > damage(hp=100%)",
    "damage(hp=30%) / damage(hp=100%) is approximately 1.30 (after softDEF reapplied) — exact ratio depends on where atk.percent is in the pipeline"
  ]
}

Computed: DamageResult

Server-evaluated by calculatePhysicalDamage() from @ro/core.

Outcome
hit
1 hit · 566 damage
566
Pipeline breakdown
D-003 steps 2–13
WeaponratioATK333
× size × skill333
× (1 + 0.0% ATK%)333
+ StatusATK (241)574
× 1.00 element574
× (1 + 0.0% race/elem/size/class)574
crit none574
− 0 hard DEF574
− 8 soft DEF566
× (1 − 0.0% taken%)566
+ MasteryATK (0)566
floor + min(1)566
Inputs
From attacker / defender ResolvedStats
StatusATK241
WeaponATK333
EquipATK0
MasteryATK0
Size mult1.00×
Element mult1.00×
Race%0.0%
Element%0.0%
Size%0.0%
Class%0.0%
Taken%0.0%

Hits (1): hit 566

Variant matrix · 2 cells

Each cell re-applies the variant's overrides to the base scenario and re-runs the same pipeline that produced the single result above.

Sweep over currentHPPercent
Highest in row is highlighted emerald; lowest rose. Hover any cell to see the full variant label.
+10.3
566566
Property assertions
Pattern-matched checks from the scenario's expected. ⊙ marks assertions the parser doesn't recognize (the raw string is shown so devs can verify by eye).
  • damage(hp=30%) > damage(hp=100%)
  • damage(hp=30%) / damage(hp=100%) is approximately 1.30 (after softDEF reapplied) — exact ratio depends on where atk.percent is in the pipeline