Files
dwroller/database/scripts/update_vesalius_echo_theta92.js

458 lines
20 KiB
JavaScript

const { missionHelpers, pool } = require('../mariadb');
const missionTitle = 'Vesalius Echo: Theta-92';
const storyFlags = [
'malachiel_freed',
'vorn_rescued',
'safe_prisoners_rescued',
'tyrant_horror_released',
'nurgle_lieutenant_revealed',
'theta92_coordinates_recovered',
'bile_escape_vector_detected',
'emergency_resupply_requested'
];
const canon = {
primaryVillain: 'Fabius Bile',
chaosTheme: 'Nurgle corruption has infected part of the experiment chain through Apothecary Morbus Threx.',
nurgleLieutenant: {
name: 'Apothecary Morbus Threx',
role: 'Corrupted former Apothecary working under Bile.',
secret: "He used Nurgle rites and plague-biotech to accelerate Bile's experiments, making them more stable, infectious, and horrifying than normal gene-work should allow.",
relationshipToBile: 'Bile sees Threx as useful but dangerous. Threx believes decay, disease, and forced adaptation are the true path to perfecting flesh.'
},
voidInstabilitySource: {
source: 'A trapped psyker inside the vault.',
effect: 'The psyker torment caused void-vox anomalies, unstable reality pockets, equipment disruption, jump pack failures, and displacement incidents.',
chaosLink: 'The psyker did not intentionally serve Chaos, but the suffering created a breach that Nurgle corruption exploited.'
},
nextMissionSeed: {
title: 'THETA-92: The Infested World',
hiddenTruth: 'The target planet is Tyranid-infested, and Bile or his agents are experimenting with Tyranid biology under Nurgle-corrupted conditions.',
opening: 'The Kill-team pursues the escape craft and receives emergency resupply mid-transit or on approach.'
}
};
const squadTacticsCheck = {
name: 'Squad Tactics',
skill: 'Tactics',
characteristic: 'Int',
target: 45,
modifier: 0,
rulesNote: 'Core: Tactics is an Advanced Intelligence Skill with groups such as Assault Doctrine, Defensive Doctrine, Orbital Drop Procedures, and Recon and Stealth. It gives tactical reading/positioning; it does not grant free Cohesion or Squad Mode abilities.',
reward: 'On success, the Kill-team identifies the best tactical approach for this scene; extra Degrees of Success may reveal a safer route, priority threat, ambush vector, or better position.',
};
function withSquadTactics(scene) {
const checks = Array.isArray(scene.checks) ? scene.checks : [];
if (checks.some(check => String(check.name || '').toLowerCase() === 'squad tactics')) return scene;
return { ...scene, checks: [squadTacticsCheck, ...checks] };
}
const scenes = [
{
title: 'The Living Vault',
type: 'investigation_rescue',
mood: 'After the lab fight, the next chamber is not a debrief. It is a living vault, a prison, and a transmitter.',
description: 'Bag laboratoriets sidste barrikade åbner et rum sig, der ikke føles bygget, men dyrket. Glasbeholdere, stasis-kister og sorte kabler hænger som årer fra loftet. Inde i vaulten bevæger noget sig stadig. Ikke alt er dødt. Ikke alt er menneskeligt. Midt i det hele står Brother Malachiel, fanget i et felt af runer, bio-kabler og psykisk støj.',
readAloud: 'Bag laboratoriets sidste barrikade åbner et rum sig, der ikke føles bygget, men dyrket. Glasbeholdere, stasis-kister og sorte kabler hænger som årer fra loftet. Inde i vaulten bevæger noget sig stadig. Ikke alt er dødt. Ikke alt er menneskeligt. Midt i det hele står Brother Malachiel, fanget i et felt af runer, bio-kabler og psykisk støj.',
objectives: [
'Secure the vault after the laboratory combat.',
'Free or stabilize Brother Malachiel.',
'Determine which prisoners are safe and which are latent bio-horrors.',
'Discover that the vault is also a transmitter.'
],
checks: [
{
name: 'Stabilize Malachiel',
skill: 'Psyniscience',
characteristic: 'Wp',
target: 55,
modifier: 0,
reward: 'Malachiel is freed without psychic backlash.'
},
{
name: 'Read the prisoners',
skill: 'Scrutiny',
characteristic: 'Per',
target: 45,
modifier: 0,
reward: 'The team identifies which prisoners are safe.'
},
{
name: 'Decode vault function',
skill: 'Tech-Use',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'The team learns the vault is transmitting to THETA-92.'
}
],
specialPlayerOptions: [
'The Chaplain may test faith, fear, guilt, or corruption among prisoners.',
'Malachiel, once freed, may use Librarian senses to detect which captives are warp-tainted.',
'The Apothecary may identify Nurgle plague-biotech in the sample tissue.',
'The Techmarine may isolate the vault transmitter.'
],
enemies: [
{
name: 'Chaos-Infected Tyrant Horror',
type: 'nurgle_tyranid_horror',
count: 1,
trigger: 'Appears if the team releases prisoners carelessly or fails the corruption check.',
description: 'A prisoner or sample body erupts into a Tyranid-like horror carrying Nurgle corruption.',
wounds: 22,
ws: 45,
bs: 0,
ap: 4,
damage: '1d10+7 R Pen 3 Toxic (1)',
agBonus: 4,
fear: 1
}
],
combat: {
enemy: 'Chaos-Infected Tyrant Horror',
weapon: 'Rending talons',
ws: 45,
bs: 0,
modifier: 0,
damage: '1d10+7',
targetTB: 4,
targetArmour: 4,
mode: 'single',
rof: 1
},
complications: [
'Failure on Stabilize Malachiel causes psychic feedback and worsens the vault timer.',
'Failure on Read the prisoners means a prisoner later mutates into a Tyrant Horror.',
'The trapped psyker is the source of the void-vox anomalies and earlier displacement events.',
'The psyker is not a willing servant of Chaos, but the suffering created a breach Nurgle corruption exploited.'
],
rewards: { xp: 75, rp: 1 },
extraChallenges: [
{ id: 'malachiel-clean-freed', text: 'Free Malachiel without severe psychic backlash.', rewardType: 'xp', rewardValue: 75, completed: false },
{ id: 'identify-infected-prisoners', text: 'Correctly identify infected prisoners before releasing them.', rewardType: 'renown', rewardValue: 1, completed: false }
],
storyFlags: ['malachiel_freed', 'tyrant_horror_released', 'theta92_coordinates_recovered'],
outro: 'Vaultens sidste puls bliver til et koordinatglimt: THETA-92 // ACTIVE // RECEIVING.',
revealed: false
},
{
title: 'Prisoner Signal',
type: 'social_horror_choice',
mood: 'A weak vox-call offers survivors, bait, and a moral cost under a tightening escape timer.',
description: "Mens vaultens sidste systemer dør, skærer en svag vox-kanal gennem alarmstøjen. Først statisk. Så hosten. Så en stemme. 'Imperial signal... hvis nogen hører dette... vi er stadig i live. Ikke mange. Ikke længe.' Kortet opdaterer: SPECIMEN HOLDING ligger tæt på jeres flugtrute.",
readAloud: "Mens vaultens sidste systemer dør, skærer en svag vox-kanal gennem alarmstøjen. Først statisk. Så hosten. Så en stemme. 'Imperial signal... hvis nogen hører dette... vi er stadig i live. Ikke mange. Ikke længe.' Kortet opdaterer: SPECIMEN HOLDING ligger tæt på jeres flugtrute.",
objectives: [
'Decide whether to spend time rescuing prisoners.',
'Find Magos-Biologis Ceryx Vorn.',
'Avoid releasing infected Tyrant Horrors.',
'Learn that Vesalius was transport, not the source.'
],
checks: [
{
name: 'Open specimen holding safely',
skill: 'Tech-Use',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'The cells open without killing support systems or waking every bio-weapon.'
},
{
name: 'Triage safe prisoners',
skill: 'Medicae',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'The team identifies which prisoners can be moved and which are contaminated.'
},
{
name: 'Hold prisoner panic under control',
skill: 'Command',
characteristic: 'Fel',
target: 45,
modifier: 0,
reward: 'The survivors move fast enough that the escape timer does not worsen.'
}
],
importantNpc: {
name: 'Magos-Biologis Ceryx Vorn',
role: 'Survivor and witness',
information: [
'Vesalius was not the source of the experiments.',
'The ship was transporting refined samples toward THETA-92.',
'A corrupted Apothecary named Morbus Threx introduced plague-stabilizing agents into the gene-vats.',
'The Nurgle contamination made the organisms more resilient but less controllable.'
]
},
enemies: [
{
name: 'Chaos-Infected Tyrant Horror',
type: 'biomorphic_prisoner_trap',
count: 1,
wounds: 20,
ws: 42,
bs: 0,
ap: 3,
damage: '1d10+6 R Pen 3',
agBonus: 4,
fear: 1
}
],
combat: {
enemy: 'Chaos-Infected Tyrant Horror',
weapon: 'Bone talons',
ws: 42,
bs: 0,
modifier: 0,
damage: '1d10+6',
targetTB: 4,
targetArmour: 3,
mode: 'single',
rof: 1
},
complications: [
'Every extra round spent here tightens the escape timer.',
'If the biomorphic trap is missed, one prisoner becomes a Fear 1 attacker.',
"If Vorn survives, he reveals that Bile's work has been altered by Nurgle corruption.",
'This is a dilemma: saving people costs time, but abandoning Vorn loses the clearest Morbus Threx clue.'
],
rewards: { xp: 100, rp: 1 },
extraChallenges: [
{ id: 'vorn-rescued', text: 'Extract Magos-Biologis Ceryx Vorn alive.', rewardType: 'xp', rewardValue: 100, completed: false },
{ id: 'safe-prisoners-rescued', text: 'Rescue four or more safe prisoners.', rewardType: 'renown', rewardValue: 1, completed: false }
],
storyFlags: ['vorn_rescued', 'safe_prisoners_rescued', 'nurgle_lieutenant_revealed', 'tyrant_horror_released'],
outro: 'Vorns stemme er metallisk og ødelagt: "Vesalius var kun transporten. Threx gjorde dem stabile. Bile sendte dem videre."',
revealed: false
},
{
title: 'Engine Shrine Sabotage',
type: 'puzzle_combat',
mood: 'The reactor is protected by living Nurgle-infected growth. Shooting it is not enough. Burning it alone is not enough.',
description: 'Motorsektionen føles ikke som et maskinrum. Den føles som et kapel bygget af kød og stål. Plasmaledninger hænger som tarme fra loftet. Tre reaktorkerner står i midten, hver omviklet af sortgrønt organisk væv. Når I nærmer jer, åbner vævet små munde og ånder varm, syg damp ud over gulvet.',
readAloud: 'Motorsektionen føles ikke som et maskinrum. Den føles som et kapel bygget af kød og stål. Plasmaledninger hænger som tarme fra loftet. Tre reaktorkerner står i midten, hver omviklet af sortgrønt organisk væv. Når I nærmer jer, åbner vævet små munde og ånder varm, syg damp ud over gulvet.',
objectives: [
'Destroy the engine shrine so Vesalius cannot be repaired.',
'Solve the Threefold Purge: cold, chemical purge, then fire/plasma.',
'Plant charges on the exposed reactor cores.',
'Survive or outrun the defenders released by the shrine.'
],
puzzleName: 'The Threefold Purge',
puzzleLogic: {
coreRule: 'The bio-growth must be broken by combining cold, chemical purge, and fire/plasma in the correct sequence.',
wrongSolutions: [
'Only shooting the growth causes it to split and regenerate.',
'Only burning the growth makes it release toxic spores.',
'Only freezing/cooling it makes it harden around the reactor core.'
],
correctSequence: [
'Cool the growth using reactor coolant or ruptured coolant lines.',
'Apply chemical purge from nearby canisters or Mechanicus sterilant tanks.',
'Burn or overload it with plasma/fire while it is brittle and chemically exposed.'
]
},
interactiveElements: [
{ name: 'Coolant Line', use: 'Freezes or hardens the growth temporarily.', skill: 'Tech-Use or Strength', target: 40 },
{ name: 'Sterilant Canisters', use: 'Weakens the plague membrane after cooling.', skill: 'Medicae, Tech-Use, or Ballistic Skill to shoot canister accurately', target: 45 },
{ name: 'Plasma Vent', use: 'Burns exposed growth and opens the core for demolition charges.', skill: 'Tech-Use or Demolition', target: 45 }
],
checks: [
{
name: 'Rupture or redirect coolant line',
skill: 'Tech-Use',
characteristic: 'Int',
target: 40,
modifier: 0,
reward: 'The growth becomes brittle for one round.'
},
{
name: 'Apply sterilant purge',
skill: 'Medicae',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'The plague membrane weakens after cooling.'
},
{
name: 'Open plasma vent and plant charges',
skill: 'Demolitions',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'All three charges are planted and Vesalius cannot be repaired.'
}
],
skillChallenge: {
goal: '5 successes before 3 failures',
successResult: 'All three charges are planted and Vesalius cannot be repaired.',
failureResult: 'The reactor vents plasma: 1d10+4 Energy Pen 3 or lost escape time.',
at2Failures: 'Two Gland Hounds or Tyrant Horrors enter the shrine.'
},
enemies: [
{
name: 'Gland Hound',
type: 'bio-hound',
count: 2,
wounds: 18,
ws: 40,
bs: 0,
ap: 2,
damage: '1d10+5 R Pen 2 Toxic (1)',
agBonus: 5
},
{
name: 'Chaos-Infected Tyrant Horror',
type: 'nurgle_tyranid_horror',
count: 1,
wounds: 22,
ws: 45,
bs: 0,
ap: 4,
damage: '1d10+7 R Pen 3 Toxic (1)',
agBonus: 4,
fear: 1
},
{
name: 'Nurgle Plague-Servitor',
type: 'plague_servitor',
count: 1,
wounds: 16,
ws: 35,
bs: 25,
ap: 5,
damage: '1d10+4 I Pen 2 Toxic (1)',
agBonus: 2,
optional: true
}
],
combat: {
enemy: 'Gland Hound',
weapon: 'Bite',
ws: 40,
bs: 0,
modifier: 0,
damage: '1d10+5',
targetTB: 4,
targetArmour: 2,
mode: 'single',
rof: 1
},
complications: [
'Skill challenge: 5 successes before 3 failures.',
'Wrong sequence regenerates, spores, or hardens the growth.',
'Failure causes 1d10+4 Energy Pen 3 or lost escape time.',
'At 2 failures, two Gland Hounds or Tyrant Horrors enter the shrine.'
],
rewards: { xp: 100, rp: 1 },
extraChallenges: [
{ id: 'threefold-purge-solved', text: 'Solve the purge puzzle without reaching 3 failures.', rewardType: 'xp', rewardValue: 100, completed: false },
{ id: 'no-escape-delay', text: 'Leave the engine shrine without reducing the escape timer.', rewardType: 'renown', rewardValue: 1, completed: false }
],
storyFlags: ['emergency_resupply_requested'],
outro: 'Kølingen rammer først. Sterilanten hvæser bagefter. Plasmaen gør resten. Under jer begynder Vesalius at dø.',
revealed: false
},
{
title: 'The Theta Escape Vector',
type: 'briefing_hook',
mood: 'No calm debrief. Vesalius burns behind them while a small craft flees toward THETA-92.',
description: "Vesalius brænder bag jer, men sejren når aldrig at blive stille. Voxen knitrer fra jeres skib: 'Kill-team, void-augur har kontakt. Lille craft. Ingen imperial ident-kode. Kurs væk fra Vesalius.' Hololithen tegner en tynd rød linje gennem tomrummet mod en nærliggende planet. På skærmen står kun én markør: THETA-92 // ACTIVE // RECEIVING.",
readAloud: "Vesalius brænder bag jer, men sejren når aldrig at blive stille. Voxen knitrer fra jeres skib: 'Kill-team, void-augur har kontakt. Lille craft. Ingen imperial ident-kode. Kurs væk fra Vesalius.' Hololithen tegner en tynd rød linje gennem tomrummet mod en nærliggende planet. På skærmen står kun én markør: THETA-92 // ACTIVE // RECEIVING.",
objectives: [
'Confirm the escape vector.',
'Choose whether to pursue immediately.',
'Record what was recovered: Malachiel, prisoners, Vorn, sample data, or corrupted tissue.',
'Request emergency resupply to be sent after the Kill-team.'
],
checks: [
{
name: 'Confirm escape vector',
skill: 'Awareness',
characteristic: 'Per',
target: 45,
modifier: 10,
reward: 'The void-augur track confirms a small craft fleeing toward THETA-92.'
},
{
name: 'Lock pursuit solution',
skill: 'Navigation',
characteristic: 'Int',
target: 45,
modifier: 0,
reward: 'The Kill-team can pursue immediately without waiting for full command clearance.'
},
{
name: 'Request moving resupply',
skill: 'Command',
characteristic: 'Fel',
target: 45,
modifier: 10,
reward: 'A Thunderhawk, drop pod, or support craft is dispatched after them during pursuit.'
}
],
bileMessageOptional: {
useIfNeeded: true,
message: "En forvrænget stemme bryder kort gennem voxen. 'I ødelagde et bur. Ikke dyret. Kom bare efter mig, Astartes. THETA-92 har allerede åbnet sig.'",
purpose: 'Bile is not just bragging. He is baiting them toward a prepared situation.'
},
nextMissionHook: [
'The planet appears cold, remote, and officially unimportant.',
'The auspex briefly registers impossible bio-signatures before static kills the feed.',
'The Kill-team does not yet know the planet is Tyranid-infested.',
'Command cannot wait for full resupply. A support craft will be dispatched after them.'
],
complications: [
'Do not run this as a calm debrief.',
'The stronger hook is the detected escape vector, not a long villain monologue.',
'Seed Tyranid infestation only as impossible bio-signatures before static kills the feed.',
'Resupply is not safe at base; it is sent after them while they continue toward the planet.'
],
rewards: { xp: 50, rp: 1 },
extraChallenges: [
{ id: 'pursuit-priority-recorded', text: 'Choose and record a clear pursuit/intel priority for THETA-92.', rewardType: 'xp', rewardValue: 50, completed: false },
{ id: 'strategic-edge-report', text: 'Frame the report so Deathwatch command gains a strategic edge.', rewardType: 'renown', rewardValue: 1, completed: false }
],
storyFlags: ['theta92_coordinates_recovered', 'bile_escape_vector_detected', 'emergency_resupply_requested'],
outro: 'Der er ingen tid til hvile. THETA-92 modtager stadig. Et lille fartøj løber foran jer. Resupply må indhente jer under jagten.',
revealed: false
}
];
(async function main() {
const existing = (await missionHelpers.getAll()).find(m => m.name === missionTitle);
if (!existing) {
throw new Error(`Mission not found: ${missionTitle}`);
}
const ok = await missionHelpers.update(existing.id, {
name: existing.name,
theme: 'chaos_biotech_nurgle_theta92',
sceneCount: scenes.length,
enemyCount: 4,
threatLevel: 'High',
playerCount: existing.player_count || 4,
scenes: scenes.map(withSquadTactics).map(scene => ({ ...scene, missionCanon: canon, missionStoryFlags: storyFlags }))
});
if (!ok) throw new Error(`Failed to update mission ${existing.id}`);
console.log(JSON.stringify({
status: 'updated',
id: existing.id,
name: existing.name,
active: existing.is_active,
sceneCount: scenes.length,
sceneTitles: scenes.map(scene => scene.title),
storyFlags
}, null, 2));
await new Promise(resolve => setTimeout(resolve, 250));
await pool.end();
})().catch(async error => {
console.error(error);
try { await pool.end(); } catch {}
process.exit(1);
});