NPC Types

npcTypes

NPC types define shared categories of NPCs, chiefly how each category responds to the world's damage types.

In the editor

"Types of NPCs that can exist"

Editor location
Files → World → Advanced → NPC Types
Editor type
Edit in Studio + View JSON
Size limits
  • npcTypes.*.description — 8,000
  • npcTypes (entire section) — 500,000

Schema

json
{
  "npcTypes": {
    "<key>": {
      "name": "string",
      "vulnerabilities": [
        "string"
      ],
      "resistances": [
        "string"
      ],
      "immunities": [
        "string"
      ],
      "description": "string",
      "successBonus": "number"
    }
  }
}

Example

json
{
  "npcTypes": {
    "Hedge Knight": {
      "name": "Hedge Knight",
      "vulnerabilities": [],
      "resistances": [],
      "immunities": [],
      "description": "Landless swords for hire, holding to a code they interpret loosely. No damage modifiers; standard combat, social, and effect rules apply. Respond to coin, reputation, and a fair fight, and will disengage from one they are losing."
    },
    "Bandit": {
      "name": "Bandit",
      "vulnerabilities": [],
      "resistances": [],
      "immunities": [],
      "successBonus": -10,
      "description": "Robbers working the roads and the edges of settlements. No special damage profile. Fully subject to social pressure: can be talked down, bribed, or scared off. Break and run once the odds turn."
    },
    "Risen Dead": {
      "name": "Risen Dead",
      "vulnerabilities": [
        "fire",
        "light"
      ],
      "resistances": [
        "slashing",
        "bludgeoning",
        "piercing"
      ],
      "immunities": [
        "poisoning",
        "dark"
      ],
      "description": "Mindless undead - skeletons, zombies, revenants without will. Take extra damage from fire and holy light, shrug off physical blows, and are unharmed by poison or dark magic. Immune to fear and social pressure; cannot be reasoned with or bargained with."
    },
    "Stone Golem": {
      "name": "Stone Golem",
      "vulnerabilities": [
        "lightning"
      ],
      "resistances": [
        "slashing",
        "bludgeoning",
        "piercing"
      ],
      "immunities": [
        "poisoning",
        "psychic"
      ],
      "description": "Animated guardians of stone or metal. Conductive cores take extra lightning damage, dense bodies resist physical attacks, and they are unaffected by poison or psychic effects. Follow their last instruction literally; cannot be persuaded or intimidated."
    }
  }
}

Fields

name

Display name of the NPC type. Required, and the outer key must match it exactly: Voyage rejects a world whose key and name differ. NPCs select a type by its outer map key.

Name the type for what it is in the world: a species, a creature category, or a role. The key is the stable id an NPC selects with type, so name it for what it is rather than as a slug. Hedge Knight, Risen Dead, Temple Priest, god, titan are the shape of it. Keep one casing convention across the section.

Warning: the axis is species or role, not disposition. A pair like character and humanoid_enemy splits on whether an NPC opposes the player, which is a property of the individual and of the scene, not of a type: it carries no damage profile. Split on the distinctions the world itself makes, and let a single type cover both a friendly and a hostile member of it.

description

What this type is: how its members behave socially and in combat, what motivates them, and how they regard the player. Required.

vulnerabilities

Damage types NPCs of this type are vulnerable to; every NPC with this type inherits them. Values match combatSettings.damageTypes case-sensitively and unnormalized, so keep them lowercase ASCII; "Fire" does not match "fire". A value that does not match carries no damage modifier at all, and is reported as an invalid reference rather than passing unnoticed.

resistances

Damage types NPCs of this type are resistant to; every NPC with this type inherits them. Values match combatSettings.damageTypes case-sensitively and unnormalized, so keep them lowercase ASCII; "Fire" does not match "fire". A value that does not match carries no damage modifier at all, and is reported as an invalid reference rather than passing unnoticed.

immunities

Damage types NPCs of this type are immune to; every NPC with this type inherits them. Values match combatSettings.damageTypes case-sensitively and unnormalized, so keep them lowercase ASCII; "Fire" does not match "fire". A value that does not match carries no damage modifier at all, and is reported as an invalid reference rather than passing unnoticed.

successBonus

Default success bonus for NPCs of this type: an NPC that leaves its own successBonus unset uses this value, and one that sets it uses its own. Same scale as the NPC field: 25 points shifts every roll one success tier, a negative value lets these NPCs fumble, and any value, 0 included, hands the narrator their rolled outcome. Optional. Only successBonus has a type default; damageModifier and damageReductionModifier are set per NPC.

Behaviour

When to create a type

Create an NPC type only when:

  • Multiple NPCs share the same damage profile (vulnerabilities / resistances / immunities), or
  • The type represents a species, creature category, or profession that more than one NPC will inhabit

No baseline type is required. A world where every NPC is a unique individual (no shared damage profiles) is fine with zero npcTypes entries and type: "" on every NPC. The section is optional.

Damage multipliers

CategoryMultiplierEffect
vulnerabilities1.5x+50% damage taken
resistances0.5x-50% damage taken
immunities0xNo damage taken

Damage type inheritance

An NPC with type: "goblin" looks up npcTypes.goblin and inherits its damage arrays -- every NPC of that type takes on the type's vulnerabilities, resistances, and immunities. The NPC's own vulnerabilities, resistances, and immunities are merged with the type's as a union. An NPC with type: "" uses only its own arrays, which suits a one-off creature with a unique profile.

Static modifiers stack with matching buffs: a resistance plus a resistance buff is 0.25x, a vulnerability plus a vulnerability buff is 2x.

Common mistake: Values in vulnerabilities, resistances, and immunities must match strings verbatim from combatSettings.damageTypes. Approximate matches do not work -- "poison" is not valid if "poisoning" is in the list; "frost" is not valid if only "ice" is defined. Always copy the exact strings from your damageTypes list. Entries that don't match carry no damage modifier and are reported as invalid references.

For guidance on populating vulnerabilities/resistances/immunities see Authoring Guide > NPC Types.

Authoring tips

NPC Types - Vulnerabilities, Resistances, Immunities

The vulnerabilities, resistances, and immunities arrays on npcTypes are matched by the engine against a single vocabulary: the damage type strings listed in combatSettings.damageTypes. They are damage multipliers and nothing else.

The matching is literal, not semantic. A value like "blade combat" will not match anything unless that exact string is a defined damage type. Populate these arrays only with values that exist in your combatSettings.damageTypes, or the entries have no mechanical effect (and are reported as invalid references).

These arrays do not govern social or skill outcomes. To make a type immune to fear, resistant to persuasion, or hard to deceive, write it into the relevant NPCs' basicInfo or personality, which the narrator reads. Do not put skill names like persuasion or intimidation in the damage arrays; they are not damage types.

Your damage type vocabulary is a world-design choice that varies by genre. A high-fantasy set will differ from a modern or sci-fi one. Define combatSettings.damageTypes for your scenario first, then design type profiles around it.

Example: a fantasy damage profile (illustrative -- one workable configuration among many; uses the default damage types):

TypeVulnerable toResistant toImmune to
Mortal---
Beast---
Risen Deadfire, lightslashing, bludgeoning, piercingpoisoning, dark
Stone Golemlightningslashing, bludgeoning, piercingpoisoning, psychic
Elemental(opposing element)(own element)poisoning
Spiritlight, arcaneslashing, bludgeoning, piercingpoisoning

A modern or slice-of-life world where combat is rare may leave these arrays empty entirely. A combat-heavy sci-fi world would define damage types like kinetic, plasma, or emp in combatSettings.damageTypes and build profiles from those. The pattern is the same; the damage vocabulary changes with the genre.