Weapons/PapNames.cs

Static lookup table mapping weapon prefab IDs to their Pack-a-Punch display names for the NZombies project. It stores a case-insensitive Dictionary<string,string> of prefab id keys to packed names and documents source/notes for each mapping.

File Access
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;

namespace NZombies;

/// <summary>
/// A packed weapon's Pack-a-Punch NAME — "Mustang MK1", not "M1911 MK1".
///
/// Ported from `SWEP.NZPaPName`. Upstream resolves the shown name as
/// `self.NZPaPName or nz.Display_PaPNames[class] or nz.Display_PaPNames[name] or name`
/// (`sh_weps.lua:146`) — a per-weapon field, then a shared lookup table, then the plain name. There
/// is no per-weapon field to hang this on here (a weapon is a prefab, and 31 prefab edits is 31
/// chances to typo one), so the table IS the mechanism and the prefab id is the key.
///
/// ⛔ KEYED ON THE PREFAB ID, NOT ON THE DISPLAY NAME. `WeaponSource.Prefab` is already the join key
/// for PaP levels, the box's duplicate check and every wall buy — and DisplayName is the field this
/// class WRITES. Keying on it would mean the second call reads "Mustang", fails to match "M1911",
/// and falls through to leaving the name alone; correct by luck on the first pass and wrong on
/// every one after it. The prefab id cannot drift, so applying twice is idempotent.
///
/// ⚠️ NAMES ARE FROM THE SOURCE SWEPs, NOT FROM MEMORY. Every entry marked ✓ below was read out of
/// `SWEP.NZPaPName` in `lua/weapons/robotnik_bo1_*/shared.lua`, workshop pack 3116673254
/// ("[TFA][AT] Call of Duty SWEPs"). Six are not from there and are individually noted.
///
/// ⚠️ TITLE CASE, WHILE THE BASE NAMES ARE ALL CAPS. That is not an inconsistency: the base names
/// are acronyms and model numbers (M1911, HK21, SPAS12) and the packed names are proper nouns, which
/// is exactly how the original renders them — "Mustang &amp; Sally", "The Pig", "Rosetta Stoned".
/// </summary>
public static class PapNames
{
	/// <summary>
	/// Prefab id (without `prefabs/weapons/` or `.prefab`) to packed name.
	///
	/// ⚠️ Every weapon in the project is listed, so `nz_pap_names` can report a MISSING entry as a
	/// real gap rather than as "probably deliberate".
	/// </summary>
	static readonly Dictionary<string, string> ByWeapon = new( StringComparer.OrdinalIgnoreCase )
	{
		// ── pistols ──────────────────────────────────────────────────────────────────────────
		// ⚠️ "Mustang", NOT "Mustang & Sally" — chosen deliberately. The original name is the pair
		// of guns you get; ours is one weapon, and the ampersand also reads badly ahead of a suffix
		// ("Mustang & Sally MK3").
		// ⛔ The workshop pack's own value is "C-3000 b1at-ch35", which the nZombies gamemode
		// OVERRIDES in its bundled `robotnik_bo1_1911/shared.lua` to "Mustang & Sally". The override
		// is what upstream actually loads, so the pack's value is the one to ignore.
		["nz_m1911"] = "Mustang",
		["nz_makarov"] = "Vladamir",              // ✓
		["nz_python"] = "Cobra",                  // ✓
		["nz_cz75"] = "Calamity",                 // ✓
		// ⚠️ NOT from the SWEPs — `robotnik_bo1_asp` ships no NZPaPName at all, because the ASP is
		// never Pack-a-Punchable in the original. Named by the user.
		["nz_asp"] = "Aspirin",

		// ── SMGs ─────────────────────────────────────────────────────────────────────────────
		["nz_mpl"] = "MPL-LF",                    // ✓
		["nz_skorpion"] = "VZ-115 Stinger",       // ✓
		["nz_uzi"] = "Uncle Gal",                 // ✓
		["nz_pm63"] = "Tokyo",                    // ✓
		["nz_mac11"] = "MAC-2-NITE",              // ✓
		["nz_kiparis"] = "Cypress",               // ✓
		["nz_spectre"] = "Phantom",               // ✓

		// ── rifles ───────────────────────────────────────────────────────────────────────────
		["nz_m14"] = "Mnesia",                    // ✓
		["nz_famas"] = "G16-GL35",                // ✓
		["nz_galil"] = "Lamentation",             // ✓
		["nz_aug"] = "AUG-5OM3",                  // ✓
		["nz_fal"] = "EPC WN",                    // ✓
		["nz_g11"] = "G115 Generator",            // ✓
		// ⚠️ NOT a BO1 weapon — no official name exists. This is nZombies' OWN name for the G3, from
		// the FAS2 entry in `sh_papnames.lua` (`["fas2_g3"] = "G3T-GUD"`), so it is at least the
		// project's own precedent rather than an invention.
		["nz_g3"] = "G3T-GUD",
		// ⚠️ RENAMED BASE. This weapon's DisplayName was "XL60" — not a BO1 gun — and is now
		// ENFIELD, which is. Its official packed name is "E-115 T-Party"; "Sabertooth" is the user's
		// choice over it, recorded here so the difference is not later read as a lookup error.
		["nz_xl60"] = "Sabertooth",
		// ⚠️ RENAMED BASE, was "AK_ULTIMATE" — a wonder-variant with no BO1 counterpart, now AK47.
		// The AK-47's official packed name is "Reznov's Revenge"; "Red Mist" is the user's choice.
		["nz_ak_ultimate"] = "Red Mist",

		// ── shotguns ─────────────────────────────────────────────────────────────────────────
		["nz_olympia"] = "Hades",                 // ✓
		["nz_spas12"] = "SPAZ-24",                // ✓
		["nz_hs10"] = "Typhoid",                  // ✓
		["nz_ks23"] = "KillSomeCommies-46",       // ✓

		// ── LMGs ─────────────────────────────────────────────────────────────────────────────
		["nz_m60"] = "The Pig",                   // ✓
		["nz_stoner"] = "Rosetta Stoned",         // ✓
		["nz_hk21"] = "H115 Oscillator",          // ✓

		// ── snipers ──────────────────────────────────────────────────────────────────────────
		["nz_svd"] = "D115 Disassembler",         // ✓  (SVD is the Dragunov)
		["nz_wa2000"] = "The Wazoo",              // ✓
		// ⚠️ RENAMED BASE, was "AWM" — not a BO1 gun. Now L96A1, whose real packed name this is, so
		// the ✓ applies to the NAME even though the rename was a decision.
		["nz_awm"] = "L115 Isolator",

		// ══ BLACK OPS II ═════════════════════════════════════════════════════════════════════
		//
		// ⚠️ SAME SOURCE, DIFFERENT FAMILY. Every ✓ below was read out of `SWEP.NZPaPName` in the
		// SAME workshop pack 3116673254 the BO1 names came from — the BO2 weapons live under
		// `lua/weapons/mac_bo2_*` (39 files) and the WaW ones under `robotnik_waw_*` (36), rather
		// than `robotnik_bo1_*`. Nothing here is from memory.
		//
		// ⛔ THE FOLDER NAME IS NOT THE WEAPON. Several of ours are named after the model file
		// rather than the gun: `nz_type95` IS a Type 25, `nz_xm8` an M8A1, `nz_sig556` a SWAT-556,
		// `nz_fnp45` a Tac-45, `nz_kard` a KAP-40. The mapping below joins on what ARC9's
		// PrintName says the weapon actually IS, which is why those five look mismatched and are
		// not. The manifest already carries the correct names; only the prefab DisplayName is the
		// crude uppercase folder name.

		// ── pistols ──────────────────────────────────────────────────────────────────────────
		["nz_b23r"] = "B34R",                     // ✓
		["nz_kard"] = "Karmic Atom Perforator-4000",   // ✓  (KAP-40)
		["nz_fiveseven"] = "Ultra",               // ✓
		["nz_fnp45"] = "FNPWND",                  // ✓  (Tac-45 — the name confirms the join)

		// ── SMGs ─────────────────────────────────────────────────────────────────────────────
		["nz_msmc"] = "Indian Typewriter",        // ✓
		["nz_chicom"] = "Chicom Cataclysmic Quadruple Burst",   // ✓
		["nz_mp7"] = "MassivePwnage7000",         // ✓
		["nz_pdw57"] = "Predictive Death Wish 57000",   // ✓
		["nz_peacekeeper"] = "War Pig",           // ✓
		// ⚠️ WaW weapons, from `robotnik_waw_*` — these three predate BO2 and keep their WaW names.
		["nz_mp40"] = "The Afterburner",          // ✓
		["nz_thompson"] = "Gibs-O-Matic",         // ✓

		// ── rifles ───────────────────────────────────────────────────────────────────────────
		["nz_an94"] = "Actuated Neutralizer 94000",     // ✓
		["nz_m27"] = "Mystifier",                 // ✓
		["nz_mtar"] = "Malevolent Taxonomic Anodized Redeemer",   // ✓
		["nz_scarh"] = "Agarthan Reaper",         // ✓
		["nz_sig556"] = "Fly Swatter",            // ✓  (SWAT-556)
		["nz_smr"] = "SM1L3R",                    // ✓
		["nz_type95"] = "Strain 25",              // ✓  (Type 25, not a Type 95)
		["nz_xm8"] = "Micro Aerator",             // ✓  (M8A1)
		["nz_stg44"] = "Spatz-447 +",             // ✓  (WaW)

		// ── shotguns ─────────────────────────────────────────────────────────────────────────
		["nz_ksg"] = "Mist Maker",                // ✓
		["nz_s12"] = "Synthetic Dozen",           // ✓

		// ── LMGs ─────────────────────────────────────────────────────────────────────────────
		["nz_lsat"] = "FSIRT",                    // ✓
		["nz_hamr"] = "SLDG HAMR",                // ✓
		["nz_mk48"] = "Mark of Death",            // ✓
		["nz_qbb"] = "Far Eastern Buzzsaw",       // ✓  (QBB LSW)

		// ── snipers ──────────────────────────────────────────────────────────────────────────
		["nz_ballista"] = "Infused Arbalest",     // ✓
		["nz_dsr50"] = "Dead Specimen Reactor 5000",    // ✓
		["nz_svu"] = "Shadowy Veil Utilizer",     // ✓
		["nz_xpr50"] = "XPRSS-2-H3LL",            // ✓

		// ── ⚠️ NOT FROM ANY SWEP — the pack has no NZPaPName for these ───────────────────────
		//
		// Seven BO2 weapons have no authored packed name: `mac_bo2_scorp` and `mac_bo2_vector`
		// ship the literal placeholder string "SomeName", and the other five have no field at
		// all. Every name below is therefore a DECISION, not a lookup, and is marked so that a
		// later reader does not go looking for a source that was never there.

		// ⚠️ USER'S CHOICE. Given directly, same as Aspirin / Sabertooth / Red Mist above.
		["nz_c96"] = "Boomhilda",                 // Mauser C96
		["nz_m1216"] = "Mesmerizer",              // M1216
		["nz_mg08"] = "Magna Collider",           // MG08/15
		["nz_nma"] = "SASSAFRAS",                 // Remington New Model Army

		// ⚠️ OURS — invented to the original's own conventions, at the user's request. The three
		// patterns the real names use are leetspeak (SM1L3R, B34R, G3T-GUD, FNPWND, AUG-5OM3),
		// element-115 machinery (G115 Generator, D115 Disassembler, H115 Oscillator), and
		// expanding the acronym into something grandiose (MTAR -> Malevolent Taxonomic Anodized
		// Redeemer, KAP-40 -> Karmic Atom Perforator-4000). One of each:

		// Leetspeak on EVO, and the gun is the fastest-firing SMG in the pack at 1150 RPM.
		["nz_scorpion"] = "EV0LV3R",              // Skorpion EVO

		// ⚠️ USER'S CHOICE, over an earlier "Plague Vector". Same disease joke, better mouthfeel.
		["nz_vector"] = "Black Plague",            // Vector K10

		// Keeps PSR as an acronym, the way MTAR and KAP-40 keep theirs. The Storm is a charge-up
		// rail gun, so "Rectifier" is doing double duty as the electrical component.
		//
		// ⚠️ THE NUMBER IS PART OF THE PATTERN. An expanded acronym in this set almost always
		// carries the weapon's own digits, inflated: KAP-40 -> Karmic Atom Perforator-4000,
		// AN-94 -> Actuated Neutralizer 94000, PDW-57 -> Predictive Death Wish 57000, DSR 50 ->
		// Dead Specimen Reactor 5000, MP7 -> MassivePwnage7000.
		//
		// ⛔ "PSR" HAS NO DIGITS TO INFLATE, so this borrows the fleet's OTHER numeric convention
		// instead of inventing one: element 115, already carried by six names here (G115
		// Generator, H115 Oscillator, D115 Disassembler, L115 Isolator, VZ-115 Stinger, E-115
		// T-Party). It is the better fit anyway — the Storm is the pack's energy weapon, and 115
		// is what powers every wonder weapon in the original.
		["nz_storm"] = "Perpetual Storm Rectifier-115",    // Storm PSR

		// ⚠️ THE R870 IS OUT OF THE GAME — removed from weapons/manifest.json, so nothing can
		// reach it. Its name is kept only because the prefab file still exists on disk and
		// `nz_pap_names` enumerates prefabs: without an entry it reports as a MISSING name every
		// time, which is noise rather than a gap. This one IS from the pack. ✓
		["nz_r870"] = "Refitted-870 Mechanical Cranium Sequencer",

		// ── World at War ─────────────────────────────────────────────────────────────────────
		//
		// ⚠️ ✓ MARKS A NAME FROM THE GAME; THE REST WE WROTE. Seventeen of these are the real WaW
		// Nazi Zombies names. Six weapons in this pack were never Pack-a-Punchable there — they are
		// the multiplayer and campaign guns the ARC9 pack bundles alongside the zombie roster — so
		// those names are ours. The distinction is marked because a wrong name is invisible until
		// someone who knows the game sees it, and then the unmarked ones are where to look.
		["nz_k98k"] = "Armageddon",                          // ✓
		["nz_ppsh41"] = "The Reaper",                        // ✓
		["nz_trenchgun"] = "The Gut Shot",                   // ✓
		["nz_doublebarrel"] = "24 Bore Long Range",          // ✓
		["nz_garand"] = "The Imploder",                      // ✓
		["nz_carbine"] = "The Widdershins RC-1",             // ✓
		["nz_g43"] = "G115 Compressor",                      // ✓
		["nz_arisaka"] = "Masamune",                         // ✓
		["nz_type99"] = "Eviscerator",                       // ✓
		["nz_type100"] = "1001 Samurais",                    // ✓
		["nz_bar"] = "The Widow Maker",                      // ✓
		["nz_mg42"] = "The Barracuda",                       // ✓
		["nz_30cal"] = "The Accelerator",                    // ✓
		["nz_dp28"] = "The Chainsaw",                        // ✓
		["nz_fg42"] = "The 420 Impeller",                    // ✓
		["nz_ptrs41"] = "The Penetrator",                    // ✓
		["nz_357"] = ".357 Plus 1 K1L-u",                    // ✓

		// Ours — these six were not in WaW Nazi Zombies and have no name to port.
		["nz_springfield"] = "Seasonal Harvest",     // spring/field read as season + hunting ground
		["nz_mosin"] = "Stakhanovite",               // the Soviet worker who overshoots his quota
		["nz_svt40"] = "Sudden Violent Trauma-80",   // SVT as a backronym; 40 doubled on upgrade
		["nz_p38"] = "The Walthz",                   // Walther -> waltz, one letter
		["nz_tt33"] = "Terminal 66",                 // 33 doubled; sibling to the SVT, same designer
		["nz_nambu"] = "Shodan",                     // Japanese "first rank" — number one, buried

		// ── Poly Arms / golub's lowpoly ──────────────────────────────────────────────────────
		//
		// ⛔ EVERY NAME HERE IS OURS, and unlike the World at War block none of them are marked ✓.
		// These weapons are not from Call of Duty — the pack invents its own designations
		// (`Wingmaster 12G` is a Remington 870, `Excalibur .338` is an AWM) — so there is no
		// canonical name to port and nothing to check against a source.
		//
		// ⚠️ THE CONVENTIONS ARE DELIBERATE, and Docs/pap_names_polyarms.md records why each one
		// was chosen. Numbers escalate on upgrade (doubled, reversed, tripled, or dissolved into
		// the word); the gun's own letters are buried inside a longer word where they fit; and a
		// few upgrade by category rather than by number — VHS-2 to DVD-4, Werefox to Werewolf.

		// Assault Rifles
		["nz_uplp_ak"] = "A-OK 365",    // AK -> A-OK, and OK all year round
		["nz_uplp_ak12"] = "23 Skidoo",  // old slang for leaving in a hurry; the M23
		["nz_uplp_ar15"] = "Atomic Reclaimer 115",  // AR expanded, 15 nudged onto the element
		["nz_uplp_aug"] = "AW-UG-50M3",  // reads as "awesome" - the pack spells it AW-UG
		["nz_uplp_famas"] = "Pain de Guerre",  // real French ration bread; reads as "pain of war"
		["nz_uplp_fal"] = "Devil's Left Hand",  // inverts the FAL's nickname, right arm of the free world
		["nz_g3_lpg"] = "G3N351S",      // genesis - where the outbreak starts
		["nz_hecate_lpg"] = "TriVIa",   // Hecate's Roman name; the capitals are Roman numerals
		["nz_iws_lpg"] = "I Was",       // the initials read as an epitaph
		["nz_uplp_ar18"] = "NightM6R3",  // nightmare, with the 63 dissolved into the word
		["nz_mosin_lpg"] = "Stakhan8bit",  // Stakhanovite + 8-bit; the low-poly Mosin
		["nz_sa58_lpg"] = "Ossuary-116",  // a bone-house; keeps the OS of OSW, 58 doubled
		["nz_uplp_asval"] = "Umbra",    // a shadow's darkest core - the gun is suppressed
		["nz_uplp_g36"] = "Sturmvogel-190",  // storm bird; 95 doubled
		["nz_svd_lpg"] = "Dragoon",     // a cavalry term that sounds like Dragunov
		["nz_vhs2_lpg"] = "DVD-4",      // the next format up, and the number doubles
		["nz_uplp_mutant"] = "Werewolf MC",  // the fox becomes a wolf; MC after Wolf Military Classic ammo
		["nz_uplp_scar"] = "K3lo1d",    // keloid - an overgrown scar that keeps spreading

		// Handguns
		["nz_uplp_1911"] = "A5P-3000",  // the ASP's letters and the 1911's number, in the WaW leet style
		["nz_uplp_deagle"] = "The Talon",  // what a Desert Eagle actually kills with
		["nz_g41_lpg"] = "Deadlock",    // rhymes with Glock; an unbreakable standoff
		["nz_uplp_2011"] = "LA M0RD1D4",  // la mordida - Spanish for the bite, which is how it spreads
		["nz_uplp_fn57"] = "MURD3R-114",  // MRD refilled into the word; 57 doubled
		["nz_uplp_usp"] = "Handkanone-90",  // German slang for an oversized pistol; .45 doubled
		["nz_pm9_lpg"] = "Eviler Gun",  // the pack called it an evil gun; the upgrade is simply more so
		["nz_uplp_m9"] = "Vendetta-29",  // rhymes with Beretta; 92 reversed
		["nz_pr57_lpg"] = "Purge-75",   // PR -> purge, 57 reversed
		["nz_rsh_lpg"] = "Kuvalda",     // Russian for sledgehammer
		["nz_uplp_rsh12"] = "RaZ0R",    // the RZ buried in a word; the twin of Kuvalda

		// Submachine Guns
		["nz_uplp_ak_smg"] = "Smörgåsbord",  // Swedish - kpist is Swedish for SMG; a spread of everything
		["nz_abomination_lpg"] = "Anathema",  // a formally cursed thing - one word up from abomination
		["nz_uplp_mac"] = "Danse Macabre",  // the medieval dance of death; MAC sits inside macabre
		["nz_uplp_mp9"] = "Alt + F4",       // the pack calls it F9; this is the shortcut that terminates
		["nz_mpx_lpg"] = "Malpractice",     // clinical register, with MP at its heart
		["nz_uplp_ar57"] = "Chimera-171",   // an AR lower wearing a P90 magazine; 57 tripled
		["nz_uplp_mp7"] = "Post-Death Warranty",  // PDW as insurance boilerplate
		["nz_uplp_mp5"] = "Post Vitam",     // Latin, after life; PV exactly
		["nz_uplp_vector"] = "Panthera-G3N3R6L",  // serval to big cat, GEN promoted to GENERAL
		["nz_uplp_ump"] = "Ultraviolent",   // one letter from ultraviolet, which is what UV means

		// Shotguns
		["nz_uplp_dbs"] = "Summary Judgment",  // a ruling with no trial; the pack said Authority
		["nz_ksg410_lpg"] = "Switchback",  // the KSG flips between twin magazine tubes
		["nz_uplp_molot"] = "Serp i Molotov",  // hammer and sickle, one syllable from a firebomb
		["nz_uplp_ks23"] = "Krushka & Flattenko",  // push escalated to crush and flatten, made Russian
		["nz_uplp_spas"] = "SPAWN-24",  // the pack's SPAW is one letter from what the horde does
		["nz_uplp_spas15"] = "Magazine Subscription",  // the SPAS-15 is the box-fed one
		["nz_uplp_m590"] = "Thunderhead-1000",  // the storm cloud, and head does its own work
		["nz_toz34_lpg"] = "Stacked Deck",  // an over-under has stacked barrels; the odds are now rigged
		["nz_uplp_r870"] = "Flying Commander",  // Wingmaster promoted

		// Light Machine Guns
		["nz_abomination_ii_lpg"] = "Leviathan",  // the bigger brother of Anathema, same register
		["nz_mg5_lpg"] = "Mass Grinder-115",   // MG expanded; mass grave crossed with meat grinder
		["nz_uplp_minigun"] = "Obituary Automatic",  // O.A. expanded - it writes them faster than print
		["nz_uplp_pkm"] = "Permanent Silence 115",  // PS expanded; what a belt-fed gun leaves behind
		["nz_uplp_m249"] = "Sawmill-902",      // SAW - a mill processes logs, this processes a crowd

		// Sniper Rifles
		["nz_uplp_sr25"] = "Designated Mortician-20",  // one word of the real DMR designation swapped
		["nz_uplp_mjolnir"] = "Kingslayer",  // Excalibur made a king; this unmakes one
		["nz_uplp_orsis"] = "Basilisk X216",  // kills with a look, at range - what a sniper does
		["nz_uplp_marlin"] = "Blue Marlin",  // the fish the maker took its name from
		["nz_uplp_awp"] = "Arctic Wrath",  // AW stands for Arctic Warfare; wrath is the upgrade

		// ── Modern Warfare Classic: CoD4 / MW2 / MW3 ─────────────────────────────────────────
		//
		// ⚠️ EVERY NAME HERE IS OURS. Pack-a-Punch is a Zombies mechanic and these are Modern
		// Warfare titles, so there was no canonical name to port — unlike the World at War block
		// above, where seventeen are the real game's and marked ✓.
		//
		// ⚠️ THE VOICE WAS RECALIBRATED PARTWAY THROUGH. The first dozen or so drifted into dry
		// institutional wit — Universal Solution, Rapid Population Decline, Short Conversation —
		// which is a knowing adult register, where the canonical names are goofy: agent nouns
		// (The Reaper, The Imploder), leetspeak on the gun's own name (AK-4TW, K1LL-ST34L), daft
		// phonetic puns (Uncle Gal, Big Mac). The later entries lean back toward that. The early
		// ones are worth a second read rather than treating as settled.
		//
		// ⚠️ SIXTEEN GUNS APPEAR IN MORE THAN ONE GAME and each has its own name — three M16A4s,
		// three USPs, three MP5s, two of a dozen others. Docs/pap_names_mwclassic.md records which
		// seam each one used so a re-port does not collapse them together.

		// Call of Duty 4
		["nz_cod4e_ak47"] = "The Kalashnikover",  // the gun that simply keeps going
		["nz_cod4e_ak74u"] = "The Krink",      // its Western nickname, itself shortened
		["nz_cod4e_g3"] = "Delay-6",           // roller-delayed action; 3 doubled
		["nz_cod4e_g36c"] = "Meltdown",        // the G36 reputation for overheating
		["nz_cod4e_m14"] = "The Understudy",   // briefly the US service rifle before the M16 took over
		["nz_cod4e_m4m16"] = "M32-A8",         // both numbers doubled
		["nz_cod4e_mp44"] = "Grandfather Clause",  // a 1944 rifle still legal in 2007
		["nz_cod4e_deagle"] = "Gold Standard",  // the gold finish, and the benchmark
		["nz_cod4e_m1911"] = "115-Centenarian",  // designed 1911, still serving
		["nz_cod4e_m9"] = "Operetta-18",       // rhymes with Beretta; 9 doubled
		["nz_cod4e_usp"] = "Universal Solution",  // USP is Universelle Selbstladepistole
		["nz_cod4e_m249"] = "M598 Conquered",  // came, SAW, conquered
		["nz_cod4e_m60"] = "Hog Wild",         // the M60 has been the Pig since Vietnam
		["nz_cod4e_rpd"] = "Rapid Population Decline",  // RPD as demographic euphemism
		["nz_cod4e_m1014"] = "Short Conversation",  // how long the argument lasts
		["nz_cod4e_w1200"] = "WIN",            // Winchester clipped to a word
		["nz_cod4e_m82"] = "Heavy Hundred",    // the M82 is nicknamed the Light Fifty; both halves flipped
		["nz_cod4e_dragunov"] = "Tigr-116",    // the civilian Dragunov is sold as the Tigr; 58 doubled
		["nz_cod4e_m40a3"] = "MAOAE",          // the digits read back as the letters they resemble
		["nz_cod4e_r700"] = "Remnant-1400",    // Remington clipped to what is left; 700 doubled
		["nz_cod4e_mp5"] = "Mortuary Penitence-105",  // MP expanded
		["nz_cod4e_uzi"] = "Golem",            // Jewish folklore animates the inanimate; the Uzi is Israeli
		["nz_cod4e_p90"] = "Fifty Sideways",   // the magazine lies flat and feeds sideways
		["nz_cod4e_skorpion"] = "Sting-122",   // what a scorpion does; 61 doubled

		// Modern Warfare 2
		["nz_mw2e_acr"] = "Masada-42",           // the ACR was the Magpul Masada first; 21 doubled
		["nz_mw2e_ak47"] = "Stamped Steel",      // what made it cheap enough to end up everywhere
		["nz_mw2e_f2000"] = "0F-G1V3N",          // zero given, rather than two thousand
		["nz_mw2e_fnfal"] = "R1SE",              // FAL reads as fall; the upgrade is the opposite
		["nz_mw2e_famas"] = "Le Clairon",        // its real French nickname, the bugle
		["nz_mw2e_m16a4"] = "Burst Disciple",    // three-round burst as devotion
		["nz_mw2e_m4a1"] = "Christmas Tree",     // soldier slang for an M4 hung with accessories
		["nz_mw2e_scarh"] = "Super Car",         // SCAR read as one word
		["nz_mw2e_tavor"] = "Double Down-42",    // 21 is blackjack; doubling down on a good hand
		["nz_mw2e_g17"] = "Austrian Plastic",    // what sceptics called it in 1982
		["nz_mw2e_m93r"] = "Bruschetta-186",     // third in the Beretta rhyme family; 93 doubled
		["nz_mw2e_mk23"] = "Crew Served",        // the standing joke about the MK23 being enormous
		["nz_mw2e_aug"] = "RE-BAR",              // HBAR into reinforcing steel
		["nz_mw2e_m240"] = "Mitrailleuse-480",   // MAG is Mitrailleuse d Appui General; 240 doubled
		["nz_mw2e_mg4"] = "MG-115 Shredder",     // the G115 Compressor template
		["nz_mw2e_m1014"] = "Benelli Baloney",   // phonetic daftness on the maker
		// ⚠️ REMOVED FROM THE GAME, NAME KEPT. The weapon's prefab and assets were
		// deleted; this entry is parked rather than dropped so the name is not lost if it
		// ever comes back. Uncomment and re-port to restore it.
		// ["nz_mw2e_akimbo_1887"] = "Lever & Lover",  // the Mustang & Sally pairing; there are two of them
		["nz_mw2e_ranger"] = "Stranger Danger",  // a playground slogan on a sawn-off
		["nz_mw2e_spas12"] = "Spasmat-24",       // the gun letters buried in a device name; 12 doubled
		["nz_mw2e_cheytac"] = "Exorcism",        // an intervention aimed at the undead
		["nz_mw2e_mp5k"] = "Kurz Circuit",       // K is Kurz, German for short; short circuit
		["nz_mw2e_pp2000"] = "PP-115 Pounder",   // PP is Pistolet-Pulemyot
		["nz_mw2e_vector"] = "Downshifter",      // the KRISS drives its bolt downward
		["nz_mw3e_m1887"] = "M3774 Ricochet",    // 1887 doubled. NOTE: this prefab is filed under the MW2 pack

		// Modern Warfare 3
		["nz_mw3e_acr"] = "A-C-R3AP3R-115",    // the initials leetspeaked into reaper
		["nz_mw3e_cm901"] = "CM-115 Convertible",  // the CM901 genuinely converts calibres
		["nz_mw3e_fad"] = "Forcibly Assisted Departure",  // FAD as the polite phrasing
		["nz_mw3e_g36"] = "G-115 Kompressor",  // the G115 Compressor template, with a German K
		["nz_mw3e_m16a4"] = "M1A-4EVA",        // the rifle that has outlasted every replacement
		["nz_mw3e_m4a1"] = "M4-115 Carbinator",  // element in the model number, daft coinage after
		["nz_mw3e_mk14"] = "The Overachiever",  // answers The Understudy on the CoD4 M14
		["nz_mw3e_scarl"] = "Scarlet",         // SCAR-L plus one letter
		["nz_mw3e_qbz97"] = "Splinterer",      // agent noun
		["nz_mw3e_anaconda"] = "Magnum Opus",  // the calibre becomes a masterwork
		["nz_mw3e_deagle"] = "Overkill",       // chambered far past anything it needs to do
		["nz_mw3e_fiveseven"] = "One-One-Five",  // the name is a spelled-out number pair; 115 in the same shape
		["nz_mw3e_mp412"] = "T-REX",           // the MP-412 REX, one letter from a dinosaur
		["nz_mw3e_p99"] = "Neunundneunzig",    // German for ninety-nine, on the smallest pistol here
		["nz_mw3e_usp"] = "Yoospy",            // how USP sounds said aloud
		["nz_mw3e_l86"] = "Jam Session",       // the SA80 family reliability record
		["nz_mw3e_m60"] = "Vietnam Express",   // twenty years past its retirement
		["nz_mw3e_mg36"] = "The Drum Major",   // it feeds from a C-Mag drum
		["nz_mw3e_mk46"] = "Diet SAW",         // the M249 with the weight cut off
		["nz_mw3e_pkp"] = "The Nomad",         // the Pechenegs were steppe nomads
		["nz_mw3e_fmg9"] = "Origami",          // it folds flat into a block
		["nz_mw3e_glock"] = "The Sprinkler",   // a full-auto pistol distributes rather than aims
		["nz_mw3e_mp9"] = "The Stapler",       // office-sized, and it fastens things permanently
		["nz_mw3e_aa12"] = "Double A Battery",  // the initials give a household object; battery is also a charge
		["nz_mw3e_ksg12"] = "Kel Tic Toc",     // phonetic on the maker, into a clock
		["nz_mw3e_striker"] = "Strike Two",    // there is rarely a third
		["nz_mw3e_usas12"] = "Freedom Server",  // a Korean shotgun serving American freedom
		["nz_mw3e_as50"] = "Anti-Social",      // AS exactly; the least sociable object in the roster
		["nz_mw3e_barrett"] = "Zero-Cover",    // cover costs you nothing against this
		["nz_mw3e_dragunov"] = "Marksman's Mandate",  // the SVD is a designated-marksman rifle, not a sniper
		["nz_mw3e_awm"] = "Long Arm",          // the long arm of the law, and the longest reach here
		["nz_mw3e_msr"] = "Modular Snuffing Rig",  // MSR kept, middle word swapped
		["nz_mw3e_rsass"] = "R3CESS",          // the initials leetspeaked into a playground word
		["nz_mw3e_mp5"] = "Tunnel Rat",        // this gun exists for corridors and stairwells
		["nz_mw3e_mp7"] = "Lucky Seven",       // the number in its own name
		["nz_mw3e_p90"] = "Cheese Grater",     // the vented handguard genuinely looks like one
		["nz_mw3e_pm9"] = "Prime Minister",    // PM exactly; an absurd office for an SMG
		["nz_mw3e_pp90m1"] = "Pipe Cleaner",   // the helical magazine looks like plumbing
		["nz_mw3e_ump45"] = "Umpire",          // UMP plus two letters; the one who decides

		// COD Extras
		["nz_cde_g3"] = "Lucky Third",  // the third G3 in the roster, and the name knows it
		["nz_cde_mcx"] = "The Replacer",  // the XM7 exists to retire the M4s, four of which are in this list

		// ── Destiny ──────────────────────────────────────────────────────────────────────────
		// ⚠️ NONE OF THESE ARE FROM A SOURCE SWEP. The Destiny pack has no Pack-a-Punch names of
		// its own -- these were chosen by the user from suggestions, so there is no upstream value
		// to check them against and no ✓ to mark. They follow the same three shapes as the rest of
		// this file: model-number mangles, evocative proper nouns, and compound tech names.
		//
		// ⚠️ THE BASE NAMES ARE ALREADY FLAVOURFUL, unlike every other pack's acronyms and model
		// numbers. A packed Destiny name therefore ESCALATES the original rather than replacing it
		// -- Thorn becomes Briar, Whisper Of The Worm becomes Wormsong.

		// handguns
		["nz_farewell"] = "Parting Shot",
		["nz_forerunner"] = "Prime Mover",
		["nz_7th_sidearm"] = "Cherubim",          // the lowest choir of angels, under the Seraphim
		["nz_trespasser"] = "Squatter's Rights",

		// submachine guns
		["nz_graviton_lance"] = "Event Horizon",
		["nz_gridskipper"] = "Latticework",
		["nz_hard_light"] = "Photon Drive",
		["nz_ikelos_smg"] = "Oneiros",            // the Oneiroi are the dream-spirits the IKELOS weapons are named for
		["nz_7th_smg"] = "Seraphim Rising",
		["nz_sweet_sorrow"] = "Bittersweet End",
		["nz_unforgiven"] = "Absolution Denied",

		// assault rifles
		["nz_bxr_battler"] = "BXR-115 Brawler",     // the model number, with 115 spliced in
		["nz_chroma_rush"] = "Full Spectrum",
		["nz_disparity"] = "The Divide",
		["nz_khvostov_7g0x"] = "Tailgunner",        // khvostov is Russian for tail
		["nz_midhas_reckoning"] = "Apocalypse",
		["nz_new_purpose"] = "Second Calling",
		["nz_outbreak_perfected"] = "SIVA Bloom",   // SIVA is the nanite plague the original weapon is built from
		["nz_piece_of_mind"] = "Slice of Genius",
		["nz_revision_zero"] = "Final Draft",
		["nz_7th_carbine"] = "Archangel",
		["nz_smite_of_merain"] = "Smite Eternal",
		["nz_the_eremite"] = "Solitude",
		["nz_touch_of_malice"] = "Death's Grip",
		["nz_vex_mythoclast2"] = "Fusion Paradox",  // the base weapon is a fusion rifle; the Vex fold time

		// battle rifles
		["nz_bryas_love"] = "Brya's Devotion",
		["nz_doom_of_chelchis"] = "Imminent Danger",
		["nz_trustee"] = "The Fiduciary",

		// light machine guns
		["nz_commemoration"] = "In Memoriam",
		["nz_eleatic_principle"] = "Zeno's Paradox",  // Zeno of Elea, whose paradoxes the base name points at
		["nz_forgotten_plague"] = "Rats & Pests",
		["nz_hammerhead"] = "Cookie Cutter",
		["nz_nemesis_star"] = "Supernova",
		["nz_qullims_terminus"] = "End Of The Line",
		["nz_recurrent_impact"] = "Aftershock",
		["nz_retrofit_escapade"] = "Grand Escape",
		["nz_7th_saw"] = "Wingsong",
		["nz_shattered_cipher"] = "Enigma",
		["nz_thunderlord"] = "Zeus",
		["nz_tommys_matchbook"] = "Firestarter",
		["nz_xenophage"] = "Xenocide",

		// revolvers
		["nz_ace_of_spades"] = "Dead Man's Hand",
		["nz_eyasluna"] = "Blue Moon",
		["nz_hawkmoon"] = "Bird Of Prey",
		["nz_ikelos_hc"] = "Morpheus",         // eldest of the Oneiroi, and the one who takes human shape
		["nz_kept_confidence"] = "Secret Revelation",
		["nz_posterity"] = "Heirloom",
		["nz_7th_revolver"] = "Field Commission",
		["nz_sunshot"] = "Solar Flare",
		["nz_thorn"] = "Briar",
		["nz_zaoulis_bane"] = "Zaouli's Curse",

		// shotguns
		["nz_heritage"] = "Patrimony",
		["nz_ikelos_shotgun"] = "Night Terror",
		["nz_matador64"] = "El Toro",               // the bull rather than the bullfighter
		["nz_7th_shotgun"] = "Seraph Breacher",
		["nz_soujourners_tale"] = "The Long Road",
		["nz_wastelander"] = "Rat King",            // Rat King is another Destiny weapon; the wasteland suits it better here

		// sniper rifles
		["nz_1000_yard_stare"] = "Abyssal Stare",
		["nz_cloudstrike"] = "Stormfront",
		["nz_darci"] = "D.E.A.T.H",                     // the acronym re-spelled, in the style of R3CESS and G3T-GUD
		["nz_defiance_of_yasmin"] = "Insubordination",
		["nz_ikelos_sniper"] = "Deep Sleep",
		["nz_ice_breaker_2"] = "Permafrost",
		["nz_izanagis"] = "Honed Edge",
		["nz_locus_locutus"] = "Epicentre",
		["nz_lorentz_driver"] = "String Theory",        // the Lorentz transform is special relativity's core
		["nz_no_land_beyond"] = "Far Far Away",
		["nz_polaris_lance"] = "Perfect Fifth",         // the perfect fifth is the base weapon's own explosive-round perk
		["nz_stormchaser"] = "Eye Of The Storm",
		["nz_succession"] = "Heir Apparent",
		["nz_thoughtless"] = "Second Thought",
		["nz_whisper"] = "Wormsong",                    // the base weapon's predecessor was Black Spindle; the worm still sings
		["nz_zen_meteor"] = "Satori",                   // satori is the Zen term for sudden enlightenment

		// ══ COD: WWII ═══════════════════════════════════════════════════════════════════════
		// ⚠️ STRAIGHT FROM `SWEP.NZPaPName` in the pack's own luas — all 74 shipped one, so none
		// of these were invented. Three were changed, each for a collision and noted inline.

		// ── Handguns ──────────────────────────────────────────────────────────────────
		["nz_ww2_1911"] = "Bacon & Eggs",  // the dropped Mustang & Sally weapon, kept as the 1911's upgrade
		["nz_ww2_m712"] = "Red 9",
		["nz_ww2_luger"] = "G.I.'s Souvenir",

		// ── Revolvers ─────────────────────────────────────────────────────────────────
		["nz_ww2_no2"] = "Bulldog",
		["nz_ww2_m1879"] = "Glücklicher Punk",

		// ── Submachine Guns ───────────────────────────────────────────────────────────
		["nz_ww2_austen"] = "Whispering Winds",
		["nz_ww2_bechowiec"] = "Lightning Catcher",
		["nz_ww2_blyskawica"] = "War Saw",
		["nz_ww2_emp44"] = "Bridesmaid",
		["nz_ww2_erma"] = "Groomsman",
		["nz_ww2_greasegun"] = "The Greaser",
		["nz_ww2_mas38"] = "Corpse King",
		["nz_ww2_m1928a1"] = "Pierson's Ticket",
		["nz_ww2_thompson"] = "Chicago Typewriter",
		["nz_ww2_m2hyde"] = "The Proven",
		["nz_ww2_mp40"] = "Hardly Werkeing",
		["nz_ww2_nambu"] = "Tokyo Jam",
		["nz_ww2_beretta38"] = "The Boot",  // shipped as "Groomsman", which the Erma EMP also uses
		["nz_ww2_ppsh41"] = "Dedushka",
		["nz_ww2_arsenal"] = "Dead Leaves",
		["nz_ww2_ribey"] = "Roland's Count",
		["nz_ww2_sten"] = "La Resistance",
		["nz_ww2_sterling"] = "The British 6",
		["nz_ww2_theclassic"] = "Yoteslaya",
		["nz_ww2_type100"] = "Blood Type",
		["nz_ww2_mp28"] = "Flapjack",
		["nz_ww2_zk383"] = "One-Eyed Mace",

		// ── Assault Rifles ────────────────────────────────────────────────────────────
		["nz_ww2_as44"] = "Prototype 7",
		["nz_ww2_federov"] = "First Red Hero",
		["nz_ww2_avs36"] = "Complex Beat",
		["nz_ww2_bar"] = "FU-BAR",
		["nz_ww2_fg42"] = "Device 450",
		["nz_ww2_grossfuss"] = "Compact Chaos",
		["nz_ww2_pg1935"] = "Hercules",
		["nz_ww2_kgm21"] = "Swedish-Chocolate",
		["nz_ww2_m1941"] = "Emma Gee",
		["nz_ww2_m2carbine"] = "M2A2 Carbine",
		["nz_ww2_charlton"] = "Slice of Kiwana",
		["nz_ww2_stg44"] = "STG770",
		["nz_ww2_volk"] = "People's Storm",
		["nz_ww2_wimmer"] = "Spz-X",

		// ── Battle Rifles ─────────────────────────────────────────────────────────────
		["nz_ww2_gewehr43"] = "Barbarossa's Strike",
		["nz_ww2_m1a1"] = "Piranha",  // shipped as "M2 Carbine" — a real weapon in this pack
		["nz_ww2_m1garand"] = "G.O.A.T.",
		["nz_ww2_svt40"] = "AVT-40",
		["nz_ww2_type5"] = "Go Ban",

		// ── Light Machine Guns ────────────────────────────────────────────────────────
		["nz_ww2_bren"] = "Ronnie",
		["nz_ww2_chatellerault"] = "The Black Cat",
		["nz_ww2_breda30"] = "Good Enough",
		["nz_ww2_lad"] = "Mad-Lad",
		["nz_ww2_lewis"] = "Belgian Rattlesnake",
		["nz_ww2_m1919"] = "Hit Box",
		["nz_ww2_mg15"] = "Prop Shredder",
		["nz_ww2_mg81"] = "Spandau Serenade",
		["nz_ww2_mg42"] = "Bone Saw",
		["nz_ww2_stinger"] = "Hurt Box",
		["nz_ww2_vmg27"] = "78 Deaths",

		// ── Sniper Rifles ─────────────────────────────────────────────────────────────
		["nz_ww2_mosin"] = "Hot Borshch",
		["nz_ww2_delisle"] = "Subsonic Scream",
		["nz_ww2_kar98k"] = "War Model",
		["nz_ww2_kbsp1938"] = "White Death",
		["nz_ww2_enfield"] = "Smiley",
		["nz_ww2_winchester94"] = "Trixie Mattel",
		["nz_ww2_springfield"] = "Massachusetts",
		["nz_ww2_mas36"] = "Finer Things",
		["nz_ww2_ptrs41"] = "Tiger Gun",
		["nz_ww2_sdk"] = "Führer Bane",  // shipped as "War Model", which the Kar98K also uses
		["nz_ww2_arisaka"] = "Defaced Chrysanthemum",
		["nz_ww2_wz35"] = "Showstopper",

		// ── Shotguns ──────────────────────────────────────────────────────────────────
		["nz_ww2_blunderbuss"] = "Funderbuss",
		["nz_ww2_model1897"] = "Diplomatic Solution",
		["nz_ww2_m30"] = "Tripps",
		["nz_ww2_model21"] = "Last Model",
		["nz_ww2_walther"] = "Lucky",


		// ── SIMER's WW2 pack ──────────────────────────────────────────────────
		// ⚠️ CHOSEN IN CONVERSATION, not read out of a SWEP. This pack's SWEPs carry no
		// NZPaPName field at all, so unlike the ✓ entries above there is no upstream source to
		// check these against -- they are the decision, and this comment is the record of it.

		// Assault Rifles
		["nz_simers_fg42"] = "The Skyhook",
		["nz_simers_mkb42"] = "Haenel's Hammer",
		["nz_simers_fedorov_a"] = "Tips Fedora",
		["nz_simers_avs36"] = "Simonov's Folly",
		["nz_simers_stg44"] = "The Stormbringer",

		// Submachine Guns
		["nz_simers_ppsh"] = "Babushka",
		["nz_simers_mp38"] = "Schmeisser's Pride",
		["nz_simers_mp28"] = "Trench Sweeper",
		["nz_simers_mp40"] = "Blitzkrieg",
		["nz_simers_kp44"] = "Suomi's Son",
		["nz_simers_m41"] = "Holzsturm",
		["nz_simers_mp41rr"] = "MP-Rasputin",
		["nz_simers_mp3008"] = "Pipe Dream",
		["nz_simers_ppk41"] = "Korovin's Ghost",
		["nz_simers_pps42"] = "Siege Iron",
		["nz_simers_kp31"] = "Kuolema",
		["nz_simers_pps43"] = "Iron Stampede",

		// Battle Rifles
		["nz_simers_ger43"] = "Selbstlader",
		["nz_simers_svt40"] = "The Sweetheart",
		["nz_simers_avt40"] = "Full Auto Sveta",
		["nz_simers_zh29"] = "Czechmate",
		["nz_simers_svt38"] = "Sveta's Elder",

		// Light Machine Guns
		["nz_simers_mg42"] = "Bonesaw",
		["nz_simers_lahtim26"] = "The Finn",
		["nz_simers_dp-27"] = "Pan Handler",
		["nz_simers_mg34"] = "Mauser's Metronome",
		["nz_simers_dpm"] = "Record Player",
		["nz_simers_dt-29"] = "Luigi's Pizzeria",
		["nz_simers_zb26"] = "Brno's Bite",

		// Sniper Rifles
		["nz_simers_pzb39"] = "Tank Tickler",
		["nz_simers_ger33"] = "G-3340",
		["nz_simers_vz24"] = "Czech Anvil",
		["nz_simers_dr_mos"] = "Dragon's Breath",
		["nz_simers_ptrd"] = "Tank Splitter",
		["nz_simers_m_28"] = "The Spitz",
		["nz_simers_kar98"] = "Mauser's Verdict",
		["nz_simers_ptrs"] = "Simonov's Sledge",

		// Handguns
		["nz_simers_tt33"] = "TT-Tridtsat-Tri",
		["nz_simers_p338"] = "P-3800",

		// Revolvers
		["nz_simers_ng"] = "Nagant's Nail",

		// ══ TFA fleet, 29 workshop packs, ported 2026-09-12 ══════════════════════════════
		//
		// ⛔ WRITTEN, NOT PORTED, AND THAT IS THE DIFFERENCE FROM EVERY ENTRY ABOVE. The ✓ marks
		// further up mean a value was read out of `SWEP.NZPaPName` in workshop pack 3116673254.
		// These 29 packs carry NO such field — checked across all 255 of their lua files, for
		// `NZPaPName`, `PaPName` and three other spellings: zero hits. That field only exists in
		// packs authored FOR nZombies, and these are plain TFA weapon packs with no awareness of
		// the gamemode at all. So there was nothing to inherit and nothing to look up.
		//
		// ⚠️ THE USER CHOSE EVERY ONE from four suggestions each, plus their own write-in where
		// none fit — "Can Opener", "Granola", "Typewriter", "Chinamaxing" and "Top Magazine" are
		// theirs. Checked before insertion: 78 ids, all matching the ported fleet exactly, no
		// duplicate names among themselves and no collision with the 429 entries above.
		//
		// ⚠️ `nz_ww2_mg42` IS ABSENT ON PURPOSE. It was the one name collision in the batch and
		// the existing weapon is a complete earlier TFA port, so it kept its entry and its port.

		// Assault Rifles
		["nz_cold_war_ndr_rifle"]    = "Ash Column",
		["nz_cold_war_sig510"]       = "Grindstone",
		["nz_coldwar_armalite_ar10"] = "Black Aspen",
		["nz_coldwar_armalite_ar18"] = "Little Brother",
		["nz_ins2_fn_fnc"]           = "Breakwater",
		["nz_verdun_bar1918"]        = "Doughboy",
		["nz_ww1_huot_rifle"]        = "Frankenstitch",
		["nz_ww2_coltmonitor"]       = "Lawman",
		["nz_ww2_ke7_renewal"]       = "Hornet's Nest",
		["nz_ww2_mlg_stg44"]         = "Stormcradle",

		// Battle Rifles
		["nz_ww2_g41"]            = "Gaswork",
		["nz_ww2_m1_carbine_mlg"] = "Jump Boot",
		["nz_ww2_mod39"]          = "Nordwind",
		["nz_ww2_type4_renewal"]  = "Chrysanthemum",

		// Submachine Guns
		["nz_coldwar_m12"]                 = "Carabinieri",
		["nz_coldwar_mat49"]               = "French Folder",
		["nz_coldwar_mpi81"]               = "Checkpoint",
		["nz_coldwar_type79"]              = "Typewriter",
		["nz_coldwar_walther_mpl_renewal"] = "Police Issue",
		["nz_ww2_43m"]                     = "Danuvia",
		["nz_ww2_armaguerra43"]            = "Cremona",
		["nz_ww2_erma_mp36"]               = "Erma's Draft",
		["nz_ww2_fnab43"]                  = "FNAF-87",
		["nz_ww2_nambu_type2"]             = "Takedown",
		["nz_ww2_nambu_type2a"]            = "Nagoya Two",
		["nz_ww2_nambu_type2a_1934"]       = "Showa Nine",
		["nz_ww2_oritamp41"]               = "Carpathian",
		["nz_ww2_ppk42"]                   = "Peter's Pattern",
		["nz_ww2_ppsh2"]                   = "Shpagin's Second",
		["nz_ww2_tokyo_1927"]              = "Bergmann Copy",

		// Light Machine Guns
		["nz_cold_war_american180"] = "Paint Sprayer",
		["nz_ww2_brenmk1"]          = "Top Magazine",
		["nz_ww2_brenmk2"]          = "Austerity",
		["nz_ww2_fnmodeld"]         = "Herstal Heavy",
		["nz_ww2_wz1928_renewal"]   = "September Campaign",

		// Shotguns
		["nz_coldwar_spas15"] = "Can Opener",

		// Sniper Rifles
		["nz_isonzo_carcano_cav"]            = "Granola",
		["nz_isonzo_mannlicher_schonauer"]   = "Rotary Spool",
		["nz_preww1_trapdoor1873"]           = "Buffalo",
		["nz_remake_hanyang88"]              = "Chinamaxing",
		["nz_tannenberg_berdan2"]            = "Cossack",
		["nz_tannenberg_m93"]                = "Oviedo",
		["nz_tannenberg_mannlicher1895"]     = "Straight Pull",
		["nz_tannenberg_type30_remake"]      = "Meiji Bolt",
		["nz_tannenberg_type38_remake"]      = "Rattling Bolt",
		["nz_tannenberg_vetterli_m1870"]     = "Rimfire Relic",
		["nz_verdun_berthier_0715"]          = "Poilu",
		["nz_verdun_g88_remake"]             = "Committee",
		["nz_verdun_pattern1914_remastered"] = "Pattern Fourteen",
		["nz_ww1_murata_type_18"]            = "Black Powder",
		["nz_ww2_grb39_nekko"]               = "Cup Launcher",
		["nz_ww2_pbz39"]                     = "Panzerbuchse",
		["nz_ww2_solothurn18_100"]           = "Solothurn",
		["nz_ww2_solothurn18_1000"]          = "Long Thousand",

		// Handguns
		["nz_isonzo_dreyse1907"]       = "Needlepoint",
		["nz_red_carpet_silver_ghost"] = "Apparition",
		["nz_verdun_fn1900_revisited"] = "Pocket Ghost",
		["nz_ww1_beretta_m1915"]       = "Stiletto",
		["nz_ww1_mauser1914_remake"]   = "Sidecar",
		["nz_ww1_steyr1907"]           = "Vienna Coil",
		["nz_ww2_baltiets"]            = "Leningrad",
		["nz_ww2_beretta_m34"]         = "Desert Rat",
		["nz_ww2_fn1910"]              = "Liege Compact",
		["nz_ww2_frommer37"]           = "Budapest",
		["nz_ww2_hamada_type1"]        = "Paper Lantern",
		["nz_ww2_hamada_type2"]        = "Rough Cut",
		["nz_ww2_korovin"]             = "Commissar",
		["nz_ww2_l35_renewal"]         = "Frozen Bolt",

		// Revolvers
		["nz_dibis_colt_heritage"]     = "Hand-Me-Down",
		["nz_isonzo_gasserm1870"]      = "Montenegrin",
		["nz_red_carpet_taurus_judge"] = "Court Adjourned",
		["nz_tannenberg_gasser1898"]   = "Chamberlain",
		["nz_ww1_colt_saa"]            = "Dusty Trail",
		["nz_ww1_lancaster"]           = "Howdah",
		["nz_ww1_m1889"]               = "Swing Out",
		["nz_ww1_ww2_type26"]          = "Meiji Wheel",

		// ── INSURGENCY ─────────────────────────────────────────────
		// ⚠️ Chosen by the user in `Docs/pap/pap_names_insurgency.html` — four suggestions per
		// weapon plus a free field. Six are the user's own text rather than one of the four.

		// Handguns
		["nz_cz75b"]                     = "Koucký's Wonder",
		["nz_deagle"]                    = "Birdwatcher",
		["nz_ins2_pist_fnp45"]           = "Belgian Waffle Iron",
		["nz_glock17"]                   = "Plastic Fantastic",
		["nz_beretta"]                   = "M9NE",
		["nz_mk23"]                      = "Heckler's Overkill",
		["nz_mp443"]                     = "Yarygin's Answer",
		["nz_ins2_pist_ots33"]           = "0D355EY",
		["nz_pm"]                        = "Eight Ball",
		["nz_sw659"]                     = "SW-956",
		["nz_g18"]                       = "EKO Cobra",
		["nz_usp_match"]                 = "U.S. Pain",
		["nz_ins2_pist_p99"]             = "Ninety-Nine Problems",

		// Revolvers
		["nz_hm500"]                     = "Heavy Metal",
		["nz_thanez_cobra"]              = "Ophiophagus",
		["nz_38rev"]                     = "Six for Sorrow",
		["nz_ins2_revolver_mr96"]        = "Mortal Remains",
		["nz_mateba"]                    = "Batou's Sidearm",

		// Submachine Guns
		["nz_ins2_warface_bt_mp9"]       = "Pocket Blizzard",
		["nz_m4_9mm"]                    = "RO-635",
		["nz_mp5k"]                      = "Case of Bees",
		["nz_mp5kpdw"]                   = "Glove Compartment",
		["nz_mp5kpdw_hardline"]          = "Sterling Pattern",
		["nz_ins_pm9"]                   = "Sewing Machine",
		["nz_sr2_veresk"]                = "Gyurza Load",
		["nz_ins2_sr2m_veresk"]          = "Lubyanka Special",
		["nz_ump45"]                     = "Slow Clap",

		// Assault Rifles
		["nz_acrc"]                      = "Aggressive Corpse Removal",
		["nz_aek971"]                    = "Kovrov's Counterweight",
		["nz_aek"]                       = "EEK!",
		["nz_ak400"]                     = "Ack-CH00",
		["nz_ak74"]                      = "Tumbler",
		["nz_akm"]                       = "Kalash & Carry",
		["nz_akm_saktac"]                = "Rail Estate",
		["nz_aks74u"]                    = "Short Fuse",
		["nz_abakan"]                    = "Nikonov's Cable",
		["nz_nb_ins_aug_a3"]             = "Absolutely Unnecessary Gore",
		["nz_nb_ins_c7e"]                = "Seven, Eh",
		["nz_fn_2000"]                   = "Y2K",
		["nz_ins2_fn_fal"]               = "Freefall",
		["nz_g36_cursed"]                = "Heat Death",
		["nz_galil_ace"]                 = "Ace High",
		["nz_galil_sar"]                 = "Happy Hour",
		["nz_k2"]                        = "K Squared",
		["nz_zm_lr300"]                  = "Fun Size",
		["nz_m16a3"]                     = "Father of Monsters",
		["nz_mk18"]                      = "Room Broom",
		["nz_moe_akm"]                   = "Method of Entry",
		["nz_l85a2"]                     = "Enfield's Last Words",
		["nz_nb_ins_cryscar"]            = "Surgical Cauterisation",
		["nz_warface_t97"]               = "Norinco Export",
		["nz_type81"]                    = "Border War Issue",

		// Battle Rifles
		["nz_mini14"]                    = "Ranch Rifle",
		["nz_nb_ins_m1asocom"]           = "No Issues",
		["nz_mk12_tfa"]                  = "Reach Out",
		["nz_sks"]                       = "Sudden Kinetic Sedation",
		["nz_sr25_eft"]                  = "Stoner's Last Call",

		// Shotguns
		["nz_izh43_sawnoff"]             = "Izhevsk Double",
		["nz_m1014"]                     = "Argo",
		["nz_m500"]                      = "Persuader",
		["nz_remington_m870"]            = "Ilion Forge",
		["nz_toz"]                       = "Tula Roulette",
		["nz_inss2_toz_194m"]            = "Cell Block M",
		["nz_br99"]                      = "Best Regards",

		// Light Machine Guns
		["nz_m249"]                      = "Belt Fed Optimism",
		["nz_ins2_hk_mg36"]              = "Beta C",
		["nz_rpk"]                       = "Repeated Percussive Kindness",
		["nz_rpk12"]                     = "Ratnik Support",

		// Sniper Rifles
		["nz_ins2_warface_ax308"]        = "4X-308",
		["nz_ins2_warface_cdxmc_kraken"] = "Pontoppidan's Beast",
		["nz_dragunov_svu"]              = "Ukorochennaya",

		// ══ COD: ONLINE (XGG), ported 2026-09-18 ════════════════════════════════════════
		//
		// ⚠️ NAMED OFF THE SKIN, NOT THE BASE GUN. Six M1887s, five AACs and four AK117s share
		// a receiver apiece, so naming them for the weapon would have produced six identical
		// entries -- the same collision their stats had before `rank_pass`. Chosen from
		// `Docs/pap/pap_names_codol.html`.

		// ── Assault Rifles ────────────────────────────────────────────────
		["nz_codol_aacs"] = "Whisper Trade",
		["nz_codol_aacs2"] = "GHILL-E",
		["nz_codol_aacs3"] = "AAC-99 Apogee",
		["nz_codol_aacxb"] = "Constellation",
		["nz_codol_aacs4"] = "The Old Faces",
		["nz_codol_ak117"] = "Kalashni-Chrome",
		["nz_codol_ak117zjzh"] = "Ejection Seat",
		["nz_codol_ak117jhs"] = "Euclid's Regret",
		["nz_codol_ak117jh"] = "Chromatic Aberration",
		["nz_codol_ak47dh"] = "The Toxicologist",
		["nz_codol_ak47fs"] = "Geiger's Lullaby",
		["nz_codol_ak47"] = "Glacier's Teeth",
		["nz_codol_an94"] = "Abakan",
		["nz_codol_an94ll"] = "Basilisk",
		["nz_codol_an94s"] = "Brimstone Stride",
		["nz_codol_f2000s"] = "Backpacker",
		["nz_codol_m4a1"] = "Four Alpha",
		["nz_codol_m4jh"] = "M4-ISO",
		["nz_codol_mk17jh"] = "MK-XVII",
		["nz_codol_ttzl"] = "Elder Pole",
		["nz_codol_type95s"] = "Norinco's Pride",
		["nz_codol_r5rgp"] = "Aristocrat",
		["nz_codol_acrjj"] = "Bushmaster",
		["nz_codol_x51"] = "Roswell",

		// ── Battle Rifles ─────────────────────────────────────────────────
		["nz_codol_mr23dcfb"] = "Faraday's Cage",
		["nz_codol_mr23jh"] = "Pythagoras",

		// ── Submachine Guns ───────────────────────────────────────────────
		["nz_codol_uzi"] = "Little Dragon",
		["nz_codol_smg5sss"] = "Kaleidoscope",
		["nz_codol_smg5s2"] = "Heckler's Heirloom",
		["nz_codol_vector"] = "Super V",

		// ── Shotguns ──────────────────────────────────────────────────────
		["nz_codol_aa12yh"] = "Mutagen",
		["nz_codol_m1887"] = "Cowboy's Last Word",
		["nz_codol_m1887cy"] = "Elsewhere",
		["nz_codol_m18873"] = "Aerosol",
		["nz_codol_m1887qq"] = "Cache Cleared",
		["nz_codol_m1887zqpk"] = "Pressure Valve",
		["nz_codol_m18872"] = "Totem Breaker",

		// ── Light Machine Guns ────────────────────────────────────────────
		["nz_codol_m4lmg"] = "Overthinker",
		["nz_codol_mg43"] = "Gabriel's Note",
		["nz_codol_rpdyxw"] = "Top Deck",
		["nz_codol_sa80"] = "Queen_Elizabeth",

		// ── Handguns ──────────────────────────────────────────────────────
		["nz_codol_deagles"] = "Sky Father",
		["nz_codol_fa1911"] = "Old Slabsides",

		// ── Revolvers ─────────────────────────────────────────────────────
		["nz_codol_magnan"] = "The Punchline",

		["nz_k98"]                       = "Kurz and Curt",
		["nz_m40a5_tfa"]                 = "Quantico Handbuilt",
		["nz_sv98_ins"]                  = "Record-1",

		// ── MODERN WARFARE 2019 / II / III ───────────────────────────────
		//
		// ⚠️ CHOSEN BY THE USER, one per gun, from `Docs/pap/pap_names_mw.html` (2026-09-30): five suggestions each, none
		// already a name in this table. Four are the user's own: Kill.MP4, Grandfather, Beltov and Mediatix. MW Base's
		// guns carry no `NZPaPName`, so there was nothing to read out of the source.

		// ── Modern Warfare 2019 · Assault Rifles ──
		["nz_mw19_ak47"] = "Banana Republic",
		["nz_mw19_an94"] = "Hyperburst Heresy",
		["nz_mw19_asval"] = "VAL-HALLA",
		["nz_mw19_cr56amax"] = "AMAX-IMUM",
		["nz_mw19_fnscar17"] = "Heavy Heart",
		["nz_mw19_fr556"] = "Trumpet Voluntary",
		["nz_mw19_g3a3"] = "Delayed Gratification",
		["nz_mw19_grau556"] = "Grey Matter",
		["nz_mw19_kilo141"] = "Kilo Watt",
		["nz_mw19_m13"] = "Baker's Dozen",
		["nz_mw19_m4a1"] = "M4A1-PHA",
		["nz_mw19_oden"] = "Allfather",
		["nz_mw19_ram7"] = "Random Access Mayhem",

		// ── Modern Warfare 2019 · Battle Rifles ──
		["nz_mw19_ebr14"] = "Sage Advice",
		["nz_mw19_fal"] = "FAL-SE",
		["nz_mw19_sks"] = "Tula's Pride",

		// ── Modern Warfare 2019 · Submachine Guns ──
		["nz_mw19_aug"] = "Steyr Crazy",
		["nz_mw19_cx9"] = "Sting Operation",
		["nz_mw19_fennec"] = "Big Ears",
		["nz_mw19_iso"] = "ISO-lation",
		["nz_mw19_mp5"] = "Kill.MP4",
		["nz_mw19_mp7"] = "Seven Deadly Sins",
		["nz_mw19_p90"] = "Chevron Seven",
		["nz_mw19_pp19bizon"] = "Helical Hymn",
		["nz_mw19_striker45"] = "Lucky Strike",
		["nz_mw19_uzi"] = "Micro Management",

		// ── Modern Warfare 2019 · Light Machine Guns ──
		["nz_mw19_bruenmk9"] = "Ninth Wave",
		["nz_mw19_finnlmg"] = "Sauna Session",
		["nz_mw19_holger26"] = "Sleeping Giant",
		["nz_mw19_m91"] = "Iron Rain",
		["nz_mw19_mg34"] = "Grandfather",
		["nz_mw19_minigun"] = "Maxigun",
		["nz_mw19_pkm"] = "Beltov",
		["nz_mw19_raalmg"] = "RAAL-ly Big",
		["nz_mw19_sa87"] = "God Save the Clip",

		// ── Modern Warfare 2019 · Sniper Rifles ──
		["nz_mw19_ax50"] = "Chopping Block",
		["nz_mw19_dragunov"] = "Dragon's Tongue",
		["nz_mw19_hdr"] = "High Dynamic Range",
		["nz_mw19_kar98k"] = "Bolt from the Blue",
		["nz_mw19_mk2carbine"] = "Buckaroo",
		["nz_mw19_rytecamr"] = "Materiel Girl",
		["nz_mw19_spr"] = "Sporting Chance",

		// ── Modern Warfare 2019 · Shotguns ──
		["nz_mw19_725"] = "Silver Pigeon",
		["nz_mw19_jak12"] = "Jack of All Trades",
		["nz_mw19_model680"] = "Slide Rule",
		["nz_mw19_origin12"] = "Big Bang Theory",
		["nz_mw19_r90"] = "Double Tap Dance",
		["nz_mw19_vlkrogue"] = "Big Bad Wolf",

		// ── Modern Warfare 2019 · Handguns ──
		["nz_mw19_50gs"] = "Midas Touch",
		["nz_mw19_m19"] = "Tupperware Tyrant",
		["nz_mw19_m1911"] = "Grandpa's Wisdom",
		["nz_mw19_renetti"] = "Bella Ciao",
		["nz_mw19_sykov"] = "Pocket Politburo",
		["nz_mw19_x16"] = "Sweet Sixteen",

		// ── Modern Warfare 2019 · Revolvers ──
		["nz_mw19_357"] = "Wheel of Fortune",

		// ── Modern Warfare II · Assault Rifles ──
		["nz_mw22_chimera"] = "Myth-Take",
		["nz_mw22_cronensquall"] = "Cronen's Tempest",
		["nz_mw22_isohemlock"] = "Socratic Method",
		["nz_mw22_kastov545"] = "Siberian Express",
		["nz_mw22_kastov762"] = "Old Guard",
		["nz_mw22_kastov74u"] = "Krinkov Krunch",
		["nz_mw22_lachman762"] = "Laughing Man",
		["nz_mw22_lachman556"] = "Punchline",
		["nz_mw22_m13b"] = "Broken Mirror",
		["nz_mw22_m16"] = "Jungle Standard",
		["nz_mw22_m4"] = "Fourth Horseman",
		["nz_mw22_stb556"] = "Stab Wound",
		["nz_mw22_taq56"] = "Tack Sharp",
		["nz_mw22_taqsc"] = "Scorched Earth",
		["nz_mw22_taqv"] = "Veni Vidi Vici",
		["nz_mw22_tempusrazorback"] = "Occam's Razorback",
		["nz_mw22_tr76geist"] = "Zeitgeist",

		// ── Modern Warfare II · Battle Rifles ──
		["nz_mw22_ebr14"] = "Enhanced Beyond Reason",
		["nz_mw22_ftacrecon"] = "Reconquista",
		["nz_mw22_tempustorrent"] = "Floodgate",

		// ── Modern Warfare II · Submachine Guns ──
		["nz_mw22_basp"] = "Bass Drop",
		["nz_mw22_fennec45"] = "Sly Fox",
		["nz_mw22_fsshurricane"] = "Storm Surge",
		["nz_mw22_iso45"] = "Late Shift",
		["nz_mw22_lachmannshroud"] = "Shroud of Turin",
		["nz_mw22_lachmannsub"] = "Subtext",
		["nz_mw22_minibak"] = "Snack Size",
		["nz_mw22_mx9"] = "Mixtape",
		["nz_mw22_pdsw528"] = "Paper Shredder",
		["nz_mw22_vaznev9k"] = "Samovar Steam",

		// ── Modern Warfare II · Light Machine Guns ──
		["nz_mw22_556icarus"] = "Daedalus",
		["nz_mw22_hcr56"] = "High Caliber Requiem",
		["nz_mw22_rapph"] = "Rap Battle",
		["nz_mw22_rpk"] = "Big Brother AK",
		["nz_mw22_sakinmg38"] = "Anatolian Thunder",

		// ── Modern Warfare II · Sniper Rifles ──
		["nz_mw22_fjximperium"] = "Pax Romana",
		["nz_mw22_lockwoodmk2"] = "Tin Star",
		["nz_mw22_mcpr300"] = "Modular Menace",
		["nz_mw22_signal50"] = "Mixed Signals",
		["nz_mw22_victusxmr"] = "XMR-ay Vision",

		// ── Modern Warfare II · Shotguns ──
		["nz_mw22_bryson800"] = "Country Gentleman",
		["nz_mw22_bryson890"] = "Mariner's Friend",
		["nz_mw22_expedite12"] = "Express Delivery",
		["nz_mw22_kvbroadside"] = "Cannonade",
		["nz_mw22_lockwood300"] = "Gentleman's Agreement",
		["nz_mw22_mxguardian"] = "Guardian Angel",

		// ── Modern Warfare II · Handguns ──
		["nz_mw22_50gs"] = "Big Bird",
		["nz_mw22_9mmdaemon"] = "Demon Core",
		["nz_mw22_ftacsiege"] = "Trebuchet",
		["nz_mw22_gsmagna"] = "Magna Fortuna",
		["nz_mw22_p890"] = "Neuhausen Nocturne",
		["nz_mw22_x12"] = "X Factor",
		["nz_mw22_x13auto"] = "Autopilot",
		["nz_mw22_x13se"] = "SE-nsational",

		// ── Modern Warfare II · Revolvers ──
		["nz_mw22_basilisk"] = "Serpent King",

		// ── Modern Warfare III · Assault Rifles ──
		["nz_mw23_bal27"] = "Balaclava",
		["nz_mw23_basb"] = "B-Side",
		["nz_mw23_bp50mwiii"] = "Boiling Point",
		["nz_mw23_chimera"] = "Bellerophon's Quarry",
		["nz_mw23_dg56"] = "Good Dog",
		["nz_mw23_dtir3006"] = "Deer Season",
		["nz_mw23_fr556"] = "Trois Coups",
		["nz_mw23_fravancer"] = "L'Avant-Garde",
		["nz_mw23_m13b"] = "Crossed Fingers",
		["nz_mw23_m13c"] = "Triskaidekaphobia",
		["nz_mw23_mcw"] = "Adaptive Arts",
		["nz_mw23_mtz556"] = "Mortise and Tenon",
		["nz_mw23_mtz762"] = "Iron Tiger",
		["nz_mw23_ram7"] = "Downloaded RAM",
		["nz_mw23_sidewinder"] = "Rattlesnake",
		["nz_mw23_soasubverter"] = "Soul Subverter",
		["nz_mw23_stg44mw3"] = "Sturm und Drang",
		["nz_mw23_superi46"] = "Superlative",

		// ── Modern Warfare III · Battle Rifles ──
		["nz_mw23_kvdenforcer"] = "Due Process",
		["nz_mw23_mcw68"] = "Mediatix",
		["nz_mw23_mtzinterceptor"] = "Midair Denial",

		// ── Modern Warfare III · Submachine Guns ──
		["nz_mw23_amr9"] = "Amour Fou",
		["nz_mw23_basp"] = "Basso Profondo",
		["nz_mw23_fjxhorus"] = "Ra's Heir",
		["nz_mw23_rival9"] = "Nemesis Nine",
		["nz_mw23_striker"] = "Third Strike",
		["nz_mw23_wspswarm"] = "Hive Mind",
		["nz_mw23_wsp9"] = "Buzz Kill",

		// ── Modern Warfare III · Light Machine Guns ──
		["nz_mw23_kastovlsw"] = "Babushka's Revenge",
		["nz_mw23_pulemyotb"] = "Red Barrage",
		["nz_mw23_taqevolvere"] = "Natural Selection",

		// ── Modern Warfare III · Sniper Rifles ──
		["nz_mw23_kar98kmwiii"] = "Kurz und Gut",
		["nz_mw23_kattamr"] = "Apex Predator",
		["nz_mw23_mors"] = "Mors Code",
		["nz_mw23_xrkstalker"] = "Tall Grass",

		// ── Modern Warfare III · Shotguns ──
		["nz_mw23_reclaimer18"] = "Lost and Found",

		// ── Modern Warfare III · Handguns ──
		["nz_mw23_tyr"] = "Tiw's Day",
		["nz_mw23_wspstinger"] = "Barbed Wire",

		// ── BLACK OPS COLD WAR / BLACK OPS 6 ─────────────────────────────
		//
		// ⚠️ CHOSEN BY THE USER, one per gun, from `Docs/pap/pap_names_bo.html` (2026-09-30): five suggestions each, none
		// already a name in this table. One is the user's own: Na-Mord (the BO6 Ladra). The DMR 14's pick came a little
		// later, the same day. MW Base's guns carry no `NZPaPName`, so there was nothing to read out of the source.

		// ── Black Ops Cold War · Assault Rifles ──
		["nz_bocw_ak47"] = "Comrade Unreasonable",
		["nz_bocw_aug"] = "Augmented Reality",
		["nz_bocw_c58"] = "Pilsner Punch",
		["nz_bocw_carv2"] = "Carve Diem",
		["nz_bocw_em2"] = "Stiff Upper Lip",
		["nz_bocw_fara83"] = "Pampas Stampede",
		["nz_bocw_ffar1"] = "FFAR Cry",
		["nz_bocw_grav"] = "Newton's Apple",
		["nz_bocw_groza"] = "Thunderstruck",
		["nz_bocw_krig6"] = "ABBA-ttoir",
		["nz_bocw_m16"] = "Sixteen Tons",
		["nz_bocw_m16a1"] = "A1 Sauce",
		["nz_bocw_qbz83"] = "Jade Emperor",
		["nz_bocw_vargo52"] = "Embargo",
		["nz_bocw_xm4"] = "Exterminator IV",

		// ── Black Ops Cold War · Battle Rifles ──
		["nz_bocw_dmr14"] = "Fortnight Fury",
		["nz_bocw_type63"] = "Type-O Negative",

		// ── Black Ops Cold War · Submachine Guns ──
		["nz_bocw_ak74u"] = "Kremlin Keychain",
		["nz_bocw_bullfrog"] = "Croak Signal",
		["nz_bocw_ksp45"] = "Midnight Sun",
		["nz_bocw_lapa"] = "LAPA-palooza",
		["nz_bocw_lc10"] = "Elsie",
		["nz_bocw_mac10"] = "Mac and Cheese",
		["nz_bocw_milano821"] = "Moda Mortale",
		["nz_bocw_mp5"] = "High Five",
		["nz_bocw_ots9"] = "Tula Tempest",
		["nz_bocw_ppsh41"] = "Balalaika Serenade",
		["nz_bocw_tec9"] = "Tech Support",
		["nz_bocw_ugr"] = "Ugly Truth",

		// ── Black Ops Cold War · Light Machine Guns ──
		["nz_bocw_m60"] = "Hogzilla",
		["nz_bocw_mg82"] = "Brass Mountain",
		["nz_bocw_rpd"] = "Red Pandemonium",
		["nz_bocw_stoner63"] = "Sticks and Stoners",

		// ── Black Ops Cold War · Sniper Rifles ──
		["nz_bocw_lw3tundra"] = "Cold Snap",
		["nz_bocw_m82"] = "Recoil Revelation",
		["nz_bocw_pelington703"] = "Hunter's Moon",
		["nz_bocw_swissk31"] = "Cuckoo Clock",
		["nz_bocw_zrg20mm"] = "Elephant in the Room",

		// ── Black Ops Cold War · Shotguns ──
		["nz_bocw_410ironhide"] = "Iron Lung Buster",
		["nz_bocw_gallosa12"] = "Cock-a-Doodle-Doom",
		["nz_bocw_hauer77"] = "Power Hauer",
		["nz_bocw_streetsweeper"] = "Broom Service",

		// ── Black Ops Cold War · Handguns ──
		["nz_bocw_1911"] = "Uncle Sam's Handshake",
		["nz_bocw_amp63"] = "Amped Up",
		["nz_bocw_diamatti"] = "Tiramisu Tempest",
		["nz_bocw_marshal"] = "Sheriff's Verdict",

		// ── Black Ops Cold War · Revolvers ──
		["nz_bocw_magnum"] = "Six-Shot Sonata",

		// ── Black Ops 6 · Assault Rifles ──
		["nz_bo6_aek973"] = "Kovrov Comet",
		["nz_bo6_ak74"] = "Perestroika Punch",
		["nz_bo6_ames85"] = "High Ames",
		["nz_bo6_asval"] = "Library Card",
		["nz_bo6_cypher091"] = "Null and Void",
		["nz_bo6_ffar"] = "FFAR-Reaching",
		["nz_bo6_goblinmk2"] = "Hobgoblin",
		["nz_bo6_gpr91"] = "Recalculating",
		["nz_bo6_krigc"] = "C for Carnage",
		["nz_bo6_swat556"] = "Door Kicker",
		["nz_bo6_xm4"] = "X-Filed",

		// ── Black Ops 6 · Battle Rifles ──
		["nz_bo6_tr2"] = "Tour de Force",

		// ── Black Ops 6 · Submachine Guns ──
		["nz_bo6_c9"] = "Top Dog",
		["nz_bo6_jackalpdw"] = "Anubis",
		["nz_bo6_kompakt92"] = "Pocket Kaiser",
		["nz_bo6_ksv"] = "Keep Shooting Victor",
		["nz_bo6_ladra"] = "Na-Mord",
		["nz_bo6_lc10"] = "Decimator",
		["nz_bo6_pp919"] = "Emergency Call",
		["nz_bo6_ppsh41"] = "Drum Solo",
		["nz_bo6_saug"] = "Sauce Boss",

		// ── Black Ops 6 · Light Machine Guns ──
		["nz_bo6_feng82"] = "Fengtastic",
		["nz_bo6_gpmg7"] = "General Purpose Mayhem",
		["nz_bo6_pml556"] = "Pure Mean Lead",
		["nz_bo6_pu21"] = "Blackjack",

		// ── Black Ops 6 · Sniper Rifles ──
		["nz_bo6_essexmodel07"] = "Model Citizen",
		["nz_bo6_lr762"] = "Last Rites",
		["nz_bo6_lw3a1frostline"] = "Frost Giant",

		// ── Black Ops 6 · Shotguns ──
		["nz_bo6_asg89"] = "Class of '89",
		["nz_bo6_maelstorm"] = "Kraken's Maw",
		["nz_bo6_marinesp"] = "Semper Fire",
		["nz_bo6_olympia"] = "Titanomachy",

		// ── Black Ops 6 · Handguns ──
		["nz_bo6_9mmpm"] = "Nine to Five",
		["nz_bo6_grekhova"] = "Sinister Minister",
		["nz_bo6_gs45"] = "Grand Slam",
		["nz_bo6_stryder22"] = "Catch-22",

		// ── Black Ops 6 · Revolvers ──
		["nz_bo6_gravemark357"] = "Rest in Pieces",

		// ── VANGUARD ──────────────────────────────────────────────────────
		//
		// ⚠️ CHOSEN BY THE USER, one per gun, from `Docs/pap/pap_names_vg.html` (2026-09-30), picked while the Vanguard
		// batch was still porting: five suggestions each, none already a name in this table. One is the user's own:
		// Cholesterol (the Grease Gun). MW Base's guns carry no `NZPaPName`, so there was nothing to read out of the source.

		// ── Vanguard · Assault Rifles ──
		["nz_vg_ak47"] = "Tula Dawn",
		["nz_vg_as44"] = "Unfinished Symphony",
		["nz_vg_automaton"] = "Tin Man",
		["nz_vg_avs36"] = "Avalanche",
		["nz_vg_bar"] = "Bar Fight",
		["nz_vg_bp50"] = "Future Tense",
		["nz_vg_coopercarbine"] = "Coop de Grâce",
		["nz_vg_ex1"] = "Ex Nihilo",
		["nz_vg_itraburst"] = "Burst of Genius",
		["nz_vg_kgm40"] = "Forty Winks",
		["nz_vg_nikitaavt"] = "La Femme Nikita",
		["nz_vg_nz41"] = "Kiwi Kicker",
		["nz_vg_stg44"] = "First of the Storm",
		["nz_vg_vargos"] = "S for Salvo",
		["nz_vg_volkssturmgewehr"] = "Makeshift Miracle",

		// ── Vanguard · Battle Rifles ──
		["nz_vg_g43"] = "G-Force",
		["nz_vg_m1garand"] = "Ping!",
		["nz_vg_m1916"] = "Doughboy's Dream",
		["nz_vg_m1a1carbine"] = "Silk Canopy",
		["nz_vg_svt40"] = "Sveta",
		["nz_vg_type5"] = "Paper Crane",

		// ── Vanguard · Submachine Guns ──
		["nz_vg_armaguerra43"] = "Pasta La Vista",
		["nz_vg_greasegun"] = "Cholesterol",
		["nz_vg_h4blixen"] = "Reindeer Games",
		["nz_vg_m1928"] = "Speakeasy",
		["nz_vg_marco5"] = "Marco Polo",
		["nz_vg_mp40"] = "Stamp Collector",
		["nz_vg_owengun"] = "Kangaroo Court",
		["nz_vg_ppsh41"] = "Kalinka",
		["nz_vg_ra225"] = "Eye of Ra",
		["nz_vg_sten"] = "Stench Gun",
		["nz_vg_type100"] = "Centurion",
		["nz_vg_welgun"] = "Wel Done",

		// ── Vanguard · Light Machine Guns ──
		["nz_vg_bren"] = "Bren and Butter",
		["nz_vg_deathmachine"] = "Grim Machinery",
		["nz_vg_dp27"] = "Dinner Plate",
		["nz_vg_lienna57"] = "Liege Lord",
		["nz_vg_mg42"] = "Zipper",
		["nz_vg_nambu99"] = "Origami Fury",
		["nz_vg_type11"] = "Hopper Popper",
		["nz_vg_ugm8"] = "Crazy Eights",
		["nz_vg_whitley"] = "Whit's End",

		// ── Vanguard · Sniper Rifles ──
		["nz_vg_3linerifle"] = "Poet's Rifle",
		["nz_vg_gorenkoantitankrifle"] = "Iron Coffin",
		["nz_vg_kar98k"] = "Karma",
		["nz_vg_leeenfield"] = "Smelly",
		["nz_vg_m1903"] = "Ought-Three",
		["nz_vg_type99"] = "Ninety-Nine Cranes",

		// ── Vanguard · Shotguns ──
		["nz_vg_combatshotgun"] = "Trench Coat",
		["nz_vg_doublebarrel"] = "Double Down",
		["nz_vg_einhornrevolving"] = "Carousel",
		["nz_vg_graceyauto"] = "Grace Period",

		// ── Vanguard · Handguns ──
		["nz_vg_1911"] = "Colt Comfort",
		["nz_vg_9mmsap"] = "Maple Tap",
		["nz_vg_klauser"] = "Klaustrophobia",
		["nz_vg_machinepistol"] = "Broomhandle Ballet",
		["nz_vg_ratt"] = "Rat-a-Tat",

		// ── Vanguard · Revolvers ──
		["nz_vg_topbreak"] = "Break a Leg",
		["nz_vg_valoisrevolver"] = "Royal Flush",

		// ── BLACK OPS 7 ───────────────────────────────────────────────────
		//
		// ⚠️ CHOSEN BY THE USER, one per gun, from `Docs/pap/pap_names_bo7.html` (2026-09-30): five suggestions each,
		// none already a name in this table. MW Base's guns carry no `NZPaPName`, so there was nothing to read out of the
		// source.

		// ── Black Ops 7 · Assault Rifles ──
		["nz_bo7_ak27"] = "The 27 Club",
		["nz_bo7_krs762"] = "Kurse Control",
		["nz_bo7_m15mod0"] = "Factory Reset",
		["nz_bo7_m8a1"] = "Burst Case Scenario",
		["nz_bo7_peacekeepermk1"] = "Pax Aetheria",
		["nz_bo7_vxcompact"] = "Small Talk",

		// ── Black Ops 7 · Battle Rifles ──
		["nz_bo7_shadowsk"] = "Skeleton Key",

		// ── Black Ops 7 · Submachine Guns ──
		["nz_bo7_kogot7"] = "Talon Show",

		// ── Black Ops 7 · Handguns ──
		["nz_bo7_1911"] = "Still Got It",
		["nz_bo7_coda9"] = "Da Capo",
		["nz_bo7_jager45"] = "Zombiejäger",
		["nz_bo7_velox57"] = "Velocity Raptor",

		// ── MW CUSTOM ─────────────────────────────────────────────────────
		//
		// ⚠️ CHOSEN BY THE USER, one per gun, from `Docs/pap/pap_names_mwc.html` (2026-09-30): five suggestions each,
		// none already a name in this table. MW Base's guns carry no `NZPaPName`, so there was nothing to read out of the
		// source. Three picks went with their guns, taken out of the pack at the user's word (2026-09-30): the MP-443's
		// "Yarygin's Revenge", the M&P 9 PRO SERIES-C's "Pro Bono" and the B&T MP9's "Chocolatier".

		// ── MW Custom · Assault Rifles ──
		["nz_mwc_ak107"] = "Counterweight",
		["nz_mwc_ak12ironsight"] = "Twelve Angry Men",
		["nz_mwc_ak12prototype"] = "Version Zero",
		["nz_mwc_ak24resistor"] = "Short Circuit",
		["nz_mwc_ak74umwr"] = "Pripyat Pocket",
		["nz_mwc_ak105zenitco"] = "Tacticool",
		["nz_mwc_ak74uqrf"] = "Quick Reaction Farce",
		["nz_mwc_akm"] = "Labs Keycard",
		["nz_mwc_am40"] = "Anno Mortis",
		["nz_mwc_arn18"] = "No Knock",
		["nz_mwc_brn180"] = "Piston Pete",
		["nz_mwc_carbinerifle"] = "Los Santos Special",
		["nz_mwc_coltm4a1"] = "Extract Camper",
		["nz_mwc_ddm4v5"] = "Lion's Den",
		["nz_mwc_dragon"] = "Wyrmfire",
		["nz_mwc_fnscarh"] = "Battle Scarred",
		["nz_mwc_g36cmwr"] = "Hunted",
		["nz_mwc_hkhk416a5"] = "Operator Syndrome",
		["nz_mwc_hkg36"] = "Plastic Surgeon",
		["nz_mwc_hk416a5"] = "Doorstop",
		["nz_mwc_howatype20"] = "Mount Fuji",
		["nz_mwc_izhmashak103"] = "Izhevsk Iron",
		["nz_mwc_kbpvsk94"] = "Library Voice",
		["nz_mwc_lwrcm6ic"] = "M7IC",
		["nz_mwc_mcxshrike"] = "Larder Filler",
		["nz_mwc_mcxspear68mm"] = "Longinus",
		["nz_mwc_pdx300"] = "Stumptown",
		["nz_mwc_qbz191"] = "Red Envelope",
		["nz_mwc_sa805"] = "Loki Strike",
		["nz_mwc_sigmcx300blackout"] = "Total Eclipse",
		["nz_mwc_sigmcxspear68x51"] = "Lancelot",
		["nz_mwc_swordfisha1"] = "Sushi Grade",
		["nz_mwc_vssvintorez"] = "Hush Puppy",
		["nz_mwc_wilsoncombatsbr"] = "Wilson!",
		["nz_mwc_wimmerspergspz"] = "Blitzkrieg Bop",
		["nz_mwc_wm556level3"] = "Extra Life",
		["nz_mwc_xmlar"] = "Hail Mary",

		// ── MW Custom · Battle Rifles ──
		["nz_mwc_dsarmssa58"] = "Fal Guy",

		// ── MW Custom · Submachine Guns ──
		["nz_mwc_btspc9"] = "Deep Space Nine",
		["nz_mwc_hkmp7"] = "Factory Floor",
		["nz_mwc_krissvector"] = "Oh Yeah!",
		["nz_mwc_krissvectorgen1"] = "Kriss Kross",
		["nz_mwc_mp7a1"] = "Seven Dwarfs",
		["nz_mwc_p90police"] = "Crowd Control",
		["nz_mwc_pp28blowback"] = "Gust Front",
		["nz_mwc_sigmpx"] = "Reserve Raider",
		["nz_mwc_sirin9mm"] = "Siren Song",
		["nz_mwc_statichv"] = "High Voltage",

		// ── MW Custom · Sniper Rifles ──
		["nz_mwc_aw50f"] = "Queen's Guard",
		["nz_mwc_model189130"] = "Mosin Around",
		["nz_mwc_oris86"] = "Orison",
		["nz_mwc_pgmhecateii"] = "Hecatomb",
		["nz_mwc_sv98"] = "Cheeki Breeki",
		["nz_mwc_truveloamris20x42"] = "Table Mountain",

		// ── MW Custom · Shotguns ──
		["nz_mwc_benellim4super90"] = "Espresso Shot",
		["nz_mwc_lockwood680"] = "Woodchipper",
		["nz_mwc_m590a1"] = "Moss Boss",
		["nz_mwc_mpsaa12gen1"] = "AAA Rated",
		["nz_mwc_raptr12g"] = "Clever Girl",
		["nz_mwc_sg12"] = "Dirty Dozen",

		// ── MW Custom · Handguns ──
		["nz_mwc_auto9"] = "Prime Directive",
		["nz_mwc_berettasamuraiedge"] = "S.T.A.R.S. Issue",
		["nz_mwc_bsebarryburton"] = "Jill Sandwich",
		["nz_mwc_coltm45a1meusoc"] = "Oorah",
		["nz_mwc_czubcz75sp01"] = "Shadow Puppet",
		["nz_mwc_czubcz75b"] = "Czech Mate",
		["nz_mwc_dcm1911"] = "Doc Martens",
		["nz_mwc_fnfivesevenmk1"] = "Take Five",
		["nz_mwc_fnfiveseven"] = "Eco Round",
		["nz_mwc_fnfnp45"] = "Fun and Games",
		["nz_mwc_hkp30l"] = "Long Story Short",
		["nz_mwc_kbpots33pernach"] = "Pernicious",
		["nz_mwc_mkv"] = "Roman Numeral",
		["nz_mwc_p220"] = "Alpine Assassin",
		["nz_mwc_pl15"] = "Ugly Duckling",
		["nz_mwc_qsz92g"] = "Silk Road",
		["nz_mwc_swmp9proc"] = "Beat Cop",
		["nz_mwc_sr1mp"] = "Gyurza Gaze",
		["nz_mwc_tti2011"] = "Baba Yaga",
		["nz_mwc_ttijw4pitviper"] = "Excommunicado",
		["nz_mwc_waltherp99"] = "Q Branch",
		["nz_mwc_waltherq5matchfs"] = "Quantum of Solace",

		// ── MW Custom · Revolvers ──
		["nz_mwc_coltkingcobra"] = "Cobra Kai",
		["nz_mwc_manurhinmr96"] = "French Twist",
		["nz_mwc_reichsrevolver"] = "Pickelhaube",
		["nz_mwc_swm500"] = "Wrist Breaker",
		["nz_mwc_swmodel500"] = "Recoil Therapy",
		["nz_mwc_taurusragingbull"] = "Matador's Mistake",

		// ── the wonder weapon ────────────────────────────────────────────
		// ⚠️ OURS, NOT FROM ANY SOURCE — the Prisma is this project's own wonder weapon (BuildParts),
		// so there was no SWEP to read a name out of. Named for what it does: every round leaves
		// `resonance` behind, and a carrier's death CASCADES it to the zombies around it, corpse to
		// corpse, until the fuse runs out (PrismaChain). It is also the Black Mesa disaster, which is
		// at home in a gamemode that started life in Garry's Mod.
		["nz_prisma"] = "Resonance Cascade",
	};

	/// <summary>
	/// The packed name for a weapon, or its plain name when there is no entry.
	///
	/// ⛔ THE CALLER DECIDES WHETHER THE GUN IS PACKED. This returns the packed name unconditionally,
	/// because the one call site already holds the level and has to branch on it anyway — an
	/// unpacked M1911 must still read "M1911", not "Mustang".
	/// </summary>
	public static string For( string prefab, string fallback )
	{
		var id = IdOf( prefab );
		if ( id is null ) return fallback;

		// ⛔ THE GUN'S OWN NAME FIRST, THEN THE TABLE. A Kitbash Editor gun is named in its Stats panel, and the
		// name reaches the game as a "pap" key on the gun's manifest entry — the per-weapon field this class's
		// header says there was nowhere to hang, for guns made outside the table. The table still names every
		// ported gun, and a gun in neither keeps its plain name.
		var own = FromManifest( id );
		if ( !string.IsNullOrWhiteSpace( own ) ) return own;

		return ByWeapon.TryGetValue( id, out var name ) ? name : fallback;
	}

	/// <summary>The "pap" key of this gun's manifest entry (WeaponLibrary), or null.</summary>
	static string FromManifest( string id )
		=> WeaponLibrary.Find( $"prefabs/weapons/{id}.prefab" )?.Pap;

	/// <summary>
	/// `prefabs/weapons/nz_galil.prefab` -> `nz_galil`.
	///
	/// ⚠️ TOLERANT OF BOTH SHAPES. `WallBuyCommands` builds full paths while some callers pass a
	/// bare id, and `StartingWeapon` is a full path — so strip a directory and an extension if they
	/// are there and accept the value as-is if they are not.
	/// </summary>
	static string IdOf( string prefab )
	{
		if ( string.IsNullOrWhiteSpace( prefab ) ) return null;

		var id = prefab.Replace( '\\', '/' );
		int slash = id.LastIndexOf( '/' );
		if ( slash >= 0 ) id = id[(slash + 1)..];

		int dot = id.LastIndexOf( '.' );
		if ( dot > 0 ) id = id[..dot];

		return id.Length == 0 ? null : id;
	}

	// ── console ──────────────────────────────────────────────────────────────────────────────

	/// <summary>
	/// `nz_pap_names` — the whole table, plus any weapon prefab with no entry.
	///
	/// ⚠️ IT LISTS THE GAPS, not just the hits. A weapon missing from the table packs to
	/// "GALIL MK2" and looks like the feature simply not applying to that gun, which is very hard to
	/// notice one weapon at a time.
	/// </summary>
	[ConCmd( "nz_pap_names" )]
	public static void NamesCmd()
	{
		Log.Info( $"[nz-papname] {ByWeapon.Count} named weapon(s)" );

		foreach ( var (id, name) in ByWeapon.OrderBy( kv => kv.Key ) )
			Log.Info( $"[nz-papname]   {id,-18} -> {name}" );

		// the guns named by their own manifest entry (the Kitbash Editor's Stats panel)
		foreach ( var e in WeaponLibrary.All.Where( e => !string.IsNullOrWhiteSpace( e.Pap ) ).OrderBy( e => e.Prefab ) )
			Log.Info( $"[nz-papname]   {IdOf( e.Prefab ),-18} -> {e.Pap}   (its manifest entry)" );

		// ⚠️ Read off DISK rather than from a registry, so a prefab added without a name shows up
		// here the moment it exists — WeaponLibrary only lists what a config has wired up.
		var dir = "prefabs/weapons";
		var missing = ResourceLibrary.GetAll<PrefabFile>()
			.Select( f => f.ResourcePath )
			.Where( p => p is not null && p.Contains( dir, StringComparison.OrdinalIgnoreCase ) )
			.Select( IdOf )
			.Where( id => id is not null && !ByWeapon.ContainsKey( id ) && string.IsNullOrWhiteSpace( FromManifest( id ) ) )
			.OrderBy( id => id )
			.ToArray();

		Log.Info( missing.Length == 0
			? "[nz-papname] every weapon prefab has a name"
			: $"[nz-papname] NO NAME: {string.Join( ", ", missing )}" );
	}
}