diff --git a/src/common/kernel/names.c b/src/common/kernel/names.c index 631a4184b..a1e58b851 100644 --- a/src/common/kernel/names.c +++ b/src/common/kernel/names.c @@ -52,315 +52,102 @@ describe_braineater(unit * u, const struct locale * lang) return LOC(lang, "describe_braineater"); } +static const xmlChar * +make_names(const char * monster, int * num_postfix, int pprefix, int * num_name, int * num_prefix, int ppostfix) +{ + int uv, uu, un; + static xmlChar name[NAMESIZE + 1]; + char zText[32]; + const xmlChar * str; + + if (*num_prefix==0) { + + for (*num_prefix=0;;++*num_prefix) { + sprintf(zText, "%s_prefix_%d", monster, *num_prefix); + str = locale_getstring(default_locale, zText); + if (str==NULL) break; + } + + for (*num_name=0;;++*num_name) { + sprintf(zText, "%s_name_%d", monster, *num_name); + str = locale_getstring(default_locale, zText); + if (str==NULL) break; + } + + for (*num_postfix=0;;++*num_postfix) { + sprintf(zText, "%s_postfix_%d", monster, *num_postfix); + str = locale_getstring(default_locale, zText); + if (str==NULL) break; + } + } + + if (*num_name==0) { + return NULL; + } + + /* nur 50% aller Namen haben "Vor-Teil" */ + uv = rng_int() % (*num_prefix * pprefix); + + uu = rng_int() % *num_name; + + /* nur 50% aller Namen haben "Nach-Teil", wenn kein Vor-Teil */ + if (uv>=*num_prefix) { + un = rng_int() % *num_postfix; + } else { + un = rng_int() % (*num_postfix * ppostfix); + } + + name[0] = 0; + if (uv < *num_prefix) { + sprintf(zText, "%s_prefix_%d", monster, uv); + str = locale_getstring(default_locale, zText); + if (str) { + xstrcat(name, str); + xstrcat(name, " "); + } + } + + sprintf(zText, "%s_name_%d", monster, uu); + str = locale_getstring(default_locale, zText); + if (str) xstrcat(name, str); + + if (un < *num_postfix) { + sprintf(zText, "%s_postfix_%d", monster, un); + str = locale_getstring(default_locale, zText); + if (str) { + xstrcat(name, " "); + xstrcat(name, str); + } + } + return name; +} + const xmlChar * undead_name(const unit * u) { static int num_postfix, num_name, num_prefix; - int uv, uu, un; - static xmlChar name[NAMESIZE + 1]; - char zText[32]; - const xmlChar * str; - - if (num_prefix==0) { - - for (num_prefix=0;;++num_prefix) { - sprintf(zText, "undead_prefix_%d", num_prefix); - str = locale_getstring(default_locale, zText); - if (str==NULL) break; - } - - for (num_name=0;;++num_name) { - sprintf(zText, "undead_name_%d", num_name); - str = locale_getstring(default_locale, zText); - if (str==NULL) break; - } - - for (num_postfix=0;;++num_postfix) { - sprintf(zText, "undead_postfix_%d", num_postfix); - str = locale_getstring(default_locale, zText); - if (str==NULL) break; - } - } - /* nur 50% aller Namen haben "Vor-Teil" */ - u=u; - uv = rng_int() % (num_prefix * 2); - - uu = rng_int() % num_name; - un = rng_int() % (num_postfix * (uv >= num_prefix ? 1 : 2)); - /* nur 50% aller Namen haben "Nach-Teil", wenn kein Vor-Teil */ - - name[0] = 0; - if (uv < num_prefix) { - sprintf(zText, "undead_prefix_%d", uv); - str = locale_getstring(default_locale, zText); - if (str) xstrcat(name, str); - } - - sprintf(zText, "undead_name_%d", uu); - str = locale_getstring(default_locale, zText); - if (str) xstrcat(name, str); - - if (un < num_postfix) { - sprintf(zText, "undead_postfix_%d", un); - str = locale_getstring(default_locale, zText); - if (str) xstrcat(name, str); - } - return name; + return make_names("undead", &num_postfix, 2, &num_name, &num_prefix, 2); } -/* Skelette */ - -#define SKEL_VOR 19 - -static const xmlChar *skel_vor[SKEL_VOR] = -{ - "Klapperige ", - "Stöhnende ", - "Schwarzknochige ", - "Schwarzgewandete ", - "Angsteinflößende ", - "Heulende ", - "Wartende ", - "Grauenvolle ", - "Schwarze ", - "Dunkle ", - "Fürchterliche ", - "Grauenhafte ", - "Furchtbare ", - "Entsetzliche ", - "Schauderhafte ", - "Schreckliche ", - "Düstere ", - "Schaurige ", - "Erbarmungslose " -}; - -#define SKEL 5 - -static const xmlChar *skel[SKEL] = -{ - "Skelette", - "Kreaturen", - "Krieger", - "Kämpfer", - "Rächer" -}; - -#define SKEL_NACH 14 - -static const xmlChar *skel_nach[SKEL_NACH] = -{ - " der Nacht", - " der Schatten", - " der Finsternis", - " des Bösen", - " der Erschlagenen", - " der Verfluchten", - " der Gefolterten", - " der Ruhelosen", - " aus dem Nebel", - " aus dem Dunkel", - " der Tiefe", - " in Ketten", - " aus dem Totenreich", - " aus der Unterwelt" -}; - const xmlChar * skeleton_name(const unit * u) { - int uv, uu, un; - static char name[NAMESIZE + 1]; - - u=u; - - /* nur 20% aller Namen haben "Vor-Teil" */ - uv = rng_int() % (SKEL_VOR * 5); - uu = rng_int() % SKEL; - un = rng_int() % (SKEL_NACH * (uv >= SKEL_VOR ? 1 : 2)); - - /* nur 50% aller Namen haben "Nach-Teil", wenn kein Vor-Teil */ - - if (uv < SKEL_VOR) { - strcpy(name, skel_vor[uv]); - } else { - name[0] = 0; - } - - strcat(name, skel[uu]); - - if (un < SKEL_NACH) - strcat(name, skel_nach[un]); - - return name; + static int num_postfix, num_name, num_prefix; + return make_names("skeleton", &num_postfix, 5, &num_name, &num_prefix, 2); } -/* Zombies */ - -#define ZOM_VOR 16 - -static const xmlChar *zombie_vor[ZOM_VOR] = -{ - "Faulende ", - "Zerschlagene ", - "Gefolterte ", - "Angsteinflößende ", - "Leise Schlurfende ", - "Kinderfressende ", - "Schwarze ", - "Dunkle ", - "Fürchterliche ", - "Grauenhafte ", - "Furchtbare ", - "Entsetzliche ", - "Schauderhafte ", - "Schreckliche ", - "Düstere ", - "Schaurige " -}; - -#define ZOM 5 - -static const xmlChar *zombie[ZOM] = -{ - "Zombies", - "Kreaturen", - "Verlorene", - "Erschlagene", - "Verdammte" -}; - -#define ZOM_NACH 13 - -static const xmlChar *zombie_nach[ZOM_NACH] = -{ - " der Nacht", - " der Schatten", - " der Finsternis", - " des Bösen", - " der Erschlagenen", - " der Verfluchten", - " der Ruhelosen", - " aus dem Nebel", - " aus dem Dunkel", - " der Tiefe", - " in Ketten", - " aus dem Totenreich", - " aus der Unterwelt" -}; - const xmlChar * zombie_name(const unit * u) { - int uv, uu, un; - static char name[NAMESIZE + 1]; - - u=u; - - /* nur 20% aller Namen haben "Vor-Teil" */ - uv = rng_int() % (ZOM_VOR * 5); - uu = rng_int() % ZOM; - un = rng_int() % (ZOM_NACH * (uv >= ZOM_VOR ? 1 : 2)); - - /* nur 50% aller Namen haben "Nach-Teil", wenn kein Vor-Teil */ - - if (uv < ZOM_VOR) { - strlcpy(name, zombie_vor[uv], sizeof(name)); - } else { - name[0] = 0; - } - - strlcat(name, zombie[uu], sizeof(name)); - - if (un < ZOM_NACH) - strlcat(name, zombie_nach[un], sizeof(name)); - - return name; + static int num_postfix, num_name, num_prefix; + return make_names("zombie", &num_postfix, 5, &num_name, &num_prefix, 2); } -/* Ghoule */ - -#define GHOUL_VOR 17 - -static const xmlChar *ghoul_vor[GHOUL_VOR] = -{ - "Faulende ", - "Angsteinflößende ", - "Leise ", - "Kinderfressende ", - "Menschenfressende ", - "Wahnsinnige ", - "Brutale ", - "Schwarze ", - "Dunkle ", - "Fürchterliche ", - "Grauenhafte ", - "Furchtbare ", - "Entsetzliche ", - "Schauderhafte ", - "Schreckliche ", - "Düstere ", - "Schaurige " -}; - -#define GHOUL 6 - -static const xmlChar *ghoul[GHOUL] = -{ - "Ghoule", - "Kreaturen", - "Verlorene", - "Erschlagene", - "Verdammte", - "Schlurfende Ghoule", -}; - -#define GHOUL_NACH 13 - -static const xmlChar *ghoul_nach[GHOUL_NACH] = -{ - " der Nacht", - " der Schatten", - " der Finsternis", - " des Bösen", - " der Erschlagenen", - " der Verfluchten", - " der Ruhelosen", - " aus dem Nebel", - " aus dem Dunkel", - " der Tiefe", - " in Ketten", - " aus dem Totenreich", - " aus der Unterwelt" -}; - const xmlChar * ghoul_name(const unit * u) { - int uv, uu, un; - static char name[NAMESIZE + 1]; - - u=u; - - /* nur 20% aller Namen haben "Vor-Teil" */ - uv = rng_int() % (GHOUL_VOR * 5); - uu = rng_int() % GHOUL; - un = rng_int() % (GHOUL_NACH * (uv >= GHOUL_VOR ? 1 : 4)); - - /* nur 25% aller Namen haben "Nach-Teil", wenn kein Vor-Teil */ - - if (uv < GHOUL_VOR) { - strcpy(name, ghoul_vor[uv]); - } else { - name[0] = 0; - } - - strcat(name, ghoul[uu]); - - if (un < GHOUL_NACH) - strcat(name, ghoul_nach[un]); - - return name; + static int num_postfix, num_name, num_prefix; + return make_names("ghoul", &num_postfix, 5, &num_name, &num_prefix, 4); } @@ -368,7 +155,7 @@ ghoul_name(const unit * u) #define SIL1 15 -const xmlChar *silbe1[SIL1] = { +const char *silbe1[SIL1] = { "Tar", "Ter", "Tor", @@ -388,7 +175,7 @@ const xmlChar *silbe1[SIL1] = { #define SIL2 19 -const xmlChar *silbe2[SIL2] = { +const char *silbe2[SIL2] = { "da", "do", "dil", @@ -412,7 +199,7 @@ const xmlChar *silbe2[SIL2] = { #define SIL3 14 -const xmlChar *silbe3[SIL3] = { +const char *silbe3[SIL3] = { "gul", "gol", "dol", @@ -608,7 +395,7 @@ dracoid_name(const unit *u) strcat(name, drac_mid[rng_int()%DRAC_MID]); } strcat(name, drac_suf[rng_int()%DRAC_SUF]); - return name; + return (const xmlChar *)name; } const xmlChar * diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index 5689ca0f7..56eb4f8de 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -1272,12 +1272,17 @@ void name_unit(unit *u) { if (u->race->generate_name) { - set_string(&u->name, (u->race->generate_name(u))); - } else { + const xmlChar * gen_name = u->race->generate_name(u); + if (gen_name) { + set_string(&u->name, gen_name); + } else { + set_string(&u->name, racename(u->faction->locale, u, u->race)); + } + } else { xmlChar name[16]; - sprintf((char*)name, "%s %s", LOC(u->faction->locale, "unitdefault"), itoa36(u->no)); - set_string(&u->name, name); - } + sprintf((char*)name, "%s %s", LOC(u->faction->locale, "unitdefault"), itoa36(u->no)); + set_string(&u->name, name); + } } /** creates a new unit. diff --git a/src/res/eressea.xml b/src/res/eressea.xml index 16328e76a..f9e695489 100644 --- a/src/res/eressea.xml +++ b/src/res/eressea.xml @@ -17,7 +17,11 @@ + + + +