massfront-playtest / src /factext.js
CREATORJD's picture
Publish MASSFRONT web 1.33.33 (part 3)
3597f5a verified
Raw
History Blame Contribute Delete
38.7 kB
;
;
/* ============================================================================
FACTION VOICE โ€” what each army calls its own hardware, and how it describes it
----------------------------------------------------------------------------
Owner report: "even previews and descriptions are reused per unit, ability
and structure."
That was exactly true, and worse than it sounds. There was no per-unit
description anywhere in the game: TYPES carries a `name` and nothing else,
and every card, tooltip and production entry generated its prose from TEN
category strings (INTEL_ROLE_COPY). Rhino, Goliath and Hornet are three
completely different vehicles and all three read "Durable direct-fire battle
unit". Structures had one shared name and one shared line. The only
per-faction prose in the codebase โ€” FACART.units โ€” was Dossier decoration,
never wired to the roster at all; it reads its names from this file now (see
facUnitName in src/factions.js), so the codex and the build menu cannot call
the same chassis two different things.
So a Brood player built a "Factory" that produced a "Rhino" described as a
durable direct-fire battle unit, in a faction whose entire premise is that it
has no vehicles and no factories.
This file is the overlay. Nova keeps the base names โ€” it is the roster's
native voice โ€” and the other three armies get their own name and their own
sentence for every chassis and every structure they can field.
SECOND PASS โ€” the same defect in the VERB tables. Names and descriptions
were faction-aware; everything the army DOES was not. A Brood "SIEGE" stance
and a Dominion "SIEGE" stance read identically, in an army that has no
machinery at all, and the Commander level-up deck offered a Brood player
"Nano Plating" and "Assembly Protocols". So three more groups live here:
mode:{} the eight stances in MODES (sim.js), keyed by mode index, plus
the key `mine` for the miner's chassis-specific mode 0
classab:{} the three contextual doctrines in CLASS_AB (commander.js)
upgrade:{} the eight Commander level-up cards in UPGRADES (commander.js)
RULES THE CONTENT FOLLOWS, because they are load-bearing:
- `nm` <= 16 characters. The production and build cards are narrow.
STANCES and DOCTRINES are stricter โ€” <= 12 โ€” because they also render on
a hot-slot chip (.hotSlot .hNm) that is 62px wide and ellipsises.
- `ds` <= 88 characters, one sentence, no trailing full stop.
- A stance or upgrade description states the REAL MECHANICAL EFFECT and
NEVER changes the numbers. SIEGE is +75% range and +45% damage in every
army; only the words around it move. A player who cannot trust the
numbers on a stance chip has to test each faction by hand.
- The description states what the thing DOES. A player reads it to decide
whether to build it, so accuracy outranks flavour: a Bulwark has no
weapon, a Constructor has no weapon, a Warden heals. Where the base text
carries a number or a condition (+4 Mass on a โ—† node, build on shore,
on a โœฆ geyser) the faction version keeps that fact.
- No two entries in a faction may be interchangeable sentences. That
interchangeability was the defect.
- The Brood uses NO mechanical vocabulary. Not "factory", "reactor",
"turret", "wall" or "engine" โ€” every structure is an organ and every unit
is a creature. An organic army described in machine words is the same bug
in a different coat. That extends to the verbs: a Brood stance is a
posture of an animal (rooting itself, hunkering, flooding itself, going
silent), never a deployment, an overclock or a protocol. "fire rate"
becomes "strikes faster"; "range" becomes "reach"; "damage" becomes
"harm". The number survives, the machine does not.
============================================================================ */
const FAC_TEXT={
/* TERRAN FRONTLINE COMMAND โ€” the roster's native voice, so it keeps the base
NAMES (Rhino and Goliath are canon; the dispatches use them). What it did
not have was descriptions: the generated fallback gave Rhino, Goliath and
Hornet the same sentence, which is the defect this whole file exists for.
Voice: professional, doctrinal, understated. Hold what you take. */
nova:{
units:{
0:{ds:'Cheap line rifleman that screens armour and holds ground while heavier units arrive'},
1:{ds:'Main battle tank and the backbone of the line โ€” everything else is built behind it'},
2:{ds:'Assault walker with 450 hull and a splash cannon, sent to break a defended position'},
3:{ds:'Field artillery that softens a position from 265 range and never has to enter it'},
4:{ds:'Your Commander: heavy, self-repairing, and the one unit the match is decided around'},
5:{ds:'Interceptor for air cover โ€” cheap enough to lose, fast enough not to'},
6:{ds:'Long-range missile carrier that kills armour it can see and dies to anything that closes'},
7:{ds:'Rocket vehicle whose splash punishes formations that have not spread out'},
8:{ds:'Sixteen thousand hull of walking siege โ€” the answer when the line will not break'},
9:{ds:'Flame trooper that clears entrenched infantry out of cover at close range'},
10:{ds:'Tank destroyer that trades armour for reach and kills heavies before they answer'},
11:{ds:'Unarmed mobile shield that walks in front of the advance and absorbs the volley'},
14:{ds:'Light warship for coastal screening and shore bombardment at medium range'},
15:{ds:'Capital warship whose 290-range guns hold an entire coastline'},
16:{ds:'Siege platform at 400 range โ€” out-ranges every static defence in the game'},
17:{ds:'Strike craft that drops onto a worker line at point-blank and is gone'},
18:{ds:'Armoured flame tank that pushes into massed infantry and burns the position clear'},
19:{ds:'Unarmed engineer: builds, auto-repairs nearby structures and salvages wrecks at 2ร— speed'},
20:{ds:'Mid-range splash gun that cuts down infantry advancing behind enemy armour'},
21:{ds:'Close-support launcher that scatters area fire over anything bunched in front of it'},
22:{ds:'Fragile 150-damage lance that removes one heavy target per shot from 230 range'},
23:{ds:'Sonic platform whose waves pass straight through Bulwark shields'},
24:{ds:'Unarmed field medic that repairs armour and treats wounded inside the fight'},
25:{ds:'Fast recon flyer with 150 sight โ€” it sees first and leaves first'},
26:{ds:'Experimental heavy with 1,100 hull and a main gun no line unit can trade with'},
27:{ds:'Siege titan whose area barrage grinds an entrenched position down from 210 range'},
31:{ds:'A brood caster that forms from 28 nearby creatures and directs the mass as one'},
32:{ds:'Unarmed mobile miner that works phase-ore in the field and hauls the mass home'}
},
bld:{
mex:{nm:'Extractor',ds:'+4 Mass, sited on a โ—† deposit and worked for as long as you hold the ground'},
pgen:{nm:'Reactor',ds:'+14 Energy from a shielded core โ€” the first thing to build after an Extractor'},
fac:{nm:'Factory',ds:'Builds ground units, and keeps building them while you are looking elsewhere'},
turret:{nm:'Sentinel',ds:'Automated laser turret covering an approach you cannot spare units to watch'},
bunker:{nm:'Bulwark',ds:'Armoured close-defence cannon that holds a chokepoint against ground assault'},
sgen:{nm:'Aegis Barrier',ds:'Projects a shield field over the position and repairs the structures under it'},
tgate:{nm:'Titan Gate',ds:'Builds TITANs โ€” the single largest commitment of the match'},
harbor:{nm:'Harbor',ds:'Builds warships; must be sited on the shore'},
bastion:{nm:'Concussion Mortar',ds:'Long-range explosive shells that stun clustered targets before they reach you'},
techlab:{nm:'Research Complex',ds:'Shielded studies that bank โ—† Data to your account for the doctrine tree'},
aatower:{nm:'Skyguard',ds:'Anti-air flak covering the airspace over your base and nothing else'},
airfield:{nm:'Airfield',ds:'Builds aircraft and turns them around between sorties'},
uplink:{nm:'Targeting Array',ds:'Extends the build zone and adds range to every tower near it'},
hq:{nm:'Carrier HQ',ds:'Your deployed super carrier โ€” a wide build zone and the anchor of the position'},
hellstorm:{nm:'Hellfire Rotary',ds:'Rapid rotary fire that shreds swarms and light armour before they close'},
arc:{nm:'Tesla Coil',ds:'Chain lightning that arcs through packed enemies and punishes tight formations'},
rail:{nm:'Rail Battery',ds:'Long-range penetrator that answers heavy armour on approach'},
nova:{nm:'NOVA Missile Silo',ds:'Strategic superweapon with map-wide strike range and a long, honest cooldown'},
minelaser:{nm:'Mining Laser',ds:'Sustained beam that melts heavy armour once it comes inside reach'},
missilebastion:{nm:'Missile Bastion',ds:'Long-range guided salvos holding standing area defence over your ground'},
plasma:{nm:'Plasma Charger',ds:'Charged ion blast with heavy splash โ€” one shot answers a whole formation'},
wall:{nm:'Barricade',ds:'Blocks ground units and forces the attack into the lane you prepared'},
gate:{nm:'Gate',ds:'A wall section your own units pass through and the enemy does not'},
geo:{nm:'Geo Plant',ds:'+30 Energy, sited on a โœฆ geyser โ€” the best power on the map if you can hold it'},
silo:{nm:'Silo',ds:'+600 mass and +2000 energy of storage, so a good economy stops overflowing'},
fab:{nm:'Fabricator',ds:'Burns 58 energy for +3.6 mass when the ground has no ore left to give'}
}
},
/* CRIMSON DOMINION โ€” imperial, unsentimental, contemptuous of weakness.
Machinery is an instrument of authority and units are expendable. */
legion:{
units:{
0:{nm:'Warden',ds:'Line infantry that holds ground until it dies and is replaced, never pulled back'},
1:{nm:'Iron Ram',ds:'Mass-built assault tank, cheap enough to spend and armoured enough to reach the line'},
2:{nm:'Warlord',ds:'Heavy anti-armour brawler that walks into the enemy column and cracks it open'},
3:{nm:'Bloodhound',ds:'Thin-hulled siege battery that shells the enemy line from far behind your own'},
5:{nm:'Shrike',ds:'Light gunship that strafes infantry and soft armour, and is expected to be lost'},
6:{nm:'Executioner',ds:'Heavier shells than a Bloodhound at shorter reach, with no armour to survive a reply'},
7:{nm:'Scourge',ds:'Rocket carrier that saturates packed formations with splash fire at long range'},
8:{nm:'Ascendant',ds:'Walking fortress built to break one front alone and hold the ruin it makes'},
9:{nm:'Immolator',ds:'Flame trooper that burns entrenched infantry out of cover at knife range'},
10:{nm:'Carrion',ds:'Thin-skinned tank hunter that kills armour from outside its reply'},
11:{nm:'Shieldbearer',ds:'Unarmed mobile shield that soaks the volley so the advance reaches the enemy line'},
14:{nm:'Enforcer',ds:'Light warship that screens the coast and guns down lighter hulls in the shallows'},
15:{nm:'Dominator',ds:'Capital warship that bombards the shoreline from far out on open water'},
16:{nm:'Siege Hammer',ds:'Longest-ranged gun in the column, built to flatten fixed defences before it advances'},
17:{nm:'Talon',ds:'Heavy gunship that drops onto armour and empties its guns at point-blank range'},
18:{nm:'Inferno',ds:'Armoured flame tank that rolls into massed infantry and burns the position clean'},
19:{nm:'Overseer',ds:'Unarmed engineer rig that raises and rebuilds structures while under fire'},
20:{nm:'Thresher',ds:'Mid-range splash gun that scythes down infantry following behind the armour'},
21:{nm:'Ashfall',ds:'Close-range launcher that scatters area blasts over anything bunched in front of it'},
22:{nm:'Impaler',ds:'Fragile long-range lance that deletes one heavy target per enormous shot'},
23:{nm:'Shieldbreaker',ds:'Sonic vehicle whose waves pierce shields and strike what shelters behind them'},
24:{nm:'Reclaimer',ds:'Unarmed crew that repairs armour and patches the wounded in the middle of the fight'},
25:{nm:'Watchman',ds:'Fast scout aircraft that maps the enemy line, armed only enough to leave it'},
26:{nm:'Tyrant',ds:'Experimental heavy carrying armour and a main gun no line unit can answer'},
27:{nm:'Warbringer',ds:'Siege titan whose area barrage grinds entrenched defences down from long range'},
32:{nm:'Requisitor',ds:'Unarmed mobile miner that strips ore off the field and feeds it to the war machine'}
},
bld:{
mex:{nm:'Tithe Rig',ds:'+4 Mass, clamped onto a โ—† deposit and worked until nothing is left'},
pgen:{nm:'Furnace',ds:'+14 Energy, burned hot and without apology'},
fac:{nm:'War Forge',ds:'Builds ground units in a continuous line, replacements included'},
turret:{nm:'Beam Post',ds:'Fixed laser turret that burns whatever walks into its arc'},
bunker:{nm:'Iron Redoubt',ds:'Armoured close-defence cannon that holds a chokepoint against ground assault'},
sgen:{nm:'Iron Aegis',ds:'Projects a shield field over the position and repairs the structures beneath it'},
tgate:{nm:'Ascension Gate',ds:'Builds TITANs, the only chassis Vex trusts to finish a front'},
harbor:{nm:'War Anchorage',ds:'Builds warships, and must be raised on the shore'},
bastion:{nm:'Concussion Pit',ds:'Long-range explosive shells that stun clustered targets before the assault lands'},
techlab:{nm:'Doctrine Vault',ds:'Shielded complex whose studies bank โ—† Data to your account'},
aatower:{nm:'Flak Tower',ds:'Anti-air flak that tears aircraft out of the sky above the column'},
airfield:{nm:'Talon Field',ds:'Builds aircraft and turns them around for the next sortie'},
uplink:{nm:'Command Array',ds:'Extends the build zone and lengthens the reach of nearby towers'},
hq:{nm:'Throne Carrier',ds:'Deployed super carrier that opens a wide build zone and anchors the offensive'},
hellstorm:{nm:'Meatgrinder',ds:'Rapid rotary fire that shreds swarms and light armour at close quarters'},
arc:{nm:'Arc Lash',ds:'Chain lightning that arcs through packed enemies and punishes tight formations'},
rail:{nm:'Rail Lance',ds:'Long-range penetrator that punches through the heaviest armour on approach'},
nova:{nm:'Verdict Silo',ds:'Strategic superweapon with map-wide strike range, the last word in any argument'},
minelaser:{nm:'Cutting Beam',ds:'Sustained beam that melts the heaviest armour once it comes inside reach'},
missilebastion:{nm:'Salvo Bastion',ds:'Long-range guided salvos that blanket an area and cover the ground you hold'},
plasma:{nm:'Ion Charger',ds:'Charged ion blast with heavy splash, one shot answering a whole formation'},
wall:{nm:'Iron Wall',ds:'Blocks ground units and forces the enemy into the lane you chose for them'},
gate:{nm:'Iron Gate',ds:'A wall your own units pass through and the enemy does not'},
geo:{nm:'Geo Furnace',ds:'+30 Energy, sunk into a โœฆ geyser and tapped until it is dry'},
silo:{nm:'War Stores',ds:'+600 mass and +2000 energy storage, held back for the next offensive'},
fab:{nm:'Transmuter',ds:'Burns 58 energy to force out +3.6 mass when the ground has nothing left'}
},
/* Stances are orders, and an order in the Dominion is a thing you are held
to: emplace and you do not move again until told. */
mode:{
0:{nm:'MARCH', ds:'Marching order: no bonus and no penalty, the footing the column fights from'},
1:{nm:'EMPLACE', ds:'Emplaced: +75% range and +45% damage, and it will not move again until told'},
2:{nm:'SHIELDWALL',ds:'Braced behind the shields: โˆ’45% damage taken, โˆ’60% speed'},
3:{nm:'BLOODRUSH', ds:'Redlined: +60% fire rate, +35% speed, and it burns its own hull to pay'},
4:{nm:'BLACKOUT', ds:'Runs dark: nothing sees it until it opens fire, โˆ’35% speed'},
5:{nm:'GRIND', ds:'Rooted and grinding: +85% fire rate, โˆ’30% range, no movement'},
6:{nm:'LABOUR', ds:'Sets the beam to work hastening a War Forge, a build site or the Throne Carrier'},
7:{nm:'CLAIM', ds:'Sends the rig to seize the nearest unclaimed phase-crystal field'},
mine:{nm:'TITHE', ds:'Clamps the extraction beam onto a working phase-crystal field and takes its due'}
},
classab:{
assault: {nm:'SHATTER', ds:'+28% damage, +22% speed and faster fire for 9s, paid with +12% damage taken'},
intercept:{nm:'RUN DOWN',ds:'Fliers take +58% speed, +22% range and faster tracking for 8s'},
service: {nm:'PATCH UP',ds:'Crews restore nearby troops and hold a 28% damage screen over them for 7s'}
},
upgrade:{
0:{nm:'Blood Edge', ds:'+25% damage on everything the Commander carries'},
1:{nm:'Iron Skin', ds:'+20% Commander max HP, and the new hull comes filled'},
2:{nm:'Undying', ds:'The Commander mends 80% faster and does not stop to do it'},
3:{nm:'Standing Order',ds:'Commander ability cooldowns cut by 20%'},
4:{nm:'War Tithe', ds:'+2.5 mass and +8 energy income, taken from the ground you hold'},
5:{nm:'Blooded Ranks', ds:'Every unit you field deals 10% more damage'},
6:{nm:'Forge Levy', ds:'War Forges turn out units 25% faster'},
7:{nm:'Wider Verdict', ds:'The orbital blast covers 35% more ground'}
}
},
/* SYNDICATE COALITION โ€” mercantile and clinical. Everything is an asset, a
line item or a service level; violence is a maintenance schedule. */
syndicate:{
units:{
0:{nm:'Retainer',ds:'Cheap legged skirmisher fielded in bulk and written off the moment it stops firing'},
1:{nm:'Coil Skiff',ds:'Light hover gun platform trading stopping power for rate of fire at medium range'},
2:{nm:'Bailiff',ds:'Heavy hover tank that pushes to short range and repossesses enemy armor plate by plate'},
3:{nm:'Arc Mortar',ds:'Thin-hulled mortar that arcs shells onto static positions from far outside their reach'},
5:{nm:'Hexwing',ds:'Cheap attack drone that swarms stragglers and pressures anything left without cover'},
6:{nm:'Longcoil',ds:'Siege launcher whose single heavy shells break emplacements it never has to approach'},
7:{nm:'Dividend',ds:'Rocket carrier that pays its payload out across clustered targets from standoff range'},
8:{nm:'Liquidator',ds:'Striding titan whose emitters erase a defended position and close the account outright'},
9:{nm:'Cauterizer',ds:'Legged thermal sprayer that burns infantry out of cover at point-blank range'},
10:{nm:'Beam Culler',ds:'Standoff beam platform that cuts open heavy armor from outside its return fire'},
11:{nm:'Indemnity',ds:'Unarmed hull that carries a shield over your advance and soaks fire your line cannot'},
14:{nm:'Coil Cutter',ds:'Light warship that screens the coast and services shore targets at medium range'},
15:{nm:'Embargo',ds:'Capital warship whose long guns close a coastline and shell anything anchored near it'},
16:{nm:'Foreclosure',ds:'Siege battery that dismantles bases from beyond tower range, once it has time to set up'},
17:{nm:'Auditor',ds:'Gunship that arrives unannounced, empties its coils point-blank, and leaves'},
18:{nm:'Slagcaster',ds:'Armored hover flamer that pushes into cover and burns entrenched infantry out of it'},
19:{nm:'Assembler',ds:'Unarmed drone rig that raises structures and extends your holdings in the field'},
20:{nm:'Scatterbeam',ds:'Fan emitter that sweeps massed light targets off a lane in a single pass'},
21:{nm:'Flux Caster',ds:'Close-support caster that lobs ionized bursts over cover into packed squads'},
22:{nm:'Prism Lance',ds:'Long-range lance that removes one heavy target per shot and reloads in the open'},
23:{nm:'Harmonic',ds:'Sonic hull whose resonance passes through shields to hit what they were protecting'},
24:{nm:'Warranty',ds:'Unarmed service rig that repairs and heals nearby assets under standing warranty'},
25:{nm:'Surveyor',ds:'Fast scout drone that maps ground the Coalition later sells by the tile, lightly armed'},
26:{nm:'Overwrite',ds:'Experimental heavy hull that opens a lane through armor and rewrites who holds it'},
27:{nm:'Final Notice',ds:'Siege platform that saturates entrenched positions with sustained area fire from range'},
32:{nm:'Assayer',ds:'Unarmed mining rig that works ore deposits in the field and converts them to mass'}
},
bld:{
mex:{nm:'Lien Drill',ds:'+4 Mass from a โ—† node, drilled under an exclusive Coalition claim'},
pgen:{nm:'Coil Reactor',ds:'+14 Energy from a sealed coil core, metered down to the last unit'},
fac:{nm:'Assembly Bay',ds:'Builds ground units, from leased skirmishers up to Phantom-pattern armor'},
turret:{nm:'Beam Sentry',ds:'Automated laser turret that services anything entering its arc'},
bunker:{nm:'Casemate',ds:'Armored emplacement whose close-defence cannon holds ground you cannot cede'},
sgen:{nm:'Barrier Pylon',ds:'Projects a shield field over your holdings and repairs the structures inside it'},
tgate:{nm:'Titan Cradle',ds:'Builds TITANs, the largest single line item the Coalition will ever approve'},
harbor:{nm:'Freeport',ds:'Builds warships; must be sited on the shore'},
bastion:{nm:'Shock Mortar',ds:'Long-range explosive shells that stun clustered targets and stall an advance'},
techlab:{nm:'Data Vault',ds:'Shielded complex that studies and banks โ—† Data hauled in by Decryptor crews'},
aatower:{nm:'Airspace Toll',ds:'Anti-air flak battery that prices every aircraft crossing your airspace'},
airfield:{nm:'Launch Deck',ds:'Builds aircraft, chartered out by the sortie'},
uplink:{nm:'Telemetry Mast',ds:'Extends your build zone and feeds nearby towers the telemetry to shoot further'},
hq:{nm:'Brokerage',ds:'Deployed super carrier and the Broker\'s seat, opening a wide build zone'},
hellstorm:{nm:'Rotary Coil',ds:'Rapid rotary fire that shreds swarms and light armor before they reach the line'},
arc:{nm:'Chain Coil',ds:'Chain lightning that arcs from one packed enemy to the next until the queue clears'},
rail:{nm:'Rail Spike',ds:'Long-range penetrator built to itemize heavy armor one target at a time'},
nova:{nm:'Terminal Clause',ds:'Strategic superweapon with map-wide strike range, invoked once and never argued'},
minelaser:{nm:'Asset Stripper',ds:'Sustained beam that melts heavy armor down to salvage value'},
missilebastion:{nm:'Salvo Bastion',ds:'Long-range guided salvos holding standing area defense over your holdings'},
plasma:{nm:'Surcharge',ds:'Charged ion blast with heavy splash, applied to anything that groups up'},
wall:{nm:'Hex Barricade',ds:'Hexplate wall that blocks ground units and routes them where you want them'},
gate:{nm:'Toll Gate',ds:'Wall section your own units pass through and nothing else does'},
geo:{nm:'Vent Tap',ds:'+30 Energy tapped from a โœฆ geyser on a lease that never expires'},
silo:{nm:'Reserve Vault',ds:'Holds +600 mass and +2000 energy in reserve against a long campaign'},
fab:{nm:'Arbitrage',ds:'Burns 58 energy to mint +3.6 mass at an exchange rate the Coalition sets'}
},
/* A stance is a service level: you buy something and something is billed
for it, and the Coalition tells you the rate up front. */
mode:{
0:{nm:'BASE RATE', ds:'Baseline footing, nothing billed either way and nothing gained'},
1:{nm:'HARD ASSET',ds:'Set down as fixed plant: +75% range, +45% damage, and it does not move'},
2:{nm:'COVERAGE', ds:'Full coverage: โˆ’45% damage taken, with โˆ’60% speed as the premium'},
3:{nm:'OVERDRAW', ds:'Drawn against its own hull: +60% fire rate, +35% speed'},
4:{nm:'OFF BOOKS', ds:'Off the books: nothing sees it until it fires, โˆ’35% speed'},
5:{nm:'SATURATE', ds:'Standing service: +85% fire rate, โˆ’30% range, no movement while it fires'},
6:{nm:'EXPEDITE', ds:'Bills a tractor beam to speed an Assembly Bay, a build site or the Brokerage'},
7:{nm:'ASSESS', ds:'Sends the rig to appraise the nearest unclaimed phase-crystal field'},
mine:{nm:'EXTRACT',ds:'Locks the mining beam onto a producing phase-crystal field and books the yield'}
},
classab:{
assault: {nm:'LEVERAGE', ds:'+28% damage, +22% speed and faster fire for 9s against +12% damage taken'},
intercept:{nm:'INTERDICT',ds:'+58% speed, +22% range and faster tracking for 8s of airspace control'},
service: {nm:'SERVICING',ds:'Support assets restore nearby holdings and hold a 28% damage screen for 7s'}
},
upgrade:{
0:{nm:'Weapon Uprate', ds:'+25% Commander damage, uprated at Coalition expense'},
1:{nm:'Hexplate Kit', ds:'+20% Commander max HP, fitted and healed on the spot'},
2:{nm:'Repair Retainer',ds:'Commander regeneration up 80% under a standing retainer'},
3:{nm:'Fast Turnaround',ds:'Commander ability cooldowns down 20%'},
4:{nm:'Margin Call', ds:'+2.5 mass and +8 energy income booked against every deposit'},
5:{nm:'Trained Assets', ds:'Every asset you field deals 10% more damage'},
6:{nm:'Line Throughput',ds:'Assembly Bays turn out units 25% faster'},
7:{nm:'Wider Writeoff', ds:'Orbital blast radius +35%, so more is written off per strike'}
}
},
/* BROOD SWARM โ€” unsettling, patient, physical. Organs and creatures only;
see the no-mechanical-vocabulary rule at the top of this file. */
horde:{
units:{
0:{nm:'Spawnling',ds:'Bred by the litter and spent without counting, it finds where you are soft first'},
1:{nm:'Goreback',ds:'Heavy-shelled walker that flings barbs at short reach and holds while the brood grows'},
2:{nm:'Sundermaw',ds:'Slow, thick-shelled breaker whose jaws split the hardest cases open at short reach'},
3:{nm:'Spitter',ds:'Sac-bellied lobber that arcs burning bile far over the field and dies fast if reached'},
5:{nm:'Hookwing',ds:'Membrane-winged biter grown in flights to harry light things from above'},
6:{nm:'Quillcaster',ds:'Patient thrower that puts a single sharpened bone spine through a body at long reach'},
7:{nm:'Rotslinger',ds:'Swollen thrower whose bursting sacs eat through anything clustered well out from it'},
8:{nm:'Worldmaw',ds:'Hill-sized creature on seven-jointed limbs that eats whole formations and will not die'},
9:{nm:'Bile Wretch',ds:'Legged sac that washes digesting bile over everything within a breath of it'},
10:{nm:'Boreworm',ds:'Long-necked hunter that drives a hardened spine through heavy shells from well back'},
11:{nm:'Shellback',ds:'Walking shell that soaks what is aimed at the brood behind it and never bites back'},
12:{nm:'Ravager',ds:'Claw-first killer that closes to touching distance and opens light bodies in seconds'},
13:{nm:'Alpha Ravager',ds:'A Ravager grown on and on, thick enough in the shell to tear a whole line open alone'},
14:{nm:'Reefspine',ds:'Swimming body that holds open water and stings whatever floats near it'},
15:{nm:'Drowner',ds:'Vast swimmer that flings bone across the water from further off than anything answers'},
16:{nm:'Bone Hurler',ds:'Slow, sac-heavy thrower that lobs hardened bone from beyond all sight and answer'},
17:{nm:'Rendwing',ds:'Heavy flier that stoops onto one target and opens it with hooked claws before rising'},
18:{nm:'Rotbelly',ds:'Fat-bodied sprayer that walks into crowds and coats them in acid that keeps eating'},
19:{nm:'Fleshweaver',ds:'Blind and jawless, it spits living matter into the shape of new organs'},
20:{nm:'Splitspine',ds:'Flings a fan of hooked spines that opens several bodies standing shoulder to shoulder'},
21:{nm:'Chokespore',ds:'Breathes a clinging cloud of burning spore over anything bunched at short reach'},
22:{nm:'Impaler',ds:'Thin-bodied hunter that drives one heavy spine through a single hard target from far off'},
23:{nm:'Wailer',ds:'Its low cry passes through shields as if they were not there and pulps what is inside'},
24:{nm:'Knitter',ds:'Toothless nurse-body that pushes new tissue into wounded broodmates until they close'},
25:{nm:'Skyeye',ds:'Fragile flier grown for its eyes, seeing far for the hive and stinging only lightly'},
26:{nm:'Dreadspine',ds:'Thick-shelled hunter, costly to grow, that kills heavy things well before they close'},
27:{nm:'Harrower',ds:'Siege-grown bulk that showers rot over packed lines and anything rooted, from far back'},
31:{nm:'Brood Tidecaster',ds:'Rises where 28 broodmates gather, casting the will of the hive and stinging at reach'},
32:{nm:'Massgrub',ds:'Soft, harmless grub that chews ore where it lies and carries the mass home to the hive'}
},
bld:{
mex:{nm:'Gullet Root',ds:'Root sunk into a โ—† seam, digesting +4 Mass out of the rock'},
pgen:{nm:'Vital Gland',ds:'Swollen gland that metabolises +14 Energy from what the creep feeds it'},
fac:{nm:'Hatchery',ds:'Birthing organ that swells, splits and pushes out new creatures without end'},
turret:{nm:'Acid Polyp',ds:'Rooted stalk that lashes a thin thread of acid at whatever walks into reach'},
bunker:{nm:'Gnaw Burrow',ds:'Hard-shelled burrow that snaps at anything coming close and takes a beating'},
sgen:{nm:'Caul Gland',ds:'Swells a living veil over nearby organs and knits their torn tissue closed'},
tgate:{nm:'Queen Chamber',ds:'Buried chamber where the hive swells a TITAN into being'},
nest:{nm:'Ravager Nest',ds:'Wild hive that answers to no brood โ€” break it open for a bounty of 200 mass'},
harbor:{nm:'Shore Womb',ds:'Grown on the shoreline, it births swimming creatures straight into the shallows'},
bastion:{nm:'Shock Bladder',ds:'Lobs a swollen sac far out that leaves packed enemies stunned and staggering'},
techlab:{nm:'Genome Sac',ds:'Veiled organ that digests what the brood has eaten and banks it as โ—† Data'},
aatower:{nm:'Barb Bloom',ds:'Coughs clouds of barbed seed upward and shreds whatever tries to fly over'},
airfield:{nm:'Flight Womb',ds:'Splits along its back to let newly grown fliers climb into the air'},
uplink:{nm:'Nerve Node',ds:'Spreads living creep outward and lengthens the reach of the organs rooted near it'},
hq:{nm:'Sovereign Hive',ds:'The Sovereign settles here, flooding creep wide so the brood can grow across all of it'},
hellstorm:{nm:'Spine Storm',ds:'Rakes a ceaseless stream of small spines that tears massed light bodies apart'},
arc:{nm:'Charge Gland',ds:'Living charge leaps body to body through anything standing crowded together'},
rail:{nm:'Spine Root',ds:'Drives one long bone through a heavy target from far outside its answering reach'},
nova:{nm:'World Seed',ds:'Grows a single living seed and casts it anywhere on the world to fall and consume'},
minelaser:{nm:'Solvent Gland',ds:'Holds a steady thread of solvent on one heavy target until it softens and runs'},
missilebastion:{nm:'Seeker Pods',ds:'Sends living seekers out to hunt down and burst over anything gathered far out'},
plasma:{nm:'Rupture Sac',ds:'Swells, then throws a fat clot of acid that bursts wide over everything near it'},
wall:{nm:'Bone Ridge',ds:'Grown ridge of fused bone that walking things cannot cross'},
gate:{nm:'Sphincter Ridge',ds:'Bone ridge with a muscled slit that opens for the brood and shuts to everything else'},
geo:{nm:'Vent Bloom',ds:'Clamped over a โœฆ geyser, drinking its heat for +30 Energy'},
silo:{nm:'Swollen Crop',ds:'Distended holding organ that keeps +600 mass and +2000 energy inside it'},
fab:{nm:'Massflesh Gland',ds:'Eats 58 energy and lays it down as +3.6 mass of raw massflesh'}
},
/* Nothing here deploys, redlines or suppresses. A brood creature roots
itself, hunkers, floods itself, goes still. The numbers are the same
numbers; the words are the ones an animal would earn. */
mode:{
0:{nm:'ROAM', ds:'How it carries itself when nothing is asked of it: no gain and no cost'},
1:{nm:'ROOT', ds:'Sinks into the ground: +75% reach and +45% harm, and it cannot move'},
2:{nm:'HUNKER', ds:'Draws its shell down over itself: takes 45% less harm, crawls 60% slower'},
3:{nm:'FEVER', ds:'Floods itself: strikes 60% faster, runs 35% quicker, eats its own flesh'},
4:{nm:'UNSEEN', ds:'Goes utterly still: nothing finds it until it strikes, and it creeps 35% slower'},
5:{nm:'SMOTHER', ds:'Plants itself and pours: 85% faster strikes, 30% less reach, no moving'},
6:{nm:'TEND', ds:'Feeds a swelling Hatchery, a growing organ or the Sovereign Hive to hasten it'},
7:{nm:'SCENT', ds:'Follows the scent to the nearest untaken phase-crystal field'},
mine:{nm:'GRAZE',em:'๐Ÿ›',ds:'Fastens onto a phase-crystal field and chews the mass loose to carry home'}
},
classab:{
assault: {nm:'REND', ds:'For 9s the brood bites 28% harder and runs 22% faster, and takes 12% more'},
intercept:{nm:'STOOP',ds:'Fliers gain 58% speed, 22% more reach and quicker eyes for 8s'},
service: {nm:'KNIT', ds:'Nurse-bodies close wounds nearby and hold a 28% harm-blunting veil for 7s'}
},
upgrade:{
0:{nm:'Sharper Claws',em:'๐Ÿฉธ',ds:'The Sovereign strikes 25% harder'},
1:{nm:'Thicker Shell', ds:'The Sovereign carries 20% more flesh, and the new flesh comes full'},
2:{nm:'Fast Knitting', ds:'The Sovereign closes its own wounds 80% faster'},
3:{nm:'Quick Blood', ds:'The Sovereign is ready to use its gifts again 20% sooner'},
4:{nm:'Deeper Roots', ds:'+2.5 mass and +8 energy drawn up out of the ground'},
5:{nm:'Fed Brood', ds:'Every creature you have grown bites 10% harder'},
6:{nm:'Swollen Wombs',em:'๐Ÿ›',ds:'Hatcheries push out new creatures 25% faster'},
7:{nm:'Wider Fall', ds:'What the Sovereign calls down lands across 35% more ground'}
}
}
};
/* Whose vocabulary applies. Inspecting an ENEMY unit shows what THEY call it โ€”
that is a small piece of intelligence, and it is also the only honest answer:
the thing in front of you is their hardware, not a Nova chassis in red. */
function factionTextKit(team){
if(team===2) return 'horde';
if(team===1){
const f=(typeof AI!=='undefined'&&AI&&AI.fac)||'';
return (typeof FACTIONS!=='undefined'&&FACTIONS[f]&&FACTIONS[f].kit)||f||'';
}
return (typeof playerKitKey==='function')?playerKitKey():'nova';
}
function facTextEntry(group,key,kit){
const k=(kit===undefined)?factionTextKit(0):kit;
const F=FAC_TEXT[k];
return (F&&F[group]&&F[group][key])||null;
}
/* Nova is the base roster's own voice, so it has no overlay and these fall
through to TYPES/BT unchanged. Anything a faction has not been given a name
for also falls through rather than showing a blank card. */
function factionUnitName(ty,kit){
const e=facTextEntry('units',ty,kit);
return (e&&e.nm)||((typeof TYPES!=='undefined'&&TYPES[ty]&&TYPES[ty].name)||'');
}
function factionUnitDesc(ty,kit){
const e=facTextEntry('units',ty,kit);
return (e&&e.ds)||'';
}
function factionBldName(id,kit){
const e=facTextEntry('bld',id,kit);
return (e&&e.nm)||((typeof BT!=='undefined'&&BT[id]&&BT[id].name)||'');
}
function factionBldDesc(id,kit){
const e=facTextEntry('bld',id,kit);
return (e&&e.ds)||'';
}
/* ---- STANCES -------------------------------------------------------------
MODES is indexed by mode id, but unitModeDef() already carries one
chassis-specific override โ€” the miner's mode 0 is MINE, not MOBILE โ€” and a
faction has to be able to rename that too. `modeBaseDef(ty,m)` in sim.js is
the single owner of which base entry a (chassis, mode) pair resolves to; this
mirrors only the KEY, so a second chassis override added there needs one line
here rather than a parallel table. */
function factionModeKey(m,ty){
return (typeof UT_MINER!=='undefined'&&ty===UT_MINER&&m===0)?'mine':m;
}
function factionModeBase(m,ty){
if(typeof modeBaseDef==='function') return modeBaseDef(ty,m)||{};
return {};
}
function factionModeName(m,ty,kit){
const e=facTextEntry('mode',factionModeKey(m,ty),kit);
return (e&&e.nm)||factionModeBase(m,ty).nm||'';
}
function factionModeDesc(m,ty,kit){
const e=facTextEntry('mode',factionModeKey(m,ty),kit);
return (e&&e.ds)||factionModeBase(m,ty).ds||'';
}
function factionModeEm(m,ty,kit){
const e=facTextEntry('mode',factionModeKey(m,ty),kit);
return (e&&e.em)||factionModeBase(m,ty).em||'';
}
/* ---- CONTEXTUAL DOCTRINES ------------------------------------------------ */
function factionClassAbName(key,kit){
const e=facTextEntry('classab',key,kit);
return (e&&e.nm)||((typeof CLASS_AB!=='undefined'&&CLASS_AB[key]&&CLASS_AB[key].nm)||'');
}
function factionClassAbDesc(key,kit){
const e=facTextEntry('classab',key,kit);
return (e&&e.ds)||((typeof CLASS_AB!=='undefined'&&CLASS_AB[key]&&CLASS_AB[key].ds)||'');
}
function factionClassAbEm(key,kit){
const e=facTextEntry('classab',key,kit);
return (e&&e.em)||((typeof CLASS_AB!=='undefined'&&CLASS_AB[key]&&CLASS_AB[key].em)||'');
}
/* ---- COMMANDER LEVEL-UP CARDS -------------------------------------------
Only the WORDS are faction-aware. The eight cards keep their index, their
order and their `fn`, so the effect a card applies can never drift from the
effect its sentence promises. */
function factionUpgradeName(i,kit){
const e=facTextEntry('upgrade',i,kit);
return (e&&e.nm)||((typeof UPGRADES!=='undefined'&&UPGRADES[i]&&UPGRADES[i].nm)||'');
}
function factionUpgradeDesc(i,kit){
const e=facTextEntry('upgrade',i,kit);
return (e&&e.ds)||((typeof UPGRADES!=='undefined'&&UPGRADES[i]&&UPGRADES[i].ds)||'');
}
function factionUpgradeEm(i,kit){
const e=facTextEntry('upgrade',i,kit);
return (e&&e.em)||((typeof UPGRADES!=='undefined'&&UPGRADES[i]&&UPGRADES[i].em)||'');
}