Spaces:
Running
Running
| ; | |
| ; | |
| /* ============================================================================ | |
| 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)||''); | |
| } | |