Skip to content

Tier 3 revive cover: extend #7 to item-based defensive abilities #86

Description

@hummat

Context

#7 (v0.10.0) added defensive combat ability activation before revive interactions via revive_ability.lua hooking BtBotInteractAction.enter. Current whitelist (combat_ability_identity.lua:51) covers 7 combat-ability templates across Veteran/Zealot/Psyker/Ogryn/Arbites.

A 2026-04-11 audit confirmed the combat-ability whitelist is complete — all 15 combat ability templates were walked against class docs + decompiled buff proc_funcs, and the 8 excluded templates are all legitimately offensive (stances, charges, dashes).

However, Tier 3 item-based abilities are not covered, and several are among the strongest defensive revive tools in the game.

Missing coverage

Item-based abilities flow through item_fallback.lua (wield/use/unwield state machine), not combat_ability_action. revive_ability.try_pre_revive resolves ability identity via unit_data_extension:read_component("combat_ability_action") only, so the entire Tier 3 class is invisible to the pre-revive path.

Ability Template slot Defensive value for revive
Psyker Telekine Shield slot_combat_ability item Physical wall blocks ranged + melee — literal projectile cover over downed ally
Zealot Relic of the Emperor Ascendant slot_combat_ability item AoE toughness restore + DR aura to allies in radius
Arbites Nuncio-Aquila drone (with adamant_drone_buff_talent) slot_combat_ability item +30% revive speed and −30% TDR for allies in zone — literally designed for this

All three are validated Tier 3 abilities already handled by item_fallback.lua for general activation.

Approach

  1. Semantic tagging: extend combat_ability_identity.lua with an item-based defensive whitelist (parallel to REVIVE_DEFENSIVE_BY_SEMANTIC_KEY) keyed on item slot identity, or add a is_revive_defensive_item resolver.
  2. Resolution path: revive_ability.try_pre_revive currently short-circuits on combat_ability_action.template_name == nil (Tier 3 path). Add a parallel branch that reads the equipped slot_combat_ability item and matches against the item whitelist.
  3. Activation: delegate to ItemFallback.begin(unit, profile) rather than action_input_extension:bot_queue_action_input. The existing item_fallback state machine handles wield → use → unwield.
  4. Cooldown/charge gate: reuse existing _is_combat_template_enabled + per-item availability checks already present in item_fallback.
  5. EventLog: emit revive_ability event with tier = 3 + item_slot fields for correlation with text-log revive_candidate lines.

Open questions

  • Does BtBotInteractAction.enter fire early enough to start a wield sequence before the revive interaction commits? Needs trace validation — Tier 3 wield-use-unwield typically takes ~1.5–2s, which may overshoot the revive start window.
  • Arbites Nuncio-Aquila drone is placement-based (ground zone) — does the bot need to be standing at the revive target before placing, or can it place en route? Check adamant_whistle.lua / drone placement logic.
  • Should Psyker Telekine Shield position preference bias toward the downed ally's line of sight to nearest enemy group, rather than default bot facing?

Relevant files

  • scripts/mods/BetterBots/revive_ability.lua (hook site + resolution)
  • scripts/mods/BetterBots/combat_ability_identity.lua (whitelist expansion)
  • scripts/mods/BetterBots/item_fallback.lua (Tier 3 state machine)
  • ../Darktide-Source-Code/scripts/extension_systems/interaction/interactions/revive_interaction.lua (revive timing reference)
  • docs/bot/input-system.md (Tier 3 wield-use-unwield pattern)

Acceptance criteria

  • Bot Psyker equipped with Telekine Shield places shield before starting a revive interaction when enemies are within X m of the downed ally
  • Bot Zealot equipped with Relic activates it before starting a revive, covering the revive window with ally toughness aura
  • Bot Arbites with Nuncio-Aquila drone + adamant_drone_buff_talent places the drone at the revive location to benefit from +30% revive speed
  • JSONL event log emits revive_ability events with tier: 3 for item-based activations
  • Existing combat-ability path (Tier 1/2) remains unchanged — no regression in Revive-with-ability: activate defensive abilities during revive #7 coverage
  • New unit tests in tests/revive_ability_spec.lua cover the item-based resolution branch

Not in scope

  • Extending to other non-revive rescue interactions (pull_up, remove_net, rescue) — already covered by RESCUE_INTERACTION_TYPES, no additional work needed
  • Ogryn Stimm Field (Hive Scum DLC broker_* — blocked, DLC not owned)
  • Dynamic item selection (bot carries multiple defensive items) — out of scope, bots have a single slot_combat_ability

Related

  • Revive-with-ability: activate defensive abilities during revive #7 — Original revive-with-ability implementation (Tier 1/2 combat abilities, shipped v0.10.0)
  • docs/classes/psyker.md (Telekine Shield template details)
  • docs/classes/zealot.md (Relic item-based ability notes)
  • docs/classes/arbites.md (Nuncio-Aquila + adamant_drone_buff_talent revive speed)

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2: laterPlanned but not urgentarea: ability-qualityAbility activation timing, suppression, and coordinationclass: arbitesArbites Exaction Squad abilitiesclass: psykerPsyker Psykinetic abilitiesclass: zealotZealot Preacher abilitiesenhancementNew feature or requesttier: 3No ability_template — needs custom approach

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions