You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#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.
+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
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.
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.
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.
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)
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
Context
#7 (v0.10.0) added defensive combat ability activation before revive interactions via
revive_ability.luahookingBtBotInteractAction.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), notcombat_ability_action.revive_ability.try_pre_reviveresolves ability identity viaunit_data_extension:read_component("combat_ability_action")only, so the entire Tier 3 class is invisible to the pre-revive path.slot_combat_abilityitemslot_combat_abilityitemadamant_drone_buff_talent)slot_combat_abilityitemAll three are validated Tier 3 abilities already handled by
item_fallback.luafor general activation.Approach
combat_ability_identity.luawith an item-based defensive whitelist (parallel toREVIVE_DEFENSIVE_BY_SEMANTIC_KEY) keyed on item slot identity, or add ais_revive_defensive_itemresolver.revive_ability.try_pre_revivecurrently short-circuits oncombat_ability_action.template_name == nil(Tier 3 path). Add a parallel branch that reads the equippedslot_combat_abilityitem and matches against the item whitelist.ItemFallback.begin(unit, profile)rather thanaction_input_extension:bot_queue_action_input. The existing item_fallback state machine handles wield → use → unwield._is_combat_template_enabled+ per-item availability checks already present initem_fallback.revive_abilityevent withtier = 3+item_slotfields for correlation with text-logrevive_candidatelines.Open questions
BtBotInteractAction.enterfire 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.adamant_whistle.lua/ drone placement logic.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
adamant_drone_buff_talentplaces the drone at the revive location to benefit from +30% revive speedrevive_abilityevents withtier: 3for item-based activationstests/revive_ability_spec.luacover the item-based resolution branchNot in scope
RESCUE_INTERACTION_TYPES, no additional work neededbroker_*— blocked, DLC not owned)slot_combat_abilityRelated
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_talentrevive speed)