@alpaca-software/40kdc-data
    Preparing search index...

    Interface AbilityDSLEntry

    Community-authored structured representation of what a game ability does. NOT GW text.

    This interface was referenced by 0KdcBundledSchemas's JSON-Schema via the definition "ability".

    interface AbilityDSLEntry {
        ability_id: string;
        name: string;
        authored_by: string;
        game_version: GameVersionReference;
        version?: string;
        supersedes?: string | null;
        unit_ids?: string[];
        faction_id?: string | null;
        detachment_id?: string | null;
        ability_type?:
            | "stratagem"
            | "enhancement"
            | "unit"
            | "core"
            | "detachment"
            | "faction";
        behavior?: "reactive"
        | "aura"
        | "passive"
        | "activated";
        effect: AbilityEffect1;
        trigger?: Trigger | [Trigger, ...Trigger[]];
        scope: AbilityScope;
        usage?: {
            frequency:
                | "once-per-phase"
                | "once-per-turn"
                | "once-per-command-phase"
                | "once-per-opponent-turn"
                | "n-per-battle"
                | "first-this-battle"
                | "first-time-this-phase";
            count?: number;
            per?: "unit"
            | "army"
            | "model";
        };
        applies_to?: | {
            required_keywords?: KeywordList;
            excluded_keywords?: KeywordList;
        }
        | null;
        interactions?: {
            ability_ref: string;
            type: | "conflicts-with"
            | "combos-with"
            | "superseded-by"
            | "requires"
            | "replaces";
            notes?: string;
            [k: string]: unknown;
        }[];
        disputed?: boolean;
        dispute_notes?: string;
        community_notes?: string;
    }
    Index

    Properties

    ability_id: string
    name: string
    authored_by: string
    game_version: GameVersionReference
    version?: string
    supersedes?: string | null
    unit_ids?: string[]
    faction_id?: string | null

    Owning faction. Authored explicitly on faction/detachment-scoped abilities; otherwise stamped at bundle time from the ability's data/enrichment// directory (records in the shared _core pool stay null). Enables faction-scoped resolution of a unit's ability_ids so an ability_id shared across factions resolves to the unit's own faction's copy rather than whichever faction bundled first.

    detachment_id?: string | null

    For detachment/enhancement/stratagem-type abilities, the associated detachment

    ability_type?:
        | "stratagem"
        | "enhancement"
        | "unit"
        | "core"
        | "detachment"
        | "faction"
    behavior?: "reactive" | "aura" | "passive" | "activated"

    How this ability interacts with the game flow — not a runtime predicate

    trigger?: Trigger | [Trigger, ...Trigger[]]

    For reactive abilities: the game event(s) this ability fires on, plus structured guards. One trigger object, OR an array of trigger objects — the ability fires on ANY listed trigger (models multi-event reactions like 'set up OR ends a move'). See $defs/trigger.

    usage?: {
        frequency:
            | "once-per-phase"
            | "once-per-turn"
            | "once-per-command-phase"
            | "once-per-opponent-turn"
            | "n-per-battle"
            | "first-this-battle"
            | "first-time-this-phase";
        count?: number;
        per?: "unit"
        | "army"
        | "model";
    }

    How often the ability may be used, beyond what scope.duration captures. scope.duration: one-use already models 'once per battle'; this models finer limits (once per turn/phase, N per battle) and an optional per-army/unit/model granularity.

    applies_to?:
        | { required_keywords?: KeywordList; excluded_keywords?: KeywordList }
        | null

    Static, human-curated keyword filter naming which datasheet units this ability benefits, for roster-side highlighting. A unit matches when it carries every keyword in required_keywords (across its keywords + faction_keywords) and none in excluded_keywords. This is a denormalized projection distinct from the runtime effect condition tree (which mixes static class, runtime-granted markers, and timing gates and must not be scraped for scope). Absent/null means no resolvable unit scope — consumers render no highlight rather than guess.

    interactions?: {
        ability_ref: string;
        type:
            | "conflicts-with"
            | "combos-with"
            | "superseded-by"
            | "requires"
            | "replaces";
        notes?: string;
        [k: string]: unknown;
    }[]
    disputed?: boolean
    dispute_notes?: string
    community_notes?: string