XRef Tables — Review Matrix¶
STATUS: PROPOSED — NOT IMPLEMENTED. Verified 2026-08-27.
The three cross-reference tables specified here —
enemy_biomes,card_eligible_classes,card_eligible_factions— appear in zero source or SQL files. This is an April 2026 schema proposal that was never built.
Branch: feat/xref-tables
Context: Three join tables being added to replace single-FK eligibility with many-to-many:
- enemy_biomes — which biomes an enemy can appear in
- card_eligible_classes — which classes can receive a card as a reward/shop offer
- card_eligible_factions — which factions can include a card in their run pool
Semantics (empty join table = eligible for all)
An enemy with no enemy_biomes entries appears in every biome (fallback behaviour preserved).
A card with no card_eligible_classes entries is available to every class.
A card with no card_eligible_factions entries is available in every faction's run.
1. Enemy → Biome Matrix¶
Biome keys: submerged-archive · sunblasted-ruin · machine-sanctuary
Initial seeding mirrors the existing name-keyword logic. Multi-biome entries are possible and encouraged for future cross-over enemies.
| Enemy | Type | AssetId | GUID suffix | Sub-Archive | Sun-Ruin | Mach-Sanct | Notes |
|---|---|---|---|---|---|---|---|
| Needlefin Archivist | Minion | 2002 | ...11 |
✓ | |||
| Choir Eel | Minion | 2003 | ...12 |
✓ | |||
| Brine Pike | Minion | 2050 | ...15 |
✓ | |||
| Archive Custodian | Elite | 2005 | ...13 |
✓ | |||
| Archive Breach Core | Boss | 2006 | ...14 |
✓ | |||
| Ash Scavenger | Minion | 2007 | ...21 |
✓ | |||
| Sand Shark | Minion | 2008 | ...22 |
✓ | |||
| Glassback Jackal | Minion | 2009 | ...25 |
✓ | |||
| Ward Captain | Elite | 2010 | ...23 |
✓ | |||
| Ruin Sovereign | Boss | 2011 | ...24 |
✓ | |||
| Lattice Sentry | Minion | 2012 | ...31 |
✓ | |||
| Calibration Hound | Minion | 2013 | ...32 |
✓ | |||
| Servo Manta | Minion | 2014 | ...35 |
✓ | |||
| Calibration Overseer | Elite | 2015 | ...33 |
✓ | |||
| Control Chamber Core | Boss | 2016 | ...34 |
✓ |
Tutorial enemies (Valerii campaign): no biome assignments yet. These are campaign-only and don't appear in QuickPlay biome pools. Assign when QuickPlay cross-faction content is added.
Design questions to resolve:
- [ ] Should any enemies span multiple biomes? (e.g. a generic enemy type that fit both ruin AND archive)
- [ ] Void-Stalker variants (Tutorial) — assign to a future void-realm biome when QuickPlay adds it?
2. Card → Eligible Classes Matrix¶
Cards with no entries = eligible for all classes (blank = universal).
Cards with entries = restricted to listed classes only.
Initial seeding is derived from the existing singleClassIdFK.
| Card | AssetId | Anchor | Drifter | Conduit | Machinist | Catalyst | Faction Gated | Notes |
|---|---|---|---|---|---|---|---|---|
| Neutral / Shared pool | ||||||||
| Shield Challenge | 1000 | Valerii | No class restriction | |||||
| Stand Between | 1001 | Valerii | No class restriction | |||||
| Ablative Drone | 1002 | — | Neutral | |||||
| Ghostwalk Feint | 1003 | ✓ | — | Currently Drifter → class-tied | ||||
| Emergency Shunt | 1004 | — | Neutral | |||||
| Rescue Compound | 1005 | — | Neutral | |||||
| Anchor starter cards | ||||||||
| Foundry Bulwark | 1100 | ✓ | ||||||
| Dense Impact | 1101 | ✓ | ||||||
| Holdfast Array | 1102 | ✓ | ||||||
| Gravemass Advance | 1103 | ✓ | ||||||
| Sinkline Guard | 1104 | ✓ | ||||||
| Drifter starter cards | ||||||||
| Phase Strike | 1200 | ✓ | ||||||
| Flicker Jab | 1201 | ✓ | ||||||
| Dimensional Slip | 1202 | ✓ | ||||||
| Echo Mark | 1203 | ✓ | ||||||
| Tempo Burst | 1204 | ✓ | ||||||
| Conduit starter cards | ||||||||
| Arc Discharge | 1300 | ✓ | ||||||
| Volt Siphon | 1301 | ✓ | ||||||
| Insulation Field | 1302 | ✓ | ||||||
| Plasma Lash | 1303 | ✓ | ||||||
| Flux Tap | 1304 | ✓ | ||||||
| Machinist starter cards | ||||||||
| Repair Drone Bay | 1400 | ✓ | ||||||
| Rivet Burst | 1401 | ✓ | ||||||
| Field Plating | 1402 | ✓ | ||||||
| Caliber Shot | 1403 | ✓ | ||||||
| Machine Spindle | 1404 | ✓ | ||||||
| Catalyst starter cards | ||||||||
| Mutagenic Strike | 1500 | ✓ | ||||||
| Hothouse Surge | 1501 | ✓ | ||||||
| Adaptive Plating | 1502 | ✓ | ||||||
| Unstable Slash | 1503 | ✓ | ||||||
| Chaotic Draw | 1505 | ✓ |
Design questions: - [ ] Should any class-specific cards be cross-class? (e.g. "Rivet Burst" also usable by Conduit?) - [ ] Neutral pool: some are currently unlocked — should they stay that way or get class restrictions added?
3. Card → Eligible Factions Matrix¶
Cards with no entries = available in any faction's run.
Cards with entries = only offered when playing that faction's quest.
Initial seeding derived from existing singleFactionIdFK.
| Card | AssetId | Valerii | Axiom | Syndicate | Censors | Salvari | Notes |
|---|---|---|---|---|---|---|---|
| Valerii faction cards | |||||||
| Shield Challenge | 1000 | ✓ | Also has Valerii FactionId | ||||
| Stand Between | 1001 | ✓ | |||||
| Valerii Shieldwall | 1600 | ✓ | Starter | ||||
| Edict Shield | 1160~? | ✓ | |||||
| Silent Tribunal | — | ✓ | |||||
| Cold Marshal | — | ✓ | |||||
| Axiom faction cards | |||||||
| Syntacta Analysis | 1602 | ✓ | Starter | ||||
| Syndicate faction cards | |||||||
| Aethari Ignition | 1602~ | ✓ | Starter | ||||
| Echo Flare | — | ✓ | |||||
| Crystal Veil | 1606 | ✓ | Starter | ||||
| Censors faction cards | |||||||
| Annalis Recall | 1604~ | ✓ | Starter | ||||
| Echo Strike | — | ✓ | |||||
| Historical Record | 1614 | ✓ | Shop | ||||
| Salvari faction cards | |||||||
| Salvari Salvage | — | ✓ | Starter | ||||
| Borrowed Plate | — | ✓ | |||||
| Neutral cards (no faction gate) | |||||||
| Ablative Drone | 1002 | All factions | |||||
| Emergency Shunt | 1004 | All factions | |||||
| Rescue Compound | 1005 | All factions | |||||
| All class starters | 1100-1504 | All factions |
Design questions: - [ ] Should faction cards also be eligible for alliances with other factions? (e.g. Valerii card available in Axiom run) - [ ] Salvari faction: currently no Salvari starter — is that correct?
4. Implementation Plan¶
Tables being added¶
-- enemy_biomes
CREATE TABLE enemy_biomes (
enemy_id UUID NOT NULL REFERENCES enemies(id) ON DELETE CASCADE,
biome_key VARCHAR(50) NOT NULL,
PRIMARY KEY (enemy_id, biome_key)
);
-- card_eligible_classes
CREATE TABLE card_eligible_classes (
card_id UUID NOT NULL REFERENCES cards(id) ON DELETE CASCADE,
class_id UUID NOT NULL,
PRIMARY KEY (card_id, class_id)
);
-- card_eligible_factions
CREATE TABLE card_eligible_factions (
card_id UUID NOT NULL REFERENCES cards(id) ON DELETE CASCADE,
faction_id UUID NOT NULL,
PRIMARY KEY (card_id, faction_id)
);
Admin UI changes¶
- EnemyEdit: multi-select with fixed options (3 biomes)
- CardEdit: replace
classId/factionIdsingle-selects witheligibleClassIds[]/eligibleFactionIds[]multi-selects
Game logic (follow-up: after admin data is populated)¶
QuickPlayRunService.FilterEnemiesByBiome()→ query fromenemy_biomestable instead of keyword matching- Card reward/shop pool → filter by
card_eligible_classesandcard_eligible_factions