combat_attack
Resolve a player attack against an NPC, applying threat level, rolling damage, handling weapon effects, updating hit points, and advancing the turn when the action is spent.
Instructions
Resolve one player attack against one NPC.
Melee tests STR and needs close range. Ranged tests DEX. The tool applies Threat Level, rolls damage on a success, applies a critical as maximum base damage plus one extra die, updates hit points, and marks a dead NPC.
Repeating the attack action in the same turn rolls Doom automatically.
Spending the last action advances the turn itself, and dropping the last enemy ends the fight itself: read turn_advanced, next_actor, combat_over, and next_step from the result rather than calling combat_end_turn. Only the active actor may attack; an attack out of turn is refused with the actor whose turn it actually is.
weapon_effect accepts none, brutal, disarm, pin_down, shove, entangle, cleave, or impale. Disarm, pin_down, and entangle deal no damage and instead flag the target (reduced damage output, or blocked from changing range band until it spends an action to break free). Shove deals no damage and pushes the target one band away. Cleave and impale both strike beyond the named target on the same swing: cleave also hits every other enemy sharing the target's range band, and impale, only when the blow fells the target, carries through for the same damage to one more enemy in that band, chosen at random. Any other value is rejected before dice are rolled: adjudicate it in fiction and record durable results with scene_commit.
Set runic true to strike with a granted runic weapon: damage equals the attribute the weapon's personality fixes, and a kill rolls the on-kill effect. A runic strike takes no weapon_effect and is not unarmed.
Set one_handed_blade true when the weapon in hand is a one-handed blade; a Sword master then tests DEX instead of STR on a melee attack. A Hunter's first ranged attack of a fight hits automatically without a test and adds their level to damage.
Set target_unaware true when the fiction holds the target unaware of the attacker; an Assassin's strike then deals damage equal to their DEX score in place of the rolled weapon damage. The engine only honours this while the target has not itself reacted this fight (its own turn opened, or it attacked someone) and this character has not already spent their own unaware strike this fight; being struck does not itself count as reacting, so a second Assassin can still find the same target unaware. Outside that window the flag is ignored and normal damage applies.
Set poisoned true to coat the strike with one prepared Herbalist poison dose. Refused before any dice roll if no dose is in stock, or alongside runic, unarmed, or a non-damaging weapon_effect (disarm, pin_down, shove, entangle). The dose is spent on the swing whether it hits or misses, and a damaging hit adds d6 poison damage.
A positioning declaration -- circling behind, backing off, working for an angle -- is not an attack; resolve it with attribute_test on the actor's own turn instead.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| runic | No | ||
| unarmed | No | ||
| poisoned | No | ||
| advantage | No | ||
| target_id | Yes | ||
| two_handed | No | ||
| attack_type | No | melee | |
| attacker_id | Yes | ||
| disadvantage | No | ||
| weapon_effect | No | none | |
| target_unaware | No | ||
| one_handed_blade | No |