Kzeroko KTM2

Identity & progression

Race evolution, class promotion and profession advancement — three separate graphs, one shared rule set.

Updated Sep 1, 2026 3 min read raceclassprofession

Who your character is has three layers, and each is a separate Origins layer with its own progression graph:

LayerModeQuestion it answers
RaceevolutionWhat you were born as
ClasspromotionHow you fight
ProfessionpromotionWhat you do for a living

They advance independently. A Dwarf can be a Magic Caster, and a Magic Caster can be a Blacksmith.

How a graph works

Each graph is a directed acyclic graph of nodes and edges: a node is one identity, an edge is a legal path from one to another. Every target identity in a layer lives on that layer’s graph, and no identity appears on two graphs at once.

  1. You start on a base node in each layer.

  2. Nodes you are connected to become visible, each listing its requirements.

  3. Meet every requirement, then hold the confirm control for that node’s hold_ticks (bounded 10–200).

  4. The change commits on release. Requirements, path and target are all rechecked at that point, and a change that fails the recheck does not happen.

Requirement types

RequirementConsumesExample
player_levelno{ "type": "player_level", "amount": 20 }
experience_leveloptional{ "type": "experience_level", "amount": 12, "consume": true }
advancementno{ "type": "advancement", "target": "minecraft:story/enter_the_nether" }
itemoptional{ "type": "item", "target": "minecraft:amethyst_shard", "amount": 8, "consume": true }

Only experience_level and item may set consume. Player level and advancements are checks, never costs.

Current state

All three graphs exist, but only the race graph is fully connected today — it carries the Dragon → High Dragon branch. Class and profession currently hold disconnected base nodes. That is a content gap rather than a missing feature: write the nodes and edges, and they connect.

For datapack authors

Definitions live in data/<namespace>/progression_graphs/<path>.json:

{
  "layer": "origins:origin",
  "mode": "evolution",
  "nodes": [
    {
      "id": "human_base",
      "target": "isekaiorigins:human",
      "rank": "base",
      "position": [0, 0],
      "hold_ticks": 30,
      "icon": "isekaiexpansion:textures/item/icons/hdicon_human.png",
      "name": "optional.translation.key",
      "description": "optional.translation.key",
      "requirements": []
    }
  ],
  "edges": [{ "from": "human_base", "to": "future_human_evolution" }]
}

Node ids are graph-local, stable persistence keys — renaming one orphans saved progress. Coordinates are normalised from -4 to 4; the interface supplies its own zoom and pan.