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

    Interface Unit

    A unit datasheet entry with stat profiles and point costs.

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

    interface Unit {
        id: string;
        name: string;
        aliases?: string[];
        faction_id: string;
        role?:
            | "character"
            | "battleline"
            | "dedicated-transport"
            | "fortification"
            | "allied"
            | "epic-hero";
        attachment_role?: "leader"
        | "support"
        | null;
        profiles: [
            {
                name?: string;
                M: StatValue;
                T: number;
                W: number;
                Sv: number;
                invuln_sv?: number
                | null;
                invuln_sv_ranged?: number | null;
                invuln_sv_melee?: number | null;
                Ld: number;
                OC: number;
                [k: string]: unknown;
            },
            ...{
                name?: string;
                M: StatValue;
                T: number;
                W: number;
                Sv: number;
                invuln_sv?: number
                | null;
                invuln_sv_ranged?: number | null;
                invuln_sv_melee?: number | null;
                Ld: number;
                OC: number;
                [k: string]: unknown;
            }[],
        ];
        points?: {
            models: number;
            cost: number;
            models_max?: number;
            unit_count_min?: number;
            unit_count_max?: number
            | null;
            [k: string]: unknown;
        }[];
        allied_points?: {
            host_faction: string;
            models: number;
            cost: number;
            models_max?: number;
            unit_count_min?: number;
            unit_count_max?: number
            | null;
        }[];
        points_provisional?: boolean;
        wargear_costs?: { item_id: string; cost: number }[];
        keywords?: KeywordList;
        faction_keywords?: KeywordList;
        excluded_faction_keywords?: KeywordList | null;
        base_size_mm?: BaseSize | null;
        model_count?: { min: number; max: number; [k: string]: unknown };
        weapon_ids?: string[];
        ability_ids?: string[];
        wargear_budgets?: {
            items: [string, ...string[]];
            count: number;
            per_models: number;
            duplicate_limit?: number;
        }[];
        transport_capacity?: | {
            capacity: number;
            keyword_restrictions?: KeywordList
            | null;
            exclusion_keywords?: KeywordList | null;
        }
        | null;
        game_version: GameVersionReference;
        is_legend?: boolean;
        game_modes?: GameModes5;
    }
    Index

    Properties

    id: string
    name: string
    aliases?: string[]

    Alternate names this unit is known by (e.g. spelling variants in other tools' roster exports). Consulted by name lookup so an import matches despite a spelling difference; never displayed.

    faction_id: string
    role?:
        | "character"
        | "battleline"
        | "dedicated-transport"
        | "fortification"
        | "allied"
        | "epic-hero"

    Battlefield role from the datasheet header. Unit types (Infantry, Vehicle, etc.) belong in keywords.

    attachment_role?: "leader" | "support" | null

    Character attachment role (11e). 'support' implies the unit is only legal when attached to a host unit (cannot be taken solo); 'leader' is valid as a standalone list entry. null/absent for non-attaching units.

    profiles: [
        {
            name?: string;
            M: StatValue;
            T: number;
            W: number;
            Sv: number;
            invuln_sv?: number
            | null;
            invuln_sv_ranged?: number | null;
            invuln_sv_melee?: number | null;
            Ld: number;
            OC: number;
            [k: string]: unknown;
        },
        ...{
            name?: string;
            M: StatValue;
            T: number;
            W: number;
            Sv: number;
            invuln_sv?: number
            | null;
            invuln_sv_ranged?: number | null;
            invuln_sv_melee?: number | null;
            Ld: number;
            OC: number;
            [k: string]: unknown;
        }[],
    ]

    1

    points?: {
        models: number;
        cost: number;
        models_max?: number;
        unit_count_min?: number;
        unit_count_max?: number | null;
        [k: string]: unknown;
    }[]

    Type Declaration

    • [k: string]: unknown
    • models: number

      Lowest model count this tier's cost applies to. For a single-size tier this is the only size; for a GW range-priced tier (block pricing) it is the range floor and models_max is the ceiling. baseUnitPoints prices a squad at the highest models threshold its count reaches.

    • cost: number
    • Optionalmodels_max?: number

      Inclusive upper model count for a range-priced tier (GW block pricing, e.g. Venatari Custodians are 4–6 models for 320). models is the range floor; every size in [models, models_max] costs cost. Absent when the tier prices a single size (equivalent to models_max == models).

    • Optionalunit_count_min?: number

      11e per-army-ordinal pricing: the first army-copy count (1-based) this tier's cost applies to. Absent (together with unit_count_max) means the cost applies to every copy — the common case. Present only for datasheets the MFM prices by how many you have taken (e.g. 'your 1st-2nd units cost X, your 3rd+ unit costs Y').

    • Optionalunit_count_max?: number | null

      Inclusive upper army-copy count for this tier's band, or null for an open-ended top band ('3rd+ unit'). Absent when unit_count_min is absent.

    allied_points?: {
        host_faction: string;
        models: number;
        cost: number;
        models_max?: number;
        unit_count_min?: number;
        unit_count_max?: number | null;
    }[]

    11e: alternate point costs that apply only when this unit is included in a host army of another faction (e.g. an Agents of the Imperium unit allied into any IMPERIUM army). Each entry mirrors a points tier but is scoped to a host_faction. Absent for the common case where the unit costs the same everywhere; consumers that don't model allied pricing read points (the native cost) and ignore this.

    Type Declaration

    • host_faction: string

      Kebab-case identifier

    • models: number
    • cost: number
    • Optionalmodels_max?: number
    • Optionalunit_count_min?: number
    • Optionalunit_count_max?: number | null
    points_provisional?: boolean

    True when point costs are carried over provisionally (e.g. seeded from a prior edition during migration) and not yet confirmed against the current dataslate.

    wargear_costs?: { item_id: string; cost: number }[]

    Per-item MFM wargear prices that the option-level additional_cost on wargear-option records cannot express: priced default-loadout items (e.g. a Terminator Assault Squad's thunder hammers, which are the default with only a swap-away option to hang a cost on) and heterogeneous choice groups where only some items in a group cost points. Each entry charges cost points for every copy of item_id in the unit's FINAL loadout (defaults included). Additive and optional — a consumer that ignores it prices this wargear as free, exactly as before. Sourced authoritatively from the MFM dump (wargear_option.points).

    Type Declaration

    • item_id: string

      Kebab-case identifier

    • cost: number

      Points charged per copy of item_id present in the final loadout.

    keywords?: KeywordList
    faction_keywords?: KeywordList
    excluded_faction_keywords?: KeywordList | null

    Faction keywords whose armies are barred from taking this otherwise-generic unit. Used where the game removes a generic unit from a specific sub-faction without printing a replacement (e.g. Black Templars cannot field Librarians; Deathwatch cannot field the generic Tactical Squad). An army may take this unit only if none of its faction keywords appear here. Absent/empty = available to every keyword-eligible army. Distinct from faction_keywords, which is the positive access list; this is the negative one for the rare exclusions a flat shared pool cannot otherwise express.

    base_size_mm?: BaseSize | null

    The unit's representative base (the most-numerous model's base). Mixed-model units carry the full per-model breakdown in unit-composition; this top-level value is a convenience for consumers that need a single base.

    model_count?: { min: number; max: number; [k: string]: unknown }
    weapon_ids?: string[]
    ability_ids?: string[]
    wargear_budgets?: {
        items: [string, ...string[]];
        count: number;
        per_models: number;
        duplicate_limit?: number;
    }[]

    Limited-wargear squad allowances the per-weapon bounds cannot express: a GW limited_wargear_choice_set that is either (a) SHARED across several weapons (a 'for every N models, one model can take one of A/B/C' line) or (b) a FLAT per-unit cap ('up to 1 per unit'). A loadout is legal only if the summed count of a budget's items is at most the cap: floor(model_count * count / per_models) for a ratio, or just count when per_models is 0 (a flat per-unit cap). Single-weapon per-N allowances are NOT budgets — the per-weapon bounds already model them (they correctly sum a weapon's capacity across the model types that may take it).

    Type Declaration

    • items: [string, ...string[]]

      1

    • count: number
    • per_models: number

      Models per count allowance; 0 means a flat per-unit cap of count (independent of squad size).

    • Optionalduplicate_limit?: number

      Optional per-item sub-cap: at most this many copies of any SINGLE item in the set — floor(model_count * duplicate_limit / per_models) for a ratio, or duplicate_limit when per_models is 0. Absent means the shared count cap is the only bound (any one item may fill the whole allowance).

    transport_capacity?:
        | {
            capacity: number;
            keyword_restrictions?: KeywordList
            | null;
            exclusion_keywords?: KeywordList | null;
        }
        | null
    game_version: GameVersionReference
    is_legend?: boolean
    game_modes?: GameModes5