You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
autohero/scripts/write-npc-migration-034.mjs

210 lines
6.0 KiB
JavaScript

import { readFileSync, writeFileSync } from 'fs';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = join(__dirname, '..');
const snippetPath = join(root, 'scripts/_npc_name_arrays_snippet.sql');
const snippet = readFileSync(snippetPath, 'utf8');
const decl = snippet
.split('\n')
.filter((l) => l.includes('text[] :='))
.join('\n');
const n8 = [
[1, 'Maren Thistlewood'],
[2, 'Finn Marlow'],
[3, 'Asha Kentwell'],
[4, 'Halric Morrow'],
[5, 'Wynn Cartwright'],
[6, 'Orin Aldgate'],
[7, 'Osbert Waynwood'],
[8, 'Liora Selwyn'],
];
const n926 = [
[9, 'npc.brandric_thacker.v1', 'Brandric Thacker'],
[10, 'npc.conrad_pitwright.v1', 'Conrad Pitwright'],
[11, 'npc.nessa_bramble.v1', 'Nessa Bramble'],
[12, 'npc.torin_marshwick.v1', 'Torin Marshwick'],
[13, 'npc.renulf_broadmere.v1', 'Renulf Broadmere'],
[14, 'npc.kael_ironwright.v1', 'Kael Ironwright'],
[15, 'npc.edmund_cinderwell.v1', 'Edmund Cinderwell'],
[16, 'npc.aelith_northgate.v1', 'Aelith Northgate'],
[17, 'npc.dorian_hawke.v1', 'Dorian Hawke'],
[18, 'npc.mariel_starling.v1', 'Mariel Starling'],
[19, 'npc.milo_ropewalk.v1', 'Milo Ropewalk'],
[20, 'npc.lissa_harcourt.v1', 'Lissa Harcourt'],
[21, 'npc.jasper_kindling.v1', 'Jasper Kindling'],
[22, 'npc.kess_wiley.v1', 'Kess Wiley'],
[23, 'npc.aldwin_relicton.v1', 'Aldwin Relicton'],
[24, 'npc.torvik_grimstad.v1', 'Torvik Grimstad'],
[25, 'npc.morna_fenwick.v1', 'Morna Fenwick'],
[26, 'npc.morah_ellis.v1', 'Morah Ellis'],
];
const n27108 = [
[27, 'Sera Whitcomb'],
[28, 'Bram Ashcombe'],
[29, 'Nils Copperton'],
[30, 'Mara Tinwell'],
[31, 'Agnes Stillwater'],
[32, 'Rodrick Cantrell'],
[33, 'Wulfric Strand'],
[34, 'Jada Boltwright'],
[35, 'Alaric Motlow'],
[36, 'Percival Pike'],
[37, 'Eadric Ashenford'],
[38, 'Yoric Scarn'],
[39, 'Rillian Hereward'],
[40, 'Tove Millerson'],
[41, 'Gareth Grantham'],
[42, 'Renulf Sackville'],
[43, 'Bernard Lukin'],
[44, 'Aldwin Grimston'],
[45, 'Edmund Edgerton'],
[46, 'Crispin Aylesford'],
[47, 'Brunhild Flint'],
[48, 'Oren Starward'],
[49, 'Simon Spirewell'],
[50, 'Hugh Comstock'],
[51, 'Yves Portier'],
[52, 'Cedric Brinewell'],
[53, 'Osmund Salter'],
[54, 'Rhys Reedman'],
[55, 'Godfrey Middleton'],
[56, 'Wystan Postlethwaite'],
[57, 'Ivo Ironside'],
[58, 'Roland Rivett'],
[59, 'Lucan Forrest'],
[60, 'Alaric Boghurst'],
[61, 'Norbert Fenwick'],
[62, 'Miles Myreham'],
[63, 'Cuthbert Reed'],
[64, 'Wendel Marsham'],
[65, 'Sigurd Dunstan'],
[66, 'Silas Siltwell'],
[67, 'Peter Sanderson'],
[68, 'Griselda Holt'],
[69, 'Bartholomew Howe'],
[70, 'Baldwin Bonewright'],
[71, 'Cole Aldridge'],
[72, 'Shadrach Morrow'],
[73, 'Rowan Mistwell'],
[74, 'Fergus Fogarty'],
[75, 'Dewi Tarrant'],
[76, 'Vespasian Vale'],
[77, 'Hugo Holloway'],
[78, 'Meredith Stowe'],
[79, 'Roderick Rotherham'],
[80, 'Beatrice Boghurst'],
[81, 'Ashford Hale'],
[82, 'Cyril Cinders'],
[83, 'Emrys Emberly'],
[84, 'Alicia Ashford'],
[85, 'Thorne Hawthorn'],
[86, 'Brian Briarton'],
[87, 'Rowan Rootwell'],
[88, 'Leofric Leaford'],
[89, 'Galfrid Gales'],
[90, 'Wynstan Windham'],
[91, 'Gustav Merseburg'],
[92, 'Blaise Brissot'],
[93, 'Archibald Frostwick'],
[94, 'Rhys Rimer'],
[95, 'Horace Hoarwell'],
[96, 'Isolde Ismay'],
[97, 'Solomon Sunderland'],
[98, 'Clifford Cliffeton'],
[99, 'Craig Cragwell'],
[100, 'Dustin Harwell'],
[101, 'Marshall Fordham'],
[102, 'Rivers Trent'],
[103, 'Bridges Ballard'],
[104, 'Sterling Brook'],
[105, 'Sevrin Veilcourt'],
[106, 'Sterling Starwell'],
[107, 'Neville Nevett'],
[108, 'Vera Veilhart'],
];
function esc(s) {
return s.replace(/'/g, "''");
}
function caseWhen(pairs, col) {
return pairs.map(([id, v]) => ` WHEN ${id} THEN '${esc(v)}'`).join('\n');
}
function caseWhen926() {
const k = n926.map(([id, key]) => ` WHEN ${id} THEN '${esc(key)}'`).join('\n');
const n = n926.map(([id, , name]) => ` WHEN ${id} THEN '${esc(name)}'`).join('\n');
return { k, n };
}
const c926 = caseWhen926();
const sql = `-- Medieval-style personal names for NPCs; generic elders/medics/stalls use per-id keys and pools (frontend/npcGeneratedNames.ts).
DO $$
DECLARE
${decl}
BEGIN
UPDATE public.npcs SET
name_key = 'npc.elder.byid.' || id::text || '.v1',
name = elder_names[1 + ((id * 3) % 20)]
WHERE name_key = 'npc.town_speaker_generic.v1';
UPDATE public.npcs SET
name_key = 'npc.medic.byid.' || id::text || '.v1',
name = medic_names[1 + ((id * 7) % 40)]
WHERE name_key = 'npc.roadside_medic_generic.v1';
UPDATE public.npcs SET
name_key = 'npc.stall.byid.' || id::text || '.v1',
name = stall_names[1 + ((id * 13) % 112)]
WHERE name_key = 'npc.stall_vendor_generic.v1';
END $$;
UPDATE public.npcs SET name = v.n
FROM (VALUES
('npc.capital.merchant_clerk.v1', 'Hugh Pennington'),
('npc.capital.armorer.v1', 'Raoul d''Aubigny'),
('npc.capital.smith.v1', 'Gilles Ferron'),
('npc.capital.jeweler.v1', 'Ysabel Tremaine'),
('npc.capital.bounty_agent_a.v1', 'Roderick Vaughn'),
('npc.capital.bounty_agent_b.v1', 'Matteo Fabbri'),
('npc.capital.elder.v1', 'Anselm Corwyn'),
('npc.capital.healer.v1', 'Clothilde Mercier'),
('npc.capital.second_armorer.v1', 'Bertrand Hale'),
('npc.capital.second_jeweler.v1', 'Eleonore Rivard')
) AS v(k, n)
WHERE public.npcs.name_key = v.k;
UPDATE public.npcs SET name = CASE id
${caseWhen(n8, 'name')}
END
WHERE id BETWEEN 1 AND 8;
UPDATE public.npcs SET
name_key = CASE id
${c926.k}
END,
name = CASE id
${c926.n}
END
WHERE id BETWEEN 9 AND 27;
`;
// Fix: WHERE id BETWEEN 9 AND 26 not 27
const sqlFixed = sql.replace('WHERE id BETWEEN 9 AND 27', 'WHERE id BETWEEN 9 AND 26');
const part27 = `UPDATE public.npcs SET name = CASE id
${caseWhen(n27108, 'name')}
END
WHERE id BETWEEN 27 AND 108;
`;
const out = sqlFixed + '\n' + part27;
writeFileSync(join(root, 'backend/migrations/000034_npc_medieval_names.sql'), out);
console.log('Wrote 000034_npc_medieval_names.sql');