# Zero Engine (SLA Industries) — System State Reference **Last updated:** 2026-06-01 **System version:** 1.3.0-dev **Foundry compatibility:** v13 minimum, verified v14.361 **World:** SLA_Industries (last played 2026-06-01, ~110 hours playtime) **Single source file:** `zero-engine.mjs` (~6500+ lines) --- ## File Map | Path | Role | |------|------| | `system.json` | Manifest — id: `zero-engine`, entry: `zero-engine.mjs` | | `zero-engine.mjs` | Everything: classes, hooks, data tables, PC/NPC creators | | `styles/zero-engine.css` | All CSS (~4600+ lines, SLA Borg font family) | | `blade-runner.css` / `.js` | Legacy Blade Runner skin (not SLA-active) | | `template.json` | Actor & Item data schemas | | `lang/en.json` | English localisation strings | | `templates/actor/character-sheet.hbs` | Primary PC sheet (Mk1) | | `templates/actor/character-sheet-mk2.hbs` | Mk2 dark sheet variant | | `templates/actor/npc-sheet.hbs` | NPC sheet | | `templates/actor/vehicle/vehicle-sheet.hbs` | Vehicle sheet | | `templates/actor/loot/loot-sheet.hbs` | Loot container sheet | | `templates/actor/character/` | Modular tab partials (stats, combat, inventory, mods, bio) | | `templates/components/roll/roll-chatcard.hbs` | Roll result chat card | | `templates/item/item-sheet.hbs` | Item sheet | | `packs/armors.json` | 6 armors | | `packs/drugs.json` | 7 drugs | | `packs/ebb-formulae.json` | 30 Ebb formulae | | `packs/specialties.json` | 16 specialties | | `packs/tables-data.json` | 5 rollable tables (panic, phys crit, mental crit, ranged fail, melee fail) | | `fonts/SLABorg-*.woff2` | Custom SLA Borg font family (Book, Tech, Title, UI) | | `assets/icons/ebb/` | 10 Ebb discipline SVG icons | | `assets/racial/` | 8 racial ability SVG icons | | `assets/textures/` | Chat card, character sheet, journal background webps | --- ## Actor Types ### `character` (PC) **Attributes** (base 2 each, rolled as Nd6): - Strength, Agility, Wits, Empathy **Skills** (add to attribute for dice pool): | Skill | Attribute | |-------|-----------| | Force, Melee, Stamina | Strength | | Marksmanship, Mobility, Stealth | Agility | | Crafting, Observation, Survival | Wits | | Healing, Insight, Persuasion, Ebb | Empathy | **Derived Stats:** - `health` (value/max) — base 3, modified by race/training/armor/drugs/specialties - `resolve` (value/max) — base 3, modified by race/training/drugs/specialties - `stress` — scalar 0–10; adds stress dice to all rolls (1s on stress dice = Banes) - `carryLimit` — base 4 - `broken` — boolean; triggers Broken condition **Other Fields:** - `details` — age, height, weight, scl (default 10), credits (default 500) - `race` — string key (see Races below) - `training` — array, first entry used as archetype label - `archetype` — string - `flux` (value/max) — Ebb resource; max = Ebb skill + 1 - `criticalInjuries` — physical\[\] and mental\[\] arrays - `panic` — directive string, active boolean - `vevaphon` — instability (0–12), instabilityMax (12), activeMorphForm - `finances` — income (salary, bpnReward, other), expenses (accommodation, drugs, subscriptions, other, bulletTax), debt, ammoSpentSession, creditLog\[\] - `bpn` — code, type (blue/green/red/silver/gold/black), status, reward, description, objectives, notes - `specialties` / `equipment` / `weapons` — legacy text fields (items are embedded) **Health/Resolve calculation** (`calculateHealthResolve`): ``` healthMax = 2 + (STR-2) + raceMod + trainingMod + equipmentMod + specialtyMod + drugMod resolveMax = 2 + (EMP-2) + raceMod + trainingMod + equipmentMod + specialtyMod + drugMod ``` Recalculates on: attribute changes, race change, item add/remove/update, active effect changes. --- ### `npc` (NPC) Simplified schema: biography, threat (1–5), flat attributes (str/agi/wits/emp), health (value/max), armor (flat number), damage. --- ## Item Types | Type | Key Fields | |------|-----------| | `weapon` | weaponType, category (ranged/melee), damage, range, rof, gearBonus, ap, magazine, ammo, fireModes, autoAmmoUse, ammoType, caliber, roundType, initiativeMod, equipped, ammoEmpty | | `armor` | armorRating, armorDice, armorAuto, statMod, skillMod, statModTarget, skillModTarget, healthMod, resolveMod, initiativeMod, equipped | | `equipment` | quantity, cost, weight, isDrug, active, activeDuration, healthMod, resolveMod, statPhysicalMod, skillAllMod, panicReduction, injuryPenaltyIgnore, stressRecoveryBonus, postUseStaminaDamage, withdrawal variants of all mods, per-skill mods, initiativeMod, equipped | | `ammo` | caliber, roundType, quantity, costPerRound, apBonus, damageMod, blastRadius, weight | | `specialty` | category, effects, prerequisites, package, healthMod, resolveMod, racialBonuses\[\], isActive | | `ebb` | discipline, fluxCost, successes, effect, catastrophe, duration, range | --- ## Races 8 playable races, defined in `SLA_RACES`: | Race | Key | Base Attrs | Attr Points | Skill Points | Health Mod | Resolve Mod | Notes | |------|-----|------------|-------------|--------------|-----------|------------|-------| | Human | `human` | 2/2/2/2 | 6 | 10 | 0 | 0 | Caps 5/5/5/5 | | Ebon | `ebon` | 2/2/3/3 | 4 | 10 | 0 | +1 | Ebb user. Caps 4/4/5/5 | | Brain Waster | `brainwaster` | 2/2/4/3 | 3 | 10 | 0 | 0 | Ebb user, push risk catastrophe. Caps 3/4/5/5 | | Stormer 313-S | `stormer` | 4/3/2/2 | 3 | 8 | +2 | 0 | Caps 5/5/3/3 | | Shaktar | `shaktar` | 3/3/2/2 | 4 | 9 | +1 | 0 | Caps 5/5/4/4 | | Wraith Raider | `wraithraider` | 2/4/2/2 | 4 | 10 | 0 | +1 | Caps 4/5/5/4 | | Frother | `frother` | 4/2/2/2 | 4 | 8 | +1 | -1 | Drug Dependency: -1 all rolls when no drug active. Caps 5/4/4/3 | | Stormer Vevaphon | `vevaphon` | 3/3/2/2 | 5 | 8 | +2 | -1 | Morph forms + Instability. Caps 5/5/4/3 | **Race-derived derived stats** are applied in `RACE_DERIVED_MODS` and `calculateHealthResolve`. Race change auto-adds racial specialty items via `_ensureRacialAbilities`. --- ## Racial Abilities (auto-embedded on race set) Each race gets specialty items automatically added to the actor: | Race | Specialties Added | |------|------------------| | Human | Social Versatility (+1 Persuasion, +1 Insight) | | Ebon | Ebb Sensitive, natural Ebb formulae | | Brain Waster | Ebb Fury (push = catastrophe risk), natural Ebb formulae | | Stormer | Regeneration (regen HP on rest) | | Shaktar | Warrior Caste (+1 Force, +1 Melee), Code of Honor | | Wraith Raider | Shaper Senses (+2 Stealth, +1 Observation), Cold Adapted | | Frother | Drug Dependency, Combat Drug User (+2 Force/Melee while drugged), Blade Proficiency | | Vevaphon | Brute Form, Stalker Form, Raptor Form, Morphic Strike | --- ## Vevaphon Morph Forms Switching form costs 1 Instability and triggers an automatic instability check roll (1d6 + current instability). Forms are stored as specialty items. `activeMorphForm` key: `none` / `brute` / `stalker` / `raptor`. | Form | Bonuses | Restriction | |------|---------|-------------| | Base (`none`) | Normal stats | — | | Brute | +2 Health max, knockdown immune, +1 Force, +1 Melee | Cannot be disguised | | Stalker | +2 Stealth, +1 Agility dice | Cannot wear armour | | Raptor | +2 Melee, +1 Marksmanship (close range), crits +1 dmg | — | | Morphic Strike | Natural weapon DMG 2 AP 1 | Always available, all forms | **Instability table** (roll: 1d6 + instability value, triggers at result ≥ 7): | Range | Name | Severity | |-------|------|----------| | 7 | Flicker | minor | | 8 | Skin Crawl | minor | | 9 | Drift | minor | | 10 | Identity Slip | minor | | 11 | Voice Shift | minor | | 12 | Pain Spike (+1 Stress) | moderate | | 13 | Limb Fault (-2 phys) | moderate | | 14 | Form Bleed | moderate | | 15 | Sensory Overload | moderate | | 16 | Tissue Rejection (1 dmg, no armour) | moderate | | 17 | Threat Lock | serious | | 18 | Form Panic (+1 Stress) | serious | | 19 | Memory Fracture | serious | | 20 | Partial Collapse (1d3 dmg) | serious | | 21 | Identity Bleed | serious | | 22 | Uncontrolled Shift (+1 Instability) | serious | | 23 | Trauma Response (Shaken) | serious | | 24 | Permanent Scar | critical | | 25 | Full Reversion (-1 Instability, revert) | critical | | 26 | Psychic Scream | critical | | 27 | Body Horror | critical | | 28 | Cascade Shift (1d3 dmg, +1 Instab) | critical | | 29 | Dissolution Risk | critical | | 30 | Identity Death | catastrophic | | 31 | Organ Shift (2 dmg/round) | catastrophic | | 32 | Full System Failure | catastrophic | | 33 | Catastrophic Cascade (1d6 dmg/round) | catastrophic | | 34 | Biogenetic Detonation (2d6 self, 1d6 AoE) | catastrophic | | 35 | Terminal Dissolution | lethal | | 36+ | Total Collapse (instant death) | lethal | Auto-effects are applied programmatically (`autoStress`, `autoDamage`, `autoDamageRoll`, `autoInstability`, `revertForm`, `applyCondition`). --- ## Training Packages 8 packages in `SLA_TRAINING`, selected at PC creation: | Package | Key | Starting Skills | Specialty | Armour | |---------|-----|-----------------|-----------|--------| | Soldier | `soldier` | Melee 2, Marksmanship 2, Stamina 1 | Hard Hitter | CAF Armor | | Scout | `scout` | Stealth 2, Mobility 2, Observation 1 | Fast Reflexes | Scout Armor | | Combat Medic | `medic` | Healing 2, Insight 1, Observation 2 | Field Surgeon | Downtown Jacket | | Technical Operative | `tech` | Crafting 3, Observation 1, Survival 1 | Inquisitive | Downtown Jacket | | Negotiator | `negotiator` | Persuasion 2, Insight 2, Observation 1 | Gut Feeling | Downtown Jacket | | Hunter | `hunter` | Marksmanship 2, Stealth 2, Observation 1 | Sniper | Scout Armor | | Brawler | `brawler` | Force 2, Melee 2, Stamina 1 | True Grit | CAF Armor | | Ebb Channeller | `ebb_user` | Ebb 3, Insight 1, Persuasion 1 | Ebb Sensitive | Downtown Jacket | Ebb Channeller gives race-differentiated starting formulae: - **Ebon:** Empathic Pulse, Danger Sense, Mind-Link, Calm, Ebb Shield, Ebb Sight, Surge - **Brain Waster:** Ebb Bolt, Heat Touch, Surge, Push, Empathic Pulse, Ebb Shield, Iron Flesh --- ## NPC Archetypes 10 archetypes in `SLA_NPC_TYPES` (used by `SLANPCCreator`): | Archetype | Threat | HP | Armor | |-----------|--------|----|-------| | Civilian | 1 | 4 | 0 | | Gang Grunt | 1 | 5 | 1 | | Shiver (Patrol) | 2 | 6 | 2 | | SLA Operative (Green) | 2 | 5 | 2 | | Carrien | 2 | 7 | 1 | | SLA Operative (Veteran) | 3 | 8 | 3 | | Ebb Operative (Ebon) | 3 | 6 | 1 | | Dept. of Propaganda Agent | 3 | 6 | 2 | | Dark Finder | 4 | 10 | 4 | | *(10th not captured in this read)* | — | — | — | --- ## Core Roll Mechanics ### Dice Pool - Roll **Attribute + Skill** d6s (plus Gear Bonus for weapons) - **Success** = 6 on any die - Count total successes (each 6 = 1 success) - 0 successes = failure ### Stress Dice - `stress` value adds that many d6s to every roll - 1s on stress dice = **Banes** (tracked, can trigger panic) - Stress increases on push; some drugs/drugs-withdrawal affect stress ### Push - After a failed roll, player may push (re-roll non-6, non-1 dice) - **Cost:** +1 Stress - **Brain Wasters:** pushing risks catastrophe result - Results formatted with `_formatYZEResult` and displayed in chat card ### Armor Check - Triggered when character takes damage - Roll **armorDice** d6s, subtract **AP** from dice pool first - Successes reduce damage 1:1 - `armorAuto` = automatic damage reduction (no roll needed) - Called via `_promptAndRollArmorCheck` → `_rollArmorCheck` ### Weapon Rolls - **Ranged:** AGI + Marksmanship + Gear Bonus - **Melee:** STR + Melee + Gear Bonus - Fire modes: single, burst, full-auto (different ammo costs) - `autoAmmoUse`: ammo consumed on full-auto (default 8) - Bullet Tax auto-applied after session (tracked in `finances.bulletTax`) ### Ebb Rolls - Roll **EMP + Ebb Skill** d6s - Need `successes` threshold from formula item - Flux cost deducted from `flux.value` - Catastrophe text displayed on roll if applicable - Disciplines: awareness, blast, communicate, enhance, heal, protect, realityFold, senses, telekinesis, thermal --- ## Conditions (SLA_CONDITIONS) 14 registered status effects, auto-applied via `applyCondition` or Token HUD: | ID | Label | Penalty | |----|-------|---------| | `sla-bleeding` | Bleeding | -1 HP/turn | | `sla-stunned` | Stunned | -3 all dice, clears end of turn | | `sla-pinned` | Pinned | -2 melee/marksmanship/mobility | | `sla-suppressed` | Suppressed | -2 all dice | | `sla-on-fire` | On Fire | -2+ HP/turn (escalating), -1 all dice | | `sla-blinded` | Blinded | -3 ranged/observation, -2 melee | | `sla-deafened` | Deafened | -1 observation | | `sla-broken` | Broken | -2 all dice, must roll Stamina to act | | `sla-winded` | Winded | -1 all dice, clears end of round | | `sla-broken-arm` | Broken Arm | -2 Melee, -1 Marksmanship, -1 Force | | `sla-broken-leg` | Broken Leg | -2 Mobility, -1 Stealth | | `sla-concussed` | Concussed | -1 all, extra -1 Observation/Wits | | `sla-gut-wound` | Gut Wound | -2 all dice | | `sla-panicking` | Panicking | -2 all dice, cannot act normally | | `sla-shaken` | Shaken | -1 all dice | Condition dice penalties are applied via `_getConditionModifiers(actor, {skill, attribute})` and reflected in every roll. --- ## Tables (tables-data.json) | Table | Formula | |-------|---------| | Panic | 1d6 + Stress | | Physical Critical | 1d66 | | Mental Critical | 1d66 | | Ranged Critical Fail | 1d6 | | Melee Critical Fail | 1d6 | --- ## Equipment Packs ### Armors (6) | Name | AR | Dice | Auto | |------|----|------|------| | Downtown Jacket | 1 | 1 | 0 | | CAF Armor | 2 | 2 | 1 | | Scout Armor | 3 | 3 | 1 | | HARD Armor | 4 | 4 | 2 | | Exo-Rig Armor | 5 | 5 | 2 | | Squad Shielded Power Armor | 6 | 6 | 3 | ### Drugs (7) | Name | HP | Resolve | Str | Panic Red | |------|----|---------|----|-----------| | Painkillers | 0 | +1 | 0 | 0 | | Stimulant | 0 | +1 | +1 | 0 | | Sedative | 0 | +2 | 0 | 0 | | Redline | +1 | -2 | +2 | 0 | | Calm-Line | 0 | +2 | 0 | +2 | | Rush | +1 | -1 | +1 | 0 | | UV (Ultra-Violence) | +2 | -3 | +2 | 0 | All drugs track active/withdrawal states with separate modifier sets. ### Specialties (16 in system pack) Categories: combat, investigation, social, medical, ebb, racial, survival | Name | Category | Package | |------|----------|---------| | Sniper | combat | Scout | | Fast Reflexes | combat | Scout | | Inquisitive | investigation | Investigator | | Gut Feeling | investigation | Investigator | | Hard Hitter | combat | Frother | | True Grit | survival | Frother | | Menacing | social | Corporate | | Compassion | social | Corporate | | Field Surgeon | medical | Medic | | Healer | medical | Medic | | Ebb Sensitive | ebb | Ebon - Any | | Ebb Fury | ebb | Brain Waster - Operative | | Code of Honor | racial | Shaktar | | Cold Adapted | racial | Wraith Raider | | Regeneration | racial | Stormer | | Combat Drug User | racial | Frother | ### Ebb Formulae (30) | Discipline | Formulae | |-----------|---------| | Awareness | Empathic Pulse (1), Precognition (2), Danger Sense (2) | | Blast | Ebb Bolt (1), Hellfire (2), Ebb Storm (3) | | Communicate | Mind-Link (1), Broadcast (2), Compel (2) | | Enhance | Surge (1), Iron Flesh (2), Heightened State (3) | | Heal | Mend (1), Restore (2), Calm (1) | | Protect | Ebb Shield (1), Ward (2), Phase Shell (3) | | RealityFold | Blink (2), Fold Space (3), Phase Through (3) | | Senses | Ebb Sight (1), Mind's Eye (1), Remote View (2) | | Telekinesis | Push (1), Grip (2), Levitate (2) | | Thermal | Heat Touch (1), Flame Burst (2), Freeze (2) | *(Numbers in parentheses = Flux cost)* --- ## Sheets ### Registered Sheets | Class | Type | Label | Default | |-------|------|-------|---------| | `ZeroEngineActorSheet` | character + npc | Zero Engine Character Sheet | Yes | | `ZeroEngineActorSheetMk2` | character only | Zero Engine — Mk2 (Dark) | No | | `ZeroEngineItemSheet` | all items | Zero Engine Item Sheet | Yes | ### Mk1 Sheet Tabs (character-sheet.hbs) Stats, Combat, Inventory, Mods, Bio — via `templates/actor/character/sheet-tabs/` ### Mk2 Sheet (ZeroEngineActorSheetMk2) Dark-themed variant extending `ZeroEngineActorSheet`. Uses `character-sheet-mk2.hbs`. Full SLA Borg font/dark palette. --- ## PC Creator Wizard (`SLAPCCreator`) Multi-step Application launched from Actor Directory. Steps: 1. Choose race (8 options with flavor text) 2. Allocate attribute points (race-specific pool and caps) 3. Choose training package (some race-restricted, e.g. Ebb Channeller = Ebon/Brain Waster only) 4. Allocate skill points (race-specific pool, cap 3) 5. Random name generation (race-keyed name tables) 6. Confirm & create actor with all embedded items Racial abilities auto-embedded via `_ensureRacialAbilities` on actor creation when race is set. --- ## NPC Creator (`SLANPCCreator`) Two modes: **Quick** (pick archetype, auto-fill stats) and **Full** (manual stat entry). Generates NPC actor with appropriate weapons, armor, and attributes. --- ## Hooks Registered | Hook | Purpose | |------|---------| | `init` | Register sheets, Handlebars helpers, SLA conditions setup trigger | | `setup` | Register `SLA_CONDITIONS` as Foundry status effects | | `ready` (×3) | DiceSoNice skin, PC creator button in Actor Directory, world clock | | `createCombatant` | Auto-initiative handling | | `renderCombatTracker` | Custom combat UI additions | | `diceSoNiceReady` | Register custom SLA Borg d6 dice skin | | `renderChatMessageHTML` | Post-roll push buttons, apply damage buttons | | `preUpdateActor` | Guard recalc triggers | | `createActor` | Auto-derive stats + racial abilities | | `updateActor` (×2) | Recalc derived stats; handle race change → racial abilities | | `createItem` / `updateItem` / `deleteItem` | Recalc derived stats (armor/drug/specialty mods) | | `createActiveEffect` / `updateActiveEffect` / `deleteActiveEffect` | Recalc derived stats | | `renderActorDirectory` | Inject "New SLA Operative" PC creator button | | `updateWorldTime` | Shift Ledger world clock integration | | `combatTurnChange` | Per-turn condition ticks (bleeding, on fire, etc.) | | `renderTokenHUD` | Condition toggle buttons in token HUD | | `pauseGame` | Custom SLA pause animation | --- ## Modules All modules are standalone FormApplication/Application classes targeting the `zero-engine` system. ### sla-bpn-dispatch (v0.3.0) Generates random BPN briefings using SLA mission colour logic (blue/green/red/silver/gold/black). Builds contact name, objectives, scenario frame, reward package. Creates GM debrief journal entry. Integrated into Actor Directory. ### sla-briefing-desk (v0.1.0) Mission briefing composer. Draft saved to world settings. Renders HTML briefing and creates journal entry. Adds button to Journal Directory. ### sla-gear-cache (v0.1.0) Generates ammo caches, med packs, breach kits, requisition bundles. Adds generated items directly to selected actor. Adds button to Actor Directory. ### sla-npc-director (v0.1.0) Tracks NPC morale, suppression, stance, and intent. Reads from current combatants or selected tokens. Saves state to world settings. Accessible from Combat Tracker, Actor Directory, and Settings. ### sla-ops-clock (v0.1.0) Tracks mission tempo: operation clock, heat, collateral, pressure. Posts player-facing updates to chat. State saved to world settings. Adds button to Scene Directory. ### sla-shift-ledger (v0.2.0) Full campaign time tracker. Manages: day/week/shift progression, actor duty schedules, housing tiers (with weekly cost calculation), living cost ledger. `SlaCampaignClockApp` application. Integrates with `updateWorldTime` hook. --- ## World Compendium Packs (SLA_Industries world) | Pack Name | Type | Contents | |-----------|------|----------| | `specialities` | Item | World-level specialty items (LevelDB) | | `sla-specialties` | Item | SLA specialty items (LevelDB) | | `sla-weapons` | Item | SLA weapon items (LevelDB) | --- ## Known Issues / Notes for Development - `template.json` still lists `vehicle` as an actor type in world notes but is not in the schema `types` array — vehicle sheet exists as a template but is not formally registered as an actor type. - Ebb `flux.max` is computed dynamically (Ebb skill + 1) rather than stored; `flux.value` is stored. - `race` field is typed as `Array` in `template.json` but consumed as a string throughout the code (`race[0]` with fallback). This is a legacy inconsistency. - Bullet Tax tracks `ammoSpentSession` on the actor and applies costs at rest. - `blade-runner.css` / `blade-runner.js` are present but not loaded — legacy files from the base YZE system. - `lang/` contains de, en, es, fr, ko, pl — only en is actively maintained for SLA content. - DiceSoNice skin registered as `sla-borg-d6` using custom SFX config at `assets/plugins/dice-so-nice/`.