Deadlock Research
verifiednote 0004build 66792026-08-15localizationcodenamesstrings

Localization and codename mapping

Question

Internal data uses codenames like hero_inferno and upgrade_ammo_scavenger. Where do human-readable names and descriptions come from, and how do they join back to the vdata?

Summary

Findings

Bundles (English, build 6679)

bundlesizecontents
citadel_generated_vo3,036 KBvoice line subtitles
citadel_heroes391 KBhero-facing strings, ability names/descriptions
citadel_main301 KBUI chrome
citadel_attributes126 KBstat/attribute labels
citadel_mods68 KBitem descriptions and stat labels
citadel_gc_mod_names21 KBitem display names
citadel_gc18 KBgame-coordinator strings
citadel_patch_notes16 KBpatch notes
citadel_gc_hero_names6 KBhero display names

Empty at this build: citadel_dev, citadel_vdata, citadel_override_hero_names, citadel_override_mod_names. The override_* bundles existing but empty suggests a live-ops rename mechanism — unconfirmed.

Format

Standard Valve KeyValues:

"lang"
{
	"Language"		"english"
	"Tokens"
	{
		"upgrade_clip_size"			"Extended Magazine"
		"upgrade_ammo_scavenger"		"Ammo Scavenger"
		"upgrade_rapid_rounds"			"Rapid Rounds"
	}
}

The join

Items — the vdata entry key is the token:

vdata keybundletokenvalue
upgrade_ammo_scavengercitadel_gc_mod_namesupgrade_ammo_scavenger"Ammo Scavenger"
upgrade_ammo_scavengercitadel_modsupgrade_ammo_scavenger_descdescription

A parallel _search token exists for every name (upgrade_ammo_scavenger_search), presumably to feed the in-game shop search box.

Heroes — the token is the vdata key plus :n:

// Hero names (tokens match the hero name directly)
"hero_warden:n"		"Warden"
"hero_warden_search:n"	"Warden"

The :n suffix is a grammatical case/gender marker used by Valve's localization system; other suffixes are expected in inflected languages.

Descriptions are templated

"upgrade_lifestrike_gauntlets_desc"	"Your next <span class=\"highlight\">Melee</span>
attack <span class=\"highlight\">heals you</span>. <span class=\"diminish\"><br><br>This
heal is {s:NonHeroHealPct}% effective vs non-heroes.<br>Cooldown is
{s:LightMeleeCooldownMult}x as long for Light Melee hits.</span>"

{s:Name} resolves against the entry's m_mapAbilityProperties in the vdata. Stat labels themselves come from citadel_mods too — AmmoPerSoul_label, AmmoPerSoul_prefix, AmmoPerSoul_postfix.

Inferred: producing a correct human-readable item tooltip requires all three of (a) the vdata entry, (b) the _desc token, and (c) the per-stat label/prefix/postfix tokens — plus scale-function evaluation from note 0002.

Unreleased content leaks here

citadel_gc_hero_names contains names with no live counterpart: Vampire, Sapper, Glider, Gunner, Cowboy, Phoenix. Localization is a leading indicator of upcoming content.

Reproduce

GAME=$(python tools/find_game.py --json | python -c 'import json,sys;print(json.load(sys.stdin)["game_dir"])')
L="$GAME/citadel/resource/localization"

ls -la "$L"
head -20 "$L/citadel_gc_hero_names/citadel_gc_hero_names_english.txt"
sed -n '5,20p' "$L/citadel_mods/citadel_mods_english.txt"

# confirm an item codename joins to a display name
grep -n 'upgrade_ammo_scavenger' "$L/citadel_gc_mod_names/citadel_gc_mod_names_english.txt"

No decompilation step is required for any of the above.

Gotchas

Open questions

Sources

Derived entirely from the local install at build 6679. No external sources used.