{ "_comment": "THE CLASS LAYER — the classes offered at combat level 5 and the console that hands them out (js/ui/ClassWindow.js over the frozen GameScene; the run's ledger is js/player/ClassState.js, the pure reads are js/player/ClassModel.js). THE DOOR: data/shipScreen.json → level.classAt (5) is the single source of the level a class is earned at — this file never restates it. The console opens when the run crosses that level AND combat goes quiet (no live hostiles, no wave run in flight) and never auto-fires again once a class is on file; closing it without picking DEFERS, and the ship console's CHOOSE YOUR CLASS door re-opens it. CODE OWNS BEHAVIOR, THIS FILE OWNS COPY + NUMBERS: every string, color, frame index and perk number lives here.", "enabled": true, "icons": { "_comment": "The class insignia sheet — assets/images/classes.png is 640×256 = ten 128×128 frames (frame 0 = Vanguard, frame 1 = Wraith; the rest are unassigned seams). The tab chips, the console's big crest and the ship console's class plate all read a class's `frame` below off this one sheet.", "texture": "assets/images/classes.png", "frameWidth": 128, "frameHeight": 128 }, "classes": [ { "id": "vanguard", "label": "VANGUARD", "_comment": "`accent` themes the whole class: its tab (red), the plate rails, the crest frame, the confirm dialog and the lock-in toast. `frame` is the insignia's index in classes.png. `tagline` sits under the crest, `role` is the small line beside it.", "accent": "#ff3a4d", "frame": 0, "role": "ASSAULT FRAME", "tagline": "RAW STRENGTH // BRUTE FORCE", "summary": "The Vanguard prefers raw strength and brute force to defense or trickery.", "overview": [ "A Vanguard does not out-think a fight. He walks into it, takes the hit, and stays standing when the other ship stops firing.", "Two mass cannons where every other hull has one is the whole doctrine: more metal on target, every volley, from the first second. Range is a problem for people who can run — and a Vanguard does not run." ], "bonuses": { "_comment": "The INITIAL bonus the lock-in grants. `skillPoints` banks on the run's ledger (js/player/ClassState.js — saved, re-applied on load; the tree that spends them is the next layer). `perks` are ids into this file's perks table below.", "skillPoints": 5, "perks": [ "dualCannon" ] } }, { "id": "wraith", "label": "WRAITH", "accent": "#a764ff", "frame": 1, "role": "RECON FRAME", "tagline": "MARKSMANSHIP // TRICKERY", "summary": "The Wraith prefers to fight smart against enemies instead of pure force — an expert in marksmanship and trickery.", "overview": [ "A Wraith never aims where an enemy IS. The targeting computer reads the hostile's heading and speed, does the arithmetic the nose never has time for, and puts the bolt where the enemy will BE when it arrives.", "One clean shot instead of three wild ones: less heat, less noise, less of the Wraith there to be shot back at. Let the Vanguard make the noise." ], "bonuses": { "skillPoints": 5, "perks": [ "targetingComputer" ] } } ], "perks": { "_comment": "The perk table — what each initial bonus IS in the combat code (js/combat/CombatSystem.js reads these through js/player/ClassModel.js). Numbers are tuned HERE, never in code: dualCannon.barrels = bolts per volley and barrelOffset = the px each barrel sits off the centreline (both barrels carry the FULL weapon damage, so two barrels is roughly double the shot — that is the Vanguard's point); targetingComputer.maxLead = the longest bolt flight (seconds) the lead solve may commit to, so an unreachable intercept can never snap the nose into nonsense — past the cap it aims at the hostile as it is now.", "dualCannon": { "label": "DUAL CANNON", "note": "Twin mass cannons fire as one — two full-damage bolts per volley from offset barrels.", "barrels": 2, "barrelOffset": 9 }, "targetingComputer": { "label": "ADVANCED TARGETING COMPUTER", "note": "Leading shots: the cannon aims where the hostile WILL be when the bolt lands, not where it is now.", "maxLead": 0.9 } }, "window": { "_comment": "The SELECT YOUR CLASS console (js/ui/ClassWindow.js — the same cabinet as the ship / map / quest consoles: LEFT the looping feed, RIGHT the tab row over one plate). Depth 85: above the other consoles (80), because it owns the moment.", "title": "CLASS SELECT", "meta": "COMBAT LEVEL {classAt} // PICK YOUR PATH", "feedLine": "CLASS DOCTRINE // LV {classAt}", "video": { "_comment": "The left feed — assets/videos/classes.mp4, muted + looping (the same 2:3 contract as ship.mp4). A missing clip leaves the NO SIGNAL plate up and the console still works.", "file": "assets/videos/classes.mp4", "aspect": [ 2, 3 ], "tag": "RECRUITING OFFICE // OPEN CHANNEL", "noSignalTag": "FEED OFFLINE" }, "speech": { "_comment": "Trestle's briefing (assets/speech/trestle/classes.mp3) — played ONCE on the console's first open of the run, with the intro copy up. The clip is always the voice; the video stays muted (the comms' rule). While it talks, music/ambience duck by musicDuck (a fraction of each own volume) and are restored exactly when it ends.", "file": "assets/speech/trestle/classes.mp3", "musicDuck": 0.25 }, "intro": { "_comment": "The state BEFORE any tab is picked: the speaker plate + Trestle's copy on the main plate. `text` is the briefing verbatim; `hint` sits under it while no class is chosen.", "speaker": "TRESTLE", "role": "OUT-OF-SYSTEM MENTOR", "text": "You made it kid, level 5 is no joke. Its time to pick your class. The class you pick is going to define how you survive in this galaxy. Some classes prefer stealth and trickery, while others prefer brute force, or survivability. You can change your class later for a price. But for now, click on the tabs and learn about the available classes, and pick the one that best suits you when you're ready.", "hint": "OPEN A TAB // THEN PICK THE CLASS THAT SUITS YOU", "backLabel": "◂ BRIEFING", "caret": true }, "tabs": { "_comment": "The class tab row (built from `classes` above — one tab per class, in that order). iconSize = the insignia chip drawn beside the label.", "iconSize": 26, "height": 46 }, "classPlate": { "_comment": "A picked tab's plate: the crest (the class frame off classes.png) + name + tagline, the overview paragraphs, then the INITIAL BONUS block (the perk lines + the skill-point line) and the PICK action.", "crestSize": 104, "overviewTitle": "DOCTRINE", "bonusTitle": "INITIAL BONUS", "skillPointsLine": "+{n} SKILL POINTS", "skillPointsNote": "BANKED — THE SKILL TREE ARMS WITH THE NEXT INSTALL", "chosenTag": "LOCKED IN" }, "pick": { "_comment": "The PICK action and its confirmation (js/ui/ConfirmOverlay.js, hosted by the window so it always paints above it, centred on the whole console). Keep line1/line2 SHORT — the dialog sizes itself to its widest line and only steps its font down after that. CONFIRM sets the class, grants the initial bonus and closes the console; CANCEL just closes the dialog. A class already on file makes every tab read inert — changing class is a later layer with a price on it.", "label": "PICK THIS CLASS", "width": 520, "height": 196, "title": "LOCK IN {class}", "line1": "{class} · {perks} · +{skillPoints} SKILL POINTS", "line2": "LOCKED IN FOR THIS RUN — CHANGE CLASS LATER, FOR A PRICE", "confirmLabel": "LOCK IT IN", "cancelLabel": "KEEP LOOKING" }, "alreadyChosenToast": "CLASS ALREADY ON FILE — CHANGING CLASS LANDS LATER", "successToast": "{class} LOCKED IN — {perks} · +{skillPoints} SKILL POINTS", "deferToast": "CLASS NOT CHOSEN — THE SHIP CONSOLE'S CHOOSE YOUR CLASS DOOR REOPENS THIS", "lockSfx": "ui_window", "lockSuccessSfx": "discovery" } }