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.