Free demo
For modders

Making mods

New languages, card backs, backgrounds, music and pictures — or your own cards, commanders, bases, decks, scenarios and Expedition events. No programming: folders, pictures and a few JSON files.

Download the example mod

A mod is a folder with a mod.json file and the files it changes or adds: texts, pictures, music, cards, commanders, bases, missions or events. You write mods in a text editor; you need no programming and no game engine. Players put the folder in the game's mods folder and switch it on in main menu → Mods.

This guide explains every file a mod can have, with all the values the game understands.

Contents: Quick start · What a mod can do · Where mods go · mod.json · Texts in several languages · Ids · Translations · Pictures · Music · Cards · Commanders · Bases · Changing the game's cards · Decks · Missions · Expedition events · Other texts · Testing and fixing a mod · Sharing a mod · The game's ids

Quick start

  1. Download the example mod (on the website: https://soldivided.eu/modding.html; in the game's source: docs/modding/example_mod/). It has three cards, a token, a commander, a base, a ready deck, a mission, an Expedition event, a card back, pictures and a changed text.
  2. Copy its folder, rename the folder (for example my_mod) and change "id" in mod.json to the same name.
  3. Change the files (any text editor; save as UTF-8). Delete the files you do not need.
  4. Put the folder in the game's mods folder: in the game, Mods → Open the folder.
  5. In the game, Mods: tick your mod. The game asks to restart; changes to mods always need a restart.
  6. Open Mods again and click your mod: under Skipped the game lists everything it could not read, with the reason. Fix it, restart, look again.

What a mod can do

A mod with …FilesOnline play
Fixes or a new languagetranslations/<language>.csv✅ stays on
Battle backgroundsbackgrounds/✅ stays on
Musicmusic/✅ stays on
Card backscard_backs/⛔ off
Pictures of cards, commanders, basescard_art/⛔ off
Ready decksdecks.json⛔ off
Missions (in the campaign's Mods tab)scenarios.json⛔ off
Expedition eventsevents.json⛔ off
New cards and tokenscards.json⛔ off, changes the rules
New commanderscommanders.json⛔ off, changes the rules
New basesbases.json⛔ off, changes the rules
Changes to the game's cardscard_changes.json⛔ off, changes the rules
  • One mod can have any of these together. If it has anything from the ⛔ rows, the whole mod is offline only.
  • Online play is off while an offline-only mod is on: the online buttons are grey and say which mod blocks them. The server plays every online battle itself with the game's own cards, and the other player would not see your pictures or backs anyway.
  • Changes the rules: battles played while such a mod is on count as modded in the statistics.
  • The campaign's rewards and enemies never use a mod's new cards. The tutorial always uses the game's own cards.

Where mods go

SystemFolder
Windows, Linuxmods next to the game (SolDivided.exe)
macOS (and everyone, as a second place)mods in the game's data folder, where the saves are

Mods → Open the folder in the game opens the right one. Each mod is one folder in it:

mods/
  my_mod/
    mod.json
    icon.png
    cards.json
    card_art/
      plasma_lancer.jpg
    translations/
      bg.csv

mod.json

Every mod needs it. Only id is required.

{
  "id": "my_mod",
  "name": {"en": "The Red Guard", "bg": "Червената гвардия"},
  "author": "Your name",
  "version": "1.0",
  "description": {"en": "What it does, in a sentence or two.", "bg": "Какво прави."},
  "replace_battle_music": false,
  "language_name": "Español"
}
FieldWhat it is
id2–32 small Latin letters, digits or _ (my_mod, red_guard_2). Different from every other mod: two mods with one id cannot both load. It goes in front of the ids of your cards, decks and so on (see Ids).
nameThe name in the Mods screen. One text or a text per language.
author, versionShown in the Mods screen.
descriptionA sentence or two in the Mods screen.
replace_battle_musictrue: in battles only your tracks play (see Music).
language_nameThe name of the new language your mod adds, as it shows in Settings (see Translations).

icon.png next to mod.json (square, 128×128 is plenty) is the mod's picture in the Mods screen.

Texts in several languages

Every text in a mod's files (names, descriptions, briefings…) can be:

  • one text for every language: "name": "Plasma Lancer"
  • a text per language: "name": {"en": "Plasma Lancer", "bg": "Плазмен копиеносец", "zh_CN": "等离子枪兵"}

The game's languages are en (English), bg (Bulgarian) and zh_CN (Simplified Chinese). A language your text does not have shows the first one you wrote.

Ids

  • Your cards, tokens, commanders, bases, decks, missions and events get your mod's id in front: plasma_lancer in the mod red_guard becomes red_guard_plasma_lancer. That is how two mods can both have a card called lancer.
  • Inside your own mod, use the short id ("summon": "guard_drone"). The long one works too.
  • To use something of the game (a card in a deck, a commander for an enemy), use its own id: mars_stormtrooper, mercer, fortified_bunker. See The game's ids.
  • An id the game already has is not allowed: a mod called mars with a card stormtrooper would be mars_stormtrooper, a card of the game, so that card is skipped. To change a card of the game, use card_changes.json.
  • A mod's card backs and backgrounds are mod_<mod id>_<file name>: card_backs/red.jpg in my_mod is mod_my_mod_red.

Translations — translations/<locale>.csv

A CSV file with two columns, key and text. The first line is the header:

key,text
UI_TAGLINE,The war for the Solar System
CARD_MARS_STORMTROOPER_NAME,Storm Trooper
UI_QUIT,"Quit, for now"
  • The file name is the language: en.csv, bg.csv, zh_CN.csv, es.csv, de.csv, pt_BR.csv, …
  • Fixing a language the game has (en, bg, zh_CN): put in only the keys you change, even one. Every other text stays the game's. Players of that language see your texts after the restart, without choosing anything.
  • A new language (es, de, …): it becomes a choice in Settings → Display → Language once the file has at least 200 texts. "language_name" in mod.json is its name in the list. The player picks it there; a key you have not translated shows in English.
  • Two mods with the same key: the one lower in the Mods list wins.
  • All the keys with the Bulgarian and English texts are in the translation template (columns key,bg,en,text). The game also reads a text column, so you can fill in that column and use the file as it is.
  • A text with a comma or a quote goes in quotes, and a quote inside is doubled: "He said ""no""".
  • A new line inside a text: \n.
  • %s and %d are filled in by the game (a name, a number); %% is a percent sign. Keep the same ones in the same order.
  • Save as UTF-8 (with or without BOM). Windows line ends are fine.

Pictures

FolderWhatSize
card_backs/card backs: every player can pick them for a deck (Decks → Choose card back)832×1216 (portrait)
backgrounds/battle backgrounds: Settings → Display → Background, or they come up at random1920×1080 or bigger
card_art/<id>.jpgthe picture of a card or a token832×1216 (portrait)
card_art/<id>.jpgthe picture of a commander or a base1216×832 (landscape)
  • PNG, JPG or WEBP. Keep the files reasonably small (a card picture as JPG is about 150 KB).
  • <id> is the short id of your card (card_art/plasma_lancer.jpg) or the id of the game's card, commander or base (card_art/mars_stormtrooper.jpg), whose picture it then replaces.
  • A card of your mod without a picture is drawn with a simple outline of the kind set in its art field (see Cards).
  • A file that is not a readable picture is listed under Skipped and left out.

Music

FileWhen it plays
music/menu.oggthe main menu (instead of the game's)
music/credits.oggthe credits
music/tension.ogga battle when a base is low on life
music/battle/*.oggbattles: your tracks join the random battle playlist
  • OGG Vorbis is best; MP3 works too.
  • With "replace_battle_music": true in mod.json only your battle tracks play.
  • Tracks are played in a loop, so make the end fit the start.

Cards — cards.json

{"cards": [
  {"id": "guard_drone", "token": true, "faction": "mars", "kind": "unit", "type": "ground",
   "subtype": "drone", "cost": 1, "attack": 1, "health": 1, "art": "drone",
   "name": {"en": "Guard Drone", "bg": "Охранителен дрон"}},
  {"id": "plasma_lancer", "faction": "mars", "kind": "unit", "type": "ground", "subtype": "infantry",
   "cost": 3, "attack": 3, "health": 2, "keywords": {"assault": 1},
   "abilities": [{"trigger": "on_play", "target": "enemy_ground", "effects": [{"damage": 1}]}],
   "name": {"en": "Plasma Lancer", "bg": "Плазмен копиеносец"},
   "flavor": {"en": "\"Closer. Always closer.\""}},
  {"id": "drone_nest", "faction": "mars", "kind": "unit", "type": "ground", "subtype": "station",
   "cost": 4, "attack": 0, "health": 5, "no_attack": true,
   "abilities": [{"trigger": "turn_start", "target": "none", "effects": [{"summon": "guard_drone"}]}],
   "name": {"en": "Drone Nest"}},
  {"id": "red_banner", "faction": "mars", "kind": "tactic", "cost": 2,
   "abilities": [{"trigger": "on_play", "target": "all_friendly_units",
                  "effects": [{"buff": {"attack": 1, "this_turn": true}}]}],
   "name": {"en": "Red Banner"}}
]}
FieldValuesIf left out
idthe card's short idrequired
factionmars, col (Belt colonies), earth, corp (corporations), neutral (fits every commander)neutral
kindunit or tacticunit
typeground or ship (units only)ground
subtypea word that bonuses can name: infantry, engineers, android, vehicle, tank, mech, artillery, turret, drone, support, transport, station, fighter, bomber, corvette, frigate, gunship, destroyer, cruiser, battleship, carrier, flagship, …none
cost0–10 cores1
attack0–200
health1–301
keywords{"armor": 1, "taunt": 1} or ["taunt", "haste"] (each with 1); see Keywordsnone
abilitiesa list; see Abilitiesnone
tokentrue: not in decks or the collection, only summoned by an abilityfalse
no_attacktrue: the unit never attacks (a station, a wall)false
artthe outline drawn when there is no picture: trooper, heavy, militia, hunter, aa, fighter, cruiser, drone, hauler, strike, cannon, minestrooper
name, flavorthe card's name and its line in italicsthe id

The card's rules text is written by the game from its keywords and abilities, in every language: you do not write it.

Keywords

KeywordIn the gameWhat it does
tauntGuardianMust be attacked first in its line. While it lives, the base cannot be attacked from that line.
camoCamouflageThe enemy cannot attack or target it until it attacks.
first_strikeFirst StrikeIf it kills its target when attacking, the target does not strike back.
armor NArmorTakes N less damage from each hit.
shieldEnergy ShieldPrevents all damage from the first hit, then disappears.
assault NAssault+N attack while attacking.
hasteHasteCan attack the turn it is played.
regen NRegenerationHeals N at the start of your turn.
bombardBombardA ship that can also attack ground units.
antiairAnti-airA ground unit that can also attack ships.
jamJammingA unit it damages in combat cannot attack in its next turn.
power NTactic PowerYour tactics deal N more damage.
protoProtomoleculeA unit it damages in combat is infected (loses 1 health each turn; the infection moves on when it dies).
debt NDebtCheap now: next turn you have N fewer cores.

Abilities

{"trigger": "on_play", "target": "enemy_unit", "combo": false, "effects": [{"damage": 2}, {"draw": 1}]}

All the effects of one ability go to its target. To do two things to two different targets (deal damage to a unit and draw a card yourself), write two abilities.

triggerWhen
on_playwhen the card is played (units and tactics)
last_signalwhen this unit dies
turn_startat the start of your turn, while this unit is on the field
auraalways, while this unit lives: use it with buff and an other_friendly_… or all_friendly_… target

"combo": true — the ability works only if you already played another card this turn.

targetWho
enemy_unit, enemy_ground, enemy_shipan enemy unit / ground unit / ship the player picks
enemy_ground_or_basean enemy ground unit or the enemy base, picked
enemy_unit_atk_le2an enemy unit with 2 attack or less, picked
friendly_unit, friendly_unit_or_baseone of your units (or your base), picked
random_enemy_unita random enemy unit
all_enemy_units, all_enemy_ground, all_enemy_shipsevery enemy unit / ground unit / ship
all_friendly_units, all_friendly_ground, all_friendly_shipsevery one of your units / …
other_friendly_units, other_friendly_ground, other_friendly_shipsyour others, not this unit
selfthis unit
own_base, enemy_basea base
playeryou (for draw, cores, discover)
noneno target (for summon, march)

If the player must pick a target and there is none, a tactic cannot be played (a unit can, without the ability).

EffectWhat it does
{"damage": 2}deals 2 damage to the target (tactics: + Tactic Power)
{"heal": 3}heals the target by 3
{"destroy": true}destroys the target unit
{"draw": 1}you draw 1 card
{"summon": "guard_drone", "count": 2}puts 2 of the token on your field (a token of your mod or of the game)
{"discover": "unit"}you choose 1 of 3 random cards of your factions: unit, ship, tactic or "" (any)
{"reactor": 1}your reactor grows by 1 core for good
{"march": true}the units you played this turn can attack at once
{"status": "jam"}jam: cannot attack next turn; infect: the protomolecule
{"credit": 1}1 core now, 1 fewer next turn
{"buff": {"attack": 1, "health": 1}}+1/+1; add "this_turn": true for this turn only
{"buff": {"keyword": "taunt"}}gives a keyword; with a number: {"keyword": "armor", "value": 2}

Commanders — commanders.json

{"commanders": [
  {"id": "colonel_reza", "factions": ["mars", "earth"],
   "bonuses": ["infantry_atk_1", "drone_hp_1"],
   "power": {"trigger": "on_play", "target": "friendly_unit", "effects": [{"buff": {"keyword": "shield"}}]},
   "power_cost": 2,
   "name": {"en": "Colonel Nadia Reza"}, "bio": {"en": "A few lines about her."},
   "bonus_texts": {"drone_hp_1": {"en": "Your drones have +1 health.", "bg": "Дроновете ти имат +1 живот."}}}
]}
FieldWhat it is
factionsthe commander's own faction first (it gives the colour), then the ally: a deck may have cards of both and neutral ones. One faction is fine too.
bonusespassive bonuses, see below
powerthe commander's ability: once a turn the player pays power_cost cores and uses it (an ability as in cards; its trigger does not matter)
power_cost0–10 cores (2 if left out)
name, biothe name and the text in the Codex
bonus_textsthe text of a bonus the game has no text for
picturecard_art/<id>.jpg, 1216×832

Bonuses (commanders and bases)

A bonus is written as an id: <who>_<what>_<number>.

WhatMeaning
<who>_atk_Nthose units have +N attack
<who>_hp_Nthose units have +N health
<who>_<keyword>_Nthose units have the keyword (first_strike, antiair, bombard, assault, armor, shield, haste, regen, taunt, camo)
<who>_cost_minus_Nthose cards cost N less

<who> is all, ground, ships, infantry (infantry, engineers, androids), machine (ground units that are not infantry), tank, mech, artillery, fighter, drone, token, cheap (cost 1–2), big (cost 6+), tactic (cost only), any other subtype (cruiser), or a keyword (units that have it: camo_atk_1).

Special bonuses: base_hp_plus_N, base_defense_plus_N, turn_heal_base_N (your base heals N each turn), air_damage_plus_N (your ships deal N more to the base), tactic_damage_plus_N, regen_plus_N, first_tactic_draw (your first tactic each turn draws a card), base_heal_double.

The game has texts for the bonuses its own commanders and bases use (for example ground_assault_1, ships_cost_minus_1, infantry_hp_1, drone_atk_1, base_hp_plus_3); for any other bonus give its text in bonus_texts, or it shows as its id.

Bases — bases.json

{"bases": [{"id": "red_bastion", "faction": "mars", "health": 28, "defense": 6,
            "defense_type": "armor", "ability": "drone_atk_1",
            "name": {"en": "Red Bastion"},
            "bonus_texts": {"drone_atk_1": {"en": "Your drones have +1 attack."}}}]}
FieldValues
factionmars, col, earth or corp: a deck can use it with a commander of that faction
health5–60 (30 if left out)
defense0–20 (5): takes damage before the base
defense_typefield (Force Field) or armor (Armored Shell): the same rule, another look; moat (Mined Moat): the unit that breaks it takes 2 damage
abilitya bonus as above, or none, bunker (the first ground unit each turn +1 health), relay (the first tactic each turn costs 1 less), lunar_yard (the first ship each turn +1 health), ice_mines (with 10 cores at the start of the turn, draw a card), saturn (when its defense falls, draw 1 more card)
picturecard_art/<id>.jpg, 1216×832; it is also the battle's background when this base is the enemy's

Changing the game's cards — card_changes.json

{"mars_stormtrooper": {"cost": 2, "attack": 4, "health": 3,
                       "name": {"en": "Storm Trooper Mk II"}},
 "mars_phobos_recruit": {"abilities": [{"trigger": "on_play", "target": "player", "effects": [{"draw": 1}]}]},
 "col_ceres_militia": {"keywords": {"taunt": 1, "shield": 1}}}
  • The key is the id of a card or token of the game. Give only what you change: cost, attack, health, keywords, abilities, no_attack, name, flavor.
  • keywords and abilities replace the card's whole list: write all you want it to have.
  • The changes count everywhere: campaign (its rewards and enemies too), Expedition, against the AI, two players at one computer, missions. Not in the tutorial.
  • Every changed card has a purple MOD mark; the Mods screen lists the cards a mod changes.
  • If two mods change the same card, the one lower in the Mods list wins.

Decks — decks.json

{"decks": [{"id": "starter", "commander": "colonel_reza", "base": "red_bastion",
            "card_back": "mod_red_guard_back_red_guard", "name": {"en": "Red Guard"},
            "cards": {"plasma_lancer": 2, "drone_nest": 2, "mars_stormtrooper": 2}}]}
  • A legal deck: exactly 40 cards, at most 2 of each, only cards of the commander's factions and neutral ones, no tokens. A deck that breaks a rule is still listed but cannot be played; its problems show in the deck builder.
  • cards is {"id": copies} or a list of ids (["plasma_lancer", "plasma_lancer", …]).
  • card_back is optional: a back of the game (back_sol, back_mars, back_earth, back_belt, back_lunar, back_laurel, back_navigator, back_ring_station, back_singularity, back_torch_drive) or of a mod (mod_<mod id>_<file name>).
  • Decks are for your mod's own cards (so players can try them at once) and for your missions' enemies. To share a deck of the game's cards, use its deck code (Decks → Deck code): no mod needed, and it works online.

Missions — scenarios.json

A battle like a campaign mission. Players find it in the campaign, in the Mods tab next to the acts (at its planet on the map), and in the Mods screen. It gives no rewards; its stars are kept apart from the campaign's.

{"scenarios": [
  {"id": "landing", "planet": "mars",
   "title": {"en": "Landing"}, "briefing": {"en": "Destroy the outpost."},
   "tip": {"en": "Its base has armor: use many small units."},
   "after_win": {"en": "The outpost is ours."}, "after_loss": {"en": "We fall back."},
   "enemy": {"commander": "col_cmd_rook", "base": "base_hidden_asteroid", "ai": 0},
   "enemy_deck": "col_starter", "enemy_base": [20, 4],
   "enemy_units": ["col_ceres_militia", "col_belt_miner"],
   "arena": "base_hidden_asteroid", "turns": 10, "life": 50},
  {"id": "hold_out", "planet": "ceres", "after": "landing",
   "title": {"en": "Hold out"}, "briefing": {"en": "Hold out for 7 turns."},
   "enemy": {"commander": "earth_cmd_hale", "base": "base_ganymede_lab", "ai": 2},
   "survive": 7, "turns": 7, "life": 40}
]}
FieldWhat it is
title, briefingthe name and the text of the mission panel
tip, after_win, after_lossoptional: a tip, and the line after a win or a loss
planetwhere it is on the map: mercury, venus, earth, mars, ceres (the Belt), jupiter, saturn, neptune (mars if left out)
enemy.commander, enemy.basethe enemy's commander and base (of the game or your mod) — required
enemy.ai0 Recruit, 1 Veteran, 2 Commander (1 if left out)
enemy_decka ready deck for the enemy; without it the game makes one from the commander's factions
enemy_base[life, defense] of the enemy base, instead of the base's own
enemy_unitsunits already on the enemy's field at the start (ids of units, not tactics)
survivewin by holding out this many turns (2–30); without it you win by destroying the base
turnsthe 2nd star: win by this turn (2–40)
lifethe 3rd star: win with at least this % of your base's life (1–100)
arenaa base whose picture is the background
afterthe id of a mission of this mod, listed before this one, that must be won first
  • The player plays with any deck they choose.
  • A chain of missions: give each mission after the first an after. The map draws the route between them, the next one opens when the one before is won, and a win offers Next mission. Missions without after are open from the start, so a mod can have a chain and some single missions together.
  • Each mod numbers its missions from 1. With two or more mods with missions on, the Mods tab has a list to show one mod at a time.

Expedition events — events.json

An event that can come up on the Expedition's map, with exactly two choices.

{"events": [{"id": "drone_cache", "title": {"en": "Drone cache"},
  "text": {"en": "A sealed military cache floats in the debris."},
  "choices": [
    {"text": {"en": "Guess the password"}, "chance": 0.5,
     "win": {"card": "high"}, "lose": {"life": -4},
     "win_text": {"en": "It opens."}, "lose_text": {"en": "It defends itself."}},
    {"text": {"en": "Sell the beacon"}, "effects": {"credits": 25}}]}]}
  • A choice has effects (certain), or chance (0–1) with win and lose (risky), or nothing ({"text": …}: leave).
  • win_text and lose_text are optional lines after a risky choice.
EffectWhat it does
life Nrepairs (or, negative, damages) the flotilla's base
max_life Nmore maximum life
credits Ngives credits; negative costs credits, and the choice needs that many
points NExpedition points
carda card: low, mid or high (rarer)
remove 1the cheapest card leaves the deck
upgrade 1a card becomes Mk II
modulea module: common or rare
reserve 1one more reserve (a lost battle costs one)

Other texts — texts.json

Any text of the game or of your mod by its key, in several languages at once:

{"UI_TAGLINE": {"en": "The war for the Solar System — now with the Red Guard",
                "bg": "Войната за Слънчевата система — вече с Червената гвардия"}}

The same as a line in each language's CSV; use whichever is easier.

Testing and fixing a mod

  • Restart after every change to a mod's files (the game reads mods when it starts).
  • Mods screen: a mod that cannot be loaded at all is red, with the reason (usually its mod.json). Under Skipped is everything the game had to leave out of a mod that loaded, and why: an unknown keyword, a deck with a card it cannot find, a picture it cannot read, … The rest of the mod still works.
  • Common mistakes: a comma missing or one too many in a JSON file (paste it into any JSON checker); a text in quotes where a number is needed ("cost": "3" works, "cost": "three" does not); a short id where the game's long id is needed or the other way round; a file saved in another encoding than UTF-8.
  • A value of the wrong kind is listed under Skipped and the default is used.
  • Try a mod with a fresh deck in a battle against the AI: hover the cards to read the rules text the game wrote for them.
  • Switching a mod off: decks with its cards stay but cannot be played until it is on again, an Expedition run loses its cards, and its pictures, music and texts are gone after the restart. A player's progress is not lost.

Sharing a mod

  • Zip the mod's folder (the folder itself, not only the files in it) and share the zip: players unzip it into their mods folder.
  • Do not include files of the game (its pictures, music or texts) — only your own work or work you may share. Say who made what in description.
  • Mods that only change texts, backgrounds and music can be used online; everything else is for single player and two players at one computer.

The game's ids

  • Cards: every card of the game, with its id, is in https://soldivided.eu/cards/cards.json ("id"), and on the card gallery: https://soldivided.eu/cards.html.
  • Commanders: mercer, valez, vex, mbele, mars_cmd_drakos, mars_cmd_sato, mars_cmd_okafor, mars_cmd_lindqvist, col_cmd_rook, col_cmd_tamsin, col_cmd_ivanov, col_cmd_noor, earth_cmd_hale, earth_cmd_varma, earth_cmd_moreau, earth_cmd_chen, earth_cmd_kowalski, earth_cmd_adeyemi, corp_cmd_sterling, corp_cmd_kane, corp_cmd_voss, corp_cmd_lin, corp_cmd_brandt, corp_cmd_unit7.
  • Bases: fortified_bunker, base_olympus_citadel, base_valles_dome, base_phobos_outpost, base_derelict_cruiser, comm_relay, europa_ice_mines, saturn_ring_station, base_ceres_port, base_pallas_refinery, base_hidden_asteroid, base_comet_station, orbital_station, lunar_shipyard, base_luna_command, base_geneva_spire, base_l5_fortress, base_neptune_watch, base_corp_arcology, base_venus_platform, base_mercury_mine, base_titan_harbor, base_ganymede_lab, base_tycho_station.
  • Ready decks: mars_starter, col_starter, earth_starter, corp_starter.
  • Texts: every key is in the translation template. A card's name is CARD_<ID>_NAME and its flavor CARD_<ID>_FLAVOR; a commander's name CMD_<ID>_NAME; a base's name BASE_<ID>_NAME (ids in capitals).