/*
* Name generators
*
* Written by Keolah and Scion for Rogue Winds
* Copyright (C) 2002 by Heather Dunn
*
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
void do_namegen(CHAR_DATA *ch, char *argument) {
char buf[MAX_STRING_LENGTH];
int lang;
if (!str_cmp(argument, "elven")
|| !str_cmp(argument, "elvish")
|| !str_cmp(argument, "elf"))
lang = LANG_ELVEN;
else if (!str_cmp(argument, "dwarven")
|| !str_cmp(argument, "dwarvish")
|| !str_cmp(argument, "gnome")
|| !str_cmp(argument, "gnomish")
|| !str_cmp(argument, "dwarf"))
lang = LANG_DWARVEN;
else if (!str_cmp(argument, "orc")
|| !str_cmp(argument, "orcish")
|| !str_cmp(argument, "kobold")
|| !str_cmp(argument, "goblin"))
lang = LANG_ORCISH;
else if (!str_cmp(argument, "dragon")
|| !str_cmp(argument, "draconic")
|| !str_cmp(argument, "draconian"))
lang = LANG_DRAGON;
else if (!str_cmp(argument, "drow")
|| !str_cmp(argument, "dark elf")
|| !str_cmp(argument, "dark elven")
|| !str_cmp(argument, "drowish"))
lang = LANG_DROW;
else
lang = LANG_KALORESE;
strcpy(buf, random_name(buf, lang));
ch_printf(ch, "%s name generated: %s\n\r", lang_names[lang], buf);
}
/* -- Random Name Generator: written by Scion,
* derived from Java code from Keolah --
* May 10, 2002 - Multiple language support added - Keolah
*/
/* NEXT LETTER */
char *next_vowel(char *word, bool dipthong) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 11)) {
case 0:
case 1:
case 2: strcat(buf, "a"); break;
case 3:
case 4:
case 5: strcat(buf, "e"); break;
case 6:
case 7: strcat(buf, "i"); break;
case 8:
case 9: strcat(buf, "o"); break;
case 10: strcat(buf, "u"); break;
case 11:
if (dipthong) {
strcpy(buf, next_vowel(word, FALSE));
strcpy(word, buf);
strcpy(buf, next_vowel(word, FALSE));
break;
} else {
strcat(buf, "i");
break;
}
}
strcpy(word, buf);
return word;
}
char *next_vowel_elven(char *word, bool dipthong) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 15)) {
case 0:
case 1:
case 2: strcat(buf, "a"); break;
case 3:
case 4:
case 5: strcat(buf, "e"); break;
case 6:
case 7: strcat(buf, "i"); break;
case 8:
case 9: strcat(buf, "o"); break;
case 10: strcat(buf, "u"); break;
case 11:
case 12: strcat(buf, "y"); break;
case 13:
case 14:
case 15:
if (dipthong) {
strcpy(buf, next_vowel_elven(word, FALSE));
strcpy(word, buf);
strcpy(buf, next_vowel_elven(word, FALSE));
break;
} else {
strcat(buf, "i");
break;
}
}
strcpy(word, buf);
return word;
}
char *next_vowel_dwarven(char *word, bool dipthong) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 4)) {
case 0: strcat(buf, "a"); break;
case 1: strcat(buf, "e"); break;
case 2: strcat(buf, "i"); break;
case 3: strcat(buf, "o"); break;
case 4: strcat(buf, "u"); break;
}
strcpy(word, buf);
return word;
}
char *next_vowel_orcish(char *word, bool dipthong) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 7)) {
case 0: strcat(buf, "a"); break;
case 1: strcat(buf, "e"); break;
case 2: strcat(buf, "i"); break;
case 3:
case 4: strcat(buf, "o"); break;
case 5:
case 6:
case 7: strcat(buf, "u"); break;
}
strcpy(word, buf);
return word;
}
char *next_stop(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 12)) {
case 0:
case 1:
case 2: strcat(buf, "t"); break;
case 3:
case 4:
case 5: strcat(buf, "d"); break;
case 6:
case 7:
case 8: strcat(buf, "k"); break;
case 9:
case 10: strcat(buf, "g"); break;
case 11: strcat(buf, "p"); break;
case 12: strcat(buf, "b"); break;
}
strcpy(word, buf);
return word;
}
char *next_stop_elven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 15)) {
case 0:
case 1:
case 2:
case 3: strcat(buf, "t"); break;
case 4:
case 5:
case 6:
case 7: strcat(buf, "d"); break;
case 8:
case 9:
case 10: strcat(buf, "c"); break;
case 11: strcat(buf, "g"); break;
case 12: strcat(buf, "p"); break;
case 13:
case 14: strcat(buf, "b"); break;
case 15: strcat(buf, "k"); break;
}
strcpy(word, buf);
return word;
}
char *next_stop_dwarven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 6)) {
case 0: strcat(buf, "t"); break;
case 1: strcat(buf, "d"); break;
case 2: strcat(buf, "k"); break;
case 3: strcat(buf, "g"); break;
case 4: strcat(buf, "b"); break;
case 5: strcat(buf, "kh"); break;
case 6: strcat(buf, "th"); break;
}
strcpy(word, buf);
return word;
}
char *next_labial_stop(char *word, bool labial) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (labial) {
switch (number_range(0, 2)) {
case 0:
case 1: strcat(buf, "b"); break;
case 2: strcat(buf, "p"); break;
}
} else {
switch (number_range(0, 6)) {
case 0:
case 1: strcat(buf, "t"); break;
case 2:
case 3: strcat(buf, "d"); break;
case 4:
case 5: strcat(buf, "k"); break;
case 6: strcat(buf, "g"); break;
}
}
strcpy(word, buf);
return word;
}
char *next_labial_stop_elven(char *word, bool labial) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (labial) {
strcat(buf, "b");
} else {
switch (number_range(0, 10)) {
case 0:
case 1:
case 2:
case 3: strcat(buf, "t"); break;
case 4:
case 5:
case 6:
case 7: strcat(buf, "d"); break;
case 8:
case 9: strcat(buf, "k"); break;
case 10: strcat(buf, "g"); break;
}
}
strcpy(word, buf);
return word;
}
char *next_fricative(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 15)) {
case 0:
case 1:
case 2:
case 3: strcat(buf, "s"); break;
case 4:
case 5: strcat(buf, "f"); break;
case 6:
case 7: strcat(buf, "v"); break;
case 8:
case 9: strcat(buf, "z"); break;
case 10: strcat(buf, "sh"); break;
case 11: strcat(buf, "zh"); break;
case 12:
case 13:
case 14: strcat(buf, "th"); break;
case 15: strcat(buf, "dh"); break;
}
strcpy(word, buf);
return word;
}
char *next_fricative_elven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 12)) {
case 0:
case 1:
case 2:
case 3: strcat(buf, "s"); break;
case 4: strcat(buf, "f"); break;
case 5:
case 6: strcat(buf, "v"); break;
case 7:
case 8: strcat(buf, "sh"); break;
case 9:
case 10:
case 11:
case 12: strcat(buf, "th"); break;
}
strcpy(word, buf);
return word;
}
char *next_fricative_dwarven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 12)) {
case 0: strcat(buf, "s"); break;
case 1: strcat(buf, "f"); break;
case 2: strcat(buf, "gh"); break;
}
strcpy(word, buf);
return word;
}
char *next_liquid(char *word, bool vowel) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 7)) {
case 0:
case 1:
case 2: strcat(buf, "l"); break;
case 3:
case 4:
case 5: strcat(buf, "r"); break;
case 6: strcat(buf, "w"); break;
case 7: strcat(buf, "y"); break;
}
strcpy(word, buf);
if (vowel)
next_vowel(word, TRUE);
return word;
}
char *next_liquid_elven(char *word, bool vowel) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 1)) {
case 0: strcat(buf, "l"); break;
case 1: strcat(buf, "r"); break;
}
strcpy(word, buf);
if (vowel)
next_vowel_elven(word, TRUE);
return word;
}
char *next_liquid_dwarven(char *word, bool vowel) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 2)) {
case 0: strcat(buf, "l"); break;
case 1: strcat(buf, "r"); break;
case 2: strcat(buf, "z"); break;
}
strcpy(word, buf);
if (vowel)
next_vowel_dwarven(word, TRUE);
return word;
}
char *next_nasal(char *word, bool vowel) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (number_range(0, 5) == 0)
strcat(buf, "m");
else
strcat(buf, "n");
strcpy(word, buf);
if (vowel)
next_vowel(word, TRUE);
return word;
}
char *next_nasal_elven(char *word, bool vowel) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (number_range(0, 5) == 0)
strcat(buf, "m");
else
strcat(buf, "n");
strcpy(word, buf);
if (vowel)
next_vowel_elven(word, TRUE);
return word;
}
char *next_weird(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 6)) {
case 0:
case 1: strcat(buf, "x"); break;
case 2:
case 3: strcat(buf, "ch"); break;
case 4: strcat(buf, "j"); break;
case 5:
case 6: strcat(buf, "h"); break;
}
strcpy(word, buf);
return word;
}
char *next_weird_elven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
strcat(buf, "h");
strcpy(word, buf);
return word;
}
char *next_weird_dwarven(char *word) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
switch (number_range(0, 2)) {
case 0: strcat(buf, "x"); break;
case 1: strcat(buf, "ch"); break;
case 2: strcat(buf, "h"); break;
}
strcpy(word, buf);
return word;
}
/* LAST LETTER */
char *last_vowel(char *word) {
switch (number_range(0, 4)) {
case 0: return next_liquid(word, FALSE);
case 1: return next_stop(word);
case 2: return next_nasal(word, FALSE);
case 3: return next_fricative(word);
case 4: return next_weird(word);
}
return word;
}
char *last_vowel_elven(char *word) {
switch (number_range(0, 4)) {
case 0:
case 1: return next_liquid_elven(word, FALSE);
case 2:
case 3: return next_nasal_elven(word, FALSE);
case 4: return next_fricative_elven(word);
}
return word;
}
char *last_vowel_dwarven(char *word) {
switch (number_range(0, 4)) {
case 0: return next_liquid_dwarven(word, FALSE);
case 1: return next_stop_dwarven(word);
case 2: return next_nasal(word, FALSE);
case 3: return next_fricative_dwarven(word);
case 4: return next_weird_dwarven(word);
}
return word;
}
char *last_vowel_drow(char *word) {
switch (number_range(0, 4)) {
case 0:
case 1: return next_liquid_dwarven(word, FALSE);
case 2:
case 3: return next_nasal_elven(word, FALSE);
case 4: return next_fricative_elven(word);
}
return word;
}
char *last_liquid(char *word) {
switch (number_range(0, 4)) {
case 0: return next_vowel(word, TRUE);
case 1: return next_stop(word);
case 2: return next_nasal(word, FALSE);
case 3: return next_fricative(word);
case 4: return next_weird(word);
}
return word;
}
char *last_liquid_elven(char *word) {
switch (number_range(0, 4)) {
case 0:
case 1:
case 2:
case 3: return next_vowel_elven(word, TRUE);
case 4: return next_stop_elven(word);
}
return word;
}
char *last_liquid_dwarven(char *word) {
switch (number_range(0, 1)) {
case 0: return next_vowel_dwarven(word, TRUE);
case 1: return next_stop_dwarven(word);
}
return word;
}
char *last_fricative(char *word, int len) {
if (len > 1) {
if (number_range(0, 1) == 1)
return next_liquid(word, TRUE);
}
return next_vowel(word, TRUE);
}
char *last_fricative_elven(char *word, int len) {
if (len > 1) {
if (number_range(0, 1) == 1)
return next_liquid_elven(word, TRUE);
}
return next_vowel_elven(word, TRUE);
}
char *last_stop(char *word, int len, bool dental) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (len > 1) {
if (number_range(0, 1) == 1) {
if (dental) {
strcat(buf, "r");
strcpy(word, buf);
return next_vowel(word, TRUE);
} else {
strcpy(word, buf);
return next_liquid(word, TRUE);
}
}
}
strcpy(word, buf);
return next_vowel(word, TRUE);
}
char *last_stop_elven(char *word, int len, bool dental) {
char buf[MAX_STRING_LENGTH];
strcpy(buf, word);
if (len > 1) {
if (number_range(0, 2) == 0) {
if (dental) {
strcat(buf, "r");
strcpy(word, buf);
return next_vowel_elven(word, TRUE);
} else {
strcpy(word, buf);
return next_liquid_elven(word, TRUE);
}
}
}
strcpy(word, buf);
return next_vowel(word, TRUE);
}
char *last_stop_dwarven(char *word) {
return next_vowel_dwarven(word, TRUE);
}
char *last_nasal(char *word, int len, bool labial) {
if (number_range(0, 2) == 0)
return next_labial_stop(word, labial);
return next_vowel(word, TRUE);
}
char *last_nasal_elven(char *word, int len, bool labial) {
if (number_range(0, 4) == 0)
return next_labial_stop_elven(word, labial);
return next_vowel_elven(word, TRUE);
}
char *last_nasal_dwarven(char *word, int len, bool labial) {
if (number_range(0, 3) == 0)
return next_stop_dwarven(word);
return next_vowel_dwarven(word, TRUE);
}
char *last_weird(char *word) {
return next_vowel(word, TRUE);
}
char *last_weird_elven(char *word) {
return next_vowel_elven(word, TRUE);
}
/* ADD LETTER */
char *addletter(char *word) {
int len = 1;
if (strlen(word) == 0) {
switch (number_range(0, 5)) {
case 0: return next_stop(word);
case 1: return next_vowel(word, FALSE);
case 2: return next_liquid(word, TRUE);
case 3: return next_nasal(word, TRUE);
case 4: return next_fricative(word);
case 5: return next_weird(word);
}
return word;
}
switch (word[strlen(word) - 1]) {
case 'a': return last_vowel(word);
case 'b': return last_stop(word, len, FALSE);
case 'c': return last_stop(word, len, FALSE);
case 'd': return last_stop(word, len, TRUE);
case 'e': return last_vowel(word);
case 'f': return last_fricative(word, len);
case 'g': return last_stop(word, len, FALSE);
case 'h': return last_weird(word);
case 'i': return last_vowel(word);
case 'j': return last_weird(word);
case 'k': return last_stop(word, len, FALSE);
case 'l': return last_liquid(word);
case 'm': return last_nasal(word, len, TRUE);
case 'n': return last_nasal(word, len, FALSE);
case 'o': return last_vowel(word);
case 'p': return last_stop(word, len, FALSE);
case 'r': return last_liquid(word);
case 's': return last_fricative(word, len);
case 't': return last_stop(word, len, TRUE);
case 'u': return last_vowel(word);
case 'v': return last_fricative(word, len);
case 'w': return last_liquid(word);
case 'x': return last_weird(word);
case 'y': return last_liquid(word);
case 'z': return last_fricative(word, len);
}
return word;
}
char *addletter_elven(char *word) {
int len = 1;
if (strlen(word) == 0) {
switch (number_range(0, 5)) {
case 0: return next_stop_elven(word);
case 1: return next_vowel_elven(word, TRUE);
case 2: return next_liquid_elven(word, TRUE);
case 3: return next_nasal_elven(word, TRUE);
case 4: return next_fricative_elven(word);
case 5: return next_weird_elven(word);
}
return word;
}
switch (word[strlen(word) - 1]) {
case 'a': return last_vowel_elven(word);
case 'b': return last_stop_elven(word, len, FALSE);
case 'c': return last_stop_elven(word, len, FALSE);
case 'd': return last_stop_elven(word, len, TRUE);
case 'e': return last_vowel_elven(word);
case 'f': return last_fricative_elven(word, len);
case 'g': return last_stop_elven(word, len, FALSE);
case 'h': return last_weird_elven(word);
case 'i': return last_vowel_elven(word);
case 'j': return last_weird_elven(word);
case 'k': return last_stop_elven(word, len, FALSE);
case 'l': return last_liquid_elven(word);
case 'm': return last_nasal_elven(word, len, TRUE);
case 'n': return last_nasal_elven(word, len, FALSE);
case 'o': return last_vowel_elven(word);
case 'p': return last_stop_elven(word, len, FALSE);
case 'r': return last_liquid_elven(word);
case 's': return last_fricative_elven(word, len);
case 't': return last_stop_elven(word, len, TRUE);
case 'u': return last_vowel_elven(word);
case 'v': return last_fricative_elven(word, len);
case 'w': return last_liquid_elven(word);
case 'x': return last_weird_elven(word);
case 'y': return last_vowel_elven(word);
case 'z': return last_fricative_elven(word, len);
}
return word;
}
char *addletter_dwarven(char *word) {
int len = 1;
if (strlen(word) == 0) {
switch (number_range(0, 5)) {
case 0: return next_stop_dwarven(word);
case 1: return next_vowel_dwarven(word, TRUE);
case 2: return next_liquid_dwarven(word, TRUE);
case 3: return next_nasal(word, TRUE);
case 4: return next_fricative_dwarven(word);
case 5: return next_weird_dwarven(word);
}
return word;
}
switch (word[strlen(word) - 1]) {
case 'a': return last_vowel_dwarven(word);
case 'b': return last_stop_dwarven(word);
case 'c': return last_stop_dwarven(word);
case 'd': return last_stop_dwarven(word);
case 'e': return last_vowel_dwarven(word);
case 'f': return last_stop_dwarven(word);
case 'g': return last_stop_dwarven(word);
case 'h': return last_stop_dwarven(word);
case 'i': return last_vowel_dwarven(word);
case 'j': return last_stop_dwarven(word);
case 'k': return last_stop_dwarven(word);
case 'l': return last_liquid_dwarven(word);
case 'm': return last_nasal_dwarven(word, len, TRUE);
case 'n': return last_nasal_dwarven(word, len, FALSE);
case 'o': return last_vowel_dwarven(word);
case 'p': return last_stop_dwarven(word);
case 'r': return last_liquid_dwarven(word);
case 's': return last_stop_dwarven(word);
case 't': return last_stop_dwarven(word);
case 'u': return last_vowel_dwarven(word);
case 'v': return last_stop_dwarven(word);
case 'w': return last_liquid_dwarven(word);
case 'x': return last_stop_dwarven(word);
case 'y': return last_vowel_dwarven(word);
case 'z': return last_liquid_dwarven(word);
}
return word;
}
char *addletter_drow(char *word) {
int len = 1;
if (strlen(word) == 0) {
switch (number_range(0, 5)) {
case 0: return next_stop_elven(word);
case 1: return next_vowel_elven(word, TRUE);
case 2: return next_liquid_dwarven(word, TRUE);
case 3: return next_nasal_elven(word, TRUE);
case 4: return next_fricative_elven(word);
case 5: return next_weird_elven(word);
}
return word;
}
switch (word[strlen(word) - 1]) {
case 'a': return last_vowel_drow(word);
case 'b': return last_stop_elven(word, len, FALSE);
case 'c': return last_stop_elven(word, len, FALSE);
case 'd': return last_stop_elven(word, len, TRUE);
case 'e': return last_vowel_drow(word);
case 'f': return last_fricative_elven(word, len);
case 'g': return last_stop_elven(word, len, FALSE);
case 'h': return last_weird_elven(word);
case 'i': return last_vowel_drow(word);
case 'j': return last_weird_elven(word);
case 'k': return last_stop_elven(word, len, FALSE);
case 'l': return last_liquid_elven(word);
case 'm': return last_nasal_elven(word, len, TRUE);
case 'n': return last_nasal_elven(word, len, FALSE);
case 'o': return last_vowel_drow(word);
case 'p': return last_stop_elven(word, len, FALSE);
case 'r': return last_liquid_elven(word);
case 's': return last_fricative_elven(word, len);
case 't': return last_stop_elven(word, len, TRUE);
case 'u': return last_vowel_drow(word);
case 'v': return last_fricative_elven(word, len);
case 'w': return last_liquid_elven(word);
case 'x': return last_weird_elven(word);
case 'y': return last_vowel_drow(word);
case 'z': return last_fricative_elven(word, len);
}
return word;
}
char *generate(char *word, int len) {
char buf[MAX_STRING_LENGTH];
if (len == 0)
return word;
strcpy(buf, word);
strcpy(buf, generate(addletter(word), len - 1));
strcpy(word, buf);
return word;
}
char *generate_elven(char *word, int len) {
char buf[MAX_STRING_LENGTH];
if (len == 0)
return word;
strcpy(buf, word);
strcpy(buf, generate_elven(addletter_elven(word), len - 1));
strcpy(word, buf);
return word;
}
char *generate_dwarven(char *word, int len) {
char buf[MAX_STRING_LENGTH];
if (len == 0)
return word;
strcpy(buf, word);
strcpy(buf, generate_dwarven(addletter_dwarven(word), len - 1));
strcpy(word, buf);
return word;
}
char *generate_drow(char *word, int len) {
char buf[MAX_STRING_LENGTH];
if (len == 0)
return word;
strcpy(buf, word);
strcpy(buf, generate_drow(addletter_drow(word), len - 1));
strcpy(word, buf);
return word;
}
char *random_name(char *word, int lang) {
char buf[MAX_STRING_LENGTH];
strcpy(word, "");
if (lang == LANG_KALORESE)
strcpy(buf, generate(word, 3 + number_range(0,6)));
if (lang == LANG_ELVEN)
strcpy(buf, generate_elven(word, 3 + number_range(0,6)));
if (lang == LANG_DWARVEN)
strcpy(buf, generate_dwarven(word, 3 + number_range(0,6)));
if (lang == LANG_DRAGON)
strcpy(buf, generate_elven(word, 6 + number_range(0,6)));
if (lang == LANG_DROW)
strcpy(buf, generate_drow(word, 3 + number_range(0,6)));
strcpy(word, capitalize(buf));
return word;
}