Skip to content
Brandon edited this page Jun 9, 2026 · 3 revisions

Now that the clan's basic components are in place, we can create its champion. For many modders, this is the most exciting part of building a clan.

A champion consists of:

  1. A monster card for the champion.

  2. A starter card associated with the champion.

  3. An UpgradeTree which defines the champion upgrade paths.

  4. A set of icons used in the UI for the champion.

We also need a separate Character Art GameObject to display the champion on the Run Setup screen.

Champion definition.

Champions are specified directly in the clan definition through its champions property.

        {
          "id": "BasicChampionA",
          "card_data": "@ChampionACard",
          "starter_card": "@ChampionAStarterCard",
          "upgrade_tree": [
            [
              "@ChampionAUpgradePathI",
              "@ChampionAUpgradePathII",
              "@ChampionAUpgradePathIII"
            ]
          ],
          "icon": "@ChampionAIcon",
          "locked_icon": "@ChampionALockedIcon",
          "portrait": "@ChampionAPortrait"
        }
  • card_data - The reference to the card defining our champion.

  • starter_card - A reference to the card for the champions associated starter card.

  • upgrade_tree - The champion's upgrade paths. Each inner list contains the three CardUpgrades belonging to one path.

  • icon - The champion's icon. This is shown in the logbook.

  • locked_icon - The champion's icon shown when the champion has not been unlocked yet. Shown in the logbook.

  • portrait - Icon shown in the RunSetupScreen.

Understanding upgrade_tree

The upgrade_tree property is a list of lists. Each inner list represents one complete upgrade path, ordered from Level I through Level III.

The Basic Clan champion currently has one upgrade path:

"upgrade_tree": [
  [
    "@ChampionAUpgradePathI",
    "@ChampionAUpgradePathII",
    "@ChampionAUpgradePathIII"
  ]
]

To add a second path, add another list containing its three upgrades:

  "upgrade_tree": [
    [
      "@ChampionAUpgradePathI",
      "@ChampionAUpgradePathII",
      "@ChampionAUpgradePathIII"
    ],
    [
      "@ChampionAUpgradePathBI",
      "@ChampionAUpgradePathBII",
      "@ChampionAUpgradePathBIII"
    ]
  ]

Each path should contain exactly three upgrades. Champions should also have no more than three upgrade paths, otherwise the UI cannot display additional paths correctly.

Champion Card, Character, and Upgrades

The champion's primary definitions are stored in champions/basic_champion.json.

This file defines:

  • The champion card.
  • The champion character and its base stats.
  • The CardUpgrades belonging to each upgrade path.
  • Any triggers and effects granted by those upgrades.
  • The champion's in-game character art.
  • A larger version of the character art for the Run Setup screen.
  • The champion's card art, portrait, and UI icons.

Here is the complete example:

{
  "$schema": "https://github.com/Monster-Train-2-Modding-Group/Trainworks-Reloaded/releases/latest/download/schema.json",
  "cards": [
    {
      "id": "ChampionACard",
      "names": {
        "english": "ChampionName",
        "chinese": "示例勇者"
      },
      "card_art": "@ChampionACardArt",
      "cost": 0,
      "card_type": "monster",
      "rarity": "champion",
      "class": "@ClassBasic",
      "targets_room": true,
      "targetless": false,
      "effects": [ "@SpawnChampionA" ],
      "lore_tooltips": [
        {
          "english": "This is an example generated by the Mod Template.",
          "chinese": "示例剧情文本。"
        }
      ]
    }
  ],
  "characters": [
    {
      "id": "ChampionACharacter",
      "names": {
        "english": "ChampionName"
      },
      "character_art": "@ChampionACharacterArt",
      "size": 3,
      "health": 10,
      "attack_damage": 10,
      "subtypes": [ "SubtypesData_Champion_83f21cbe-9d9b-4566-a2c3-ca559ab8ff34" ]
    }
  ],
  "upgrades": [
    {
      "id": "ChampionAUpgradePathI",
      "titles": {
        "english": "UpgradePathNameA"
      },
      "bonus_damage": 30,
      "bonus_hp": 30
    },
    {
      "id": "ChampionAUpgradePathII",
      "titles": {
        "english": "UpgradePathNameA II"
      },
      "bonus_damage": 90,
      "bonus_hp": 60
    },
    {
      "id": "ChampionAUpgradePathIII",
      "titles": {
        "english": "UpgradePathNameA III"
      },
      "trigger_upgrades": [ "@ChampionATriggerIII" ],
      "bonus_damage": 270,
      "bonus_hp": 120
    }
  ],
  "character_triggers": [
    {
      "id": "ChampionATriggerIII",
      "trigger": "post_combat",
      "effects": [ "@ChampionAGain5Rage" ]
    }
  ],
  "effects": [
    {
      "id": "SpawnChampionA",
      "name": "CardEffectSpawnMonster",
      "target_mode": "room",
      "param_character": "@ChampionACharacter"
    },
    {
      "id": "ChampionAGain5Rage",
      "name": "CardEffectAddStatusEffect",
      "target_mode": "self",
      "param_status_effects": [
        {
          "status": "buff",
          "count": 5
        }
      ]
    }
  ],
  "game_objects": [
    {
      "id": "ChampionACardArt",
      "type": "card_art",
      "extensions": {
        "card_art": {
          "sprite": "@ChampionACardSprite"
        }
      }
    },
    {
      "id": "ChampionACharacterArt",
      "type": "character_art",
      "extensions": {
        "character_art": {
          "sprite": "@ChampionACharacterSprite",
          "transform": {
            "position": {
              "x": 0,
              "y": 1.3,
              "z": 0
            },
            "scale": {
              "x": 1,
              "y": 1,
              "z": 1
            }
          }
        }
      }
    },
    {
      "id": "ChampionAClassDisplayCharacterArt",
      "type": "character_art",
      "extensions": {
        "character_art": {
          "sprite": "@ChampionACharacterSprite",
          "transform": {
            "position": {
              "x": 2,
              "y": 1.4,
              "z": 0
            },
            "scale": {
              "x": 2.25,
              "y": 2.25,
              "z": 1
            }
          }
        }
      }
    }
  ],
  "sprites": [
    {
      "id": "ChampionACardSprite",
      "path": "textures/card_art/ChampionA.png"
    },
    {
      "id": "ChampionACharacterSprite",
      "path": "textures/character_art/ChampionA.png"
    },
    {
      "id": "ChampionAPortrait",
      "path": "textures/icons/ChampionAPortrait.png"
    },
    {
      "id": "ChampionAIcon",
      "path": "textures/icons/ChampionA.png"
    },
    {
      "id": "ChampionALockedIcon",
      "path": "textures/icons/ChampionALocked.png"
    }
  ]
}

The Champion Card

The champion's card is defined like any other monster card:

  "cards": [
    {
      "id": "ChampionACard",
      "names": {
        "english": "ChampionName",
        "chinese": "示例勇者"
      },
      "card_art": "@ChampionACardArt",
      "cost": 0,
      "card_type": "monster",
      "rarity": "champion",
      "class": "@ClassBasic",
      "targets_room": true,
      "targetless": false,
      "effects": [ "@SpawnChampionA" ],
      "lore_tooltips": [
        {
          "english": "This is an example generated by the Mod Template.",
          "chinese": "示例剧情文本。"
        }
      ]
    }
  ],

This should be very straightforward at this point. The only difference here is that you will set the rarity of the card to champion.

The Champion Character

Here is where we define our champion character, and define its base stats. You are free to give the character any triggers / abilities you want here. Just note that a character can only have one ability however.

  "characters": [
    {
      "id": "ChampionACharacter",
      "names": {
        "english": "ChampionName"
      },
      "character_art": "@ChampionACharacterArt",
      "size": 3,
      "health": 10,
      "attack_damage": 10,
      "subtypes": [ "SubtypesData_Champion_83f21cbe-9d9b-4566-a2c3-ca559ab8ff34" ]
    }
  ],

subtypes - This long string is the internal Subtype name for Champion.

Champion Upgrades

Each level of each upgrade path is represented by a separate CardUpgrade.

When the player selects a champion upgrade, the corresponding CardUpgrade is applied to the champion's base card.

Upgrades from the same path replace one another they do not stack.

For example, Level II does not add its bonuses on top of Level I. When the Level II upgrade is applied the game will remove the Level I upgrade entirely. Each upgrade must therefore contain the complete bonus that should apply at that level.

Upgrades from different paths can coexist. If the player selects Level I from two different paths, both Level I upgrades will be present on the champion.

Example Upgrade Path

The example champion has the following upgrades:

    {
      "id": "ChampionAUpgradePathI",
      "titles": {
        "english": "UpgradePathNameA"
      },
      "bonus_damage": 30,
      "bonus_hp": 30
    },
    {
      "id": "ChampionAUpgradePathII",
      "titles": {
        "english": "UpgradePathNameA II"
      },
      "bonus_damage": 90,
      "bonus_hp": 60
    },
    {
      "id": "ChampionAUpgradePathIII",
      "titles": {
        "english": "UpgradePathNameA III"
      },
      "trigger_upgrades": [ "@ChampionATriggerIII" ],
      "bonus_damage": 270,
      "bonus_hp": 120
    }

The only required field for these upgrades is titles which is the name of the upgrade displayed in the Light Forge.

Given these upgrades here are the stat totals for each corresponding upgrade.

Pathname Attack Health
Base Unit 10 10
UpgradePathNameA 40 40
UpgradePathNameA II 100 70
UpgradePathNameA III 280 130

Upgrade Path Design

Champion paths should offer distinct strategies while remaining useful when combined through cross-pathing.

Remember the Ability Limit

A unit can only have one ability. Because of this, multiple upgrade paths cannot independently grant different abilities to the same champion.

Possible approaches include:

  • Give the ability as part of its base character. And if necessary, one particular path can replace the ability with something else. (See: Lord Fenix)
  • Grant an ability only at Level III of any path or keep the ability exclusive to a single upgrade path (See: Hornbreaker Prince)
  • Give the base character an ability and use the Conjure trigger to append to its effects through upgrades. (See: Lord Fenix)

Plan ability-based paths carefully so that selecting upgrades from different paths does not cause an ability to be overwritten.

Replacing Existing Upgrades

Primordium's Superfood path demonstrates a more advanced upgrade pattern.

Primordium's base unit receives its Eaten behavior through an upgrade initial_upgrades. The Superfood path then uses upgrades_to_remove to remove that original upgrade and replace it with an improved version.

This technique is useful when a champion path must replace existing behavior rather than merely add new behavior.

Make Cross-Pathing Viable

The champion uses two Character Art GameObjects:

  1. One for the champion during battle.
  2. One for the larger champion display on the Run Setup screen.

Players are not required to select all three levels of a single path. They may instead combine upgrades from two paths.

When designing the champion's base stats and Level I upgrades, make sure that choosing Level I in multiple paths still produces a viable unit.

One approach is to move some of the champion's expected starting power out of the base character and into each path's first upgrade. This gives each Level I upgrade enough stats or functionality to remain valuable when cross-pathed.

Champion GameObjects

The champion uses two Character Art GameObjects:

  1. One for the champion during battle.
  2. One for the larger champion display on the Run Setup screen.
    {
      "id": "ChampionACharacterArt",
      "type": "character_art",
      "extensions": {
        "character_art": {
          "sprite": "@ChampionACharacterSprite",
          "transform": {
            "position": {
              "x": 0,
              "y": 1.3,
              "z": 0
            },
            "scale": {
              "x": 1,
              "y": 1,
              "z": 1
            }
          }
        }
      }
    },
    {
      "id": "ChampionAClassDisplayCharacterArt",
      "type": "character_art",
      "extensions": {
        "character_art": {
          "sprite": "@ChampionACharacterSprite",
          "transform": {
            "position": {
              "x": 2,
              "y": 1.4,
              "z": 0
            },
            "scale": {
              "x": 2.25,
              "y": 2.25,
              "z": 1
            }
          }
        }
      }
    }

The first GameObject is one we use for the in game character. You can also adjust positition and size with position and scale respectively in the transform property.

The second is a scaled up version for the RunSetupScreen.

Clone this wiki locally