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.
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 & 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 )}" );
}
}