Relations

Relations are stored in Relation table. They’re simple tags, linking two people together. Links are one way, so if you want to make two people rivals to each other, there needs to be two rows in Relation table for that.

Relation
    originatorId PersonId
    targetId PersonId
    type RelationType
    visibility RelationVisibility
    deriving Show Read Eq

You can read row in table as originatorId is type to targetId. For example: “Pete is rival to Uzhag”.

Visibility

Not all relations are known to everyone. This is modeled with visibility field of type RelationVisibility. RelationVisibility is defined as:

data RelationVisibility =
    SecretRelation
    | FamilyRelation
    | PublicRelation
    deriving (Show, Read, Eq, Enum, Bounded, Ord)

When the system is building a person report and listing relations of the subject, relation visibilities are considered. Observer has some level of intelligence (stored in HumanIntelligence) about people being observed that determines what relations exactly are known to them.