# Psykers

A Psyker is any ContentFighter with one of the following rules:

* Psyker
* Non-sanctioned Psyker
* Sanctioned Psyker

Like equipment, Psyker Powers can be assigned by default (`ContentFighterPsykerPowerDefaultAssignment`) or directly assigned (`ListFighterPsykerPowerAssignment`).

These assignment classes link the fighter to a power (`ContentPsykerPower`). The power is linked to a discipline (`ContentPsykerDiscipline`).

The overall structure looks like this:

{% @mermaid/diagram content="graph LR
subgraph content
subgraph Powers
ContentPsykerPower-->ContentPsykerDiscipline
end

```
ContentFighterPsykerDisciplineAssignment-->ContentFighter
ContentFighterPsykerDisciplineAssignment-->ContentPsykerDiscipline

ContentFighterPsykerPowerDefaultAssignment-->ContentFighter
ContentFighterPsykerPowerDefaultAssignment-->ContentPsykerPower
```

end

subgraph core
ListFighter-->ContentFighter
ListFighterPsykerPowerAssignment-->ListFighter
ListFighterPsykerPowerAssignment-->ContentPsykerPower
end
" %}

## Important Classes

`ContentFighterPsykerDisciplineAssignment`

Links a `ContentFighter` to the `ContentPsykerDiscipline` from which the fighter is allowed to take `ContentPsykerPower`. This is enforced when the `ContentFighter` or `ListFighter` model `clean()` method is called, in the case of default or direct assignments respectively.

### `ContentFighterPsykerPowerDefaultAssignment`

Assigns a particular `ContentPsykerPower` to a `ContentFighter` by default.

### `ListFighterPsykerPowerAssignment`

Assigns a `ContentPsykerPower` to a `ListFighter` directly. The `ContentPsykerPower` must be associated with the `ContentPsykerDiscipline` that is assigned to the `ListFighter` 's associated `ContentFighter` .

### Managing power assignments

Like with equipment, we use a "virtual" assignment class to abstract over the different kinds of assignment. These can either be backed by a default assignment, a direct assignment, or no assignment at all. The latter case is use for the editing form when managing powers.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gyrinx.gitbook.io/gyrinx/technical-reference/psykers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
