From 25cd0e4b664e874d0e9594afb5e7eb07068f9976 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 25 Jun 2007 01:50:34 +0000 Subject: [PATCH] added an option to have certain races supply a description without a need to set u->display everywhere. This was costing 24 MB of memory just for the braineaters alone, a terrible waste. --- src/common/gamecode/creport.c | 8 +++++--- src/common/kernel/names.c | 25 +++++++++++++++++++++++++ src/common/kernel/names.h | 2 +- src/common/kernel/race.c | 11 ----------- src/common/kernel/race.h | 1 + src/common/kernel/reports.c | 9 +++++---- src/common/kernel/save.c | 13 ++++++++++++- src/common/kernel/teleport.c | 1 - src/common/kernel/unit.c | 11 +++++++++++ src/common/kernel/unit.h | 2 +- src/common/kernel/xmlreader.c | 2 ++ src/common/util/parser.c | 2 +- src/eressea/gmtool.c | 2 ++ src/eressea/main.c | 1 + src/eressea/server.cpp | 2 ++ src/res/de/strings.xml | 6 +++++- src/res/races.xml | 1 + 17 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 2f427c5bf..0833b2e7d 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -604,6 +604,7 @@ cr_output_unit(FILE * F, const region * r, { /* Race attributes are always plural and item attributes always * singular */ + const char * str; const item_type * lasttype; int pr; item *itm, *show; @@ -632,9 +633,10 @@ cr_output_unit(FILE * F, const region * r, fprintf(F, "EINHEIT %d\n", u->no); fprintf(F, "\"%s\";Name\n", u->name); - if (u->display && strlen(u->display)) - fprintf(F, "\"%s\";Beschr\n", u->display); - + str = u_description(u, f->locale); + if (str) { + fprintf(F, "\"%s\";Beschr\n", str); + } { /* print faction information */ const faction * sf = visible_faction(f, u); diff --git a/src/common/kernel/names.c b/src/common/kernel/names.c index 9991b421d..6dc33d3ec 100644 --- a/src/common/kernel/names.c +++ b/src/common/kernel/names.c @@ -40,6 +40,7 @@ /* util includes */ #include #include +#include #include /* Untote */ @@ -112,6 +113,12 @@ static const char *untot_nach[UNTOT_NACH] = " aus der Unterwelt" }; +static const char * +describe_braineater(unit * u, const struct locale * lang) +{ + return LOC(lang, "describe_braineater"); +} + const char * untoten_name(const unit * u) { @@ -707,3 +714,21 @@ abkz(const char *s, size_t max) return buf; } + +void +register_names(void) +{ + register_function((pf_generic)describe_braineater, "describe_braineater"); + /* function name + * generate a name for a nonplayerunit + * race->generate_name() */ + register_function((pf_generic)untoten_name, "nameundead"); + register_function((pf_generic)skeleton_name, "nameskeleton"); + register_function((pf_generic)zombie_name, "namezombie"); + register_function((pf_generic)ghoul_name, "nameghoul"); + register_function((pf_generic)drachen_name, "namedragon"); + register_function((pf_generic)dracoid_name, "namedracoid"); + register_function((pf_generic)shadow_name, "nameshadow"); +} + + diff --git a/src/common/kernel/names.h b/src/common/kernel/names.h index 7a6249c9d..4ff7af503 100644 --- a/src/common/kernel/names.h +++ b/src/common/kernel/names.h @@ -18,7 +18,7 @@ #ifdef __cplusplus extern "C" { #endif - +extern void register_names(void); const char *untoten_name(const struct unit * u); const char *skeleton_name(const struct unit * u); const char *zombie_name(const struct unit * u); diff --git a/src/common/kernel/race.c b/src/common/kernel/race.c index c7b889d91..b4a609437 100644 --- a/src/common/kernel/race.c +++ b/src/common/kernel/race.c @@ -410,17 +410,6 @@ register_races(void) register_function((pf_generic)allowed_fly, "moveflying"); register_function((pf_generic)allowed_dragon, "movedragon"); - /* function name - * generate a name for a nonplayerunit - * race->generate_name() */ - register_function((pf_generic)untoten_name, "nameundead"); - register_function((pf_generic)skeleton_name, "nameskeleton"); - register_function((pf_generic)zombie_name, "namezombie"); - register_function((pf_generic)ghoul_name, "nameghoul"); - register_function((pf_generic)drachen_name, "namedragon"); - register_function((pf_generic)dracoid_name, "namedracoid"); - register_function((pf_generic)shadow_name, "nameshadow"); - /* function age * race->age() */ register_function((pf_generic)age_undead, "ageundead"); diff --git a/src/common/kernel/race.h b/src/common/kernel/race.h index 446f7cd27..792fdcf9a 100644 --- a/src/common/kernel/race.h +++ b/src/common/kernel/race.h @@ -79,6 +79,7 @@ typedef struct race { race_t oldfamiliars[MAXMAGIETYP]; const char *(*generate_name) (const struct unit *); + const char *(*describe) (const struct unit *, const struct locale *); void (*age)(struct unit *u); boolean (*move_allowed)(const struct region *, const struct region *); struct item * (*itemdrop)(const struct race *, int size); diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index dfcb8d867..e3444492b 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -235,7 +235,7 @@ bufunit(const faction * f, const unit * u, int indent, int mode) { int i, dh; int getarnt = fval(u, UFL_PARTEITARNUNG); - const char *pzTmp; + const char *pzTmp, *str; building * b; boolean isbattle = (boolean)(mode == see_battle); int telepath_see = 0; @@ -630,18 +630,19 @@ bufunit(const faction * f, const unit * u, int indent, int mode) } i = 0; - if (u->display && u->display[0]) { + str = u_description(u, f->locale); + if (str) { rsize = strlcpy(bufp, "; ", size); if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; - rsize = strlcpy(bufp, u->display, size); + rsize = strlcpy(bufp, str, size); if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; - i = u->display[strlen(u->display) - 1]; + i = str[strlen(str) - 1]; } if (i != '!' && i != '?' && i != '.') { if (size>1) { diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 3692dbea9..6a2f7749d 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -976,7 +976,9 @@ readunit(FILE * F) } rds(F, &u->name); if (lomem) rds(F, 0); - else rds(F, &u->display); + else { + rds(F, &u->display); + } #ifndef NDEBUG if (strlen(u->name)>=NAMESIZE) u->name[NAMESIZE] = 0; if (u->display && strlen(u->display)>=DISPLAYSIZE) u->display[DISPLAYSIZE] = 0; @@ -1009,6 +1011,15 @@ readunit(FILE * F) if (strlen(buf)) u->irace = rc_find(buf); else u->irace = u->race; } + if (u->race->describe) { + const char * rcdisp = u->race->describe(u, u->faction->locale); + if (u->display && rcdisp) { + /* see if the data file contains old descriptions */ + if (strcmp(rcdisp, u->display)==0) { + set_string(&u->display, NULL); + } + } + } if (u->faction == NULL) { log_error(("unit %s has faction == NULL\n", unitname(u))); u_setfaction(u, findfaction(MONSTER_FACTION)); diff --git a/src/common/kernel/teleport.c b/src/common/kernel/teleport.c index f1dccdd2d..7772cff82 100644 --- a/src/common/kernel/teleport.c +++ b/src/common/kernel/teleport.c @@ -154,7 +154,6 @@ spawn_braineaters(float chance) unit *u = createunit(r, f0, 1+rng_int()%10+rng_int()%10, new_race[RC_HIRNTOETER]); set_string(&u->name, "Hirntöter"); - set_string(&u->display, "Wabernde grüne Schwaden treiben durch den Nebel und verdichten sich zu einer unheimlichen Kreatur, die nur aus einem langen Ruderschwanz und einem riesigen runden Maul zu bestehen scheint."); set_level(u, SK_STEALTH, 1); set_level(u, SK_OBSERVATION, 1); next = rng_int() % (int)(chance*100); diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c index bf1562830..bd46bd3a1 100644 --- a/src/common/kernel/unit.c +++ b/src/common/kernel/unit.c @@ -346,6 +346,17 @@ attrib_type at_private = { a_readstring }; +const char * +u_description(const unit * u, const struct locale * lang) +{ + if (u->display && u->display[0]) { + return u->display; + } else if (u->race->describe) { + return u->race->describe(u, lang); + } + return NULL; +} + const char * uprivate(const unit * u) { attrib * a = a_find(u->attribs, &at_private); diff --git a/src/common/kernel/unit.h b/src/common/kernel/unit.h index a5f77ee07..4f355e143 100644 --- a/src/common/kernel/unit.h +++ b/src/common/kernel/unit.h @@ -171,7 +171,7 @@ extern const struct unit * u_peasants(void); extern const struct unit * u_unknown(void); extern struct unit * udestroy; - +extern const char * u_description(const unit * u, const struct locale * lang); extern struct skill * add_skill(struct unit * u, skill_t id); extern void remove_skill(struct unit *u, skill_t sk); extern struct skill * get_skill(const struct unit * u, skill_t id); diff --git a/src/common/kernel/xmlreader.c b/src/common/kernel/xmlreader.c index 4760165fc..a98695a04 100644 --- a/src/common/kernel/xmlreader.c +++ b/src/common/kernel/xmlreader.c @@ -1532,6 +1532,8 @@ parse_races(xmlDocPtr doc) assert(property!=NULL); if (strcmp((const char*)property, "name")==0) { rc->generate_name = (const char* (*)(const struct unit*))fun; + } else if (strcmp((const char*)property, "describe")==0) { + rc->describe = (const char* (*)(const struct unit*, const struct locale *))fun; } else if (strcmp((const char*)property, "age")==0) { rc->age = (void(*)(struct unit*))fun; } else if (strcmp((const char*)property, "move")==0) { diff --git a/src/common/util/parser.c b/src/common/util/parser.c index b64134c3e..881664e90 100644 --- a/src/common/util/parser.c +++ b/src/common/util/parser.c @@ -22,7 +22,7 @@ init_tokens_str(const char * initstr, char * cmd) if (state==NULL) { state = malloc(sizeof(parser_state)); } - if (state->current_cmd) free(state->current_cmd); + else if (state->current_cmd) free(state->current_cmd); state->current_cmd = cmd; state->current_token = (const unsigned char *)initstr; } diff --git a/src/eressea/gmtool.c b/src/eressea/gmtool.c index d3e144b5b..202843921 100644 --- a/src/eressea/gmtool.c +++ b/src/eressea/gmtool.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -213,6 +214,7 @@ game_init(void) init_xmas(); register_races(); + register_names(); register_resources(); register_buildings(); register_ships(); diff --git a/src/eressea/main.c b/src/eressea/main.c index 08f082068..86204c8e6 100644 --- a/src/eressea/main.c +++ b/src/eressea/main.c @@ -158,6 +158,7 @@ game_init(void) debug_language("locales.log"); register_races(); + register_names(); register_resources(); register_buildings(); register_ships(); diff --git a/src/eressea/server.cpp b/src/eressea/server.cpp index 6243940d3..332259aa0 100644 --- a/src/eressea/server.cpp +++ b/src/eressea/server.cpp @@ -69,6 +69,7 @@ #include #include #include +#include #include #include #include @@ -219,6 +220,7 @@ game_init(void) debug_language("locales.log"); register_races(); + register_names(); register_resources(); register_buildings(); register_ships(); diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml index 475ec85d9..37685a12e 100644 --- a/src/res/de/strings.xml +++ b/src/res/de/strings.xml @@ -6,7 +6,11 @@ _x: preposition (15 /Troll/schwerter) _a: including article (ein Troll, a troll) --> - + + "Wabernde grüne Schwaden treiben durch den Nebel und + verdichten sich zu einer unheimlichen Kreatur, die nur aus einem langen + Ruderschwanz und einem riesigen runden Maul zu bestehen scheint." + Keine Informationen über diese Rasse verfügbar. diff --git a/src/res/races.xml b/src/res/races.xml index dfa595783..33078c19e 100644 --- a/src/res/races.xml +++ b/src/res/races.xml @@ -572,6 +572,7 @@ +