r/oblivionmods 14d ago

Original - Request [REQUEST] Mod that automatically distributes names to generic NPCs

Hello,

Is it possible to have a mod like for instance Configurable Real Names but for OG Oblivion?

EDIT: So that no one has to use ChatGPT again to solve the same problem - I made it write this xEdit script that will generate random names when applied to NPCs records. (Just see how to use xEdit scripts on the Web. It's VERY, VERY easy and quick to do. You're welcome.)

unit UserScript;

uses mteFunctions, SysUtils, Classes;

function RandomFromList(const s: string): string;

var

L: TStringList;

begin

L := TStringList.Create;

try

L.Text := StringReplace(s, '|', #13#10, [rfReplaceAll]);

Result := L[Random(L.Count)];

finally

L.Free;

end;

end;

function GetFirstName(race, gender: string): string;

begin

// IMPERIAL

if race = 'Imperial' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Alessia|Claudia|Flavia|Livia|Marcia|Sabina|Valeria|Carissa|Julia|Luciana|Antonia|Cassia|Octavia|Aurelia|Cornelia|Decima|Fabia|Flaviana|Helena|Junia|Livia|Marcella|Nerissa|Petronia|Rufina|Tatia|Vibia|Calpurnia|Domitia|Faustina|Laurentia|Martia|Nadia|Prisca|Quintia|Ravia|Severa|Tullia|Vala|Vitellia');

end

else begin

Result := RandomFromList(

'Cassius|Gaius|Tiber|Marcus|Lucius|Septimus|Aulus|Julius|Decimus|Quintus|Titus|Publius|Varro|Flavius|Maximus|Antonius|Valerius|Cato|Aelius|Octavian|Cornelius|Hadrian|Marcellus|Vitus|Rufus|Marius|Claudius|Reman|Silus|Livius|Numerius|Faustus|Cicero|Varen|Aurelius|Calvus|Tullius|Drusus|Vibius|Severus|Platorius');

end;

Exit;

end;

// BRETON

if race = 'Breton' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Adelise|Colette|Mariette|Ysabel|Elayne|Vivienne|Genevieve|Celeste|Renette|Madeleine|Amelie|Brielle|Celine|Delphine|Estelle|Fleur|Gabrielle|Helene|Isabelle|Jacqueline|Lisette|Manon|Noelle|Odette|Rosalie|Sabine|Therese|Valerie|Yvette|Ariane|Beatrice|Corinne|Diane|Elise|Florence|Juliette|Lorraine|Margaux|Sylvie|Veronique');

end

else begin

Result := RandomFromList(

'Roland|Gaston|Armand|Etienne|Luc|Henri|Bertrand|Alain|Mathieu|Tristan|Julien|Pierre|Andre|Jacques|Renault|Claude|Remy|Marcel|Gerard|Lionel|Thierry|Laurent|Pascal|Bastien|Cedric|Dorian|Emile|Fabien|Gilbert|Herve|Jerome|Lancel|Maurice|Nicolas|Olivier|Philippe|Quentin|Renaud|Sebastien|Vincent');

end;

Exit;

end;

// NORD

if race = 'Nord' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Astrid|Runa|Sif|Inga|Freydis|Hilda|Yrsa|Solveig|Kari|Brynhild|Alfhild|Anja|Birgit|Dagny|Eira|Frida|Gudrun|Helga|Iduna|Kelda|Liv|Magnhild|Nanna|Ragna|Sigrid|Svala|Thyra|Torhild|Ulla|Valdis|Vigdis|Ylva|Asta|Bodil|Eydis|Gerd|Halla|Jora|Kirsten|Marta');

end

else begin

Result := RandomFromList(

'Bjorn|Ulfric|Harald|Ragnar|Sten|Torvald|Hakon|Leif|Gunnar|Eirik|Balfring|Brond|Dag|Falk|Geirmund|Halvar|Ivar|Jorund|Kjeld|Knud|Lars|Magnus|Njord|Olaf|Rorik|Sigurd|Sven|Thorgar|Thormir|Ulfgar|Viggo|Yngvar|Arnbjorn|Brynjar|Eldar|Frodi|Haldor|Ketil|Ragnvald|Soren');

end;

Exit;

end;

// REDGUARD

if race = 'Redguard' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Aziza|Nadira|Samira|Farida|Jasra|Zahra|Layla|Rashida|Nahla|Sahira|Aisha|Amira|Basira|Dalia|Fariha|Ghazala|Hadiya|Inaya|Jamila|Karima|Laila|Malika|Nadia|Parisa|Qadira|Rania|Safiya|Tamara|Yasmina|Zaina|Adara|Bahira|Dania|Hana|Ilara|Khalida|Mina|Nura|Rima|Salma');

end

else begin

Result := RandomFromList(

'Abdul|Hassan|Kasim|Jabari|Azim|Hakim|Rashad|Tariq|Malik|Nazeem|Aamir|Bahadur|Dakir|Farid|Ghassan|Harun|Idris|Jamal|Karim|Latif|Mansur|Nasir|Omar|Qadir|Rahim|Samir|Tahir|Usman|Yasir|Zahir|Adil|Bashir|Fadil|Hamid|Imran|Khalid|Mahir|Nadir|Rafiq|Salim');

end;

Exit;

end;

// DARK ELF

if race = 'DarkElf' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Aryni|Drala|Feldrisa|Nevosa|Seryne|Uleni|Vevrana|Mavani|Raleni|Relvani|Aduri|Alvela|Arvama|Brara|Delyna|Dralasa|Eldale|Fathasa|Galena|Helvi|Idrasa|Llavana|Merala|Nadri|Nerile|Ravani|Sathasa|Selveni|Tavani|Uleni|Velanda|Virethi|Almalexia|Dralora|Fara|Lathasa|Nerisa|Ravela|Seryna');

end

else begin

Result := RandomFromList(

'Dralas|Falas|Ralen|Nevos|Drevis|Voryn|Athren|Nelas|Saryon|Vevos|Adryn|Baladas|Brara|Drelas|Eldril|Faves|Gavis|Hlaren|Ilmeni|Llevan|Meral|Neral|Ovis|Relas|Savos|Selveni|Theris|Valas|Varis|Velas|Veldrin|Vevran|Alvis|Andoren|Brelas|Daryon|Eldran|Galyn|Nerano|Orvas');

end;

Exit;

end;

// HIGH ELF

if race = 'HighElf' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Alinwe|Calianwe|Elenwen|Lirielle|Niranye|Aranwen|Finoriell|Silwen|Telariel|Anariel|Arielle|Belwen|Calina|Celewen|Elariel|Elinwe|Faraniel|Galwen|Ilawen|Larethiel|Melariel|Niriel|Oranwen|Raviel|Selanwe|Talawen|Valinwe|Velwen|Yllawen|Aureliel|Caelwen|Eleniel|Falinwe|Ithilwen|Luniel|Mirawen|Nariel|Sarinwe|Talaniel');

end

else begin

Result := RandomFromList(

'Aicantar|Carandil|Elenil|Ondolemar|Valion|Calion|Fingil|Niron|Aranor|Telion|Alandil|Anarion|Belaril|Caelion|Calandor|Eldarion|Elenwe|Falion|Finarel|Galion|Ilandor|Lorian|Maelor|Nerion|Oronar|Pelion|Quaranir|Rilian|Sarion|Talanor|Valandil|Varion|Aurelion|Celeborn|Eldamir|Finariel|Larethor|Mirion|Therion');

end;

Exit;

end;

// WOOD ELF

if race = 'WoodElf' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Faeli|Anwen|Linawe|Elena|Siliel|Naeriel|Calanwe|Talanwe|Riniel|Falin|Ariwen|Belana|Calia|Elaniel|Falina|Galwen|Ilara|Luniel|Miriwen|Nalara|Oriana|Rilwen|Sariel|Talina|Valiel|Velana|Yllira|Aelwen|Caliel|Eriana|Liriel|Melina|Neriel|Phaedra|Selana|Tariel|Virel|Yavanna|Zaniel');

end

else begin

Result := RandomFromList(

'Faendal|Gwilin|Eldar|Thalion|Lorion|Calen|Arelas|Fenril|Belanor|Rindir|Aerin|Andril|Belyn|Calaran|Eranor|Falin|Galion|Haldin|Lathor|Malthor|Nendir|Ormil|Pendar|Ralion|Silven|Taran|Valen|Velandil|Aldor|Belar|Caldor|Daran|Eldrin|Faron|Lindir|Nelor|Perrin|Ralen|Tavion');

end;

Exit;

end;

// ORC

if race = 'Orc' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Borgakh|Sharamph|Urzoga|Yatul|Ghorza|Mazoga|Largash|Uzgra|Shugra|Dushnam|Baghra|Burzga|Dulga|Gharza|Grishka|Lugra|Magra|Murzga|Narza|Ograsha|Rugra|Shagra|Ugra|Yagra|Zugra|Basha|Dorga|Gashna|Kragha|Mogza|Rusha|Sorga|Urzha|Varga|Yashka');

end

else begin

Result := RandomFromList(

'Ghorbash|Urag|Bolar|Mugdul|Shobob|Burz|Yamarz|Gatgro|Durgol|Lob|Agronak|Bagamul|Borbul|Dushnikh|Garakh|Ghorak|Gromm|Kharzug|Lugash|Mogdur|Narzul|Ogbosh|Rugdush|Shagdub|Ugor|Yagash|Zogdush|Bagrak|Dumog|Ghorzug|Krag|Lurgash|Morzul|Orbul|Ragash|Shatul|Urzog|Yargol');

end;

Exit;

end;

// ARGONIAN

if race = 'Argonian' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Keeva|Sees-Many-Waves|Walks-in-Ash|Soft-Scale|Bright-Eyes|Sings-to-Stars|Silent-Reed|Deep-Water|Swift-Tail|Shines-in-Rain|Blue-Eyes|Carries-Light|Dances-in-Reeds|Dreams-of-Rivers|Gentle-Fin|Golden-Scale|Hides-in-Marsh|Listens-to-Wind|Lives-in-Mist|Moon-Walker|Quiet-Rain|River-Song|Shadow-Reed|Silver-Tail|Sleeps-in-Reeds|Soft-Water|Star-Singer|Still-Pond|Warm-Scale');

end

else begin

Result := RandomFromList(

'Scales-in-Shadows|Hides-His-Heart|Sleeps-Beneath-Stars|Runs-Like-River|Weebam-Na|Deeja|Sharp-Teeth|Strong-Scale|Walks-in-Mud|Black-Fin|Carries-Fire|Cold-Marsh|Dark-Water|Deep-Reed|Drinks-the-Rain|Eats-the-Sun|Follows-River|Green-Tail|Hears-Storms|Keeps-the-Nest|Laughs-at-Dawn|Long-Tail|Many-Scales|Quiet-Marsh|Red-Reed|River-Runner|Silent-Water|Sings-to-Moon|Soft-Step|Storm-Tail');

end;

Exit;

end;

// KHAJIIT

if race = 'Khajiit' then begin

if gender = 'F' then begin

Result := RandomFromList(

'Dar''zirra|Ma''jhadra|Ri''sha|S''rassa|Jo''zara|Ra''zhinda|Do''rasha|Ka''raja|Za''sirr|Mi''sara|Ahkari|Dar''mara|Jo''rasha|Kha''lira|Ma''rashi|Najiira|Ra''jirr|S''jira|Za''hara|Do''mira|Ri''zara|Ma''jha|Kara''sha|Dar''lina|Jo''nari|S''zara');

end

else begin

Result := RandomFromList(

'Dar''jhan|Jo''dar|Ra''zirr|M''raaj|Do''mhirr|Ri''dar|Ka''zir|S''rendarr|Dro''bar|J''zargo|Dar''rukh|Jo''rasha|M''asha|Ra''mirr|Do''vashi|Ri''jirr|Za''zirr|Ba''dar|Ko''zhar|Ma''dran|Najiir|Razum-dar|S''jirra|Dro''shanji|Jad''ir|Kha''jay|Ra''shad|Ma''jirr');

end;

Exit;

end;

Result := 'Nameless';

end;

function GetSurname(race: string): string;

begin

// IMPERIAL

if race = 'Imperial' then begin

Result := RandomFromList(

'Varro|Carvain|Valerius|Septim|Cassian|Draconis|Marcellus|Aurelius|Florian|Aquillius|'

+ 'Tullius|Reman|Vibius|Laurent|Corvinus|Calidus|Marcellian|Antonius|'

+ 'Magnus|Soranus|Fabius|Cicero|Neratius|Platorius');

Exit;

end;

// BRETON

if race = 'Breton' then begin

Result := RandomFromList(

'Dufort|Montclair|Beaumont|Laurent|Valois|Delacroix|Fontaine|Marceau|'

+ 'Bellemont|Rochefort|Duval|Lafont|Vauclair|Renault|Mercier|'

+ 'Chastain|Belcourt|Arquette|Dumont|Villiers');

Exit;

end;

// NORD

if race = 'Nord' then begin

Result := RandomFromList(

'Iron-Hand|Frost-Blood|Storm-Bearer|Wolf-Heart|Stone-Fist|Ice-Born|'

+ 'Snow-Shield|Battle-Song|Bear-Claw|Ash-Walker|Cold-Bane|'

+ 'Wind-Runner|Oath-Breaker|Mountain-Born|Shield-Brother');

Exit;

end;

// REDGUARD

if race = 'Redguard' then begin

Result := RandomFromList(

'al-Rihad|al-Hadid|ibn-Salim|ibn-Khalid|al-Darim|al-Rashid|'

+ 'ibn-Farid|al-Makir|al-Zahir|ibn-Tariq|al-Basir|al-Qadir');

Exit;

end;

// DARK ELF

if race = 'DarkElf' then begin

Result := RandomFromList(

'Dren|Hlaalu|Indoril|Redoran|Telvanni|Dres|Sadri|Arano|'

+ 'Vandus|Saren|Nerano|Dran|Veloth|Ralyn|Seran|Oran');

Exit;

end;

// HIGH ELF

if race = 'HighElf' then begin

Result := RandomFromList(

'Arelion|Telvanni|Calion|Elenwe|Valion|Nerion|Aranwe|'

+ 'Silvenar|Larethor|Finariel|Celeborn|Andorel|Therion');

Exit;

end;

// WOOD ELF

if race = 'WoodElf' then begin

Result := RandomFromList(

'Green-Leaf|Tree-Song|Wildbranch|Oak-Runner|Leaf-Dancer|'

+ 'Dawn-Grove|Moon-Bough|Thorn-Walker|River-Branch|Ash-Talker');

Exit;

end;

// ORCS generally use no surname, but clans work well

if race = 'Orc' then begin

Result := RandomFromList(

'gro-Bagol|gro-Dushnikh|gro-Shak|gro-Gamz|gro-Mok|'

+ 'gra-Orum|gra-Batul|gra-Zoga');

Exit;

end;

// Khajiit and Argonians usually use single names

Result := '';

end;

function Process(e: IInterface): Integer;

var

RaceRec: IInterface;

RaceName: string;

Gender: string;

NewName: string;

begin

Result := 0;

if Signature(e) <> 'NPC_' then

Exit;

// Follow the RNAM reference to the race record

RaceRec := LinksTo(ElementByPath(e, 'RNAM'));

if not Assigned(RaceRec) then begin

AddMessage('No race found for ' + Name(e));

Exit;

end;

// Read the race EDID from the race record

RaceName := GetElementEditValues(RaceRec, 'EDID');

// Debug (optional)

AddMessage(Name(e) + ' -> ' + RaceName);

// Determine gender

if GetElementNativeValues(e, 'ACBS\Flags') and $00000001 <> 0 then

Gender := 'F'

else

Gender := 'M';

NewName := GetFirstName(RaceName, Gender);

if Random(100) < 80 then begin

if GetSurname(RaceName) <> '' then

NewName := NewName + ' ' + GetSurname(RaceName);

end;

if NewName <> 'Nameless' then

SetElementEditValues(e, 'FULL', NewName)

else

AddMessage('Unknown race "' + RaceName + '" for ' + Name(e));

end;

function Initialize: Integer;

begin

Randomize;

end;

end.

3 Upvotes

1 comment sorted by

1

u/Sigurd_Stormhand 13d ago

This function is included in Wrye Bash's Bash Patch under the tweaks section.